package alice.tuprolog; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Iterator; import java.util.NoSuchElementException; import org.junit.Test; public class TermIteratorTestCase { @Test public void emptyIterator() { String theory = ""; Iterator<Term> i = Term.getIterator(theory); assertFalse(i.hasNext()); try { i.next(); fail(); } catch (NoSuchElementException expected) {} } @Test public void iterationCount() { String theory = "q(1)." + "\n" + "q(2)." + "\n" + "q(3)." + "\n" + "q(5)." + "\n" + "q(7)."; Iterator<Term> i = Term.getIterator(theory); int count = 0; for (; i.hasNext(); count++) i.next(); assertEquals(5, count); assertFalse(i.hasNext()); } @Test public void multipleHasNext() { String theory = "p. q. r."; Iterator<Term> i = Term.getIterator(theory); assertTrue(i.hasNext()); assertTrue(i.hasNext()); assertTrue(i.hasNext()); assertEquals(new Struct("p"), i.next()); } @Test public void multipleNext() { String theory = "p(X):-q(X),X>1." + "\n" + "q(1)." + "\n" + "q(2)." + "\n" + "q(3)." + "\n" + "q(5)." + "\n" + "q(7)."; Iterator<Term> i = Term.getIterator(theory); assertTrue(i.hasNext()); i.next(); // skip the first term assertEquals(new Struct("q", new Int(1)), i.next()); assertEquals(new Struct("q", new Int(2)), i.next()); assertEquals(new Struct("q", new Int(3)), i.next()); assertEquals(new Struct("q", new Int(5)), i.next()); assertEquals(new Struct("q", new Int(7)), i.next()); // no more terms assertFalse(i.hasNext()); try { i.next(); fail(); } catch (NoSuchElementException expected) {} } @Test public void iteratorOnInvalidTerm() { String t = "q(1)"; // missing the End-Of-Clause! try { Term.getIterator(t); fail(); } catch (InvalidTermException expected) {} } @Test public void iterationOnInvalidTheory() { String theory = "q(1)." + "\n" + "q(2)." + "\n" + "q(3) " + "\n" + // missing the End-Of-Clause! "q(5)." + "\n" + "q(7)."; Struct firstTerm = new Struct("q", new Int(1)); Struct secondTerm = new Struct("q", new Int(2)); Iterator<Term> i1 = Term.getIterator(theory); assertTrue(i1.hasNext()); assertEquals(firstTerm, i1.next()); assertTrue(i1.hasNext()); assertEquals(secondTerm, i1.next()); try { i1.hasNext(); fail(); } catch (InvalidTermException expected) {} Iterator<Term> i2 = Term.getIterator(theory); assertEquals(firstTerm, i2.next()); assertEquals(secondTerm, i2.next()); try { i2.next(); fail(); } catch (InvalidTermException expected) {} } @Test public void removeOperationNotSupported() { String theory = "p(1)."; Iterator<Term> i = Term.getIterator(theory); assertNotNull(i.next()); try { i.remove(); fail(); } catch (UnsupportedOperationException expected) {} } }