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 FunctorTest { Prolog engine; @Before public void setUp() { engine = new Prolog(); } @Test public void test0() throws PrologException { SolveInfo solution = engine.solve("functor(foo(a, b, c), foo, 3)."); assertTrue(solution.isSuccess()); } @Test public void test1() throws PrologException { SolveInfo solution = engine.solve("functor(foo(a), foo, 2)."); assertFalse(solution.isSuccess()); } @Test public void test2() throws PrologException { SolveInfo solution = engine.solve("functor(foo(a), fo, 1)."); assertFalse(solution.isSuccess()); } @Test public void test3() throws PrologException { SolveInfo solution = engine.solve("functor([_|_], '.', 2)."); assertTrue(solution.isSuccess()); } @Test public void test4() throws PrologException { SolveInfo solution = engine.solve("functor([], [], 0)."); assertTrue(solution.isSuccess()); } @Test public void test5() throws PrologException { SolveInfo solution = engine.solve("functor(foo(a, b, c), X, Y)."); assertTrue(solution.isSuccess()); Term binding = solution.getTerm("X"); assertEquals(Term.createTerm("foo"), binding); binding = solution.getTerm("Y"); assertEquals(Term.createTerm("3"), binding); } @Test public void test6() throws PrologException { SolveInfo solution = engine.solve("functor(X, foo, 3)."); assertTrue(solution.isSuccess()); Term binding = solution.getTerm("X"); // X = foo(_, _, _) assertTrue(binding.isCompound()); Struct foo = (Struct) binding; assertEquals(3, foo.getArity()); assertEquals("foo", foo.getName()); Term arg = foo.getArg(0); assertTrue(arg instanceof Var); assertTrue(((Var) arg).isAnonymous()); arg = foo.getArg(1); assertTrue(arg instanceof Var); assertTrue(((Var) arg).isAnonymous()); arg = foo.getArg(2); assertTrue(arg instanceof Var); assertTrue(((Var) arg).isAnonymous()); } @Test public void test7() throws PrologException { SolveInfo solution = engine.solve("functor(X, foo, 0)."); assertTrue(solution.isSuccess()); Term binding = solution.getTerm("X"); assertEquals(Term.createTerm("foo"), binding); } @Test public void test8() throws PrologException { SolveInfo solution = engine.solve("functor(mats(A, B), A, B)."); assertTrue(solution.isSuccess()); Term binding = solution.getTerm("A"); assertEquals(Term.createTerm("mats"), binding); binding = solution.getTerm("B"); assertEquals(Term.createTerm("2"), binding); } @Test public void test9() throws PrologException { SolveInfo solution = engine.solve("functor(1, X, Y)."); assertTrue(solution.isSuccess()); Term binding = solution.getTerm("X"); assertEquals(Term.createTerm("1"), binding); binding = solution.getTerm("Y"); assertEquals(Term.createTerm("0"), binding); } @Test public void test10() throws PrologException { SolveInfo solution = engine.solve("functor(X, 1.1, 0)."); assertTrue(solution.isSuccess()); Term binding = solution.getTerm("X"); assertEquals(Term.createTerm("1.1"), binding); } @Test public void test11() throws PrologException { SolveInfo solution = engine.solve("functor(X, Y, 3)."); assertFalse(solution.isSuccess()); // TODO Should throw instantiation_error } @Test public void test12() throws PrologException { SolveInfo solution = engine.solve("functor(X, foo, N)."); assertFalse(solution.isSuccess()); // TODO Should throw instantiation_error } @Test public void test13() throws PrologException { SolveInfo solution = engine.solve("functor(X, foo, a)."); assertFalse(solution.isSuccess()); // TODO Should throw type_error(integer, a) } @Test public void test14() throws PrologException { SolveInfo solution = engine.solve("functor(F, 1.5, 1)."); assertFalse(solution.isSuccess()); // TODO Should throw type_error(atom, 1.5) } @Test public void test15() throws PrologException { SolveInfo solution = engine.solve("functor(F, foo(a), 1)."); assertFalse(solution.isSuccess()); // TODO Should throw type_error(atomic, foo(a)) } @Test public void test16() throws PrologException { SolveInfo solution = engine.solve("current_prolog_flag(max_arity, A), X is A + 1, functor(T, foo, X)."); assertFalse(solution.isSuccess()); // TODO Should throw representation_error(max_arity) } @Test public void test17() throws PrologException { SolveInfo solution = engine.solve("Minus1 is 0 - 1, functor(F, foo, Minus1)."); assertFalse(solution.isSuccess()); // TODO Should throw domain_error(not_less_than_zero, -1) } }