package com.declarativa.interprolog; import junit.framework.*; import java.util.*; import com.declarativa.interprolog.util.*; import javax.swing.*; public abstract class PrologEngineTest extends TestCase{ public PrologEngine engine=null; protected int thisID; public PrologEngineTest(String name){ super(name); } //defined in subclasses: //protected abstract void setUp() throws java.lang.Exception; //protected abstract void tearDown() throws java.lang.Exception; public void loadTestFile(){ engine.consultFromPackage("tests.P",PrologEngineTest.class); } public static class NumberTypes implements java.io.Serializable{ byte b; short s; int i; float f; public NumberTypes(byte b,short s,int i, float f){ this.b=b; this.s=s; this.i=i; this.f=f; } public static ObjectExamplePair example(){ return new ObjectExamplePair( new NumberTypes(Byte.MIN_VALUE,Short.MIN_VALUE,PrologEngine.MIN_INT_VALUE,SMALL_FLOAT_VALUE), new NumberTypes(Byte.MAX_VALUE,Short.MAX_VALUE,PrologEngine.MAX_INT_VALUE,LARGE_FLOAT_VALUE) ); } public String toString(){ return "b=="+b+",s=="+s+",i=="+i+",f=="+f; } public boolean equals(Object o){ if (!(o instanceof NumberTypes)) return false; NumberTypes io = (NumberTypes)o; return io.b==b && io.s==s && io.i==i && io.f==f; } } // floats not very precise on XSB Prolog, let's use reasonable values: static final float SMALL_FLOAT_VALUE = (float)-3.14159; static final float LARGE_FLOAT_VALUE = (float)817.3E4; public void testNumbers(){ ObjectExamplePair[] examples = {NumberTypes.example()}; engine.teachMoreObjects(examples); engine.waitUntilIdle(); String g = "ipObjectSpec('com.declarativa.interprolog.PrologEngineTest$NumberTypes',Min,["; g += Byte.MIN_VALUE+","+SMALL_FLOAT_VALUE+","+PrologEngine.MIN_INT_VALUE+","+Short.MIN_VALUE+"],_), "; g += "ipObjectSpec('com.declarativa.interprolog.PrologEngineTest$NumberTypes',Max,["; g += Byte.MAX_VALUE+","+LARGE_FLOAT_VALUE+","+PrologEngine.MAX_INT_VALUE+","+Short.MAX_VALUE+"],_)"; NumberTypes MIN = new NumberTypes(Byte.MIN_VALUE,Short.MIN_VALUE,PrologEngine.MIN_INT_VALUE,SMALL_FLOAT_VALUE); NumberTypes MAX = new NumberTypes(Byte.MAX_VALUE,Short.MAX_VALUE,PrologEngine.MAX_INT_VALUE,LARGE_FLOAT_VALUE); Object [] args = {MIN,MAX}; assertTrue("Numbers well sent",engine.deterministicGoal(g,"[Min,Max]",args)); Object [] bindings = engine.deterministicGoal(g,"[Min,Max]"); assertEquals("MIN arrived well",MIN,bindings[0]); assertEquals("MAX arrived well",MAX,bindings[1]); } public static class MyClass implements java.io.Serializable{ int one,two; public MyClass(){one=0;two=0;} } public void testPrototypeStuff(){ engine.teachOneObject(new MyClass()); String g = "ipObjectSpec('com.declarativa.interprolog.PrologEngineTest$MyClass',[one=1,two=2],Obj)"; g += ", ipObjectSpec('com.declarativa.interprolog.PrologEngineTest$MyClass',[one=One,two=Two],Obj), Three is One+Two, "; g += "ipObjectSpec('java.lang.Integer',[value=Three],Integer)"; Object[] bindings = engine.deterministicGoal(g,"[Obj,Integer]"); MyClass result0 = (MyClass)bindings[0]; assertTrue( 1==result0.one );assertTrue( 2==result0.two ); assertEquals(new Integer(3),bindings[1]); } public void testAutoTermModel(){ Object[] bindings = engine.deterministicGoal("X=1,Y=hello(complex(term))",null); assertEquals(bindings.length,1); assertTrue(bindings[0] instanceof TermModel); } public void testBuildTermModel(){ TermModel t1 = (TermModel)engine.deterministicGoal("buildTermModel(a(b,c(1)),Model)","[Model]")[0]; assertEquals("a(b,c(1))",t1.toString()); assertEquals("a(_,_)",t1.getTemplate()); assertEquals(2,t1.getChildCount()); TermModel t2 = (TermModel)engine.deterministicGoal("buildTermModel(a(X,c(X)),Model)","[Model]")[0]; TermModel t2child = (TermModel)t2.getChild(0); assertTrue("Child is var",t2child.isVar()); Object t3 = t2.clone(); assertEquals(t2.toString(),t3.toString()); t2.assignToVar((VariableNode) t2child.node, "someX"); assertEquals("a(someX,c(someX))",t2.toString()); Object[] passed = {t2,t3}; String g = "recoverTermModel(Model3,T3), arg(1,T3,X), arg(2,T3,c(XX)), XX==X, recoverTermModel(Model2,T2), T2=T3, "; g += "arg(1,T2,someX), functor(T2,F,N), ipObjectSpec('java.lang.Integer',Integer,[N],_)"; Object[] bindings = engine.deterministicGoal(g, "[Model2,Model3]", passed,"[string(F),Integer]"); assertTrue(bindings!=null); assertEquals("a",bindings[0]); assertEquals(new Integer(2),bindings[1]); } public void testDeterministicGoal(){ engine.command("import append/3,length/2 from basics"); engine.waitUntilAvailable(); Object[] objects = {new Float(16.25),new Float(0.0), new Float(15.5)}; Object[] bindings = engine.deterministicGoal( "append([97,98],[99,100],L), length(L,N), ipObjectSpec('java.lang.Integer',Integer,[N],_), name(A,L),"+ "assert(foofoo(Objects))", "Objects", objects, "[Integer,string(A)]" ); assertTrue("Got a result",bindings!=null); assertEquals("First result",bindings[0],new Integer(4)); assertEquals("Second result",bindings[1],"abcd"); Object[] floats = engine.deterministicGoal("foofoo([F1,F2,F3])","[F1,F2,F3]"); assertTrue("succeeded",floats!=null); assertEquals(floats[0],new Float(16.25)); assertEquals(floats[1],new Float(0.0)); assertEquals("Third float OK",floats[2],new Float(15.5)); assertTrue(engine.deterministicGoal("true")); try{ engine.deterministicGoal("foofoo(BadThingCausingGrammarFailure)","[BadThingCausingGrammarFailure]"); fail("should raise an IPException due to grammar failure"); } catch (IPException e){ assertTrue("IPException should complain about spec. of result bindings:"+e,e.toString().indexOf("bindings")!=-1); } try{ engine.deterministicGoal("bad goal"); fail("should raise an IPException with syntax error"); } catch (IPException e){ assertTrue("IPException should denote syntax error:"+e,e.toString().indexOf("Syntax")!=-1); } assertTrue("Engine ready2",engine.isIdle()); assertTrue("Engine working",engine.deterministicGoal("true")); try{ engine.deterministicGoal("true","BadResultsList"); fail("should raise an IPException complaining about lack of a Prolog list"); } catch (IPException e){} assertTrue("Engine ready1",engine.isIdle()); java.util.Vector v = new java.util.Vector(); v.addElement(objects); v.addElement("Hello there"); for(int i=0;i<30;i++){ Vector vv=new Vector(); for (int j=0;j<100;j++) vv.addElement(new Integer(j)); v.addElement(vv); } assertTrue(engine.deterministicGoal("import streamContents/4 from interprolog")); engine.waitUntilAvailable(); engine.command("import ground/1, length/2, append/3 from basics"); Object [] toSerialize = {v}; String g = "streamContents([Object],handles(NH,_),Bytes,[]), length(Bytes,NB), "; g += "ipObjectSpec('java.lang.Integer',IntegerNH,[NH],_), ipObjectSpec('java.lang.Integer',IntegerNB,[NB],_)"; long tortureStart= System.currentTimeMillis(); Object [] yetanother = engine.deterministicGoal(g,"[Object]",toSerialize,"[Object,IntegerNH,IntegerNB]"); long duration = System.currentTimeMillis()-tortureStart; int nbytes = ((Integer)yetanother[2]).intValue(); System.out.println("Bulk torture took "+(duration)+" mS ("+(1000*nbytes/duration)+" bytes gone and returned / second)"); // Win98, Celeron 400 MHz: 4670 ms // Win NT4 Workstation, Pentium 400 MHz: 4607 mS (7128 bytes gone and returned / second) // Win 2k, Pentium 400 MHz: 7221 mS (4548 bytes gone and returned / second) /* System.out.println(yetanother[0]); System.out.println(yetanother[1]); System.out.println(yetanother[2]);*/ // If Vector's internals change in subsequent Java releases review these values by printing them above: assertEquals(new Integer(3072),yetanother[1]); assertEquals(new Integer(32843),yetanother[2]); assertTrue(yetanother[0] instanceof java.util.Vector); tortureStart= System.currentTimeMillis(); int ngoals=3; for (int i=0;i20); } public static class ConfigurationItem implements java.io.Serializable{ String feature,value; public String toString(){ return "FEATURE "+feature+" HAS VALUE "+value; } } public void testXSBstuff(){ // The following is too complicated for the assertion presently tested, but ready for deeper stuff: engine.teachOneObject(new ConfigurationItem()); String g = "F=install_dir, findall(Obj, (xsb_configuration(F,V), "; g += "ipObjectSpec('com.declarativa.interprolog.PrologEngineTest$ConfigurationItem',[feature=string(F),value=string(V)],Obj)"; g += "),L), ipObjectSpec('ArrayOfObject',L,Array)"; Object[] items = (Object[])engine.deterministicGoal(g,"[Array]")[0]; ConfigurationItem item = (ConfigurationItem) items[0]; assertTrue(AllTests.startCommand.indexOf(item.value)!=-1); } public static class Loop implements java.io.Serializable{ Loop next; } public void testLoops(){ engine.teachOneObject(new Loop()); Loop L = new Loop(); L.next=L; assertTrue(engine.deterministicGoal("true","[L]",new Object[]{L})); // but if you replace true by write(L).. } public int somaN(int n) { Object[] bindings = engine.deterministicGoal ( "somaN("+n+",X), ipObjectSpec('java.lang.Integer',Spec,[X],_)", "[Spec]" ); return ((Integer)bindings[0]).intValue(); } public void testSomaN(){ engine.waitUntilIdle(); engine.command("ipObjectSpec('InvisibleObject',_T,["+thisID+"],_),"+ "assert(ipSomaN(_T))"); engine.waitUntilIdle(); Object[] bindings = engine.deterministicGoal ( "somaN(10,X), ipObjectSpec('java.lang.Integer',Spec,[X],_)", "[Spec]" ); Integer result = (Integer)bindings[0]; assertTrue ("Got a result",bindings!=null); engine.progressMessage("result: "+bindings[0]); assertEquals ("First result",result, new Integer (55)); } public int fibonaci(int n) { Object[] bindings = engine.deterministicGoal ( "fib("+n+",X), ipObjectSpec('java.lang.Integer',Spec,[X],_)", "[Spec]" ); return ((Integer)bindings[0]).intValue(); } public void testFibonaci(){ engine.command("ipObjectSpec('InvisibleObject',_T,["+thisID+"],_),"+ "assert(ipFibonaci(_T))"); engine.waitUntilIdle(); Object[] bindings = engine.deterministicGoal ( "fib(10,X), ipObjectSpec('java.lang.Integer',Spec,[X],_)", "[Spec]" ); Integer result = (Integer)bindings[0]; assertTrue ("Got a result",bindings!=null); engine.progressMessage("result: "+bindings[0]); assertEquals ("First result",result, new Integer (89)); } public int factorial(int n) { Object[] bindings = engine.deterministicGoal ( "fac("+n+",X), ipObjectSpec('java.lang.Integer',Spec,[X],_)", "[Spec]" ); return ((Integer)bindings[0]).intValue(); } public void testFactorial(){ engine.command("ipObjectSpec('InvisibleObject',_T,["+thisID+"],_),"+ "assert(ipFactorial(_T))"); engine.waitUntilIdle(); Object[] bindings = engine.deterministicGoal ( "fac(7,X), ipObjectSpec('java.lang.Integer',Spec,[X],_)", "[Spec]" ); Integer result = (Integer)bindings[0]; assertTrue ("Got a result",bindings!=null); engine.progressMessage("result: "+bindings[0]); assertEquals ("First result",result, new Integer (5040)); } }