This repository has been archived on 2025-09-23. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
2025LogProg-project-GhentPr.../tests/prolog/builtins/OtherOperatorsTests.kt
2025-05-06 11:59:55 +02:00

54 lines
1.6 KiB
Kotlin

package prolog.builtins
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import prolog.ast.Database.Program
import prolog.ast.arithmetic.Integer
import prolog.ast.logic.Rule
import prolog.ast.terms.Atom
import prolog.ast.terms.CompoundTerm
import prolog.ast.terms.Variable
import java.io.ByteArrayOutputStream
import java.io.PrintStream
class OtherOperatorsTests {
@Test
fun `forall(X is 1, X == 1)`() {
val forall = ForAll(Is(Variable("X"), Integer(1)), EvaluatesTo(Variable("X"), Integer(1)))
val result = forall.satisfy(emptyMap()).toList()
assertEquals(1, result.size)
}
/**
* @see [Forall instead of failure-driven loops](https://riptutorial.com/prolog/example/19554/forall-instead-of-failure-driven-loops#example)
*/
@Test
fun `forall printer`() {
val printer = Rule(
CompoundTerm(Atom("print"), listOf(Variable("X"))),
ForAll(
Between(Integer(1), Variable("X"), Variable("Y")),
Write(Variable("Y"))
)
)
Program.load(listOf(printer))
// Set output
val outStream = ByteArrayOutputStream()
System.setOut(PrintStream(outStream))
var expected = ""
for (i in 1..5) {
val result = CompoundTerm(Atom("print"), listOf(Integer(i))).satisfy(emptyMap()).toList()
assertEquals(1, result.size)
assertTrue(result[0].isSuccess)
expected += "$i"
assertEquals(expected, outStream.toString())
outStream.reset()
}
}
}