Checkpoint
This commit is contained in:
parent
5bfa1691dd
commit
a85169dced
27 changed files with 377 additions and 250 deletions
|
@ -3,7 +3,7 @@ package prolog.builtins
|
|||
import org.junit.jupiter.api.Assertions.*
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Test
|
||||
import prolog.Program
|
||||
import prolog.ast.Database.Program
|
||||
import prolog.ast.logic.Fact
|
||||
import prolog.ast.logic.Rule
|
||||
import prolog.ast.terms.Atom
|
||||
|
@ -14,7 +14,7 @@ import prolog.ast.terms.Variable
|
|||
class ControlOperatorsTests {
|
||||
@BeforeEach
|
||||
fun setUp() {
|
||||
Program.clear()
|
||||
Program.reset()
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -55,7 +55,7 @@ class ControlOperatorsTests {
|
|||
|
||||
// Now with cut
|
||||
|
||||
Program.clear()
|
||||
Program.reset()
|
||||
|
||||
Program.load(
|
||||
listOf(
|
||||
|
@ -104,7 +104,7 @@ class ControlOperatorsTests {
|
|||
|
||||
// Now with cut in the middle
|
||||
|
||||
Program.clear()
|
||||
Program.reset()
|
||||
|
||||
Program.load(
|
||||
listOf(
|
||||
|
@ -138,7 +138,7 @@ class ControlOperatorsTests {
|
|||
|
||||
// Now with cut at the end
|
||||
|
||||
Program.clear()
|
||||
Program.reset()
|
||||
|
||||
Program.load(
|
||||
listOf(
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
package prolog.builtins
|
||||
|
||||
import org.junit.jupiter.api.Assertions.assertEquals
|
||||
import org.junit.jupiter.api.Assertions.assertFalse
|
||||
import org.junit.jupiter.api.Assertions.assertTrue
|
||||
import org.junit.jupiter.api.BeforeEach
|
||||
import org.junit.jupiter.api.Nested
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.junit.jupiter.params.ParameterizedTest
|
||||
import org.junit.jupiter.params.provider.ValueSource
|
||||
import prolog.Program
|
||||
import prolog.ast.Database
|
||||
import prolog.ast.Database.Program
|
||||
import prolog.ast.logic.Clause
|
||||
import prolog.ast.logic.Fact
|
||||
import prolog.ast.logic.Predicate
|
||||
|
@ -14,12 +17,11 @@ import prolog.ast.logic.Rule
|
|||
import prolog.ast.terms.Atom
|
||||
import prolog.ast.terms.Structure
|
||||
import prolog.ast.terms.Variable
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
class DatabaseOperatorsTests {
|
||||
@BeforeEach
|
||||
fun setup() {
|
||||
Program.clear()
|
||||
Program.reset()
|
||||
}
|
||||
|
||||
abstract class AssertTestsBase<T : Structure> {
|
||||
|
@ -27,7 +29,7 @@ class DatabaseOperatorsTests {
|
|||
|
||||
@BeforeEach
|
||||
fun setup() {
|
||||
Program.clear()
|
||||
Program.reset()
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
|
@ -36,8 +38,8 @@ class DatabaseOperatorsTests {
|
|||
val fact = Fact(Atom("a"))
|
||||
createAssert(fact).satisfy(emptyMap())
|
||||
|
||||
assertEquals(1, Program.internalDb.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(fact, Program.internalDb.predicates["a/_"]!!.clauses[0])
|
||||
assertEquals(1, Program.db.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(fact, Program.db.predicates["a/_"]!!.clauses[0])
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -45,8 +47,8 @@ class DatabaseOperatorsTests {
|
|||
val fact = Fact(Structure(Atom("a"), listOf(Atom("b"))))
|
||||
createAssert(fact).satisfy(emptyMap())
|
||||
|
||||
assertEquals(1, Program.internalDb.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(fact, Program.internalDb.predicates["a/1"]!!.clauses[0])
|
||||
assertEquals(1, Program.db.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(fact, Program.db.predicates["a/1"]!!.clauses[0])
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -57,8 +59,8 @@ class DatabaseOperatorsTests {
|
|||
)
|
||||
createAssert(rule).satisfy(emptyMap())
|
||||
|
||||
assertEquals(1, Program.internalDb.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(rule, Program.internalDb.predicates["a/1"]!!.clauses[0])
|
||||
assertEquals(1, Program.db.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(rule, Program.db.predicates["a/1"]!!.clauses[0])
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,9 +90,9 @@ class DatabaseOperatorsTests {
|
|||
AssertA(rule1).satisfy(emptyMap())
|
||||
AssertA(rule2).satisfy(emptyMap())
|
||||
|
||||
assertEquals(1, Program.internalDb.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(rule2, Program.internalDb.predicates["a/1"]!!.clauses[0])
|
||||
assertEquals(rule1, Program.internalDb.predicates["a/1"]!!.clauses[1])
|
||||
assertEquals(1, Program.db.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(rule2, Program.db.predicates["a/1"]!!.clauses[0])
|
||||
assertEquals(rule1, Program.db.predicates["a/1"]!!.clauses[1])
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -113,9 +115,9 @@ class DatabaseOperatorsTests {
|
|||
AssertZ(rule1).satisfy(emptyMap())
|
||||
AssertZ(rule2).satisfy(emptyMap())
|
||||
|
||||
assertEquals(1, Program.internalDb.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(rule1, Program.internalDb.predicates["a/1"]!!.clauses[0])
|
||||
assertEquals(rule2, Program.internalDb.predicates["a/1"]!!.clauses[1])
|
||||
assertEquals(1, Program.db.predicates.size, "Expected 1 predicate")
|
||||
assertEquals(rule1, Program.db.predicates["a/1"]!!.clauses[0])
|
||||
assertEquals(rule2, Program.db.predicates["a/1"]!!.clauses[1])
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -130,13 +132,13 @@ class DatabaseOperatorsTests {
|
|||
@Test
|
||||
fun `simple retract`() {
|
||||
val predicate = Predicate(listOf(Fact(Atom("a"))))
|
||||
Program.internalDb.load(predicate)
|
||||
Program.db.load(predicate)
|
||||
|
||||
assertEquals(1, Program.query(Atom("a")).count())
|
||||
|
||||
val retract = Retract(Atom("a"))
|
||||
|
||||
assertTrue(retract.satisfy(emptyMap()).any(), "Expected 1 result")
|
||||
assertEquals(1, retract.satisfy(emptyMap()).toList().size, "Expected 1 result")
|
||||
assertEquals(0, predicate.clauses.size, "Expected 0 clauses")
|
||||
|
||||
assertTrue(retract.satisfy(emptyMap()).none())
|
||||
|
@ -149,7 +151,7 @@ class DatabaseOperatorsTests {
|
|||
Fact(Atom("a")),
|
||||
Fact(Atom("a"))
|
||||
))
|
||||
Program.internalDb.load(predicate)
|
||||
Program.db.load(predicate)
|
||||
|
||||
val control = Program.query(Atom("a")).toList()
|
||||
|
||||
|
@ -157,20 +159,25 @@ class DatabaseOperatorsTests {
|
|||
|
||||
val retract = Retract(Atom("a"))
|
||||
|
||||
val result = retract.satisfy(emptyMap())
|
||||
val result = retract.satisfy(emptyMap()).iterator()
|
||||
|
||||
assertEquals(3, predicate.clauses.size, "Expected 3 clauses")
|
||||
|
||||
var answer = result.first()
|
||||
assertTrue(result.hasNext(), "Expected more results")
|
||||
|
||||
val answer = result.next()
|
||||
|
||||
assertTrue(answer.isSuccess, "Expected success")
|
||||
var subs = answer.getOrNull()!!
|
||||
assertTrue(subs.isEmpty(), "Expected no substitutions")
|
||||
assertTrue(answer.getOrNull()!!.isEmpty(), "Expected no substitutions")
|
||||
|
||||
assertTrue(result.hasNext(), "Expected more results")
|
||||
assertEquals(2, predicate.clauses.size, "Expected 2 clauses")
|
||||
|
||||
assertTrue(result.first().isSuccess)
|
||||
assertTrue(result.first().isSuccess)
|
||||
assertTrue(result.next().isSuccess)
|
||||
assertTrue(result.hasNext(), "Expected more results")
|
||||
assertTrue(result.next().isSuccess)
|
||||
|
||||
assertFalse(result.hasNext(), "Expected more results")
|
||||
assertEquals(0, predicate.clauses.size, "Expected no remaining clauses")
|
||||
}
|
||||
|
||||
|
@ -181,7 +188,7 @@ class DatabaseOperatorsTests {
|
|||
Fact(Structure(Atom("a"), listOf(Atom("c")))),
|
||||
Fact(Structure(Atom("a"), listOf(Atom("d"))))
|
||||
))
|
||||
Program.internalDb.load(predicate)
|
||||
Program.db.load(predicate)
|
||||
|
||||
val control = Program.query(Structure(Atom("a"), listOf(Variable("X")))).toList()
|
||||
|
||||
|
@ -189,38 +196,40 @@ class DatabaseOperatorsTests {
|
|||
|
||||
val retract = Retract(Structure(Atom("a"), listOf(Variable("X"))))
|
||||
|
||||
val result = retract.satisfy(emptyMap())
|
||||
val result = retract.satisfy(emptyMap()).iterator()
|
||||
|
||||
assertEquals(3, predicate.clauses.size, "Expected 3 clauses")
|
||||
|
||||
var answer = result.first()
|
||||
assertTrue(result.hasNext(), "Expected more results")
|
||||
var answer = result.next()
|
||||
|
||||
assertTrue(answer.isSuccess, "Expected success")
|
||||
var subs = answer.getOrNull()!!
|
||||
assertTrue(subs.isNotEmpty(), "Expected substitutions")
|
||||
assertTrue(Variable("X") in subs, "Expected variable X")
|
||||
assertEquals(Atom("b"), subs[Variable("X")], "Expected b")
|
||||
assertTrue(result.hasNext(), "Expected more results")
|
||||
assertEquals(2, predicate.clauses.size, "Expected 2 clauses")
|
||||
|
||||
answer = result.first()
|
||||
answer = result.next()
|
||||
|
||||
assertTrue(answer.isSuccess, "Expected success")
|
||||
subs = answer.getOrNull()!!
|
||||
assertTrue(subs.isNotEmpty(), "Expected substitutions")
|
||||
assertTrue(Variable("X") in subs, "Expected variable X")
|
||||
assertEquals(Atom("c"), subs[Variable("X")], "Expected c")
|
||||
assertTrue(result.hasNext(), "Expected more results")
|
||||
assertEquals(1, predicate.clauses.size, "Expected 1 clause")
|
||||
|
||||
answer = result.first()
|
||||
answer = result.next()
|
||||
|
||||
assertTrue(answer.isSuccess, "Expected success")
|
||||
subs = answer.getOrNull()!!
|
||||
assertTrue(subs.isNotEmpty(), "Expected substitutions")
|
||||
assertTrue(Variable("X") in subs, "Expected variable X")
|
||||
assertEquals(Atom("d"), subs[Variable("X")], "Expected d")
|
||||
assertFalse(result.hasNext(), "Expected no more results")
|
||||
assertEquals(0, predicate.clauses.size, "Expected no clauses")
|
||||
|
||||
assertEquals(0, result.count(), "Expected no remaining results")
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
Reference in a new issue