package jadex.rules.test.rulesystem; import jadex.rules.rulesystem.IAction; import jadex.rules.rulesystem.ICondition; import jadex.rules.rulesystem.IRule; import jadex.rules.rulesystem.IVariableAssignments; import jadex.rules.rulesystem.RuleSystem; import jadex.rules.rulesystem.Rulebase; import jadex.rules.rulesystem.rete.RetePatternMatcherFunctionality; import jadex.rules.rulesystem.rules.AndCondition; import jadex.rules.rulesystem.rules.BoundConstraint; import jadex.rules.rulesystem.rules.FunctionCall; import jadex.rules.rulesystem.rules.IOperator; import jadex.rules.rulesystem.rules.ObjectCondition; import jadex.rules.rulesystem.rules.PredicateConstraint; import jadex.rules.rulesystem.rules.Rule; import jadex.rules.rulesystem.rules.Variable; import jadex.rules.rulesystem.rules.functions.OperatorFunction; import jadex.rules.state.IOAVState; import jadex.rules.state.OAVJavaType; import jadex.rules.state.javaimpl.OAVStateFactory; import java.util.ArrayList; import java.util.List; import junit.framework.TestCase; /** * Test if multi field splits are correct. */ public class MultifieldSplitTest extends TestCase { //-------- attributes -------- /** The state. */ protected IOAVState state; /** The rule system. */ protected RuleSystem system; /** The list is filled by the action of the condition. */ protected List result; //-------- constructors -------- /** * Test setup. */ protected void setUp() throws Exception { state = OAVStateFactory.createOAVState(Numberbox.numberbox_type_model); result = new ArrayList(); // Create rule system. Rulebase rb = new Rulebase(); system = new RuleSystem(state, rb, new RetePatternMatcherFunctionality(rb)); system.init(); } //-------- test methods -------- /** * Test all neighbors are found. */ public void testNeighborsTrigger() { // Find all pairs of neighboring numbers // Numberbox ($?c1, ?x, ?y, $?c2) ObjectCondition cond = new ObjectCondition(Numberbox.numberbox_type); List pattern = new ArrayList(); pattern.add(new Variable("$?c1", OAVJavaType.java_integer_type, true, false)); pattern.add(new Variable("?x", OAVJavaType.java_integer_type)); pattern.add(new Variable("?y", OAVJavaType.java_integer_type)); pattern.add(new Variable("$?c2", OAVJavaType.java_integer_type, true, false)); cond.addConstraint(new BoundConstraint(Numberbox.numberbox_has_numbers, pattern, IOperator.EQUAL)); IRule rule = new Rule("neibors(x,y)", cond, new IAction() { public void execute(IOAVState state, IVariableAssignments assigments) { Object x = assigments.getVariableValue("?x"); Object y = assigments.getVariableValue("?y"); result.add("("+x+","+y+")"); } }); system.getRulebase().addRule(rule); // RetePanel.createReteFrame("Split test", ((RetePatternMatcher)system.getMatcher()).getReteNode()); // synchronized(system){system.wait();} // Add 5 numbers. Object nb = state.createRootObject(Numberbox.numberbox_type); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(1)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(3)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(2)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(5)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(4)); List test = new ArrayList(); test.add("(1,3)"); test.add("(3,2)"); test.add("(2,5)"); test.add("(5,4)"); system.fireAllRules(); assertEquals("The condition should trigger with: "+test, test, result); // System.out.println(result); system.getRulebase().removeRule(rule); } /** * Test all neighbors are found. */ public void testSameNeighborsTrigger() { // Find all pairs of neighboring same numbers // Numberbox ($?c1 ?x ?x $?c2) ObjectCondition cond = new ObjectCondition(Numberbox.numberbox_type); List pattern = new ArrayList(); pattern.add(new Variable("$?c1", OAVJavaType.java_integer_type, true, false)); pattern.add(new Variable("?x", OAVJavaType.java_integer_type)); pattern.add(new Variable("?x", OAVJavaType.java_integer_type)); pattern.add(new Variable("$?c2", OAVJavaType.java_integer_type, true, false)); cond.addConstraint(new BoundConstraint(Numberbox.numberbox_has_numbers, pattern, IOperator.EQUAL)); IRule rule = new Rule("neibors(x,x)", cond, new IAction() { public void execute(IOAVState state, IVariableAssignments assigments) { Object x = assigments.getVariableValue("?x"); //Object y = assigments.getVariableValue("?y"); result.add("("+x+")"); } }); system.getRulebase().addRule(rule); // RetePanel.createReteFrame("Split test", ((RetePatternMatcher)system.getMatcher()).getReteNode()); // try{synchronized(system){system.wait();}} catch(Exception e){} // Add 5 numbers. Object nb = state.createRootObject(Numberbox.numberbox_type); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(3)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(3)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(2)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(5)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(5)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(5)); //System.out.println(((RetePatternMatcher)system.getMatcher()).getReteMemory()); List test = new ArrayList(); test.add("(3)"); test.add("(5)"); test.add("(5)"); system.fireAllRules(); assertEquals("The condition should trigger with: "+test, test, result); // System.out.println(result); system.getRulebase().removeRule(rule); } /** * Test all neighbors are found. */ public void testPredicateNeighborsTrigger() { // Find all pairs of neighboring numbers with the second greater than the first // Numberbox ($?c1 ?x ?y $?c2) &:(?x<?y) ObjectCondition cond = new ObjectCondition(Numberbox.numberbox_type); List pattern = new ArrayList(); pattern.add(new Variable("$?c1", OAVJavaType.java_integer_type, true, false)); pattern.add(new Variable("?x", OAVJavaType.java_integer_type)); pattern.add(new Variable("?y", OAVJavaType.java_integer_type)); pattern.add(new Variable("$?c2", OAVJavaType.java_integer_type, true, false)); cond.addConstraint(new BoundConstraint(Numberbox.numberbox_has_numbers, pattern, IOperator.EQUAL)); FunctionCall fc = new FunctionCall(new OperatorFunction(IOperator.LESS), new Variable[]{ new Variable("?x", OAVJavaType.java_integer_type), new Variable("?y", OAVJavaType.java_integer_type) }); cond.addConstraint(new PredicateConstraint(fc)); IRule rule = new Rule("neibors(x,y) && x<y", cond, new IAction() { public void execute(IOAVState state, IVariableAssignments assigments) { Object x = assigments.getVariableValue("?x"); Object y = assigments.getVariableValue("?y"); result.add("("+x+","+y+")"); } }); system.getRulebase().addRule(rule); // RetePanel.createReteFrame("Split test", ((RetePatternMatcher)system.getMatcher()).getReteNode()); // synchronized(system){system.wait();} // Add 5 numbers. Object nb = state.createRootObject(Numberbox.numberbox_type); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(1)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(3)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(2)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(5)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(4)); List test = new ArrayList(); test.add("(1,3)"); //test.add("(3,2)"); test.add("(2,5)"); //test.add("(5,4)"); system.fireAllRules(); assertEquals("The condition should trigger with: "+test, test, result); // System.out.println(result); system.getRulebase().removeRule(rule); } /** * Test a multiple multi split. */ public void testMultiTrigger() { // Find all pairs of neighboring same numbers // Numberbox (numbers $?c1 ?x ?y $?c2) (numbers2 $?c3 ?y ?x $?c4) ObjectCondition cond = new ObjectCondition(Numberbox.numberbox_type); List pattern = new ArrayList(); pattern.add(new Variable("$?c1", OAVJavaType.java_integer_type, true, false)); pattern.add(new Variable("?x", OAVJavaType.java_integer_type)); pattern.add(new Variable("?y", OAVJavaType.java_integer_type)); pattern.add(new Variable("$?c2", OAVJavaType.java_integer_type, true, false)); cond.addConstraint(new BoundConstraint(Numberbox.numberbox_has_numbers, pattern, IOperator.EQUAL)); List pattern2 = new ArrayList(); pattern2.add(new Variable("$?c3", OAVJavaType.java_integer_type, true, false)); pattern2.add(new Variable("?y", OAVJavaType.java_integer_type)); pattern2.add(new Variable("?x", OAVJavaType.java_integer_type)); pattern2.add(new Variable("$?c4", OAVJavaType.java_integer_type, true, false)); cond.addConstraint(new BoundConstraint(Numberbox.numberbox_has_numbers2, pattern2, IOperator.EQUAL)); IRule rule = new Rule("neibors_numbers(x,y) && neibors_numbers2(y,x)", cond, new IAction() { public void execute(IOAVState state, IVariableAssignments assigments) { Object x = assigments.getVariableValue("?x"); Object y = assigments.getVariableValue("?y"); result.add("("+x+","+y+")"); } }); system.getRulebase().addRule(rule); // RetePanel.createReteFrame("Split test", ((RetePatternMatcher)system.getMatcher()).getReteNode()); // Add numbers. Object nb = state.createRootObject(Numberbox.numberbox_type); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(1)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(2)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(3)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(4)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(5)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers2, new Integer(5)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers2, new Integer(4)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers2, new Integer(3)); // System.out.println(((RetePatternMatcher)system.getMatcher()).getReteMemory()); // try{synchronized(system){system.wait();}} catch(Exception e){} List test = new ArrayList(); test.add("(3,4)"); test.add("(4,5)"); system.fireAllRules(); assertEquals("The condition should trigger with: "+test, test, result); // System.out.println(result); system.getRulebase().removeRule(rule); } /** * Test a multiple multi split. */ public void testJoinTrigger() { // Find all pairs of neighboring same numbers // Numberbox (numbers $?c1 ?x ?y $?c2) // Numberbox (numbers $?c3 ?y ?x $?c4) ObjectCondition cond1 = new ObjectCondition(Numberbox.numberbox_type); List pattern = new ArrayList(); pattern.add(new Variable("$?c1", OAVJavaType.java_integer_type, true, false)); pattern.add(new Variable("?x", OAVJavaType.java_integer_type)); pattern.add(new Variable("?y", OAVJavaType.java_integer_type)); pattern.add(new Variable("$?c2", OAVJavaType.java_integer_type, true, false)); cond1.addConstraint(new BoundConstraint(Numberbox.numberbox_has_numbers, pattern, IOperator.EQUAL)); ObjectCondition cond2 = new ObjectCondition(Numberbox.numberbox_type); List pattern2 = new ArrayList(); pattern2.add(new Variable("$?c3", OAVJavaType.java_integer_type, true, false)); pattern2.add(new Variable("?y", OAVJavaType.java_integer_type)); pattern2.add(new Variable("?x", OAVJavaType.java_integer_type)); pattern2.add(new Variable("$?c4", OAVJavaType.java_integer_type, true, false)); cond2.addConstraint(new BoundConstraint(Numberbox.numberbox_has_numbers, pattern2, IOperator.EQUAL)); IRule rule = new Rule("neibors_numbers(x,y) && neibors_numbers(y,x)", new AndCondition(new ICondition[]{cond1, cond2}), new IAction() { public void execute(IOAVState state, IVariableAssignments assigments) { Object x = assigments.getVariableValue("?x"); Object y = assigments.getVariableValue("?y"); result.add("("+x+","+y+")"); } }); system.getRulebase().addRule(rule); // RetePanel.createReteFrame("Split test", ((RetePatternMatcher)system.getMatcher()).getReteNode()); // Add numbers. Object nb = state.createRootObject(Numberbox.numberbox_type); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(1)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(2)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(3)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(4)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(5)); // System.out.println(((RetePatternMatcher)system.getMatcher()).getReteMemory()); Object nb2 = state.createRootObject(Numberbox.numberbox_type); state.addAttributeValue(nb2, Numberbox.numberbox_has_numbers, new Integer(5)); state.addAttributeValue(nb2, Numberbox.numberbox_has_numbers, new Integer(4)); state.addAttributeValue(nb2, Numberbox.numberbox_has_numbers, new Integer(3)); // System.out.println(((RetePatternMatcher)system.getMatcher()).getReteMemory()); // try{synchronized(system){system.wait();}} catch(Exception e){} List test = new ArrayList(); test.add("(5,4)"); test.add("(4,5)"); test.add("(4,3)"); test.add("(3,4)"); // Todo: which order would be correct? // test.add("(4,5)"); // test.add("(5,4)"); // test.add("(3,4)"); // test.add("(4,3)"); system.fireAllRules(); assertEquals("The condition should trigger with: "+test, test, result); system.getRulebase().removeRule(rule); } /** * Test multi select -> removed. Now collect node. * / public void testLiteralConstraints() { // Find all pairs of neighboring same numbers // Numberbox ($?numbers:(value < 5 && value > 2)) ObjectCondition cond = new ObjectCondition(Numberbox.numberbox_type); // todo: is there another way to specify that here a virtual extractor should be used BoundSelectConstraint bsc = new BoundSelectConstraint(Numberbox.numberbox_has_numbers, new Variable("$?numbers", OAVJavaType.java_integer_type, true), IOperator.EQUAL); bsc.addConstraint(new LiteralConstraint(null, new Integer(5), IOperator.LESS)); bsc.addConstraint(new LiteralConstraint(null, new Integer(2), IOperator.GREATER)); cond.addConstraint(bsc); IRule rule = new Rule("", cond, new IAction() { public void execute(IOAVState state, IVariableAssignments assigments) { Object x = assigments.getVariableValue("$?numbers"); result.add("("+x+")"); } }); system.getRulebase().addRule(rule); // RetePanel.createReteFrame("Split test", system, new Object()); // try{synchronized(system){system.wait();}} catch(Exception e){} // Add numbers. Object nb = state.createRootObject(Numberbox.numberbox_type); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(1)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(10)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(2)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(9)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(3)); state.addAttributeValue(nb, Numberbox.numberbox_has_numbers, new Integer(8)); system.fireAllRules(); //System.out.println(((RetePatternMatcher)system.getMatcher()).getReteMemory()); List test = new ArrayList(); test.add("([3])"); assertEquals("The condition should trigger with: "+test, test, result); // System.out.println(result); system.getRulebase().removeRule(rule); }*/ /** * * @param args * / public static void main(String[] args) { try { MultifieldSplitTest test = new MultifieldSplitTest(); test.setUp(); test.testLiteralConstraints(); } catch(Exception e) { e.printStackTrace(); } }*/ }