[jboss-svn-commits] JBL Code SVN: r35931 - in labs/jbossrules/trunk: drools-guvnor/src/main/java/org/drools/guvnor/client/qa/testscenarios and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Nov 10 02:11:13 EST 2010


Author: jervisliu
Date: 2010-11-10 02:11:11 -0500 (Wed, 10 Nov 2010)
New Revision: 35931

Added:
   labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/CheeseType.java
Modified:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/VerifyFieldConstraintEditor.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/testscenarios/FieldDataConstraintEditor.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/testing/VerifyField.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/server/util/SuggestionCompletionEngineBuilder.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/testframework/FactFieldValueVerifier.java
   labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/testframework/ScenarioRunner.java
   labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/Cheese.java
   labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/ide/common/server/rules/SuggestionCompletionLoaderTest.java
   labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/testframework/ScenarioRunnerTest.java
Log:
https://jira.jboss.org/browse/GUVNOR-687: Business Rules may not be handling Java Enums Correctly, DRL Generated does not work and Running Test Scenarios fails. 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/VerifyFieldConstraintEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/VerifyFieldConstraintEditor.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/VerifyFieldConstraintEditor.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -127,6 +127,7 @@
         } else {
             String[] enums = sce.getDataEnumList( key );
             if ( enums != null ) {
+            	field.nature = FieldData.TYPE_ENUM;
                 panel.add( new EnumDropDown( field.expected,
                                              new DropDownValueChanged() {
                                                  public void valueChanged(String newText,

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/testscenarios/FieldDataConstraintEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/testscenarios/FieldDataConstraintEditor.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/qa/testscenarios/FieldDataConstraintEditor.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -126,6 +126,7 @@
         } else {
             String[] enums = sce.getDataEnumList( key );
             if ( enums != null ) {
+            	field.nature = FieldData.TYPE_ENUM;
                 panel.add( new EnumDropDown( field.value,
                                              new DropDownValueChanged() {
                                                  public void valueChanged(String newText,

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/testing/VerifyField.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/testing/VerifyField.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/client/modeldriven/testing/VerifyField.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -77,4 +77,12 @@
         this.operator = operator;
     }
 
+	public long getNature() {
+		return nature;
+	}
+
+	public void setNature(long nature) {
+		this.nature = nature;
+	}
+
 }

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/server/util/SuggestionCompletionEngineBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/server/util/SuggestionCompletionEngineBuilder.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/ide/common/server/util/SuggestionCompletionEngineBuilder.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -233,7 +233,8 @@
                     int i = 0;
                     for (Field f : flds) {
                         if (f.isEnumConstant()) {
-                            listEnum.add(i + "=" + f.getName());
+                        	String shortName = fieldClass.getName().substring(fieldClass.getName().lastIndexOf(".")+1)+ "."+ f.getName();
+                         	listEnum.add(shortName + "=" + shortName);
                             i++;
                         }
                     }

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/testframework/FactFieldValueVerifier.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/testframework/FactFieldValueVerifier.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/testframework/FactFieldValueVerifier.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -23,6 +23,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.drools.base.TypeResolver;
 import org.drools.ide.common.client.modeldriven.testing.VerifyField;
 import org.mvel2.MVEL;
 import org.mvel2.ParserContext;
@@ -41,13 +42,16 @@
     private final Object              factObject;
 
     private VerifyField               currentField;
-
+    final TypeResolver resolver;
+    
     public FactFieldValueVerifier(Map<String, Object> populatedData,
                              String factName,
-                             Object factObject) {
+                             Object factObject,
+                             final TypeResolver resolver) {
         this.populatedData = populatedData;
         this.factName = factName;
         this.factObject = factObject;
+        this.resolver = resolver;
     }
 
     public void checkFields(List<VerifyField> fieldValues) {
@@ -80,7 +84,21 @@
         if ( currentField.expected.startsWith( "=" ) ) {
             expectedResult = eval( currentField.expected.substring( 1 ),
                                    this.populatedData );
-        }
+        } else if (currentField.getNature() == VerifyField.TYPE_ENUM) {
+			try {
+				// The string representation of enum value is using a  
+				// format like CheeseType.CHEDDAR
+				String classNameOfEnum = currentField.expected.substring(0,
+						currentField.expected.indexOf("."));
+				String valueOfEnum = currentField.expected.substring(currentField.expected
+						.indexOf(".") + 1);
+				String fullName = resolver.getFullTypeName(classNameOfEnum);
+
+				expectedResult = eval(fullName + "." + valueOfEnum);
+			} catch (ClassNotFoundException e) {
+				//Do nothing. 
+			}
+		} 
         return expectedResult;
     }
 

Modified: labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/testframework/ScenarioRunner.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/testframework/ScenarioRunner.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-ide-common/src/main/java/org/drools/testframework/ScenarioRunner.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -65,6 +65,7 @@
     final Map<String, FactHandle> factHandles   = new HashMap<String, FactHandle>();
 
     final InternalWorkingMemory   workingMemory;
+    final TypeResolver resolver;
 
     /**
      * This constructor is normally used by Guvnor for running tests on a users request.
@@ -86,8 +87,9 @@
                           final InternalWorkingMemory wm) throws ClassNotFoundException {
         this.scenario = scenario;
         this.workingMemory = wm;
+        this.resolver = resolver;
         runScenario( scenario,
-                     resolver );
+                     this.resolver );
     }
 
     /**
@@ -98,12 +100,12 @@
                           RuleBase rb) throws ClassNotFoundException {
         this.scenario = ScenarioXMLPersistence.getInstance().unmarshal( xml );
         this.workingMemory = (InternalWorkingMemory) rb.newStatefulSession();
-        Package pk = rb.getPackages()[0];
+                Package pk = rb.getPackages()[0];
         ClassLoader cl = ((InternalRuleBase) rb).getRootClassLoader();
         HashSet<String> imports = new HashSet<String>();
         imports.add( pk.getName() + ".*" );
         imports.addAll( pk.getImports().keySet() );
-        TypeResolver resolver = new ClassTypeResolver( imports,
+        this.resolver = new ClassTypeResolver( imports,
                                                        cl );
         runScenario( scenario,
                      resolver );
@@ -132,7 +134,8 @@
                 public void go() {
                     populateFields( fact,
                                     globalData,
-                                    factObject );
+                                    factObject,
+                                    resolver);
                 }
             } );
             globalData.put( fact.name,
@@ -159,7 +162,8 @@
                         public void go() {
                             populateFields( fact,
                                             populatedData,
-                                            factObject );
+                                            factObject,
+                                            resolver);
                             workingMemory.update( factHandles.get( fact.name ),
                                                   factObject );
                         }
@@ -171,7 +175,8 @@
                         public void go() {
                             populateFields( fact,
                                             populatedData,
-                                            factObject );
+                                            factObject,
+                                            resolver);
                             factHandles.put( fact.name,
                                              workingMemory.insert( factObject ) );
                         }
@@ -306,7 +311,8 @@
             if ( factObject == null ) factObject = this.globalData.get( value.name );
             FactFieldValueVerifier fieldVerifier = new FactFieldValueVerifier( populatedData,
                                                                                value.name,
-                                                                               factObject );
+                                                                               factObject,
+                                                                               resolver);
             fieldVerifier.checkFields( value.fieldValues );
         } else {
             Iterator obs = this.workingMemory.iterateObjects();
@@ -315,7 +321,8 @@
                 if ( factObject.getClass().getSimpleName().equals( value.name ) ) {
                     FactFieldValueVerifier fieldVerifier = new FactFieldValueVerifier( populatedData,
                                                                                        value.name,
-                                                                                       factObject );
+                                                                                       factObject,
+                                                                                       resolver );
                     fieldVerifier.checkFields( value.fieldValues );
                     if ( value.wasSuccessful() ) return;
                 }
@@ -331,24 +338,44 @@
 
     Object populateFields(FactData fact,
                           Map<String, Object> factData,
-                          Object factObject) {
+                          Object factObject,
+                          final TypeResolver resolver) {
         for ( int i = 0; i < fact.fieldData.size(); i++ ) {
             FieldData field = (FieldData) fact.fieldData.get( i );
-            Object val;
+            Object val = null;
+            
             if ( field.value != null && !field.value.equals( "" ) ) {
+             		
                 if ( field.value.startsWith( "=" ) ) {
                     // eval the val into existence
                     val = eval( field.value.substring( 1 ),
                                 factData );
-                } else {
-                    val = field.value;
-                }
+				} else if (field.getNature() == FieldData.TYPE_ENUM) {
+					try {
+						// The string representation of enum value is using 
+						// format like CheeseType.CHEDDAR
+						String classNameOfEnum = field.value.substring(0,
+								field.value.indexOf("."));
+						String valueOfEnum = field.value.substring(field.value
+								.indexOf(".") + 1);
+						String fullName = resolver
+								.getFullTypeName(classNameOfEnum);
+
+						val = eval(fullName + "." + valueOfEnum);
+					} catch (ClassNotFoundException e) {
+						//Do nothing. 
+					}
+				} else {
+					val = field.value;
+				}
+                
                 Map<String, Object> vars = new HashMap<String, Object>();
                 vars.putAll( factData );
                 vars.put( "__val__",
-                          val );
+                		val );
                 vars.put( "__fact__",
                           factObject );
+                //System.out.println("eval: " + "__fact__." + field.name + " = __val__");
                 eval( "__fact__." + field.name + " = __val__",
                       vars );
             }

Modified: labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/Cheese.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/Cheese.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/Cheese.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -36,6 +36,7 @@
     private int               oldPrice;
     private Date              usedBy;
     private double            doublePrice;
+    private CheeseType        cheeseType;
 
     public Cheese() {
 
@@ -63,7 +64,15 @@
         this.oldPrice = oldPrice;
     }
 
-    public int getPrice() {
+    public CheeseType getCheeseType() {
+		return cheeseType;
+	}
+
+	public void setCheeseType(CheeseType cheeseType) {
+		this.cheeseType = cheeseType;
+	}
+
+	public int getPrice() {
         return this.price;
     }
 

Added: labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/CheeseType.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/CheeseType.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/CheeseType.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -0,0 +1,24 @@
+/**
+ * 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;
+
+public enum CheeseType {
+	BRICK,
+	CHEDDAR,
+	COLBY,
+	MOZZARELLA
+}

Modified: labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/ide/common/server/rules/SuggestionCompletionLoaderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/ide/common/server/rules/SuggestionCompletionLoaderTest.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/ide/common/server/rules/SuggestionCompletionLoaderTest.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -209,9 +209,9 @@
         assertTrue(eng.hasDataEnumLists());
         assertEquals(eng.getDataEnumList("SomeFact.anEnum").length,3);
         String a[] = eng.getDataEnumList("SomeFact.anEnum") ;
-        assertEquals(a[0],"0="+EnumClass.v1);
-        assertEquals(a[1],"1="+EnumClass.v2);
-        assertEquals(a[2],"2="+EnumClass.v3);
+        assertEquals(a[0],"EnumClass.v1=EnumClass.v1");
+        assertEquals(a[1],"EnumClass.v2=EnumClass.v2");
+        assertEquals(a[2],"EnumClass.v3=EnumClass.v3");
     }
 
     public void testSortOrderOfFacts() throws Exception {

Modified: labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/testframework/ScenarioRunnerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2010-11-10 06:52:56 UTC (rev 35930)
+++ labs/jbossrules/trunk/drools-ide-common/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2010-11-10 07:11:11 UTC (rev 35931)
@@ -25,6 +25,7 @@
 import java.util.Map;
 
 import org.drools.Cheese;
+import org.drools.CheeseType;
 import org.drools.Cheesery;
 import org.drools.Cheesery.Maturity;
 import org.drools.OuterFact;
@@ -131,7 +132,32 @@
                       p.getAge() );
 
     }
+    
+    public void testPopulateEnum() throws Exception {
+        Scenario sc = new Scenario();
+        FieldData fd = new FieldData( "cheeseType", "CheeseType.CHEDDAR");
+        fd.setNature(FieldData.TYPE_ENUM, null);
+        List facts = ls( new FactData( "Cheese",
+                                       "c1",
+                                       ls(fd),
+                                       false ));
 
+        sc.fixtures.addAll( facts );
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
+        resolver.addImport( "org.drools.CheeseType" );
+        ScenarioRunner runner = new ScenarioRunner( sc,
+                                                    resolver,
+                                                    new MockWorkingMemory() );
+
+        assertTrue( runner.populatedData.containsKey( "c1" ) );
+
+        Cheese c = (Cheese) runner.populatedData.get( "c1" );
+        assertEquals( CheeseType.CHEDDAR,
+                      c.getCheeseType() );
+    }
+    
     public void testPopulateNested() throws Exception {
         Scenario sc = new Scenario();
         List facts = ls( new FactData( "Cheese",
@@ -323,7 +349,8 @@
 
         run.populateFields( fd,
                             run.populatedData,
-                            c );
+                            c,
+                            resolver);
         assertEquals( "whee",
                       c.getType() );
         assertEquals( 42,
@@ -419,6 +446,42 @@
 
     }
 
+    public void testVerifyFactsWithEnum() throws Exception {
+        FieldData fd = new FieldData( "cheeseType", "CheeseType.CHEDDAR");
+        fd.setNature(FieldData.TYPE_ENUM, null);
+        List facts = ls( new FactData( "Cheese",
+                                       "c1",
+                                       ls(fd),
+                                       false ));
+
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
+        resolver.addImport( "org.drools.CheeseType" );
+        
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+        		                                    resolver,
+                                                    new MockWorkingMemory() );
+        Cheese f1 = new Cheese( "othertype",
+                                42 );
+        f1.setCheeseType(CheeseType.CHEDDAR);
+        runner.populatedData.put( "f1",
+                                  f1 );
+
+
+        VerifyFact vf = new VerifyFact();
+        vf.name = "f1";
+        VerifyField verifyField = new VerifyField( "cheeseType",
+                "CheeseType.CHEDDAR",
+                "==" );
+        verifyField.setNature(VerifyField.TYPE_ENUM);
+        vf.fieldValues = ls( verifyField );
+        runner.verify( vf );
+        for ( int i = 0; i < vf.fieldValues.size(); i++ ) {
+            assertTrue( ((VerifyField) vf.fieldValues.get( i )).successResult );
+        }
+    }
+
     public void testVerifyAnonymousFacts() throws Exception {
         MockWorkingMemory wm = new MockWorkingMemory();
         ScenarioRunner runner = new ScenarioRunner( new Scenario(),
@@ -672,6 +735,27 @@
 
     }
 
+    public void testRuleFiredWithEnum() throws Exception {
+        Map<String, Integer> firingCounts = new HashMap<String, Integer>();
+        firingCounts.put( "foo",
+                          2 );
+        firingCounts.put( "bar",
+                          1 );
+        // and baz, we leave out
+
+        ScenarioRunner runner = new ScenarioRunner( new Scenario(),
+                                                    null,
+                                                    new MockWorkingMemory() );
+        VerifyRuleFired v = new VerifyRuleFired();
+        v.ruleName = "foo";
+        v.expectedFire = true;
+        runner.verify( v,
+                       firingCounts );
+        assertTrue( v.successResult );
+        assertEquals( 2,
+                      v.actualResult.intValue() );
+    }
+    
     public void testTestingEventListener() throws Exception {
         Scenario sc = new Scenario();
         sc.rules.add( "foo" );
@@ -1498,7 +1582,7 @@
                                     "listChesse",
                                     lstField,
                                     false );
-        runner.populateFields(lst,runner.populatedData,listChesse);
+        runner.populateFields(lst,runner.populatedData,listChesse, null);
         assertTrue(listChesse.getCheeses().size()==3);
         assertTrue(listChesse.getCheeses().contains(f1));
         assertTrue(listChesse.getCheeses().contains(f3));



More information about the jboss-svn-commits mailing list