From 30669a60af56e3e2b0a23101a8842f27e604eeaa Mon Sep 17 00:00:00 2001 From: Alex Semin Date: Thu, 5 Oct 2023 22:39:41 +0200 Subject: [PATCH] Extend the test that validates token priority is driven by parsers --- .../kotlin/me/alllex/parsus/TokenTests.kt | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/commonTest/kotlin/me/alllex/parsus/TokenTests.kt b/src/commonTest/kotlin/me/alllex/parsus/TokenTests.kt index 50cc966..8a5e0dd 100644 --- a/src/commonTest/kotlin/me/alllex/parsus/TokenTests.kt +++ b/src/commonTest/kotlin/me/alllex/parsus/TokenTests.kt @@ -2,6 +2,7 @@ package me.alllex.parsus import assertk.assertions.isEqualTo import me.alllex.parsus.parser.* +import me.alllex.parsus.token.EofToken import me.alllex.parsus.token.TokenMatch import me.alllex.parsus.token.literalToken import me.alllex.parsus.token.regexToken @@ -25,14 +26,31 @@ class TokenTests { @Test fun tokenPriorityIsDrivenByParser() { object : Grammar() { - val single by literalToken("<") + // double declared first val double by literalToken("<<") + val single by literalToken("<") + override val root by double or single + }.run { + assertParsed("<<").isEqualTo(TokenMatch(double, 0, 2)) + } + object : Grammar() { + val single by literalToken("<") + val double by literalToken("<<") // even though single token is declared first, it is not matched first override val root by double or single }.run { assertParsed("<<").isEqualTo(TokenMatch(double, 0, 2)) } + + object : Grammar() { + val single by literalToken("<") + val double by literalToken("<<") + // if the order in the parser is "wrong", then the parsing will fail too + override val root by single or double + }.run { + assertNotParsed("<<").failedWithUnmatchedToken(EofToken, 1) + } } @Test