/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.ide.common.modeldriven; import java.util.List; import junit.framework.TestCase; import org.drools.ide.common.client.modeldriven.brl.ActionRetractFact; import org.drools.ide.common.client.modeldriven.brl.ActionSetField; import org.drools.ide.common.client.modeldriven.brl.CompositeFactPattern; import org.drools.ide.common.client.modeldriven.brl.CompositeFieldConstraint; import org.drools.ide.common.client.modeldriven.brl.ConnectiveConstraint; import org.drools.ide.common.client.modeldriven.brl.DSLSentence; import org.drools.ide.common.client.modeldriven.brl.FactPattern; import org.drools.ide.common.client.modeldriven.brl.IAction; import org.drools.ide.common.client.modeldriven.brl.IPattern; import org.drools.ide.common.client.modeldriven.brl.BaseSingleFieldConstraint; import org.drools.ide.common.client.modeldriven.brl.RuleAttribute; import org.drools.ide.common.client.modeldriven.brl.RuleMetadata; import org.drools.ide.common.client.modeldriven.brl.RuleModel; import org.drools.ide.common.client.modeldriven.brl.SingleFieldConstraint; import com.thoughtworks.xstream.XStream; public class RuleModelTest extends TestCase { public void testAddItemLhs() { final RuleModel model = new RuleModel(); final FactPattern x = new FactPattern(); model.addLhsItem(x); assertEquals(1, model.lhs.length); final FactPattern y = new FactPattern(); model.addLhsItem(y); assertEquals(2, model.lhs.length); assertEquals(x, model.lhs[0]); assertEquals(y, model.lhs[1]); } public void testAddItemRhs() { final RuleModel model = new RuleModel(); final IAction a0 = new ActionSetField(); final IAction a1 = new ActionSetField(); model.addRhsItem(a0); assertEquals(1, model.rhs.length); model.addRhsItem(a1); assertEquals(2, model.rhs.length); assertEquals(a0, model.rhs[0]); assertEquals(a1, model.rhs[1]); } public void testAllVariableBindings() { final RuleModel model = new RuleModel(); model.lhs = new IPattern[2]; final FactPattern x = new FactPattern("Car"); model.lhs[0] = x; x.boundName = "boundFact"; SingleFieldConstraint sfc = new SingleFieldConstraint("q"); x.addConstraint(sfc); sfc.setFieldBinding("field1"); SingleFieldConstraint sfc2 = new SingleFieldConstraint("q"); x.addConstraint(sfc2); sfc2.setFieldBinding("field2"); model.lhs[1] = new CompositeFactPattern(); List vars = model.getAllVariables(); assertEquals(3, vars.size()); assertEquals("boundFact", vars.get(0)); assertEquals("field1", vars.get(1)); assertEquals("field2", vars.get(2)); assertTrue(model.isVariableNameUsed("field2")); } public void testAttributes() { final RuleModel m = new RuleModel(); final RuleAttribute at = new RuleAttribute("salience", "42"); m.addAttribute(at); assertEquals(1, m.attributes.length); assertEquals(at, m.attributes[0]); final RuleAttribute at2 = new RuleAttribute("agenda-group", "x"); m.addAttribute(at2); assertEquals(2, m.attributes.length); assertEquals(at2, m.attributes[1]); m.removeAttribute(0); assertEquals(1, m.attributes.length); assertEquals(at2, m.attributes[0]); } public void testBindingList() { final RuleModel model = new RuleModel(); model.lhs = new IPattern[3]; final FactPattern x = new FactPattern("Car"); model.lhs[0] = x; x.boundName = "x"; final FactPattern y = new FactPattern("Car"); model.lhs[1] = y; y.boundName = "y"; final SingleFieldConstraint[] cons = new SingleFieldConstraint[2]; y.constraintList = new CompositeFieldConstraint(); y.constraintList.constraints = cons; cons[0] = new SingleFieldConstraint("age"); cons[0].setFieldBinding("qbc"); cons[0].setFieldType("String"); cons[0].connectives = new ConnectiveConstraint[1]; cons[0].connectives[0] = new ConnectiveConstraint("age", "String", "&", "x"); cons[0].connectives[0].setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cons[1] = new SingleFieldConstraint("make"); cons[1].setFieldType("Long"); cons[1].connectives = new ConnectiveConstraint[1]; cons[1].connectives[0] = new ConnectiveConstraint("make", "Long", "=", "2"); cons[1].connectives[0].setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); final FactPattern other = new FactPattern("House"); model.lhs[2] = other; final List b = model.getBoundFacts(); assertEquals(3, b.size()); assertEquals("x", b.get(0)); assertEquals("y", b.get(1)); assertEquals("qbc", b.get(2)); } public void testBoundFactFinder() { final RuleModel model = new RuleModel(); assertNull(model.getBoundFact("x")); model.lhs = new IPattern[3]; final FactPattern x = new FactPattern("Car"); model.lhs[0] = x; x.boundName = "x"; assertNotNull(model.getBoundFact("x")); assertEquals(x, model.getBoundFact("x")); final FactPattern y = new FactPattern("Car"); model.lhs[1] = y; y.boundName = "y"; final FactPattern other = new FactPattern("House"); model.lhs[2] = other; assertEquals(y, model.getBoundFact("y")); assertEquals(x, model.getBoundFact("x")); model.rhs = new IAction[1]; final ActionSetField set = new ActionSetField(); set.variable = "x"; model.rhs[0] = set; assertTrue(model.isBoundFactUsed("x")); assertFalse(model.isBoundFactUsed("y")); assertEquals(3, model.lhs.length); assertFalse(model.removeLhsItem(0)); assertEquals(3, model.lhs.length); final ActionRetractFact fact = new ActionRetractFact("q"); model.rhs[0] = fact; assertTrue(model.isBoundFactUsed("q")); assertFalse(model.isBoundFactUsed("x")); final XStream xt = new XStream(); xt.alias("rule", RuleModel.class); xt.alias("fact", FactPattern.class); xt.alias("retract", ActionRetractFact.class); final String brl = xt.toXML(model); System.out.println(brl); } public void testGetVariableNameForRHS() { RuleModel m = new RuleModel(); m.name = "blah"; FactPattern pat = new FactPattern(); pat.boundName = "pat"; pat.factType = "Person"; m.addLhsItem(pat); List l = m.getAllVariables(); assertEquals(1, l.size()); assertEquals("pat", l.get(0)); } public void testIsDSLEnhanced() throws Exception { RuleModel m = new RuleModel(); assertFalse(m.hasDSLSentences()); m.addLhsItem(new FactPattern()); assertFalse(m.hasDSLSentences()); m.addRhsItem(new ActionSetField("q")); assertFalse(m.hasDSLSentences()); m.addLhsItem(new DSLSentence()); assertTrue(m.hasDSLSentences()); m.addRhsItem(new DSLSentence()); assertTrue(m.hasDSLSentences()); m = new RuleModel(); m.addLhsItem(new DSLSentence()); assertTrue(m.hasDSLSentences()); m = new RuleModel(); m.addRhsItem(new DSLSentence()); assertTrue(m.hasDSLSentences()); } public void testMetaData() { final RuleModel m = new RuleModel(); final RuleMetadata rm = new RuleMetadata("foo", "bar"); // test add m.addMetadata(rm); assertEquals(1, m.metadataList.length); assertEquals(rm, m.metadataList[0]); // should be able to find it RuleMetadata gm = m.getMetaData("foo"); assertNotNull(gm); // test add and remove final RuleMetadata rm2 = new RuleMetadata("foo2", "bar2"); m.addMetadata(rm2); assertEquals(2, m.metadataList.length); assertEquals(rm2, m.metadataList[1]); assertEquals("@foo(bar)", rm.toString()); m.removeMetadata(0); assertEquals(1, m.metadataList.length); assertEquals(rm2, m.metadataList[0]); assertEquals("@foo2(bar2)", (m.metadataList[0]).toString()); // should be able to find it now that it was removed gm = m.getMetaData("foo"); assertNull(gm); // test add via update method m.updateMetadata(rm); gm = m.getMetaData("foo"); assertNotNull(gm); // test update of existing element rm.value = "bar2"; m.updateMetadata(rm); gm = m.getMetaData("foo"); assertNotNull(gm); assertEquals("bar2", gm.value); } public void testRemoveItemLhs() { final RuleModel model = new RuleModel(); model.lhs = new IPattern[3]; final FactPattern x = new FactPattern("Car"); model.lhs[0] = x; x.boundName = "x"; final FactPattern y = new FactPattern("Car"); model.lhs[1] = y; y.boundName = "y"; final FactPattern other = new FactPattern("House"); model.lhs[2] = other; assertEquals(3, model.lhs.length); assertEquals(x, model.lhs[0]); model.removeLhsItem(0); assertEquals(2, model.lhs.length); assertEquals(y, model.lhs[0]); } public void testRemoveItemRhs() { final RuleModel model = new RuleModel(); model.rhs = new IAction[3]; final ActionRetractFact r0 = new ActionRetractFact("x"); final ActionRetractFact r1 = new ActionRetractFact("y"); final ActionRetractFact r2 = new ActionRetractFact("z"); model.rhs[0] = r0; model.rhs[1] = r1; model.rhs[2] = r2; model.removeRhsItem(1); assertEquals(2, model.rhs.length); assertEquals(r0, model.rhs[0]); assertEquals(r2, model.rhs[1]); } public void testScopedVariables() { // setup the data... final RuleModel model = new RuleModel(); model.lhs = new IPattern[3]; final FactPattern x = new FactPattern("Car"); model.lhs[0] = x; x.boundName = "x"; final FactPattern y = new FactPattern("Car"); model.lhs[1] = y; y.boundName = "y"; final SingleFieldConstraint[] cons = new SingleFieldConstraint[2]; y.constraintList = new CompositeFieldConstraint(); y.constraintList.constraints = cons; cons[0] = new SingleFieldConstraint("age"); cons[1] = new SingleFieldConstraint("make"); cons[0].setFieldBinding("qbc"); cons[0].connectives = new ConnectiveConstraint[1]; cons[0].connectives[0] = new ConnectiveConstraint("age", null, "&", "x"); cons[0].connectives[0].setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); final FactPattern other = new FactPattern("House"); model.lhs[2] = other; other.boundName = "q"; final SingleFieldConstraint[] cons2 = new SingleFieldConstraint[1]; cons2[0] = new SingleFieldConstraint(); other.constraintList = new CompositeFieldConstraint(); other.constraintList.constraints = cons2; // check the results for correct scope List vars = model.getBoundVariablesInScope(cons[0]); assertEquals(1, vars.size()); assertEquals("x", vars.get(0)); vars = model.getBoundVariablesInScope(cons[0].connectives[0]); assertEquals(1, vars.size()); assertEquals("x", vars.get(0)); vars = model.getBoundVariablesInScope(cons[1]); assertEquals(2, vars.size()); assertEquals("x", vars.get(0)); assertEquals("qbc", vars.get(1)); vars = model.getBoundVariablesInScope(cons[0]); assertEquals(1, vars.size()); assertEquals("x", vars.get(0)); vars = model.getBoundVariablesInScope(cons2[0]); assertEquals(3, vars.size()); assertEquals("x", vars.get(0)); assertEquals("qbc", vars.get(1)); assertEquals("y", vars.get(2)); } public void testScopedVariablesWithCompositeFact() { RuleModel m = new RuleModel(); FactPattern p = new FactPattern(); CompositeFieldConstraint cf = new CompositeFieldConstraint(); cf.addConstraint(new SingleFieldConstraint("x")); p.addConstraint(cf); SingleFieldConstraint sf = new SingleFieldConstraint("q"); sf.setFieldBinding("abc"); p.addConstraint(sf); SingleFieldConstraint sf2 = new SingleFieldConstraint("q"); sf2.setFieldBinding("qed"); cf.addConstraint(sf2); m.addLhsItem(p); List vars = m.getAllVariables(); assertEquals(1, vars.size()); assertEquals("abc", vars.get(0)); } public void testGetFieldConstraint() { final RuleModel model = new RuleModel(); model.lhs = new IPattern[3]; final FactPattern x = new FactPattern("Boat"); model.lhs[0] = x; x.boundName = "x"; final FactPattern y = new FactPattern("Car"); model.lhs[1] = y; y.boundName = "y"; final SingleFieldConstraint[] cons = new SingleFieldConstraint[2]; y.constraintList = new CompositeFieldConstraint(); y.constraintList.constraints = cons; cons[0] = new SingleFieldConstraint("age"); cons[0].setFieldBinding("qbc"); cons[0].setFieldType("String"); cons[0].connectives = new ConnectiveConstraint[1]; cons[0].connectives[0] = new ConnectiveConstraint("age", "String", "&", "x"); cons[0].connectives[0].setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); cons[1] = new SingleFieldConstraint("make"); cons[1].setFieldType("Long"); cons[1].connectives = new ConnectiveConstraint[1]; cons[1].connectives[0] = new ConnectiveConstraint("make", "Long", "=", "2"); cons[1].connectives[0].setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL); final FactPattern other = new FactPattern("House"); model.lhs[2] = other; other.boundName = "q"; final SingleFieldConstraint[] cons2 = new SingleFieldConstraint[1]; cons2[0] = new SingleFieldConstraint(); other.constraintList = new CompositeFieldConstraint(); other.constraintList.constraints = cons2; String varTypeString = model.getBindingType("qbc"); assertEquals("String", varTypeString); String varTypeLong = model.getBindingType("make"); assertEquals(null, varTypeLong); FactPattern varTypeBoat = model.getBoundFact("x"); assertEquals("Boat", varTypeBoat.factType); FactPattern varTypeCar = model.getBoundFact("y"); assertEquals("Car", varTypeCar.factType); } public void testAddItemLhsAtSpecificPosition() { final RuleModel model = new RuleModel(); final FactPattern a = new FactPattern(); model.addLhsItem(a); assertEquals(1, model.lhs.length); final FactPattern b = new FactPattern(); model.addLhsItem(b); assertEquals(2, model.lhs.length); final FactPattern c = new FactPattern(); model.addLhsItem(c,true); assertEquals(3, model.lhs.length); assertEquals(a, model.lhs[0]); assertEquals(b, model.lhs[1]); assertEquals(c, model.lhs[2]); final FactPattern d = new FactPattern(); model.addLhsItem(d,false); assertEquals(4, model.lhs.length); assertEquals(d, model.lhs[0]); assertEquals(a, model.lhs[1]); assertEquals(b, model.lhs[2]); assertEquals(c, model.lhs[3]); final FactPattern e = new FactPattern(); model.addLhsItem(e,2); assertEquals(5, model.lhs.length); assertEquals(d, model.lhs[0]); assertEquals(a, model.lhs[1]); assertEquals(e, model.lhs[2]); assertEquals(b, model.lhs[3]); assertEquals(c, model.lhs[4]); //test auto-bound final FactPattern f = new FactPattern(); final FactPattern g = new FactPattern(); model.addLhsItem(f,-1); model.addLhsItem(g,100); assertEquals(7, model.lhs.length); assertEquals(f, model.lhs[0]); assertEquals(d, model.lhs[1]); assertEquals(a, model.lhs[2]); assertEquals(e, model.lhs[3]); assertEquals(b, model.lhs[4]); assertEquals(c, model.lhs[5]); assertEquals(g, model.lhs[6]); model.moveLhsItemDown(5); model.moveLhsItemUp(3); assertEquals(7, model.lhs.length); assertEquals(f, model.lhs[0]); assertEquals(d, model.lhs[1]); assertEquals(e, model.lhs[2]); assertEquals(a, model.lhs[3]); assertEquals(b, model.lhs[4]); assertEquals(g, model.lhs[5]); assertEquals(c, model.lhs[6]); model.moveLhsItemUp(0); model.moveLhsItemDown(6); assertEquals(7, model.lhs.length); assertEquals(f, model.lhs[0]); assertEquals(d, model.lhs[1]); assertEquals(e, model.lhs[2]); assertEquals(a, model.lhs[3]); assertEquals(b, model.lhs[4]); assertEquals(g, model.lhs[5]); assertEquals(c, model.lhs[6]); } public void testAddItemRhsAtSpecificPosition() { final RuleModel model = new RuleModel(); final ActionSetField a = new ActionSetField(); model.addRhsItem(a); assertEquals(1, model.rhs.length); final ActionSetField b = new ActionSetField(); model.addRhsItem(b); assertEquals(2, model.rhs.length); final ActionSetField c = new ActionSetField(); model.addRhsItem(c,true); assertEquals(3, model.rhs.length); assertEquals(a, model.rhs[0]); assertEquals(b, model.rhs[1]); assertEquals(c, model.rhs[2]); final ActionSetField d = new ActionSetField(); model.addRhsItem(d,false); assertEquals(4, model.rhs.length); assertEquals(d, model.rhs[0]); assertEquals(a, model.rhs[1]); assertEquals(b, model.rhs[2]); assertEquals(c, model.rhs[3]); final ActionSetField e = new ActionSetField(); model.addRhsItem(e,2); assertEquals(5, model.rhs.length); assertEquals(d, model.rhs[0]); assertEquals(a, model.rhs[1]); assertEquals(e, model.rhs[2]); assertEquals(b, model.rhs[3]); assertEquals(c, model.rhs[4]); //test auto-bound final ActionSetField f = new ActionSetField(); final ActionSetField g = new ActionSetField(); model.addRhsItem(f,-1); model.addRhsItem(g,100); assertEquals(7, model.rhs.length); assertEquals(f, model.rhs[0]); assertEquals(d, model.rhs[1]); assertEquals(a, model.rhs[2]); assertEquals(e, model.rhs[3]); assertEquals(b, model.rhs[4]); assertEquals(c, model.rhs[5]); assertEquals(g, model.rhs[6]); model.moveRhsItemDown(5); model.moveRhsItemUp(3); assertEquals(7, model.rhs.length); assertEquals(f, model.rhs[0]); assertEquals(d, model.rhs[1]); assertEquals(e, model.rhs[2]); assertEquals(a, model.rhs[3]); assertEquals(b, model.rhs[4]); assertEquals(g, model.rhs[5]); assertEquals(c, model.rhs[6]); model.moveRhsItemUp(0); model.moveRhsItemDown(6); assertEquals(7, model.rhs.length); assertEquals(f, model.rhs[0]); assertEquals(d, model.rhs[1]); assertEquals(e, model.rhs[2]); assertEquals(a, model.rhs[3]); assertEquals(b, model.rhs[4]); assertEquals(g, model.rhs[5]); assertEquals(c, model.rhs[6]); } }