package prog8tests import org.antlr.v4.runtime.* import org.junit.jupiter.api.Test import prog8.ast.IStringEncoding import prog8.ast.antlr.toAst import prog8.ast.statements.Block import prog8.parser.* import java.nio.file.Path import kotlin.test.* class TestAntlrParser { class MyErrorListener: ConsoleErrorListener() { override fun syntaxError(recognizer: Recognizer<*, *>?, offendingSymbol: Any?, line: Int, charPositionInLine: Int, msg: String, e: RecognitionException?) { throw ParsingFailedError(msg) } } private fun parseModule(srcText: String): prog8Parser.ModuleContext { val lexer = prog8Lexer(CharStreams.fromString(srcText)) val tokens = CommonTokenStream(lexer) val parser = prog8Parser(tokens) //parser.errorHandler = BailErrorStrategy() parser.addErrorListener(MyErrorListener()) return parser.module() } object TestStringEncoding: IStringEncoding { override fun encodeString(str: String, altEncoding: Boolean): List { TODO("Not yet implemented") } override fun decodeString(bytes: List, altEncoding: Boolean): String { TODO("Not yet implemented") } } @Test fun testModuleFileNeedNotEndWithNewline() { val srcText = """ main { sub start() { return } }""" // file ends with '}' (= NO newline, issue #40) // before the fix, prog8Parser would have reported (thrown) "missing at ''" val parseTree = parseModule(srcText) assertEquals(parseTree.block().size, 1) } @Test fun testModuleFileMayEndWithNewline() { val srcText = """ main { sub start() { return } } """ // file does end with a newline (issue #40) val parseTree = parseModule(srcText) assertEquals(parseTree.block().size, 1) } @Test fun testProg8Ast() { // can create charstreams from many other sources as well; val charstream = CharStreams.fromString(""" main { sub start() { return } } """) val lexer = prog8Lexer(charstream) val tokens = CommonTokenStream(lexer) val parser = prog8Parser(tokens) parser.errorHandler = BailErrorStrategy() // parser.removeErrorListeners() // parser.addErrorListener(MyErrorListener()) val ast = parser.module().toAst("test", false, Path.of(""), TestStringEncoding) assertIs(ast.statements.first()) assertEquals((ast.statements.first() as Block).name, "main") } }