[jboss-svn-commits] JBL Code SVN: r25883 - in labs/jbossrules/trunk/drools-compiler/src: test/java/org/drools/testframework and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Mar 30 05:50:41 EDT 2009


Author: michael.neale at jboss.com
Date: 2009-03-30 05:50:41 -0400 (Mon, 30 Mar 2009)
New Revision: 25883

Modified:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java
Log:
populating happens lazily

Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java	2009-03-30 09:47:03 UTC (rev 25882)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java	2009-03-30 09:50:41 UTC (rev 25883)
@@ -2,12 +2,7 @@
 
 import static org.mvel2.MVEL.eval;
 
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
+import java.util.*;
 
 import org.drools.FactHandle;
 import org.drools.RuleBase;
@@ -85,6 +80,10 @@
         runScenario(scenario, resolver, this.workingMemory);
 	}
 
+    interface Populate {
+        public void go();
+    }
+
 	private void runScenario(final Scenario scenario,
 			final TypeResolver resolver, final InternalWorkingMemory wm)
 			throws ClassNotFoundException {
@@ -97,37 +96,54 @@
 
 		TestingEventListener listener = null;
 
+        List<Populate> toPopulate = new ArrayList<Populate>();
+
 		for (Iterator iterator = scenario.globals.iterator(); iterator.hasNext();) {
-			FactData fact = (FactData) iterator.next();
-			Object f = eval("new " + getTypeName(resolver, fact) + "()");
-			populateFields(fact, globalData, f);
+			final FactData fact = (FactData) iterator.next();
+			final Object f = eval("new " + getTypeName(resolver, fact) + "()");
+            toPopulate.add(new Populate() {
+                public void go() {
+                    populateFields(fact, globalData, f);
+                }
+            });
 			globalData.put(fact.name, f);
 			wm.setGlobal(fact.name, f);
 		}
 
+        doPopulate(toPopulate);
+
 		for (Iterator<Fixture> iterator = scenario.fixtures.iterator(); iterator.hasNext();) {
 			Fixture fx = iterator.next();
 
 			if (fx instanceof FactData) {
 				//deal with facts and globals
-				FactData fact = (FactData)fx;
-				Object f = (fact.isModify)? this.populatedData.get(fact.name) : eval("new " + getTypeName(resolver, fact) + "()");
+				final FactData fact = (FactData)fx;
+				final Object f = (fact.isModify)? this.populatedData.get(fact.name) : eval("new " + getTypeName(resolver, fact) + "()");
 				if (fact.isModify) {
 					if (!this.factHandles.containsKey(fact.name)) {
 						throw new IllegalArgumentException("Was not a previously inserted fact. [" + fact.name  + "]");
 					}
-					populateFields(fact, populatedData, f);
-					this.workingMemory.update(this.factHandles.get(fact.name), f);
+                    toPopulate.add(new Populate() {
+                        public void go() {
+                            populateFields(fact, populatedData, f);
+                            workingMemory.update(factHandles.get(fact.name), f);
+                        }
+                    });
 				} else /* a new one */ {
-					populateFields(fact, populatedData, f);
-					populatedData.put(fact.name, f);
-					this.factHandles.put(fact.name, wm.insert(f));
+                    populatedData.put(fact.name, f);
+                    toPopulate.add(new Populate() {
+                        public void go() {
+                            populateFields(fact, populatedData, f);
+                            factHandles.put(fact.name, wm.insert(f));
+                        }
+                    });
 				}
 			} else if (fx instanceof RetractFact) {
 				RetractFact f = (RetractFact)fx;
 				this.workingMemory.retract(this.factHandles.get(f.name));
 				this.populatedData.remove(f.name);
 			} else if (fx instanceof ExecutionTrace) {
+                doPopulate(toPopulate);
 				ExecutionTrace executionTrace = (ExecutionTrace)fx;
 				//create the listener to trace rules
 
@@ -148,6 +164,7 @@
 
 
 			} else if (fx instanceof Expectation) {
+                doPopulate(toPopulate);
 					Expectation assertion = (Expectation) fx;
 					if (assertion instanceof VerifyFact) {
 						verify((VerifyFact) assertion);
@@ -162,8 +179,15 @@
 
 
 		}
+        
+        doPopulate(toPopulate);
 	}
 
+    private void doPopulate(List<Populate> toPopulate) {
+        for (Populate p : toPopulate) {p.go();}
+        toPopulate.clear();
+    }
+
     private String getTypeName(TypeResolver resolver, FactData fact) throws ClassNotFoundException {
 
         String fullName = resolver.getFullTypeName(fact.type);

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2009-03-30 09:47:03 UTC (rev 25882)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2009-03-30 09:50:41 UTC (rev 25883)
@@ -145,6 +145,45 @@
 
     }
 
+    /**
+     * to check for re-ordering..
+     * @throws Exception
+     */
+    public void testPopulateNestedWrongOrder() throws Exception {
+        Scenario sc = new Scenario();
+        List facts = ls( new FactData( "OuterFact",
+                                       "p1",
+                                       ls( new FieldData( "name",
+                                                          "mic" ),
+                                           new FieldData( "innerFact",
+                                                          "=c1" ) ),
+                                       false ),
+                         new FactData( "Cheese",
+                                       "c1",
+                                       ls( new FieldData( "type",
+                                                          "cheddar" ),
+                                           new FieldData( "price",
+                                                          "42" ) ),
+                                       false ) );
+
+        sc.fixtures.addAll( facts );
+        TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(),
+                                                       Thread.currentThread().getContextClassLoader() );
+        resolver.addImport( "org.drools.Cheese" );
+        resolver.addImport( "org.drools.OuterFact" );
+        ScenarioRunner runner = new ScenarioRunner( sc,
+                                                    resolver,
+                                                    new MockWorkingMemory() );
+
+        assertTrue( runner.populatedData.containsKey( "c1" ) );
+        assertTrue( runner.populatedData.containsKey( "p1" ) );
+
+        OuterFact o = (OuterFact) runner.populatedData.get("p1");
+        assertNotNull(o.getInnerFact());
+
+    }
+
+
     public void testPopulateEmpty() throws Exception {
         Scenario sc = new Scenario();
         List facts = ls( new FactData( "Cheese",




More information about the jboss-svn-commits mailing list