Checkpoint
This commit is contained in:
parent
9db1c66781
commit
724e911a6f
17 changed files with 288 additions and 95 deletions
|
@ -2,10 +2,11 @@ package parser.grammars
|
|||
|
||||
import com.github.h0tk3y.betterParse.grammar.Grammar
|
||||
import com.github.h0tk3y.betterParse.grammar.parseToEnd
|
||||
import com.github.h0tk3y.betterParse.parser.Parser
|
||||
import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.Assertions.assertTrue
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Nested
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.api.assertDoesNotThrow
|
||||
import org.junit.jupiter.params.ParameterizedTest
|
||||
|
@ -17,7 +18,6 @@ import prolog.ast.terms.Structure
|
|||
import prolog.ast.terms.Term
|
||||
import prolog.ast.terms.Variable
|
||||
import prolog.logic.equivalent
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class TermsGrammarTests {
|
||||
private lateinit var parser: Grammar<Term>
|
||||
|
@ -32,7 +32,7 @@ class TermsGrammarTests {
|
|||
fun `parse atom`(name: String) {
|
||||
val result = parser.parseToEnd(name)
|
||||
|
||||
Assertions.assertEquals(Atom(name), result, "Expected atom '$name'")
|
||||
assertEquals(Atom(name), result, "Expected atom '$name'")
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
|
@ -52,7 +52,7 @@ class TermsGrammarTests {
|
|||
|
||||
val expected = input.substring(1, input.length - 1)
|
||||
|
||||
Assertions.assertEquals(Atom(expected), result, "Expected atom")
|
||||
assertEquals(Atom(expected), result, "Expected atom")
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
|
@ -60,7 +60,7 @@ class TermsGrammarTests {
|
|||
fun `parse variable`(name: String) {
|
||||
val result = parser.parseToEnd(name)
|
||||
|
||||
Assertions.assertEquals(Variable(name), result, "Expected atom '$name'")
|
||||
assertEquals(Variable(name), result, "Expected atom '$name'")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -69,10 +69,7 @@ class TermsGrammarTests {
|
|||
|
||||
val result = parser.parseToEnd(input)
|
||||
|
||||
Assertions.assertTrue(
|
||||
equivalent(Structure(Atom("f"), emptyList()), result, emptyMap()),
|
||||
"Expected atom 'f'"
|
||||
)
|
||||
assertEquals(Structure(Atom("f"), emptyList()), result, "Expected atom 'f'")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -81,10 +78,7 @@ class TermsGrammarTests {
|
|||
|
||||
val result = parser.parseToEnd(input)
|
||||
|
||||
Assertions.assertTrue(
|
||||
equivalent(Structure(Atom("f"), listOf(Atom("a"))), result, emptyMap()),
|
||||
"Expected atom 'f(a)'"
|
||||
)
|
||||
assertEquals(Structure(Atom("f"), listOf(Atom("a"))), result, "Expected atom 'f(a)'")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -93,8 +87,9 @@ class TermsGrammarTests {
|
|||
|
||||
val result = parser.parseToEnd(input)
|
||||
|
||||
Assertions.assertTrue(
|
||||
equivalent(Structure(Atom("f"), listOf(Atom("a"), Atom("b"))), result, emptyMap()),
|
||||
assertEquals(
|
||||
Structure(Atom("f"), listOf(Atom("a"), Atom("b"))),
|
||||
result,
|
||||
"Expected atom 'f(a, b)'"
|
||||
)
|
||||
}
|
||||
|
@ -105,7 +100,7 @@ class TermsGrammarTests {
|
|||
|
||||
val result = parser.parseToEnd(input)
|
||||
|
||||
Assertions.assertTrue(
|
||||
assertTrue(
|
||||
equivalent(Structure(Atom("f"), listOf(Atom("a"), Variable("X"))), result, emptyMap()),
|
||||
"Expected atom 'f(a, X)'"
|
||||
)
|
||||
|
@ -179,4 +174,59 @@ class TermsGrammarTests {
|
|||
fun `parse unification`(input: String) {
|
||||
assertDoesNotThrow { parser.parseToEnd(input) }
|
||||
}
|
||||
|
||||
@Nested
|
||||
class `Operator precedence` {
|
||||
private lateinit var parser: Grammar<Term>
|
||||
|
||||
@BeforeEach
|
||||
fun setup() {
|
||||
parser = TermsGrammar() as Grammar<Term>
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse addition and multiplication`() {
|
||||
val input = "1 + 2 * 3"
|
||||
|
||||
val result = parser.parseToEnd(input)
|
||||
|
||||
assertEquals(
|
||||
Structure(Atom("+"), listOf(Integer(1), Structure(Atom("*"), listOf(Integer(2), Integer(3))))),
|
||||
result,
|
||||
"Expected addition and multiplication"
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse multiplication and addition`() {
|
||||
val input = "1 * 2 + 3"
|
||||
|
||||
val result = parser.parseToEnd(input)
|
||||
|
||||
assertEquals(
|
||||
Structure(Atom("+"), listOf(Structure(Atom("*"), listOf(Integer(1), Integer(2))), Integer(3))),
|
||||
result,
|
||||
"Expected multiplication and addition"
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `complex expression`() {
|
||||
val input = "1 + 2 * 3 - 4 / 5"
|
||||
|
||||
val result = parser.parseToEnd(input)
|
||||
|
||||
assertEquals(
|
||||
Structure(
|
||||
Atom("-"),
|
||||
listOf(
|
||||
Structure(Atom("+"), listOf(Integer(1), Structure(Atom("*"), listOf(Integer(2), Integer(3))))),
|
||||
Structure(Atom("/"), listOf(Integer(4), Integer(5)))
|
||||
)
|
||||
),
|
||||
result,
|
||||
"Expected complex expression"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
Reference in a new issue