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 LengthTest {
Prolog engine;
@Before
public void setUp() {
engine = new Prolog();
}
@Test public void atomLength() throws PrologException {
SolveInfo solution = engine.solve("length(scarlet, 7).");
assertFalse(solution.isSuccess());
}
@Test public void emptyList() throws PrologException {
SolveInfo solution = engine.solve("length([], 0).");
assertTrue(solution.isSuccess());
}
@Test(expected=AssertionError.class)
public void variableLength() throws PrologException {
SolveInfo solution = engine.solve("length(X, 4).");
assertTrue(solution.isSuccess());
Term[] items = new Term[] {new Var(), new Var(), new Var(), new Var()};
assertEquals(new Struct(items), solution.getTerm("X"));
}
@Test public void variableNegativeLength() throws PrologException {
SolveInfo solution = engine.solve("length(A, -1).");
assertFalse(solution.isSuccess());
}
@Test(expected=AssertionError.class)
public void generativeEffectOnList() throws PrologException {
SolveInfo solution = engine.solve("length(L, S).");
assertTrue(solution.isSuccess());
assertEquals(new Int(0), solution.getTerm("S"));
assertEquals(new Struct(), solution.getTerm("L"));
solution = engine.solveNext();
assertTrue(solution.isSuccess());
assertEquals(new Int(1), solution.getTerm("S"));
assertEquals(new Struct(new Term[] {new Var()}), solution.getTerm("L"));
solution = engine.solveNext();
assertTrue(solution.isSuccess());
assertEquals(new Int(2), solution.getTerm("S"));
assertEquals(new Struct(new Term[] {new Var(), new Var()}), solution.getTerm("L"));
assertTrue(engine.hasOpenAlternatives());
}
@Test(expected=AssertionError.class)
public void generativeEffectOnListTail() throws PrologException {
SolveInfo solution = engine.solve("length([1, 2 | T], X).");
assertTrue(solution.isSuccess());
assertEquals(new Int(2), solution.getTerm("X"));
assertEquals(new Struct(), solution.getTerm("T"));
solution = engine.solveNext();
assertTrue(solution.isSuccess());
assertEquals(new Int(3), solution.getTerm("X"));
assertEquals(new Struct(new Term[] {new Var()}), solution.getTerm("T"));
solution = engine.solveNext();
assertTrue(solution.isSuccess());
assertEquals(new Int(4), solution.getTerm("X"));
assertEquals(new Struct(new Term[] {new Var(), new Var()}), solution.getTerm("T"));
assertTrue(engine.hasOpenAlternatives());
}
}