prog8/compiler/test/ast/TestAstToSourceText.kt

108 lines
3.0 KiB
Kotlin
Raw Normal View History

package prog8tests.ast
import io.kotest.assertions.fail
import io.kotest.core.spec.style.AnnotationSpec
import io.kotest.matchers.string.shouldContain
2021-10-28 23:06:01 +00:00
import prog8.ast.AstToSourceTextConverter
2021-10-10 22:22:04 +00:00
import prog8.ast.Module
import prog8.ast.Program
import prog8.ast.internedStringsModuleName
import prog8.parser.ParseError
2021-10-10 22:22:04 +00:00
import prog8.parser.Prog8Parser.parseModule
import prog8.parser.SourceCode
import prog8tests.helpers.DummyFunctions
import prog8tests.helpers.DummyMemsizer
import prog8tests.helpers.DummyStringEncoder
class TestAstToSourceText: AnnotationSpec() {
private fun generateP8(module: Module) : String {
2021-10-29 22:05:55 +00:00
val program = Program("test", DummyFunctions, DummyMemsizer, DummyStringEncoder)
.addModule(module)
var generatedText = ""
2021-10-28 23:06:01 +00:00
val it = AstToSourceTextConverter({ str -> generatedText += str }, program)
it.visit(program)
return generatedText
}
private fun roundTrip(module: Module): Pair<String, Module> {
val generatedText = generateP8(module)
try {
2021-10-13 16:55:56 +00:00
val parsedAgain = parseModule(SourceCode.Text(generatedText))
return Pair(generatedText, parsedAgain)
} catch (e: ParseError) {
fail("should produce valid Prog8 but threw $e")
}
}
@Test
fun testMentionsInternedStringsModule() {
2021-10-13 16:55:56 +00:00
val orig = SourceCode.Text("\n")
val (txt, _) = roundTrip(parseModule(orig))
txt shouldContain Regex(";.*$internedStringsModuleName")
}
@Test
fun testImportDirectiveWithLib() {
2021-10-13 16:55:56 +00:00
val orig = SourceCode.Text("%import textio\n")
val (txt, _) = roundTrip(parseModule(orig))
txt shouldContain Regex("%import +textio")
}
@Test
fun testImportDirectiveWithUserModule() {
2021-10-13 16:55:56 +00:00
val orig = SourceCode.Text("%import my_own_stuff\n")
val (txt, _) = roundTrip(parseModule(orig))
txt shouldContain Regex("%import +my_own_stuff")
}
@Test
fun testStringLiteral_noAlt() {
2021-10-13 16:55:56 +00:00
val orig = SourceCode.Text("""
main {
str s = "fooBar\n"
}
""")
val (txt, _) = roundTrip(parseModule(orig))
txt shouldContain Regex("str +s += +\"fooBar\\\\n\"")
}
@Test
fun testStringLiteral_withAlt() {
2021-10-13 16:55:56 +00:00
val orig = SourceCode.Text("""
main {
str sAlt = @"fooBar\n"
}
""")
val (txt, _) = roundTrip(parseModule(orig))
txt shouldContain Regex("str +sAlt += +@\"fooBar\\\\n\"")
}
@Test
fun testCharLiteral_noAlt() {
2021-10-13 16:55:56 +00:00
val orig = SourceCode.Text("""
main {
ubyte c = 'x'
}
""")
val (txt, _) = roundTrip(parseModule(orig))
txt shouldContain Regex("ubyte +c += +'x'")
}
@Test
fun testCharLiteral_withAlt() {
2021-10-13 16:55:56 +00:00
val orig = SourceCode.Text("""
main {
ubyte cAlt = @'x'
}
""")
val (txt, _) = roundTrip(parseModule(orig))
txt shouldContain Regex("ubyte +cAlt += +@'x'")
}
}