[jboss-svn-commits] JBL Code SVN: r17149 - 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 Dec 10 02:18:52 EST 2007


Author: michael.neale at jboss.com
Date: 2007-12-10 02:18:51 -0500 (Mon, 10 Dec 2007)
New Revision: 17149

Added:
   labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/RuleCoverageListener.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java
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:
JBRULES-1383 Rule coverage measurement

Added: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/RuleCoverageListener.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/RuleCoverageListener.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/RuleCoverageListener.java	2007-12-10 07:18:51 UTC (rev 17149)
@@ -0,0 +1,73 @@
+package org.drools.testframework;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.drools.WorkingMemory;
+import org.drools.event.ActivationCancelledEvent;
+import org.drools.event.ActivationCreatedEvent;
+import org.drools.event.AfterActivationFiredEvent;
+import org.drools.event.AgendaEventListener;
+import org.drools.event.AgendaGroupPoppedEvent;
+import org.drools.event.AgendaGroupPushedEvent;
+import org.drools.event.BeforeActivationFiredEvent;
+
+/**
+ * Measure the rule coverage.
+ * @author Michael Neale
+ */
+public class RuleCoverageListener implements AgendaEventListener {
+
+	private final Set<String> rules;
+	private int totalCount;
+
+	/**
+	 * Pass in the expected rules to fire.
+	 * @param expectedRuleNames
+	 */
+	public RuleCoverageListener(HashSet<String> expectedRuleNames) {
+		this.rules = expectedRuleNames;
+		this.totalCount = expectedRuleNames.size();
+	}
+
+	public void activationCancelled(ActivationCancelledEvent event,
+			WorkingMemory workingMemory) {
+	}
+
+	public void activationCreated(ActivationCreatedEvent event,
+			WorkingMemory workingMemory) {
+	}
+
+	public void afterActivationFired(AfterActivationFiredEvent event,
+			WorkingMemory workingMemory) {
+		rules.remove(event.getActivation().getRule().getName());
+	}
+
+	public void agendaGroupPopped(AgendaGroupPoppedEvent event,
+			WorkingMemory workingMemory) {
+	}
+
+	public void agendaGroupPushed(AgendaGroupPushedEvent event,
+			WorkingMemory workingMemory) {
+	}
+
+	public void beforeActivationFired(BeforeActivationFiredEvent event,
+			WorkingMemory workingMemory) {
+	}
+
+	/**
+	 * @return A set of rules that were not fired.
+	 */
+	public Set<String> getUnfiredRules() {
+		return this.rules;
+	}
+
+	public int getPercentCovered() {
+		float left = totalCount - rules.size();
+
+		return (int) ((left / totalCount) * 100);
+	}
+
+
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/RuleCoverageListener.java
___________________________________________________________________
Name: svn:eol-style
   + native

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	2007-12-10 07:17:52 UTC (rev 17148)
+++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/testframework/ScenarioRunner.java	2007-12-10 07:18:51 UTC (rev 17149)
@@ -201,29 +201,35 @@
 			VerifyField fld = (VerifyField) value.fieldValues.get(i);
 			Map<String, Object> st = new HashMap<String, Object>();
 			st.put("__fact__", fact);
-			st.put("__expected__", fld.expected);
+			if (fld.expected != null) {
+				Object expectedVal = fld.expected.trim();
+				if (fld.expected.startsWith("=")) {
+					expectedVal = eval(fld.expected.substring(1), this.populatedData);
+				}
+				st.put("__expected__", expectedVal);
 
-			fld.successResult = (Boolean) eval("__fact__." + fld.fieldName
-					+ " " + fld.operator  + " __expected__", st);
+				fld.successResult = (Boolean) eval("__fact__." + fld.fieldName
+						+ " " + fld.operator  + " __expected__", st);
 
 
-			if (!fld.successResult) {
-				Object actual = eval("__fact__." + fld.fieldName, st);
-				fld.actualResult = (actual != null) ? actual.toString() : "";
+				if (!fld.successResult) {
+					Object actual = eval("__fact__." + fld.fieldName, st);
+					fld.actualResult = (actual != null) ? actual.toString() : "";
 
-				if (fld.operator.equals("==")) {
-					fld.explanation = "[" + value.name + "] field [" + fld.fieldName + "] was [" + fld.actualResult
-										+ "] expected [" + fld.expected + "].";
+					if (fld.operator.equals("==")) {
+						fld.explanation = "[" + value.name + "] field [" + fld.fieldName + "] was [" + fld.actualResult
+											+ "] expected [" + fld.expected + "].";
+					} else {
+						fld.explanation = "[" + value.name + "] field [" + fld.fieldName + "] was not expected to be [" + fld.actualResult
+						+ "].";
+					}
 				} else {
-					fld.explanation = "[" + value.name + "] field [" + fld.fieldName + "] was not expected to be [" + fld.actualResult
-					+ "].";
+					if (fld.operator.equals("==")) {
+						fld.explanation = "[" + value.name + "] field [" + fld.fieldName + "] was [" + fld.expected + "].";
+					} else if (fld.operator.equals("!=")){
+						fld.explanation = "[" + value.name + "] field [" + fld.fieldName + "] was not [" + fld.expected + "].";
+					}
 				}
-			} else {
-				if (fld.operator.equals("==")) {
-					fld.explanation = "[" + value.name + "] field [" + fld.fieldName + "] was [" + fld.expected + "].";
-				} else if (fld.operator.equals("!=")){
-					fld.explanation = "[" + value.name + "] field [" + fld.fieldName + "] was not [" + fld.expected + "].";
-				}
 			}
 
 		}

Added: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java	2007-12-10 07:18:51 UTC (rev 17149)
@@ -0,0 +1,129 @@
+package org.drools.testframework;
+
+import java.util.HashSet;
+
+import org.drools.common.ActivationGroupNode;
+import org.drools.common.LogicalDependency;
+import org.drools.common.RuleFlowGroupNode;
+import org.drools.event.AfterActivationFiredEvent;
+import org.drools.rule.GroupElement;
+import org.drools.rule.Rule;
+import org.drools.spi.Activation;
+import org.drools.spi.AgendaGroup;
+import org.drools.spi.PropagationContext;
+import org.drools.spi.Tuple;
+import org.drools.util.LinkedList;
+
+import junit.framework.TestCase;
+
+public class RuleCoverageListenerTest extends TestCase {
+
+	public void testCoverage() throws Exception {
+		HashSet<String> rules = new HashSet<String>();
+		rules.add("rule1");
+		rules.add("rule2");
+		rules.add("rule3");
+
+		RuleCoverageListener ls = new RuleCoverageListener(rules);
+		assertEquals(3, ls.getUnfiredRules().size());
+		assertEquals(0, ls.getPercentCovered());
+
+		ls.afterActivationFired(new AfterActivationFiredEvent(new MockActivation("rule1")), null);
+		assertEquals(2, ls.getUnfiredRules().size());
+		assertTrue(ls.getUnfiredRules().contains("rule2"));
+		assertTrue(ls.getUnfiredRules().contains("rule3"));
+		assertFalse(ls.getUnfiredRules().contains("rule1"));
+		assertEquals(33, ls.getPercentCovered());
+
+		ls.afterActivationFired(new AfterActivationFiredEvent(new MockActivation("rule2")), null);
+		assertEquals(1, ls.getUnfiredRules().size());
+		assertFalse(ls.getUnfiredRules().contains("rule2"));
+		assertFalse(ls.getUnfiredRules().contains("rule1"));
+		assertTrue(ls.getUnfiredRules().contains("rule3"));
+
+		assertEquals(66, ls.getPercentCovered());
+
+
+		ls.afterActivationFired(new AfterActivationFiredEvent(new MockActivation("rule3")), null);
+		assertEquals(0, ls.getUnfiredRules().size());
+		assertFalse(ls.getUnfiredRules().contains("rule2"));
+		assertFalse(ls.getUnfiredRules().contains("rule1"));
+		assertFalse(ls.getUnfiredRules().contains("rule3"));
+
+		assertEquals(100, ls.getPercentCovered());
+
+
+	}
+
+}
+
+class MockActivation implements Activation {
+	private String ruleName;
+
+	public MockActivation(String ruleName) {
+		this.ruleName = ruleName;
+	}
+
+	public void addLogicalDependency(LogicalDependency node) {
+	}
+
+	public ActivationGroupNode getActivationGroupNode() {
+		return null;
+	}
+
+	public long getActivationNumber() {
+		return 0;
+	}
+
+	public AgendaGroup getAgendaGroup() {
+		return null;
+	}
+
+	public LinkedList getLogicalDependencies() {
+		return null;
+	}
+
+	public PropagationContext getPropagationContext() {
+		return null;
+	}
+
+	public Rule getRule() {
+		return new Rule(ruleName);
+	}
+
+	public RuleFlowGroupNode getRuleFlowGroupNode() {
+		return null;
+	}
+
+	public int getSalience() {
+		return 0;
+	}
+
+	public GroupElement getSubRule() {
+		return null;
+	}
+
+	public Tuple getTuple() {
+		return null;
+	}
+
+	public boolean isActivated() {
+		return false;
+	}
+
+	public void remove() {
+	}
+
+	public void setActivated(boolean activated) {
+	}
+
+	public void setActivationGroupNode(ActivationGroupNode activationGroupNode) {
+	}
+
+	public void setLogicalDependencies(LinkedList justified) {
+	}
+
+	public void setRuleFlowGroupNode(RuleFlowGroupNode ruleFlowGroupNode) {
+	}
+
+}


Property changes on: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/RuleCoverageListenerTest.java
___________________________________________________________________
Name: svn:eol-style
   + native

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	2007-12-10 07:17:52 UTC (rev 17148)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/ScenarioRunnerTest.java	2007-12-10 07:18:51 UTC (rev 17149)
@@ -200,6 +200,22 @@
 
 	}
 
+	public void testVerifyFactsWithExpression() throws Exception {
+		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
+				new MockWorkingMemory());
+		Cheese f1 = new Cheese("cheddar", 42);
+		runner.populatedData.put("f1", f1);
+		f1.setPrice(42);
+		// test all true
+		VerifyFact vf = new VerifyFact();
+		vf.name = "f1";
+		vf.fieldValues = ls(
+				new VerifyField("price", "= 40 + 2", "==") );
+		runner.verify(vf);
+
+		assertTrue(((VerifyField)vf.fieldValues.get(0)).successResult);
+	}
+
 	public void testVerifyFactExplanation() throws Exception {
 		ScenarioRunner runner = new ScenarioRunner(new Scenario(), null,
 				new MockWorkingMemory());




More information about the jboss-svn-commits mailing list