Skip to content

Commit 105ce11

Browse files
christian-huehn-mwclaude
authored andcommitted
test(analysis): add unit tests for TreeSitterAdapter
Add dedicated test class for TreeSitterAdapter covering all public methods including language mapping, file extension handling, and error cases for unsupported extensions. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 26a750c commit 105ce11

File tree

1 file changed

+231
-0
lines changed
  • analysis/analysers/parsers/UnifiedParser/src/test/kotlin/de/maibornwolff/codecharta/analysers/parsers/unified/metriccollectors

1 file changed

+231
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
package de.maibornwolff.codecharta.analysers.parsers.unified.metriccollectors
2+
3+
import de.maibornwolff.codecharta.model.NodeType
4+
import de.maibornwolff.codecharta.serialization.FileExtension
5+
import de.maibornwolff.treesitter.excavationsite.api.AvailableFileMetrics
6+
import de.maibornwolff.treesitter.excavationsite.api.Language
7+
import org.assertj.core.api.Assertions.assertThat
8+
import org.assertj.core.api.Assertions.assertThatThrownBy
9+
import org.junit.jupiter.api.Test
10+
import org.junit.jupiter.api.io.TempDir
11+
import java.io.File
12+
import java.nio.file.Path
13+
14+
class TreeSitterAdapterTest {
15+
@TempDir
16+
lateinit var tempDir: Path
17+
18+
@Test
19+
fun `should collect metrics for file by reading content automatically`() {
20+
// Arrange
21+
val javaFile = tempDir.resolve("Test.java").toFile()
22+
javaFile.writeText("public class Test { }")
23+
24+
// Act
25+
val result = TreeSitterAdapter.collectMetricsForFile(javaFile)
26+
27+
// Assert
28+
assertThat(result.name).isEqualTo("Test.java")
29+
assertThat(result.type).isEqualTo(NodeType.File)
30+
assertThat(result.checksum).isNotNull()
31+
}
32+
33+
@Test
34+
fun `should collect metrics for file with provided content`() {
35+
// Arrange
36+
val javaFile = tempDir.resolve("Test.java").toFile()
37+
javaFile.createNewFile()
38+
val content = "public void foo() { if(true) {} }"
39+
40+
// Act
41+
val result = TreeSitterAdapter.collectMetricsForFile(javaFile, content)
42+
43+
// Assert
44+
assertThat(result.name).isEqualTo("Test.java")
45+
assertThat(result.attributes).isNotEmpty()
46+
}
47+
48+
@Test
49+
fun `should throw exception for unsupported file extension`() {
50+
// Arrange
51+
val unsupportedFile = tempDir.resolve("test.xyz").toFile()
52+
unsupportedFile.writeText("some content")
53+
54+
// Act & Assert
55+
assertThatThrownBy { TreeSitterAdapter.collectMetricsForFile(unsupportedFile) }
56+
.isInstanceOf(IllegalArgumentException::class.java)
57+
.hasMessageContaining("Unsupported file extension")
58+
}
59+
60+
@Test
61+
fun `should map all supported FileExtensions to Languages`() {
62+
// Arrange
63+
val expectedMappings = mapOf(
64+
FileExtension.JAVA to Language.JAVA,
65+
FileExtension.KOTLIN to Language.KOTLIN,
66+
FileExtension.TYPESCRIPT to Language.TYPESCRIPT,
67+
FileExtension.JAVASCRIPT to Language.JAVASCRIPT,
68+
FileExtension.PYTHON to Language.PYTHON,
69+
FileExtension.GO to Language.GO,
70+
FileExtension.PHP to Language.PHP,
71+
FileExtension.RUBY to Language.RUBY,
72+
FileExtension.SWIFT to Language.SWIFT,
73+
FileExtension.BASH to Language.BASH,
74+
FileExtension.CSHARP to Language.CSHARP,
75+
FileExtension.CPP to Language.CPP,
76+
FileExtension.C to Language.C,
77+
FileExtension.OBJECTIVE_C to Language.OBJECTIVE_C,
78+
FileExtension.VUE to Language.VUE
79+
)
80+
81+
// Act & Assert
82+
expectedMappings.forEach { (fileExtension, expectedLanguage) ->
83+
val result = TreeSitterAdapter.getLanguageForExtension(fileExtension)
84+
assertThat(result)
85+
.describedAs("FileExtension.$fileExtension should map to Language.$expectedLanguage")
86+
.isEqualTo(expectedLanguage)
87+
}
88+
}
89+
90+
@Test
91+
fun `should return null for unsupported FileExtension`() {
92+
// Arrange
93+
val unsupportedExtension = FileExtension.JSON
94+
95+
// Act
96+
val result = TreeSitterAdapter.getLanguageForExtension(unsupportedExtension)
97+
98+
// Assert
99+
assertThat(result).isNull()
100+
}
101+
102+
@Test
103+
fun `should detect language from file extension`() {
104+
// Arrange
105+
val javaFile = File("Test.java")
106+
val kotlinFile = File("Test.kt")
107+
val pythonFile = File("test.py")
108+
109+
// Act & Assert
110+
assertThat(TreeSitterAdapter.getLanguageForFile(javaFile)).isEqualTo(Language.JAVA)
111+
assertThat(TreeSitterAdapter.getLanguageForFile(kotlinFile)).isEqualTo(Language.KOTLIN)
112+
assertThat(TreeSitterAdapter.getLanguageForFile(pythonFile)).isEqualTo(Language.PYTHON)
113+
}
114+
115+
@Test
116+
fun `should return null for unknown file extension`() {
117+
// Arrange
118+
val unknownFile = File("test.unknown")
119+
120+
// Act
121+
val result = TreeSitterAdapter.getLanguageForFile(unknownFile)
122+
123+
// Assert
124+
assertThat(result).isNull()
125+
}
126+
127+
@Test
128+
fun `should handle uppercase file extensions`() {
129+
// Arrange
130+
val javaFile = File("Test.JAVA")
131+
132+
// Act
133+
val result = TreeSitterAdapter.getLanguageForFile(javaFile)
134+
135+
// Assert
136+
assertThat(result).isEqualTo(Language.JAVA)
137+
}
138+
139+
@Test
140+
fun `should return true for supported FileExtensions`() {
141+
// Arrange
142+
val supportedExtensions = listOf(
143+
FileExtension.JAVA,
144+
FileExtension.KOTLIN,
145+
FileExtension.TYPESCRIPT,
146+
FileExtension.JAVASCRIPT,
147+
FileExtension.PYTHON,
148+
FileExtension.GO,
149+
FileExtension.PHP,
150+
FileExtension.RUBY,
151+
FileExtension.SWIFT,
152+
FileExtension.BASH,
153+
FileExtension.CSHARP,
154+
FileExtension.CPP,
155+
FileExtension.C,
156+
FileExtension.OBJECTIVE_C,
157+
FileExtension.VUE
158+
)
159+
160+
// Act & Assert
161+
supportedExtensions.forEach { extension ->
162+
assertThat(TreeSitterAdapter.isSupported(extension))
163+
.describedAs("FileExtension.$extension should be supported")
164+
.isTrue()
165+
}
166+
}
167+
168+
@Test
169+
fun `should return false for unsupported FileExtensions`() {
170+
// Arrange
171+
val unsupportedExtension = FileExtension.JSON
172+
173+
// Act
174+
val result = TreeSitterAdapter.isSupported(unsupportedExtension)
175+
176+
// Assert
177+
assertThat(result).isFalse()
178+
}
179+
180+
@Test
181+
fun `should collect metrics with explicit language parameter`() {
182+
// Arrange
183+
val fileName = "test.java"
184+
val content = "public void method() { }"
185+
186+
// Act
187+
val result = TreeSitterAdapter.collectMetrics(fileName, content, Language.JAVA)
188+
189+
// Assert
190+
assertThat(result.name).isEqualTo(fileName)
191+
assertThat(result.type).isEqualTo(NodeType.File)
192+
assertThat(result.checksum).isNotNull()
193+
assertThat(result.attributes).isNotEmpty()
194+
}
195+
196+
@Test
197+
fun `should calculate checksum from file content`() {
198+
// Arrange
199+
val fileName = "test.java"
200+
val content = "public class Test {}"
201+
202+
// Act
203+
val result1 = TreeSitterAdapter.collectMetrics(fileName, content, Language.JAVA)
204+
val result2 = TreeSitterAdapter.collectMetrics(fileName, content, Language.JAVA)
205+
val resultDifferentContent = TreeSitterAdapter.collectMetrics(fileName, "different", Language.JAVA)
206+
207+
// Assert
208+
assertThat(result1.checksum).isEqualTo(result2.checksum)
209+
assertThat(result1.checksum).isNotEqualTo(resultDifferentContent.checksum)
210+
}
211+
212+
@Test
213+
fun `should include file-level and per-function metrics in result`() {
214+
// Arrange
215+
val content = """
216+
public void methodOne() {
217+
if (true) { }
218+
}
219+
public void methodTwo() {
220+
for (int i = 0; i < 10; i++) { }
221+
}
222+
""".trimIndent()
223+
224+
// Act
225+
val result = TreeSitterAdapter.collectMetrics("test.java", content, Language.JAVA)
226+
227+
// Assert
228+
assertThat(result.attributes).containsKey(AvailableFileMetrics.COMPLEXITY.metricName)
229+
assertThat(result.attributes).containsKey(AvailableFileMetrics.NUMBER_OF_FUNCTIONS.metricName)
230+
}
231+
}

0 commit comments

Comments
 (0)