[jboss-svn-commits] JBL Code SVN: r16439 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Nov 8 18:10:16 EST 2007
Author: tirelli
Date: 2007-11-08 18:10:16 -0500 (Thu, 08 Nov 2007)
New Revision: 16439
Added:
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuntimeTypeCoercion2.drl
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuntimeTypeCoercion.drl
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java
Log:
JBRULES-1284: improving runtime type coercion
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java 2007-11-08 21:52:49 UTC (rev 16438)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/Primitives.java 2007-11-08 23:10:16 UTC (rev 16439)
@@ -34,6 +34,8 @@
private String[] stringArray;
private Boolean booleanWrapper;
+
+ private Object object;
public boolean isBooleanPrimitive() {
return this.booleanPrimitive;
@@ -145,4 +147,12 @@
this.booleanWrapper = booleanWrapper;
}
+ public Object getObject() {
+ return object;
+ }
+
+ public void setObject(Object object) {
+ this.object = object;
+ }
+
}
\ No newline at end of file
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2007-11-08 21:52:49 UTC (rev 16438)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MiscTest.java 2007-11-08 23:10:16 UTC (rev 16439)
@@ -4569,7 +4569,68 @@
assertEquals( 1, list.size() );
assertEquals( fact.getData(), list.get( 0 ) );
+
+ fact.setData( "10" );
+ workingMemory.update( handle, fact );
+ workingMemory.fireAllRules();
+
+ assertEquals( 2, list.size() );
+ assertEquals( fact.getData(), list.get( 1 ) );
+
+ try {
+ fact.setData( new Boolean(true) );
+ workingMemory.update( handle, fact );
+ fail("Should not allow to compare < with a Boolean object");
+ } catch( ClassCastException cce ) {
+ // success, as can't use "<" to compare to a boolean
+ }
+
+ }
+ public void testRuntimeTypeCoercion2() throws Exception {
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_RuntimeTypeCoercion2.drl" ) ) );
+ final Package pkg = builder.getPackage();
+
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+ final WorkingMemory workingMemory = ruleBase.newStatefulSession();
+
+ final List list = new ArrayList();
+ workingMemory.setGlobal( "results",
+ list );
+
+ final Primitives fact = new Primitives( );
+ fact.setBooleanPrimitive( true );
+ fact.setBooleanWrapper( new Boolean(true) );
+ fact.setObject( new Boolean(true) );
+ fact.setCharPrimitive( 'X' );
+ final FactHandle handle = workingMemory.insert( fact );
+
+ workingMemory.fireAllRules();
+
+ int index = 0;
+ assertEquals( list.toString(), 4, list.size() );
+ assertEquals( "boolean", list.get( index++ ));
+ assertEquals( "boolean wrapper", list.get( index++ ));
+ assertEquals( "boolean object", list.get( index++ ));
+ assertEquals( "char", list.get( index++ ));
+
+ fact.setBooleanPrimitive( false );
+ fact.setBooleanWrapper( null );
+ fact.setCharPrimitive( '\0' );
+ fact.setObject( new Character('X') );
+ workingMemory.update( handle, fact );
+ workingMemory.fireAllRules();
+ assertEquals( 5, list.size() );
+ assertEquals( "char object", list.get( index++ ) );
+
+// fact.setObject( null );
+// workingMemory.update( handle, fact );
+// workingMemory.fireAllRules();
+// assertEquals( 6, list.size() );
+// assertEquals( "null object", list.get( index++ ) );
+
}
Modified: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuntimeTypeCoercion.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuntimeTypeCoercion.drl 2007-11-08 21:52:49 UTC (rev 16438)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuntimeTypeCoercion.drl 2007-11-08 23:10:16 UTC (rev 16439)
@@ -3,8 +3,10 @@
global java.util.List results;
rule "Testing coercion"
+ salience 100
when
PolymorphicFact( $value : data < 15 )
then
results.add( $value );
end
+
Added: labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuntimeTypeCoercion2.drl
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuntimeTypeCoercion2.drl (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuntimeTypeCoercion2.drl 2007-11-08 23:10:16 UTC (rev 16439)
@@ -0,0 +1,53 @@
+package org.drools;
+
+global java.util.List results;
+
+rule "Test boolean coercion"
+ salience 100
+ when
+ Primitives( booleanPrimitive == "true" )
+ then
+ results.add( "boolean" );
+end
+
+rule "Test boolean wrapper coercion"
+ salience 95
+ when
+ Primitives( booleanWrapper == "true" )
+ then
+ results.add( "boolean wrapper" );
+end
+
+rule "Test boolean object coercion"
+ salience 92
+ when
+ Primitives( object == "true" )
+ then
+ results.add( "boolean object" );
+end
+
+rule "Test char coercion"
+ salience 90
+ when
+ Primitives( charPrimitive == "X" )
+ then
+ results.add( "char" );
+end
+
+
+rule "Test object char coercion"
+ salience 85
+ when
+ Primitives( object == "X" )
+ then
+ results.add( "char object" );
+end
+
+
+/* rule "Test object null coercion"
+ salience 82
+ when
+ Primitives( object == null )
+ then
+ results.add( "null object" );
+end*/
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 2007-11-08 21:52:49 UTC (rev 16438)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/base/evaluators/ObjectFactory.java 2007-11-08 23:10:16 UTC (rev 16439)
@@ -565,6 +565,16 @@
if( arg0 instanceof String ) {
return arg0.equals( arg1.toString() );
}
+ if( arg0 instanceof Boolean ) {
+ if( arg1 instanceof String ) {
+ return ((Boolean)arg0).booleanValue() == Boolean.valueOf( (String)arg1 ).booleanValue();
+ }
+ }
+ if( arg0 instanceof Character ) {
+ if( arg1 instanceof String && ((String) arg1).length() == 1 ) {
+ return ((Character)arg0).charValue() == ((String)arg1).charAt( 0 );
+ }
+ }
return arg0.equals( arg1 );
}
}
@@ -615,7 +625,11 @@
}
}
- return ((Comparable)arg0).compareTo( arg1 );
+ try {
+ return ((Comparable)arg0).compareTo( arg1 );
+ } catch ( ClassCastException cce ) {
+ throw new ClassCastException( "Not possible to compare a "+arg0.getClass()+" with a "+arg1.getClass());
+ }
}
}
More information about the jboss-svn-commits
mailing list