package alice.tuprolog; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; import org.junit.Test; import alice.tuprolog.event.SpyEvent; import alice.tuprolog.event.SpyListener; public class PrologTestCase { @Test public void engineInitialization() { Prolog engine = new Prolog(); assertEquals(4, engine.getCurrentLibraries().length); assertNotNull(engine.getLibrary("alice.tuprolog.lib.BasicLibrary")); assertNotNull(engine.getLibrary("alice.tuprolog.lib.ISOLibrary")); assertNotNull(engine.getLibrary("alice.tuprolog.lib.IOLibrary")); assertNotNull(engine.getLibrary("alice.tuprolog.lib.JavaLibrary")); } @Test public void loadLibraryAsString() throws InvalidLibraryException { Prolog engine = new Prolog(); engine.loadLibrary("alice.tuprolog.StringLibrary"); assertNotNull(engine.getLibrary("alice.tuprolog.StringLibrary")); } @Test public void loadLibraryAsObject() throws InvalidLibraryException { Prolog engine = new Prolog(); Library stringLibrary = new StringLibrary(); engine.loadLibrary(stringLibrary); assertNotNull(engine.getLibrary("alice.tuprolog.StringLibrary")); Library javaLibrary = new alice.tuprolog.lib.JavaLibrary(); engine.loadLibrary(javaLibrary); assertSame(javaLibrary, engine.getLibrary("alice.tuprolog.lib.JavaLibrary")); } @Test public void getLibraryWithName() throws InvalidLibraryException { Prolog engine = new Prolog(new String[] {"alice.tuprolog.TestLibrary"}); assertNotNull(engine.getLibrary("TestLibraryName")); } @Test public void unloadLibraryAfterLoadingTheory() throws Exception { Prolog engine = new Prolog(); assertNotNull(engine.getLibrary("alice.tuprolog.lib.IOLibrary")); Theory t = new Theory("a(1).\na(2).\n"); engine.setTheory(t); engine.unloadLibrary("alice.tuprolog.lib.IOLibrary"); assertNull(engine.getLibrary("alice.tuprolog.lib.IOLibrary")); } @Test public void addTheory() throws InvalidTheoryException { Prolog engine = new Prolog(); Theory t = new Theory("test :- notx existing(s)."); try { engine.addTheory(t); fail(); } catch (InvalidTheoryException expected) { assertEquals("", engine.getTheory().toString()); } } @Test public void spyListenerManagement() { Prolog engine = new Prolog(); SpyListener listener1 = new SpyListener() { @Override public void onSpy(SpyEvent e) {} }; SpyListener listener2 = new SpyListener() { @Override public void onSpy(SpyEvent e) {} }; engine.addSpyListener(listener1); engine.addSpyListener(listener2); assertEquals(2, engine.getSpyListenerList().size()); } @Test public void libraryListener() throws InvalidLibraryException { Prolog engine = new Prolog(new String[]{}); engine.loadLibrary("alice.tuprolog.lib.BasicLibrary"); engine.loadLibrary("alice.tuprolog.lib.IOLibrary"); TestPrologEventAdapter a = new TestPrologEventAdapter(); engine.addLibraryListener(a); engine.loadLibrary("alice.tuprolog.lib.JavaLibrary"); assertEquals("alice.tuprolog.lib.JavaLibrary", a.firstMessage); engine.unloadLibrary("alice.tuprolog.lib.JavaLibrary"); assertEquals("alice.tuprolog.lib.JavaLibrary", a.firstMessage); } @Test public void theoryListener() throws InvalidTheoryException { Prolog engine = new Prolog(); TestPrologEventAdapter a = new TestPrologEventAdapter(); engine.addTheoryListener(a); Theory t = new Theory("a(1).\na(2).\n"); engine.setTheory(t); assertEquals("", a.firstMessage); assertEquals("a(1).\n\na(2).\n\n", a.secondMessage); t = new Theory("a(3).\na(4).\n"); engine.addTheory(t); assertEquals("a(1).\n\na(2).\n\n", a.firstMessage); assertEquals("a(1).\n\na(2).\n\na(3).\n\na(4).\n\n", a.secondMessage); } @Test public void queryListener() throws Exception { Prolog engine = new Prolog(); TestPrologEventAdapter a = new TestPrologEventAdapter(); engine.addQueryListener(a); engine.setTheory(new Theory("a(1).\na(2).\n")); engine.solve("a(X)."); assertEquals("a(X)", a.firstMessage); assertEquals("yes.\nX / 1", a.secondMessage); engine.solveNext(); assertEquals("a(X)", a.firstMessage); assertEquals("yes.\nX / 2", a.secondMessage); } }