git.iko.soy/opencode-android
on 7496a78 help sign in
opencode-android/app/src/test/java/soy/iko/opencode/ui/components/CodeHighlighterLanguageTest.kt
66 lines 2.6 kB history raw
1package soy.iko.opencode.ui.components
3import androidx.compose.ui.graphics.Color
4import org.junit.Assert.assertEquals
5import org.junit.Assert.assertTrue
6import org.junit.Test
8class CodeHighlighterLanguageTest {
10 @Test
11 fun tagResolvesByNameOrExtension() {
12 assertEquals(Language.C_FAMILY, syntaxForLanguageTag("kotlin").lang)
13 assertEquals(Language.C_FAMILY, syntaxForLanguageTag("typescript").lang)
14 assertEquals(Language.C_FAMILY, syntaxForLanguageTag("ts").lang)
15 assertEquals(Language.PYTHON, syntaxForLanguageTag("python").lang)
16 assertEquals(Language.PYTHON, syntaxForLanguageTag("py").lang)
17 assertEquals(Language.SHELL, syntaxForLanguageTag("bash").lang)
18 assertEquals(Language.RUBY, syntaxForLanguageTag("ruby").lang)
19 assertEquals(Language.RUBY, syntaxForLanguageTag("rb").lang)
20 assertEquals(Language.JSON, syntaxForLanguageTag("json").lang)
21 assertEquals(Language.MARKUP, syntaxForLanguageTag("html").lang)
22 assertEquals(Language.NONE, syntaxForLanguageTag("brainfuck").lang)
23 }
25 @Test
26 fun tagIsCaseInsensitiveAndTrimmed() {
27 assertEquals(Language.C_FAMILY, syntaxForLanguageTag(" Kotlin ").lang)
28 }
30 private val palette = HighlightPalette(
31 keyword = Color.White,
32 comment = Color.Gray,
33 string = Color.Green,
34 number = Color.Blue,
35 annotation = Color.Cyan,
36 tag = Color.Red,
37 base = Color.Black,
38 )
40 @Test
41 fun noneLanguageReturnsPlainString() {
42 val code = "val x = 1"
43 val out = highlightCode(code, syntaxForLanguageTag("txt"), palette)
44 assertEquals(code, out.toString())
45 assertTrue(out.spanStyles.isEmpty())
46 }
48 @Test
49 fun multilineCodePreservesTextAndAppliesSpans() {
50 val code = "val a = 1\nval b = 2"
51 val out = highlightCode(code, syntaxForLanguageTag("kotlin"), palette)
52 // Highlighting must not alter the characters, only attach spans.
53 assertEquals(code, out.toString())
54 // 'val' is a C-family keyword and appears on both lines, so at least two spans exist.
55 assertTrue("expected spans for two keyword lines", out.spanStyles.size >= 2)
56 }
58 @Test
59 fun rubyNotMisclassifiedAsPython() {
60 // Regression guard: `.rb` previously fell into the Python keyword set.
61 assertEquals(Language.RUBY, syntaxForLanguageTag("rb").lang)
62 val out = highlightCode("def foo\nend", syntaxForLanguageTag("ruby"), palette)
63 assertEquals("def foo\nend", out.toString())
64 assertTrue(out.spanStyles.isNotEmpty())
65 }