phodal/chapi

View on GitHub
chapi-parser-toml/src/test/kotlin/chapi/parser/toml/TomlAnalyserTest.kt

Summary

Maintainability
B
4 hrs
Test Coverage
package chapi.parser.toml;

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

class TomlAnalyserTest {

    @Test
    fun `analysis should return CodeContainer with correct field count`() {
        // given
        val tomlCode = "title = \"TOML Example\""
        val analyser = TomlAnalyser()

        // when
        val container = analyser.analysis(tomlCode, "path/to/file.toml")

        // then
        assertEquals(1, container.Fields.size)
        assertEquals("title", container.Fields[0].TypeKey)
        assertEquals("TOML Example", container.Fields[0].TypeValue)
        assertEquals("String", container.Fields[0].TypeType)
    }

    @Test
    fun `analysis should return CodeContainer with correct field count 2`() {
        // given
        val tomlCode = """
            title = "TOML Example"
            
            [owner]
            name = "Tom Preston-Werner"
            dob = 1979-05-27T07:32:00-08:00
        """.trimIndent()
        val analyser = TomlAnalyser()

        // when
        val container = analyser.analysis(tomlCode, "path/to/file.toml")

        // then
        assertEquals(1, container.Fields.size)
        val childContainer = container.Containers
        assertEquals(1, childContainer.size)
        val firstChild = childContainer[0]

        assertEquals("owner", firstChild.PackageName)
        assertEquals("Tom Preston-Werner", firstChild.Fields[0].TypeValue)
        assertEquals("name", firstChild.Fields[0].TypeKey)
        assertEquals("String", firstChild.Fields[0].TypeType)
        assertEquals("1979-05-27T07:32:00-08:00", firstChild.Fields[1].TypeValue)
        assertEquals("dob", firstChild.Fields[1].TypeKey)
        assertEquals("Date", firstChild.Fields[1].TypeType)
    }

    @Test
    fun `analysis should return CodeContainer with correct field count 3`() {
        // given
        val tomlCode = """
            [database]
            enabled = true
            ports = [ 8000, 8001, 8002 ]
            data = [ ["delta", "phi"], [3.14] ]
            temp_targets = { cpu = 79.5, case = 72.0 }
        """.trimIndent()
        val analyser = TomlAnalyser()

        // when
        val container = analyser.analysis(tomlCode, "path/to/file.toml")

        // then
        assertEquals(0, container.Fields.size)
        val childContainer = container.Containers
        assertEquals(1, childContainer.size)
        val firstChild = childContainer[0]

        assertEquals("[8000,8001,8002]", firstChild.Fields[1].TypeValue)
        val childValue = firstChild.Fields[1].ArrayValue
        assertEquals(3, childValue.size)
        assertEquals("8000", childValue[0].TypeValue)
        assertEquals("Int", childValue[1].TypeType)

        val secondArray = firstChild.Fields[2]
        assertEquals("[[\"delta\",\"phi\"],[3.14]]", secondArray.TypeValue)

        assertEquals("data", secondArray.TypeKey)
        assertEquals("Array", secondArray.TypeType)
        assertEquals("Array", secondArray.ArrayValue[0].TypeType)
        assertEquals("String", secondArray.ArrayValue[0].ArrayValue[0].TypeType)

        assertEquals("Array", secondArray.ArrayValue[1].TypeType)

        val childFloat = secondArray.ArrayValue[1].ArrayValue[0]
        assertEquals("3.14", childFloat.TypeValue)
        assertEquals("Float", childFloat.TypeType)
    }

    @Test
    fun `analysis should return CodeContainer with correct field count 4`() {
        // given
        val tomlCode = """
            [database]
            enabled = true
            ports = [ 8000, 8001, 8002 ]
            data = [ ["delta", "phi"], [3.14] ]
            temp_targets = { cpu = 79.5, case = 72.0 }
        """.trimIndent()

        val analyser = TomlAnalyser()

        val container = analyser.analysis(tomlCode, "path/to/file.toml")

        assertEquals(0, container.Fields.size)
        val childContainer = container.Containers
        assertEquals(1, childContainer.size)

        val firstChild = childContainer[0]
        val thirdField = firstChild.Fields[3]
        assertEquals("{cpu=79.5,case=72.0}", thirdField.TypeValue)
        assertEquals("temp_targets", thirdField.TypeKey)
        assertEquals("InlineTable", thirdField.TypeType)

        val childField = thirdField.ArrayValue[0]
        assertEquals("cpu", childField.TypeKey)
        assertEquals("79.5", childField.TypeValue)
        assertEquals("Float", childField.TypeType)
    }

    @Test
    fun should_handle_for_long_string() {
        val code = """
            re = '''I [dw]on't need \d{2} apples'''
            lines = '''
            The first newline is
            trimmed in raw strings.
            All other whitespace
            is preserved.
            '''
            """.trimIndent()

        val analyser = TomlAnalyser()
        val container = analyser.analysis(code, "path/to/file.toml")

        assertEquals(2, container.Fields.size)
        val firstField = container.Fields[0]
        assertEquals("re", firstField.TypeKey)
        assertEquals("'''I [dw]on't need \\d{2} apples'''", firstField.TypeValue)

        val secondField = container.Fields[1]
        assertEquals("lines", secondField.TypeKey)
        assertEquals("'''\nThe first newline is\ntrimmed in raw strings.\nAll other whitespace\nis preserved.\n'''", secondField.TypeValue)
    }
}