prog8/compiler/test/ast/TestSourceCode.kt

144 lines
4.9 KiB
Kotlin
Raw Normal View History

package prog8tests.ast
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.AnnotationSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
2022-03-21 00:01:21 +00:00
import prog8.code.core.SourceCode
2023-07-30 16:42:45 +00:00
import prog8.code.core.SourceCode.Companion.LIBRARYFILEPREFIX
2022-06-26 16:51:03 +00:00
import prog8tests.helpers.assumeNotExists
import prog8tests.helpers.assumeReadableFile
import prog8tests.helpers.fixturesDir
import prog8tests.helpers.resourcesDir
2021-10-10 22:22:04 +00:00
import kotlin.io.path.Path
class TestSourceCode: AnnotationSpec() {
@Test
fun testFromString() {
val text = """
main { }
"""
2021-10-13 16:55:56 +00:00
val src = SourceCode.Text(text)
src.origin shouldContain Regex("^string:[0-9a-f\\-]+$")
src.text shouldBe text
src.isFromResources shouldBe false
src.isFromFilesystem shouldBe false
2022-03-21 00:01:21 +00:00
src.toString().startsWith("prog8.code.core.SourceCode") shouldBe true
}
@Test
fun testFromPathWithNonExistingPath() {
val filename = "i_do_not_exist.p8"
2022-06-26 16:51:03 +00:00
val path = assumeNotExists(fixturesDir, filename)
shouldThrow<NoSuchFileException> { SourceCode.File(path) }
}
@Test
fun testFromPathWithMissingExtension_p8() {
2022-06-26 16:51:03 +00:00
val pathWithoutExt = assumeNotExists(fixturesDir,"simple_main")
assumeReadableFile(fixturesDir,"ast_simple_main.p8")
shouldThrow<NoSuchFileException> { SourceCode.File(pathWithoutExt) }
}
@Test
fun testFromPathWithDirectory() {
2022-06-26 16:51:03 +00:00
shouldThrow<FileSystemException> { SourceCode.File(fixturesDir) }
}
@Test
fun testFromPathWithExistingPath() {
val filename = "ast_simple_main.p8"
2022-06-26 16:51:03 +00:00
val path = assumeReadableFile(fixturesDir, filename)
2021-10-13 16:55:56 +00:00
val src = SourceCode.File(path)
val expectedOrigin = SourceCode.relative(path).toString()
src.origin shouldBe expectedOrigin
src.text shouldBe path.toFile().readText()
src.isFromResources shouldBe false
src.isFromFilesystem shouldBe true
}
@Test
fun testFromPathWithExistingNonNormalizedPath() {
val filename = "ast_simple_main.p8"
val path = Path(".", "test", "..", "test", "fixtures", filename)
2022-06-26 16:51:03 +00:00
val srcFile = assumeReadableFile(path).toFile()
2021-10-13 16:55:56 +00:00
val src = SourceCode.File(path)
val expectedOrigin = SourceCode.relative(path).toString()
src.origin shouldBe expectedOrigin
src.text shouldBe srcFile.readText()
}
@Test
fun testFromResourcesWithExistingP8File_withoutLeadingSlash() {
val pathString = "prog8lib/math.p8"
2022-06-26 16:51:03 +00:00
val srcFile = assumeReadableFile(resourcesDir, pathString).toFile()
2021-10-13 16:55:56 +00:00
val src = SourceCode.Resource(pathString)
2023-07-30 16:42:45 +00:00
src.origin shouldBe "$LIBRARYFILEPREFIX/$pathString"
src.text shouldBe srcFile.readText()
src.isFromResources shouldBe true
src.isFromFilesystem shouldBe false
}
@Test
fun testFromResourcesWithExistingP8File_withLeadingSlash() {
val pathString = "/prog8lib/math.p8"
2022-06-26 16:51:03 +00:00
val srcFile = assumeReadableFile(resourcesDir, pathString.substring(1)).toFile()
2021-10-13 16:55:56 +00:00
val src = SourceCode.Resource(pathString)
2023-07-30 16:42:45 +00:00
src.origin shouldBe "$LIBRARYFILEPREFIX$pathString"
src.text shouldBe srcFile.readText()
}
@Test
fun testFromResourcesWithExistingAsmFile_withoutLeadingSlash() {
val pathString = "prog8lib/math.asm"
2022-06-26 16:51:03 +00:00
val srcFile = assumeReadableFile(resourcesDir, pathString).toFile()
2021-10-13 16:55:56 +00:00
val src = SourceCode.Resource(pathString)
2023-07-30 16:42:45 +00:00
src.origin shouldBe "$LIBRARYFILEPREFIX/$pathString"
src.text shouldBe srcFile.readText()
src.isFromResources shouldBe true
}
@Test
fun testFromResourcesWithExistingAsmFile_withLeadingSlash() {
val pathString = "/prog8lib/math.asm"
2022-06-26 16:51:03 +00:00
val srcFile = assumeReadableFile(resourcesDir, pathString.substring(1)).toFile()
2021-10-13 16:55:56 +00:00
val src = SourceCode.Resource(pathString)
2023-07-30 16:42:45 +00:00
src.origin shouldBe "$LIBRARYFILEPREFIX$pathString"
src.text shouldBe srcFile.readText()
}
@Test
fun testFromResourcesWithNonNormalizedPath() {
val pathString = "/prog8lib/../prog8lib/math.p8"
2022-06-26 16:51:03 +00:00
val srcFile = assumeReadableFile(resourcesDir, pathString.substring(1)).toFile()
2021-10-13 16:55:56 +00:00
val src = SourceCode.Resource(pathString)
2023-07-30 16:42:45 +00:00
src.origin shouldBe "$LIBRARYFILEPREFIX/prog8lib/math.p8"
src.text shouldBe srcFile.readText()
src.isFromResources shouldBe true
}
@Test
fun testFromResourcesWithNonExistingFile_withLeadingSlash() {
val pathString = "/prog8lib/i_do_not_exist"
2022-06-26 16:51:03 +00:00
assumeNotExists(resourcesDir, pathString.substring(1))
shouldThrow<NoSuchFileException> { SourceCode.Resource(pathString) }
}
@Test
fun testFromResourcesWithNonExistingFile_withoutLeadingSlash() {
val pathString = "prog8lib/i_do_not_exist"
2022-06-26 16:51:03 +00:00
assumeNotExists(resourcesDir, pathString)
shouldThrow<NoSuchFileException> { SourceCode.Resource(pathString) }
}
}