package alice.tuprolog;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
public class CurrentPredicateTest {
Prolog engine;
@Before
public void setUp() {
engine = new Prolog();
try {
engine.setTheory(new Theory(
":- dynamic(cat/0).\n" +
"cat.\n" +
":- dynamic(dog/0).\n" +
"dog :- true.\n" +
"elk(X) :- moose(X).\n" +
":- dynamic(legs/2).\n" +
"legs(A, 6) :- insect(A).\n" +
"legs(A, 7) :- A, call(A).\n" +
":- dynamic(insect/1).\n" +
"insect(ant).\n" +
"insect(bee).\n"));
} catch (InvalidTheoryException e) {
}
}
@Test(expected=AssertionError.class)
public void test0() throws PrologException {
SolveInfo solution = engine.solve("current_predicate(dog/0).");
assertTrue(solution.isSuccess());
}
@Test public void test1() throws PrologException {
SolveInfo solution = engine.solve("current_predicate(current_predicate/1).");
assertFalse(solution.isSuccess());
}
@Test(expected=AssertionError.class)
public void test2() throws PrologException {
SolveInfo solution = engine.solve("current_predicate(elk/Arity).");
assertTrue(solution.isSuccess());
Term binding = solution.getTerm("Arity");
assertEquals(Term.createTerm("1"), binding);
}
@Test public void test3() throws PrologException {
SolveInfo solution = engine.solve("current_predicate(foo/A).");
assertFalse(solution.isSuccess());
}
@Test(expected=AssertionError.class)
public void test4() throws PrologException {
SolveInfo solution = engine.solve("current_predicate(Name/1).");
assertTrue(solution.isSuccess());
Term binding = solution.getTerm("Name");
assertEquals(Term.createTerm("elk"), binding);
solution = engine.solveNext();
assertTrue(solution.isSuccess());
assertEquals(Term.createTerm("insect"), binding);
}
@Test public void test5() throws PrologException {
SolveInfo solution = engine.solve("current_predicate(4).");
assertFalse(solution.isSuccess());
// TODO Should throw type_error(predicate_indicator, 4)
}
}