Author: mic...@jb... Date: 2006-04-28 06:48:46 -0400 (Fri, 28 Apr 2006) New Revision: 4003 Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/big_decimal_and_comparable.drl labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AndDescr.java labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Person.java labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/multiple_bindings.drl labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java Log: test coverage for dumper, comparable support Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AndDescr.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AndDescr.java 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/lang/descr/AndDescr.java 2006-04-28 10:48:46 UTC (rev 4003) @@ -36,7 +36,7 @@ if ( this.descrs == Collections.EMPTY_LIST ) { this.descrs = new ArrayList( 1 ); } -//MN: No pattern combining just yet +//MN: No pattern combining ?? // if ( patternDescr instanceof ColumnDescr ) { // addColumn( (ColumnDescr) patternDescr ); // } else { Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/xml/XmlDumper.java 2006-04-28 10:48:46 UTC (rev 4003) @@ -26,9 +26,9 @@ import org.drools.util.ReflectiveVisitor; /** - * + * This utility will take a AST of a rule package, and emit XML. + * This can be used in porting from DRL to XML. * @author <a href="mailto:jay...@gm...">Author Jayaram C S</a> - * */ public class XmlDumper extends ReflectiveVisitor implements Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Person.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Person.java 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Person.java 2006-04-28 10:48:46 UTC (rev 4003) @@ -16,6 +16,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import java.math.BigDecimal; +import java.math.BigInteger; @@ -23,6 +25,8 @@ private final String name; private final String likes; private final int age; + private BigDecimal bigDecimal; + private BigInteger bigInteger; private char sex; @@ -118,4 +122,24 @@ if ( sex != other.sex ) return false; return true; } + + + public BigDecimal getBigDecimal() { + return bigDecimal; + } + + + public void setBigDecimal(BigDecimal bigDecimal) { + this.bigDecimal = bigDecimal; + } + + + public BigInteger getBigInteger() { + return bigInteger; + } + + + public void setBigInteger(BigInteger bigInteger) { + this.bigInteger = bigInteger; + } } \ No newline at end of file Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/IntegrationCases.java 2006-04-28 10:48:46 UTC (rev 4003) @@ -25,6 +25,7 @@ import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.io.Reader; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -67,6 +68,7 @@ protected abstract RuleBase getRuleBase() throws Exception; public void testGlobals() throws Exception { + PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "globals_rule_test.drl" ) ) ); Package pkg = builder.getPackage(); @@ -214,7 +216,33 @@ assertEquals( bill, list.get( 0 ) ); } + + public void testBigDecimal() throws Exception { + + PackageBuilder builder = new PackageBuilder(); + builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "big_decimal_and_comparable.drl" ) ) ); + Package pkg = builder.getPackage(); + RuleBase ruleBase = getRuleBase(); + ruleBase.addPackage( pkg ); + WorkingMemory workingMemory = ruleBase.newWorkingMemory(); + + List list = new ArrayList(); + workingMemory.setGlobal( "list", + list ); + + Person bill = new Person( "bill", + null, + 12 ); + bill.setBigDecimal( new BigDecimal("42") ); + workingMemory.assertObject( new BigDecimal("43") ); + workingMemory.assertObject( bill ); + workingMemory.fireAllRules(); + + assertEquals( 1, + list.size() ); + } + public void testCell() throws Exception { Cell cell1 = new Cell( 9 ); Cell cell = new Cell( 0 ); Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java 2006-04-28 10:48:46 UTC (rev 4003) @@ -388,12 +388,14 @@ /** Note this is only to be enabled if we agree to combine patterns from columns bound to the same var. * At present, not a valid test. Refer to AndDescr and AndDescrTest (Michael Neale). */ - public void xxxtestMultiBindings() throws Exception { + public void XXXtestMultiBindings() throws Exception { RuleDescr rule = parseResource( "multiple_bindings.drl" ).rule(); assertNotNull( rule ); assertEquals( "simple_rule", rule.getName() ); - assertEquals(1, rule.getLhs().getDescrs().size()); + assertEquals(2, rule.getLhs().getDescrs().size()); + assertEquals("foo", ( (ColumnDescr) rule.getLhs().getDescrs().get( 0 )).getIdentifier()); + assertEquals("baz", ( (ColumnDescr) rule.getLhs().getDescrs().get( 1 )).getIdentifier()); } Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java 2006-04-28 10:48:46 UTC (rev 4003) @@ -0,0 +1,117 @@ +package org.drools.xml; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.StringReader; + +import junit.framework.TestCase; + +import org.drools.compiler.DrlParser; +import org.drools.lang.DrlDumper; +import org.drools.lang.descr.PackageDescr; +import org.drools.lang.descr.RuleDescr; + +/** + * Test the dump/convert format utilities. + * @author Michael Neale + */ +public class DumperTest extends TestCase { + + public void testRoundTripXml() throws Exception { + + XmlPackageReader xmlPackageReader = new XmlPackageReader(); + xmlPackageReader.read( new InputStreamReader( getClass().getResourceAsStream( "test_ParseRule.xml" ) ) ); + PackageDescr pkgOriginal = xmlPackageReader.getPackageDescr(); + + XmlDumper dumper = new XmlDumper(); + String result = dumper.dump( pkgOriginal ); + assertNotNull( result ); + + //now lest slurp it back up + xmlPackageReader = new XmlPackageReader(); + PackageDescr pkgDumped = xmlPackageReader.read( new StringReader( result ) ); + + assertEquals( pkgOriginal.getName(), + pkgDumped.getName() ); + assertEquals( pkgOriginal.getFunctions().size(), + pkgDumped.getFunctions().size() ); + assertEquals( pkgOriginal.getRules().size(), + pkgDumped.getRules().size() ); + assertEquals( pkgOriginal.getGlobals().size(), + pkgDumped.getGlobals().size() ); + + RuleDescr ruleOriginal = (RuleDescr) pkgOriginal.getRules().get( 0 ); + RuleDescr ruleDumped = (RuleDescr) pkgDumped.getRules().get( 0 ); + + assertEquals( ruleOriginal.getName(), + ruleDumped.getName() ); + + assertEquals( ruleOriginal.getLhs().getDescrs().size(), + ruleDumped.getLhs().getDescrs().size() ); + assertEquals( ruleOriginal.getConsequence(), + ruleDumped.getConsequence() ); + + } + + public void testRoundTripDrl() throws Exception { + + DrlParser parser = new DrlParser(); + PackageDescr pkgOriginal = parser.parse( new InputStreamReader( getClass().getResourceAsStream( "test_Dump.drl" ) )); + DrlDumper dumper = new DrlDumper(); + String result = dumper.dump( pkgOriginal ); + assertNotNull(result); + + parser = new DrlParser(); + PackageDescr pkgDumped = parser.parse( new StringReader(result) ); + + assertEquals( pkgOriginal.getName(), + pkgDumped.getName() ); + assertEquals( pkgOriginal.getFunctions().size(), + pkgDumped.getFunctions().size() ); + assertEquals( pkgOriginal.getRules().size(), + pkgDumped.getRules().size() ); + assertEquals( pkgOriginal.getGlobals().size(), + pkgDumped.getGlobals().size() ); + + RuleDescr ruleOriginal = (RuleDescr) pkgOriginal.getRules().get( 0 ); + RuleDescr ruleDumped = (RuleDescr) pkgDumped.getRules().get( 0 ); + + assertEquals( ruleOriginal.getName(), + ruleDumped.getName() ); + + assertEquals( ruleOriginal.getLhs().getDescrs().size(), + ruleDumped.getLhs().getDescrs().size() ); + assertEquals( ruleOriginal.getConsequence(), + ruleDumped.getConsequence() ); + + + } + + private void assertEqualsIgnoreWhitespace(String expected, + String actual) { + String cleanExpected = expected.replaceAll( "\\s+", + "" ); + String cleanActual = actual.replaceAll( "\\s+", + "" ); + + assertEquals( cleanExpected, + cleanActual ); + } + + private String readFile(String file) throws IOException { + InputStreamReader reader = new InputStreamReader( getClass().getResourceAsStream( file ) ); + + StringBuffer text = new StringBuffer(); + + char[] buf = new char[1024]; + int len = 0; + + while ( (len = reader.read( buf )) >= 0 ) { + text.append( buf, + 0, + len ); + } + return text.toString(); + } + +} Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/xml/DumperTest.java ___________________________________________________________________ Name: svn:eol-style + native Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/big_decimal_and_comparable.drl =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/big_decimal_and_comparable.drl 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/big_decimal_and_comparable.drl 2006-04-28 10:48:46 UTC (rev 4003) @@ -0,0 +1,16 @@ +#created on: 27-Mar-2006 +package org.drools.test + +import org.drools.Person; +import java.math.BigDecimal; + +global java.util.List list; + +rule "BigDec" + + when + b : BigDecimal() + p : Person(bigDecimal < b) + then + list.add( p ); +end Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/big_decimal_and_comparable.drl ___________________________________________________________________ Name: svn:eol-style + native Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/multiple_bindings.drl =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/multiple_bindings.drl 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/lang/multiple_bindings.drl 2006-04-28 10:48:46 UTC (rev 4003) @@ -2,7 +2,8 @@ rule simple_rule when foo : Bar(a==3) - foo : Bar(a!=4) + foo : Bar(a!=4) + baz : Bar(a==3) then Baz(); end \ No newline at end of file Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl 2006-04-28 10:48:46 UTC (rev 4003) @@ -0,0 +1,15 @@ +package foo + +rule simple_rule + when + foo3 : Bar(a==3) + foo4 : Bar(a4:a==4) + Baz() + then + if ( a == b ) { + assert( foo3 ); + } else { + retract( foo4 ); + } + System.out.println( a4 ); +end \ No newline at end of file Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/xml/test_Dump.drl ___________________________________________________________________ Name: svn:eol-style + native Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java 2006-04-28 10:48:46 UTC (rev 4003) @@ -1,4 +1,5 @@ package org.drools.base.evaluators; + /* * Copyright 2005 JBoss Inc * @@ -15,8 +16,8 @@ * limitations under the License. */ - - +import java.lang.reflect.Array; +import java.util.Arrays; import java.util.Collection; import org.drools.base.BaseEvaluator; @@ -27,6 +28,10 @@ * It is fairly limited in operations, * and what operations are available are dependent on the exact type. * + * This supports "<" and ">" etc by requiring objects to implement the comparable interface. + * Of course, literals will not work with comparator, as it has no way + * of converting from literal to the appropriate type. + * * @author Michael Neale */ public class ObjectFactory { @@ -39,6 +44,14 @@ return ObjectNotEqualEvaluator.INSTANCE; case Evaluator.CONTAINS : return ObjectContainsEvaluator.INSTANCE; + case Evaluator.LESS : + return ObjectLessEvaluator.INSTANCE; + case Evaluator.LESS_OR_EQUAL : + return ObjectLessOrEqualEvaluator.INSTANCE; + case Evaluator.GREATER : + return ObjectGreaterEvaluator.INSTANCE; + case Evaluator.GREATER_OR_EQUAL : + return ObjectGreaterOrEqualEvaluator.INSTANCE; default : throw new RuntimeException( "Operator '" + operator + "' does not exist for ObjectEvaluator" ); } @@ -82,6 +95,83 @@ } } + static class ObjectLessEvaluator extends BaseEvaluator { + public final static Evaluator INSTANCE = new ObjectLessEvaluator(); + + private ObjectLessEvaluator() { + super( Evaluator.OBJECT_TYPE, + Evaluator.LESS ); + } + + public boolean evaluate(Object object1, + Object object2) { + Comparable comp = (Comparable) object1; + int val = comp.compareTo( object2 ); + return val < 0; + } + + public String toString() { + return "Object <"; + } + } + + static class ObjectLessOrEqualEvaluator extends BaseEvaluator { + public final static Evaluator INSTANCE = new ObjectLessOrEqualEvaluator(); + + private ObjectLessOrEqualEvaluator() { + super( Evaluator.OBJECT_TYPE, + Evaluator.LESS_OR_EQUAL ); + } + + public boolean evaluate(Object object1, + Object object2) { + Comparable comp = (Comparable) object1; + return comp.compareTo( object2 ) <= 0; + } + + public String toString() { + return "Object <="; + } + } + + static class ObjectGreaterEvaluator extends BaseEvaluator { + public final static Evaluator INSTANCE = new ObjectGreaterEvaluator(); + + private ObjectGreaterEvaluator() { + super( Evaluator.OBJECT_TYPE, + Evaluator.GREATER ); + } + + public boolean evaluate(Object object1, + Object object2) { + Comparable comp = (Comparable) object1; + return comp.compareTo( object2 ) > 0; + } + + public String toString() { + return "Object >"; + } + } + + static class ObjectGreaterOrEqualEvaluator extends BaseEvaluator { + public final static Evaluator INSTANCE = new ObjectGreaterOrEqualEvaluator(); + + private ObjectGreaterOrEqualEvaluator() { + super( Evaluator.OBJECT_TYPE, + Evaluator.GREATER_OR_EQUAL ); + } + + public boolean evaluate(Object object1, + Object object2) { + Comparable comp = (Comparable) object1; + return comp.compareTo( object2 ) >= 0; + } + + public String toString() { + return "Object >="; + } + } + static class ObjectContainsEvaluator extends BaseEvaluator { public final static Evaluator INSTANCE = new ObjectContainsEvaluator(); @@ -93,8 +183,6 @@ public boolean evaluate(Object object1, Object object2) { if ( object2 == null ) return false; - - //TODO: add support for hashes, normal arrays etc Collection col = (Collection) object1; return col.contains( object2 ); } Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java =================================================================== --- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java 2006-04-27 22:55:32 UTC (rev 4002) +++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/base/EvaluatorFactoryTest.java 2006-04-28 10:48:46 UTC (rev 4003) @@ -17,6 +17,8 @@ +import java.math.BigDecimal; +import java.math.BigInteger; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; @@ -38,8 +40,18 @@ list.add( "foo" ); Object[][] data = {{"foo", "==", "bar", Boolean.FALSE}, {"foo", "==", "foo", Boolean.TRUE}, {"foo", "!=", "bar", Boolean.TRUE}, {list, "contains", "foo", Boolean.TRUE}, {list, "contains", "bar", Boolean.FALSE}, - {list, "==", null, Boolean.FALSE}, {list, "!=", null, Boolean.TRUE}, {null, "==", null, Boolean.TRUE}}; - + {list, "==", null, Boolean.FALSE}, + {list, "!=", null, Boolean.TRUE}, + {null, "==", null, Boolean.TRUE}, + {new BigDecimal("42.42"), "<", new BigDecimal("43"), Boolean.TRUE}, + {new BigDecimal("42.42"), ">", new BigDecimal("43"), Boolean.FALSE}, + {new BigDecimal("42.42"), "<=", new BigDecimal("42.42"), Boolean.TRUE}, + {new BigInteger("42"), ">=", new BigInteger("43"), Boolean.FALSE} + + + + }; + runEvaluatorTest( data, Evaluator.OBJECT_TYPE ); @@ -49,8 +61,12 @@ Object[] field = new Object[]{"foo", "bar"}; - Object[][] data = {{field, "==", new Object[]{"foo"}, Boolean.FALSE}, {field, "==", field, Boolean.TRUE}, {field, "!=", new Object[]{"foo"}, Boolean.TRUE}, {field, "contains", "foo", Boolean.TRUE}, {field, "!=", null, Boolean.TRUE}, - {field, "==", null, Boolean.FALSE}}; + Object[][] data = {{field, "==", new Object[]{"foo"}, Boolean.FALSE}, + {field, "==", field, Boolean.TRUE}, + {field, "!=", new Object[]{"foo"}, Boolean.TRUE}, + {field, "contains", "foo", Boolean.TRUE}, + {field, "!=", null, Boolean.TRUE}, + {field, "==", null, Boolean.FALSE}}; runEvaluatorTest( data, Evaluator.ARRAY_TYPE ); |