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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Apr 15 18:27:51 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-04-15 18:27:51 -0400 (Sun, 15 Apr 2007)
New Revision: 10980

Added:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/TruthMaintenanceTest.java
Removed:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/TruthMaintenanceTest.java
Log:
JBRULES-795 Refactor IntegrationCases into a number of other categorised classes
-refactored IntegrationCases into TruthMaintenanceTest, DslTest, DynamicRulesTest, 
 ExecutionFlowControlTest, FirstOrderLogicTest and MiscTest

Deleted: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/TruthMaintenanceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/TruthMaintenanceTest.java	2007-04-15 21:35:04 UTC (rev 10979)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/TruthMaintenanceTest.java	2007-04-15 22:27:51 UTC (rev 10980)
@@ -1,764 +0,0 @@
-package org.drools.compiler;
-
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.drools.Cheese;
-import org.drools.CheeseEqual;
-import org.drools.FactHandle;
-import org.drools.Person;
-import org.drools.RuleBase;
-import org.drools.RuleBaseConfiguration;
-import org.drools.RuleBaseFactory;
-import org.drools.Sensor;
-import org.drools.WorkingMemory;
-import org.drools.audit.WorkingMemoryFileLogger;
-import org.drools.common.InternalWorkingMemory;
-import org.drools.common.TruthMaintenanceSystem;
-import org.drools.event.ActivationCancelledEvent;
-import org.drools.event.ActivationCreatedEvent;
-import org.drools.event.AfterActivationFiredEvent;
-import org.drools.event.AgendaEventListener;
-import org.drools.event.BeforeActivationFiredEvent;
-import org.drools.event.DefaultAgendaEventListener;
-import org.drools.event.DefaultWorkingMemoryEventListener;
-import org.drools.event.ObjectAssertedEvent;
-import org.drools.event.ObjectModifiedEvent;
-import org.drools.event.ObjectRetractedEvent;
-import org.drools.event.WorkingMemoryEventListener;
-import org.drools.rule.Package;
-import org.drools.util.ObjectHashMap;
-
-public class TruthMaintenanceTest extends TestCase {
-    protected RuleBase getRuleBase() throws Exception {
-
-        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
-                                            null );
-    }
-
-    protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {
-
-        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
-                                            config );
-    }
-    
-    public void testLogicalAssertions() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertions.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        final Cheese brie = new Cheese( "brie",
-                                        12 );
-        final FactHandle brieHandle = workingMemory.assertObject( brie );
-
-        final Cheese provolone = new Cheese( "provolone",
-                                             12 );
-        final FactHandle provoloneHandle = workingMemory.assertObject( provolone );
-
-        workingMemory.fireAllRules();
-
-        assertEquals( 3,
-                      list.size() );
-
-        assertEquals( 3,
-                      workingMemory.getObjects().size() );
-
-        workingMemory.retractObject( brieHandle );
-
-        assertEquals( 2,
-                      workingMemory.getObjects().size() );
-
-        workingMemory.retractObject( provoloneHandle );
-
-        assertEquals( 0,
-                      workingMemory.getObjects().size() );
-    }
-
-    public void testLogicalAssertionsBacking() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsBacking.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        final Cheese cheese1 = new Cheese( "c",
-                                           1 );
-        final Cheese cheese2 = new Cheese( cheese1.getType(),
-                                           1 );
-        List list;
-
-        final FactHandle h1 = workingMemory.assertObject( cheese1 );
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( cheese1.getType().getClass() );
-        assertEquals( 1,
-                      list.size() );
-        // probably dangerous, as contains works with equals, not identity
-        assertEquals( cheese1.getType(),
-                      list.get( 0 ) );
-        // FactHandle ht = workingMemory.getFactHandle(c1.getType());
-
-        final FactHandle h2 = workingMemory.assertObject( cheese2 );
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( cheese1.getType().getClass() );
-        assertEquals( 1,
-                      list.size() );
-        assertEquals( cheese1.getType(),
-                      list.get( 0 ) );
-
-        workingMemory.retractObject( h1 );
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( cheese1.getType().getClass() );
-        assertEquals( "cheese-type " + cheese1.getType() + " was retracted, but should not. Backed by cheese2 => type.",
-                      1,
-                      list.size() );
-        assertEquals( "cheese-type " + cheese1.getType() + " was retracted, but should not. Backed by cheese2 => type.",
-                      cheese1.getType(),
-                      list.get( 0 ) );
-
-        workingMemory.retractObject( h2 );
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( cheese1.getType().getClass() );
-        assertEquals( "cheese-type " + cheese1.getType() + " was not retracted, but should have. Neither  cheese1 => type nor cheese2 => type is true.",
-                      0,
-                      list.size() );
-    }
-
-    public void testLogicalAssertionsSelfreferencing() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsSelfreferencing.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        List list;
-
-        final Person b = new Person( "b" );
-        final Person a = new Person( "a" );
-
-        workingMemory.setGlobal( "b",
-                                 b );
-
-        FactHandle h1 = workingMemory.assertObject( a );
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( a.getClass() );
-        assertEquals( 2,
-                      list.size() );
-        assertTrue( list.contains( a ) );
-        assertTrue( list.contains( b ) );
-
-        workingMemory.retractObject( h1 );
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( a.getClass() );
-        assertEquals( "b was retracted, but it should not have. Is backed by b => b being true.",
-                      1,
-                      list.size() );
-        assertEquals( "b was retracted, but it should not have. Is backed by b => b being true.",
-                      b,
-                      list.get( 0 ) );
-
-        h1 = workingMemory.getFactHandle( b );
-        workingMemory.retractObject( h1 );
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( a.getClass() );
-        assertEquals( 0,
-                      list.size() );
-    }
-
-    public void testLogicalAssertionsLoop() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsLoop.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        List list;
-
-        final List l = new ArrayList();
-        final Person a = new Person( "a" );
-        workingMemory.setGlobal( "a",
-                                 a );
-        workingMemory.setGlobal( "l",
-                                 l );
-
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( a.getClass() );
-        assertEquals( "a still asserted.",
-                      0,
-                      list.size() );
-        assertEquals( "Rule has not fired (looped) expected number of times",
-                      10,
-                      l.size() );
-    }
-
-    public void testLogicalAssertionsNoLoop() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsNoLoop.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        List list;
-
-        final List l = new ArrayList();
-        final Person a = new Person( "a" );
-        workingMemory.setGlobal( "a",
-                                 a );
-        workingMemory.setGlobal( "l",
-                                 l );
-
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects( a.getClass() );
-        assertEquals( "a still in WM",
-                      0,
-                      list.size() );
-        assertEquals( "Rule should not loop",
-                      1,
-                      l.size() );
-    }
-
-    public void testLogicalAssertionsWithModify() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsWithModify.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-        
-        final WorkingMemoryEventListener l2 = new DefaultWorkingMemoryEventListener() {
-            public void objectAsserted(ObjectAssertedEvent event) {
-                System.out.println( event );
-            }
-
-            public void objectRetracted(ObjectRetractedEvent event) {
-                System.out.println( event );
-            }
-
-            public void objectModified(ObjectModifiedEvent event) {
-                System.out.println( event );
-            }
-        };
-        
-        workingMemory.addEventListener( l2 );        
-
-        List l;
-        final Person p = new Person( "person" );
-        p.setAge( 2 );
-        final FactHandle h = workingMemory.assertObject( p );
-        assertEquals( 1,
-                      workingMemory.getObjects().size() );
-
-        workingMemory.fireAllRules();
-        assertEquals( 2,
-                      workingMemory.getObjects().size() );
-        l = workingMemory.getObjects( CheeseEqual.class );
-        assertEquals( 1,
-                      l.size() );
-        assertEquals( 2,
-                      ((CheeseEqual) l.get( 0 )).getPrice() );
-
-        workingMemory.retractObject( h );
-        assertEquals( 0,
-                      workingMemory.getObjects().size() );
-
-        TruthMaintenanceSystem tms = ((InternalWorkingMemory) workingMemory).getTruthMaintenanceSystem();
-
-        final java.lang.reflect.Field field = tms.getClass().getDeclaredField( "assertMap" );
-        field.setAccessible( true );
-        final ObjectHashMap m = (ObjectHashMap) field.get( tms );
-        field.setAccessible( false );
-        assertEquals( "assertMap should be empty",
-                      0,
-                      m.size() );
-    }
-
-    public void testLogicalAssertions2() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertions2.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( workingMemory );
-        logger.setFileName( "logical.log" );
-
-        final AgendaEventListener listener = new DefaultAgendaEventListener() {
-            public void activationCreated(ActivationCreatedEvent event,
-                                          WorkingMemory workingMemory) {
-                System.out.println( event );
-            }
-
-            public void activationCancelled(ActivationCancelledEvent event,
-                                            WorkingMemory workingMemory) {
-                System.out.println( event );
-            }
-
-            public void beforeActivationFired(BeforeActivationFiredEvent event,
-                                              WorkingMemory workingMemory) {
-            }
-
-            public void afterActivationFired(AfterActivationFiredEvent event,
-                                             WorkingMemory workingMemory) {
-                System.out.println( event );
-            }
-        };
-        workingMemory.addEventListener( listener );
-
-        final List events = new ArrayList();
-
-        workingMemory.setGlobal( "events",
-                                 events );
-
-        final Sensor sensor = new Sensor( 80,
-                                          80 );
-        final FactHandle handle = workingMemory.assertObject( sensor );
-
-        // everything should be normal
-        workingMemory.fireAllRules();
-
-        final List list = workingMemory.getObjects();
-
-        assertEquals( "Only sensor is there",
-                      1,
-                      list.size() );
-        assertEquals( "Only one event",
-                      1,
-                      events.size() );
-
-        // problems should be detected
-        sensor.setPressure( 200 );
-        sensor.setTemperature( 200 );
-        workingMemory.modifyObject( handle,
-                                    sensor );
-
-        workingMemory.fireAllRules();
-        logger.writeToDisk();
-
-        assertEquals( "Only sensor is there",
-                      1,
-                      list.size() );
-        assertEquals( "Exactly six events",
-                      6,
-                      events.size() );
-    }
-
-    public void testLogicalAssertionsNot() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsNot.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        List list;
-
-        final Person a = new Person( "a" );
-        final Cheese cheese = new Cheese( "brie",
-                                          1 );
-        workingMemory.setGlobal( "cheese",
-                                 cheese );
-
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects();
-        assertEquals( "i was not asserted by not a => i.",
-                      1,
-                      list.size() );
-        assertEquals( "i was not asserted by not a => i.",
-                      cheese,
-                      list.get( 0 ) );
-
-        final FactHandle h = workingMemory.assertObject( a );
-        // no need to fire rules, assertion alone removes justification for i,
-        // so it should be retracted.
-        // workingMemory.fireAllRules();
-        list = workingMemory.getObjects();
-        assertEquals( "a was not asserted or i not retracted.",
-                      1,
-                      list.size() );
-        assertEquals( "a was asserted.",
-                      a,
-                      list.get( 0 ) );
-        assertFalse( "i was not rectracted.",
-                     list.contains( cheese ) );
-
-        // no rules should fire, but nevertheless...
-        // workingMemory.fireAllRules();
-        assertEquals( "agenda should be empty.",
-                      0,
-                      workingMemory.getAgenda().agendaSize() );
-
-        workingMemory.retractObject( h );
-        workingMemory.fireAllRules();
-        list = workingMemory.getObjects();
-        assertEquals( "i was not asserted by not a => i.",
-                      1,
-                      list.size() );
-        assertEquals( "i was not asserted by not a => i.",
-                      cheese,
-                      list.get( 0 ) );
-    }
-
-    public void testLogicalAssertionsNotPingPong() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsNotPingPong.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        // workingMemory.addEventListener(new DebugAgendaEventListener());
-        // workingMemory.addEventListener(new
-        // DebugWorkingMemoryEventListener());
-
-        final List list = new ArrayList();
-
-        final Person person = new Person( "person" );
-        final Cheese cheese = new Cheese( "cheese",
-                                          0 );
-        workingMemory.setGlobal( "cheese",
-                                 cheese );
-        workingMemory.setGlobal( "person",
-                                 person );
-        workingMemory.setGlobal( "list",
-                                 list );
-
-        workingMemory.fireAllRules();
-
-        // not sure about desired state of working memory.
-        assertEquals( "Rules have not fired (looped) expected number of times",
-                      10,
-                      list.size() );
-    }
-
-    public void testLogicalAssertionsDynamicRule() throws Exception {
-        PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsDynamicRule.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        org.drools.reteoo.ReteooRuleBase reteooRuleBase = null;
-        // org.drools.leaps.LeapsRuleBase leapsRuleBase = null;
-        final RuleBase ruleBase = getRuleBase();
-        if ( ruleBase instanceof org.drools.reteoo.ReteooRuleBase ) {
-            reteooRuleBase = (org.drools.reteoo.ReteooRuleBase) ruleBase;
-            // } else if ( ruleBase instanceof org.drools.leaps.LeapsRuleBase )
-            // {
-            // leapsRuleBase = (org.drools.leaps.LeapsRuleBase) ruleBase;
-        }
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        // workingMemory.addEventListener(new
-        // org.drools.event.DebugAgendaEventListener());
-        // workingMemory.addEventListener(new
-        // org.drools.event.DebugWorkingMemoryEventListener());
-
-        final Cheese c1 = new Cheese( "a",
-                                      1 );
-        final Cheese c2 = new Cheese( "b",
-                                      2 );
-        final Cheese c3 = new Cheese( "c",
-                                      3 );
-        List list;
-
-        workingMemory.assertObject( c1 );
-        final FactHandle h = workingMemory.assertObject( c2 );
-        workingMemory.assertObject( c3 );
-        workingMemory.fireAllRules();
-
-        // Check logical assertions where made for c2 and c3
-        list = workingMemory.getObjects( Person.class );
-        assertEquals( 2,
-                      list.size() );
-        assertFalse( list.contains( new Person( c1.getType() ) ) );
-        assertTrue( list.contains( new Person( c2.getType() ) ) );
-        assertTrue( list.contains( new Person( c3.getType() ) ) );
-
-        // this rule will make a logical assertion for c1 too
-        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsDynamicRule2.drl" ) );
-        builder = new PackageBuilder();
-        builder.addPackageFromDrl( reader );
-        final Package pkg2 = builder.getPackage();
-        ruleBase.addPackage( pkg2 );
-
-        workingMemory.fireAllRules();
-
-        // check all now have just one logical assertion each
-        list = workingMemory.getObjects( Person.class );
-        assertEquals( 3,
-                      list.size() );
-        assertTrue( list.contains( new Person( c1.getType() ) ) );
-        assertTrue( list.contains( new Person( c2.getType() ) ) );
-        assertTrue( list.contains( new Person( c3.getType() ) ) );
-
-        // check the packages are correctly populated
-        assertEquals( "org.drools.test",
-                      ruleBase.getPackages()[0].getName() );
-        assertEquals( "org.drools.test2",
-                      ruleBase.getPackages()[1].getName() );
-        assertEquals( "rule1",
-                      ruleBase.getPackages()[0].getRules()[0].getName() );
-        assertEquals( "rule2",
-                      ruleBase.getPackages()[1].getRules()[0].getName() );
-
-        // now remove the first rule
-        if ( reteooRuleBase != null ) {
-            reteooRuleBase.removeRule( ruleBase.getPackages()[0].getName(),
-                                       ruleBase.getPackages()[0].getRules()[0].getName() );
-            // } else if ( leapsRuleBase != null ) {
-            // leapsRuleBase.removeRule( ruleBase.getPackages()[0].getName(),
-            // ruleBase.getPackages()[0].getRules()[0].getName() );
-        }
-
-        // Check the rule was correctly remove
-        assertEquals( 0,
-                      ruleBase.getPackages()[0].getRules().length );
-        assertEquals( 1,
-                      ruleBase.getPackages()[1].getRules().length );
-        assertEquals( "org.drools.test2",
-                      ruleBase.getPackages()[1].getName() );
-        assertEquals( "rule2",
-                      ruleBase.getPackages()[1].getRules()[0].getName() );
-
-        list = workingMemory.getObjects( Person.class );
-        assertEquals( "removal of the rule should result in retraction of c3's logical assertion",
-                      2,
-                      list.size() );
-        assertTrue( "c1's logical assertion should not be retracted",
-                    list.contains( new Person( c1.getType() ) ) );
-        assertTrue( "c2's logical assertion should  not be retracted",
-                    list.contains( new Person( c2.getType() ) ) );
-        assertFalse( "c3's logical assertion should be  retracted",
-                     list.contains( new Person( c3.getType() ) ) );
-
-        c2.setPrice( 3 );
-        workingMemory.modifyObject( h,
-                                    c2 );
-        list = workingMemory.getObjects( Person.class );
-        assertEquals( "c2 now has a higher price, its logical assertion should  be cancelled",
-                      1,
-                      list.size() );
-        assertFalse( "The logical assertion cor c2 should have been retracted",
-                     list.contains( new Person( c2.getType() ) ) );
-        assertTrue( "The logical assertion  for c1 should exist",
-                    list.contains( new Person( c1.getType() ) ) );
-
-        if ( reteooRuleBase != null ) {
-            reteooRuleBase.removeRule( ruleBase.getPackages()[1].getName(),
-                                       ruleBase.getPackages()[1].getRules()[0].getName() );
-            // } else if ( leapsRuleBase != null ) {
-            // leapsRuleBase.removeRule( ruleBase.getPackages()[1].getName(),
-            // ruleBase.getPackages()[1].getRules()[0].getName() );
-        }
-        assertEquals( 0,
-                      ruleBase.getPackages()[0].getRules().length );
-        assertEquals( 0,
-                      ruleBase.getPackages()[1].getRules().length );
-        list = workingMemory.getObjects( Person.class );
-        assertEquals( 0,
-                      list.size() );
-    }
-
-    public void testLogicalAssertionsModifyEqual() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsModifyEqual.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        List l;
-        final Person p = new Person( "person" );
-        p.setAge( 2 );
-        final FactHandle h = workingMemory.assertObject( p );
-        assertEquals( 1,
-                      workingMemory.getObjects().size() );
-
-        workingMemory.fireAllRules();
-        assertEquals( 2,
-                      workingMemory.getObjects().size() );
-        l = workingMemory.getObjects( CheeseEqual.class );
-        assertEquals( 1,
-                      l.size() );
-        assertEquals( 3,
-                      ((CheeseEqual) l.get( 0 )).getPrice() );
-
-        workingMemory.retractObject( h );
-        assertEquals( 0,
-                      workingMemory.getObjects().size() );
-
-        TruthMaintenanceSystem tms = ((InternalWorkingMemory) workingMemory).getTruthMaintenanceSystem();
-
-        final java.lang.reflect.Field field = tms.getClass().getDeclaredField( "assertMap" );
-        field.setAccessible( true );
-        final ObjectHashMap m = (ObjectHashMap) field.get( tms );
-        field.setAccessible( false );
-        assertEquals( "assertMap should be empty",
-                      0,
-                      m.size() );
-    }
-
-    public void testLogicalAssertionsWithExists() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionWithExists.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        final Person p1 = new Person( "p1",
-                                      "stilton",
-                                      20 );
-        p1.setStatus( "europe" );
-        final FactHandle c1FactHandle = workingMemory.assertObject( p1 );
-        final Person p2 = new Person( "p2",
-                                      "stilton",
-                                      30 );
-        p2.setStatus( "europe" );
-        final FactHandle c2FactHandle = workingMemory.assertObject( p2 );
-        final Person p3 = new Person( "p3",
-                                      "stilton",
-                                      40 );
-        p3.setStatus( "europe" );
-        final FactHandle c3FactHandle = workingMemory.assertObject( p3 );
-        workingMemory.fireAllRules();
-
-        // all 3 in europe, so, 2 cheese
-        List cheeseList = workingMemory.getObjects( Cheese.class );
-        assertEquals( 2,
-                      cheeseList.size() );
-
-        // europe=[ 1, 2 ], america=[ 3 ]
-        p3.setStatus( "america" );
-        workingMemory.modifyObject( c3FactHandle,
-                                    p3 );
-        workingMemory.fireAllRules();
-        cheeseList = workingMemory.getObjects( Cheese.class );
-        assertEquals( 1,
-                      cheeseList.size() );
-
-        // europe=[ 1 ], america=[ 2, 3 ]
-        p2.setStatus( "america" );
-        workingMemory.modifyObject( c2FactHandle,
-                                    p2 );
-        workingMemory.fireAllRules();
-        cheeseList = workingMemory.getObjects( Cheese.class );
-        assertEquals( 1,
-                      cheeseList.size() );
-
-        // europe=[ ], america=[ 1, 2, 3 ]
-        p1.setStatus( "america" );
-        workingMemory.modifyObject( c1FactHandle,
-                                    p1 );
-        workingMemory.fireAllRules();
-        cheeseList = workingMemory.getObjects( Cheese.class );
-        assertEquals( 2,
-                      cheeseList.size() );
-
-        // europe=[ 2 ], america=[ 1, 3 ]
-        p2.setStatus( "europe" );
-        workingMemory.modifyObject( c2FactHandle,
-                                    p2 );
-        workingMemory.fireAllRules();
-        cheeseList = workingMemory.getObjects( Cheese.class );
-        assertEquals( 1,
-                      cheeseList.size() );
-
-        // europe=[ 1, 2 ], america=[ 3 ]
-        p1.setStatus( "europe" );
-        workingMemory.modifyObject( c1FactHandle,
-                                    p1 );
-        workingMemory.fireAllRules();
-        cheeseList = workingMemory.getObjects( Cheese.class );
-        assertEquals( 1,
-                      cheeseList.size() );
-
-        // europe=[ 1, 2, 3 ], america=[ ]
-        p3.setStatus( "europe" );
-        workingMemory.modifyObject( c3FactHandle,
-                                    p3 );
-        workingMemory.fireAllRules();
-        cheeseList = workingMemory.getObjects( Cheese.class );
-        assertEquals( 2,
-                      cheeseList.size() );
-    }
-    
-    public void testLogicalAssertions3() throws Exception {
-        final PackageBuilder builder = new PackageBuilder();
-        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_logicalAssertions3.drl" ) ) );
-        final Package pkg = builder.getPackage();
-
-        final RuleBase ruleBase = getRuleBase();
-        ruleBase.addPackage( pkg );
-        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
-
-        final List list = new ArrayList();
-        workingMemory.setGlobal( "events",
-                                 list );
-
-        // asserting the sensor object
-        final Sensor sensor = new Sensor( 150,
-                                          100 );
-        final FactHandle sensorHandle = workingMemory.assertObject( sensor );
-
-        workingMemory.fireAllRules();
-
-        // alarm must sound
-        assertEquals( 2,
-                      list.size() );
-        assertEquals( 2,
-                      workingMemory.getObjects().size() );
-
-        // modifying sensor
-        sensor.setTemperature( 125 );
-        workingMemory.modifyObject( sensorHandle,
-                                    sensor );
-        workingMemory.fireAllRules();
-
-        // alarm must continue to sound
-        assertEquals( 4,
-                      list.size() );
-        assertEquals( 2,
-                      workingMemory.getObjects().size() );
-
-        // modifying sensor
-        sensor.setTemperature( 80 );
-        workingMemory.modifyObject( sensorHandle,
-                                    sensor );
-        workingMemory.fireAllRules();
-
-        // no alarms anymore
-        assertEquals( 4,
-                      list.size() );
-        assertEquals( 1,
-                      workingMemory.getObjects().size() );
-
-    }
-    
-
-}

Copied: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/TruthMaintenanceTest.java (from rev 10979, labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/compiler/TruthMaintenanceTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/TruthMaintenanceTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/TruthMaintenanceTest.java	2007-04-15 22:27:51 UTC (rev 10980)
@@ -0,0 +1,764 @@
+package org.drools.integrationtests;
+
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.drools.Cheese;
+import org.drools.CheeseEqual;
+import org.drools.FactHandle;
+import org.drools.Person;
+import org.drools.RuleBase;
+import org.drools.RuleBaseConfiguration;
+import org.drools.RuleBaseFactory;
+import org.drools.Sensor;
+import org.drools.WorkingMemory;
+import org.drools.audit.WorkingMemoryFileLogger;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.common.TruthMaintenanceSystem;
+import org.drools.event.ActivationCancelledEvent;
+import org.drools.event.ActivationCreatedEvent;
+import org.drools.event.AfterActivationFiredEvent;
+import org.drools.event.AgendaEventListener;
+import org.drools.event.BeforeActivationFiredEvent;
+import org.drools.event.DefaultAgendaEventListener;
+import org.drools.event.DefaultWorkingMemoryEventListener;
+import org.drools.event.ObjectAssertedEvent;
+import org.drools.event.ObjectModifiedEvent;
+import org.drools.event.ObjectRetractedEvent;
+import org.drools.event.WorkingMemoryEventListener;
+import org.drools.rule.Package;
+import org.drools.util.ObjectHashMap;
+
+public class TruthMaintenanceTest extends TestCase {
+    protected RuleBase getRuleBase() throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            null );
+    }
+
+    protected RuleBase getRuleBase(final RuleBaseConfiguration config) throws Exception {
+
+        return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+                                            config );
+    }
+    
+    public void testLogicalAssertions() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertions.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        final Cheese brie = new Cheese( "brie",
+                                        12 );
+        final FactHandle brieHandle = workingMemory.assertObject( brie );
+
+        final Cheese provolone = new Cheese( "provolone",
+                                             12 );
+        final FactHandle provoloneHandle = workingMemory.assertObject( provolone );
+
+        workingMemory.fireAllRules();
+
+        assertEquals( 3,
+                      list.size() );
+
+        assertEquals( 3,
+                      workingMemory.getObjects().size() );
+
+        workingMemory.retractObject( brieHandle );
+
+        assertEquals( 2,
+                      workingMemory.getObjects().size() );
+
+        workingMemory.retractObject( provoloneHandle );
+
+        assertEquals( 0,
+                      workingMemory.getObjects().size() );
+    }
+
+    public void testLogicalAssertionsBacking() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsBacking.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        final Cheese cheese1 = new Cheese( "c",
+                                           1 );
+        final Cheese cheese2 = new Cheese( cheese1.getType(),
+                                           1 );
+        List list;
+
+        final FactHandle h1 = workingMemory.assertObject( cheese1 );
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( cheese1.getType().getClass() );
+        assertEquals( 1,
+                      list.size() );
+        // probably dangerous, as contains works with equals, not identity
+        assertEquals( cheese1.getType(),
+                      list.get( 0 ) );
+        // FactHandle ht = workingMemory.getFactHandle(c1.getType());
+
+        final FactHandle h2 = workingMemory.assertObject( cheese2 );
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( cheese1.getType().getClass() );
+        assertEquals( 1,
+                      list.size() );
+        assertEquals( cheese1.getType(),
+                      list.get( 0 ) );
+
+        workingMemory.retractObject( h1 );
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( cheese1.getType().getClass() );
+        assertEquals( "cheese-type " + cheese1.getType() + " was retracted, but should not. Backed by cheese2 => type.",
+                      1,
+                      list.size() );
+        assertEquals( "cheese-type " + cheese1.getType() + " was retracted, but should not. Backed by cheese2 => type.",
+                      cheese1.getType(),
+                      list.get( 0 ) );
+
+        workingMemory.retractObject( h2 );
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( cheese1.getType().getClass() );
+        assertEquals( "cheese-type " + cheese1.getType() + " was not retracted, but should have. Neither  cheese1 => type nor cheese2 => type is true.",
+                      0,
+                      list.size() );
+    }
+
+    public void testLogicalAssertionsSelfreferencing() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsSelfreferencing.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        List list;
+
+        final Person b = new Person( "b" );
+        final Person a = new Person( "a" );
+
+        workingMemory.setGlobal( "b",
+                                 b );
+
+        FactHandle h1 = workingMemory.assertObject( a );
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( a.getClass() );
+        assertEquals( 2,
+                      list.size() );
+        assertTrue( list.contains( a ) );
+        assertTrue( list.contains( b ) );
+
+        workingMemory.retractObject( h1 );
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( a.getClass() );
+        assertEquals( "b was retracted, but it should not have. Is backed by b => b being true.",
+                      1,
+                      list.size() );
+        assertEquals( "b was retracted, but it should not have. Is backed by b => b being true.",
+                      b,
+                      list.get( 0 ) );
+
+        h1 = workingMemory.getFactHandle( b );
+        workingMemory.retractObject( h1 );
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( a.getClass() );
+        assertEquals( 0,
+                      list.size() );
+    }
+
+    public void testLogicalAssertionsLoop() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsLoop.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        List list;
+
+        final List l = new ArrayList();
+        final Person a = new Person( "a" );
+        workingMemory.setGlobal( "a",
+                                 a );
+        workingMemory.setGlobal( "l",
+                                 l );
+
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( a.getClass() );
+        assertEquals( "a still asserted.",
+                      0,
+                      list.size() );
+        assertEquals( "Rule has not fired (looped) expected number of times",
+                      10,
+                      l.size() );
+    }
+
+    public void testLogicalAssertionsNoLoop() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsNoLoop.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        List list;
+
+        final List l = new ArrayList();
+        final Person a = new Person( "a" );
+        workingMemory.setGlobal( "a",
+                                 a );
+        workingMemory.setGlobal( "l",
+                                 l );
+
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects( a.getClass() );
+        assertEquals( "a still in WM",
+                      0,
+                      list.size() );
+        assertEquals( "Rule should not loop",
+                      1,
+                      l.size() );
+    }
+
+    public void testLogicalAssertionsWithModify() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsWithModify.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+        
+        final WorkingMemoryEventListener l2 = new DefaultWorkingMemoryEventListener() {
+            public void objectAsserted(ObjectAssertedEvent event) {
+                System.out.println( event );
+            }
+
+            public void objectRetracted(ObjectRetractedEvent event) {
+                System.out.println( event );
+            }
+
+            public void objectModified(ObjectModifiedEvent event) {
+                System.out.println( event );
+            }
+        };
+        
+        workingMemory.addEventListener( l2 );        
+
+        List l;
+        final Person p = new Person( "person" );
+        p.setAge( 2 );
+        final FactHandle h = workingMemory.assertObject( p );
+        assertEquals( 1,
+                      workingMemory.getObjects().size() );
+
+        workingMemory.fireAllRules();
+        assertEquals( 2,
+                      workingMemory.getObjects().size() );
+        l = workingMemory.getObjects( CheeseEqual.class );
+        assertEquals( 1,
+                      l.size() );
+        assertEquals( 2,
+                      ((CheeseEqual) l.get( 0 )).getPrice() );
+
+        workingMemory.retractObject( h );
+        assertEquals( 0,
+                      workingMemory.getObjects().size() );
+
+        TruthMaintenanceSystem tms = ((InternalWorkingMemory) workingMemory).getTruthMaintenanceSystem();
+
+        final java.lang.reflect.Field field = tms.getClass().getDeclaredField( "assertMap" );
+        field.setAccessible( true );
+        final ObjectHashMap m = (ObjectHashMap) field.get( tms );
+        field.setAccessible( false );
+        assertEquals( "assertMap should be empty",
+                      0,
+                      m.size() );
+    }
+
+    public void testLogicalAssertions2() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertions2.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        final WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger( workingMemory );
+        logger.setFileName( "logical.log" );
+
+        final AgendaEventListener listener = new DefaultAgendaEventListener() {
+            public void activationCreated(ActivationCreatedEvent event,
+                                          WorkingMemory workingMemory) {
+                System.out.println( event );
+            }
+
+            public void activationCancelled(ActivationCancelledEvent event,
+                                            WorkingMemory workingMemory) {
+                System.out.println( event );
+            }
+
+            public void beforeActivationFired(BeforeActivationFiredEvent event,
+                                              WorkingMemory workingMemory) {
+            }
+
+            public void afterActivationFired(AfterActivationFiredEvent event,
+                                             WorkingMemory workingMemory) {
+                System.out.println( event );
+            }
+        };
+        workingMemory.addEventListener( listener );
+
+        final List events = new ArrayList();
+
+        workingMemory.setGlobal( "events",
+                                 events );
+
+        final Sensor sensor = new Sensor( 80,
+                                          80 );
+        final FactHandle handle = workingMemory.assertObject( sensor );
+
+        // everything should be normal
+        workingMemory.fireAllRules();
+
+        final List list = workingMemory.getObjects();
+
+        assertEquals( "Only sensor is there",
+                      1,
+                      list.size() );
+        assertEquals( "Only one event",
+                      1,
+                      events.size() );
+
+        // problems should be detected
+        sensor.setPressure( 200 );
+        sensor.setTemperature( 200 );
+        workingMemory.modifyObject( handle,
+                                    sensor );
+
+        workingMemory.fireAllRules();
+        logger.writeToDisk();
+
+        assertEquals( "Only sensor is there",
+                      1,
+                      list.size() );
+        assertEquals( "Exactly six events",
+                      6,
+                      events.size() );
+    }
+
+    public void testLogicalAssertionsNot() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsNot.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        List list;
+
+        final Person a = new Person( "a" );
+        final Cheese cheese = new Cheese( "brie",
+                                          1 );
+        workingMemory.setGlobal( "cheese",
+                                 cheese );
+
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects();
+        assertEquals( "i was not asserted by not a => i.",
+                      1,
+                      list.size() );
+        assertEquals( "i was not asserted by not a => i.",
+                      cheese,
+                      list.get( 0 ) );
+
+        final FactHandle h = workingMemory.assertObject( a );
+        // no need to fire rules, assertion alone removes justification for i,
+        // so it should be retracted.
+        // workingMemory.fireAllRules();
+        list = workingMemory.getObjects();
+        assertEquals( "a was not asserted or i not retracted.",
+                      1,
+                      list.size() );
+        assertEquals( "a was asserted.",
+                      a,
+                      list.get( 0 ) );
+        assertFalse( "i was not rectracted.",
+                     list.contains( cheese ) );
+
+        // no rules should fire, but nevertheless...
+        // workingMemory.fireAllRules();
+        assertEquals( "agenda should be empty.",
+                      0,
+                      workingMemory.getAgenda().agendaSize() );
+
+        workingMemory.retractObject( h );
+        workingMemory.fireAllRules();
+        list = workingMemory.getObjects();
+        assertEquals( "i was not asserted by not a => i.",
+                      1,
+                      list.size() );
+        assertEquals( "i was not asserted by not a => i.",
+                      cheese,
+                      list.get( 0 ) );
+    }
+
+    public void testLogicalAssertionsNotPingPong() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsNotPingPong.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        // workingMemory.addEventListener(new DebugAgendaEventListener());
+        // workingMemory.addEventListener(new
+        // DebugWorkingMemoryEventListener());
+
+        final List list = new ArrayList();
+
+        final Person person = new Person( "person" );
+        final Cheese cheese = new Cheese( "cheese",
+                                          0 );
+        workingMemory.setGlobal( "cheese",
+                                 cheese );
+        workingMemory.setGlobal( "person",
+                                 person );
+        workingMemory.setGlobal( "list",
+                                 list );
+
+        workingMemory.fireAllRules();
+
+        // not sure about desired state of working memory.
+        assertEquals( "Rules have not fired (looped) expected number of times",
+                      10,
+                      list.size() );
+    }
+
+    public void testLogicalAssertionsDynamicRule() throws Exception {
+        PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsDynamicRule.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        org.drools.reteoo.ReteooRuleBase reteooRuleBase = null;
+        // org.drools.leaps.LeapsRuleBase leapsRuleBase = null;
+        final RuleBase ruleBase = getRuleBase();
+        if ( ruleBase instanceof org.drools.reteoo.ReteooRuleBase ) {
+            reteooRuleBase = (org.drools.reteoo.ReteooRuleBase) ruleBase;
+            // } else if ( ruleBase instanceof org.drools.leaps.LeapsRuleBase )
+            // {
+            // leapsRuleBase = (org.drools.leaps.LeapsRuleBase) ruleBase;
+        }
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        // workingMemory.addEventListener(new
+        // org.drools.event.DebugAgendaEventListener());
+        // workingMemory.addEventListener(new
+        // org.drools.event.DebugWorkingMemoryEventListener());
+
+        final Cheese c1 = new Cheese( "a",
+                                      1 );
+        final Cheese c2 = new Cheese( "b",
+                                      2 );
+        final Cheese c3 = new Cheese( "c",
+                                      3 );
+        List list;
+
+        workingMemory.assertObject( c1 );
+        final FactHandle h = workingMemory.assertObject( c2 );
+        workingMemory.assertObject( c3 );
+        workingMemory.fireAllRules();
+
+        // Check logical assertions where made for c2 and c3
+        list = workingMemory.getObjects( Person.class );
+        assertEquals( 2,
+                      list.size() );
+        assertFalse( list.contains( new Person( c1.getType() ) ) );
+        assertTrue( list.contains( new Person( c2.getType() ) ) );
+        assertTrue( list.contains( new Person( c3.getType() ) ) );
+
+        // this rule will make a logical assertion for c1 too
+        final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsDynamicRule2.drl" ) );
+        builder = new PackageBuilder();
+        builder.addPackageFromDrl( reader );
+        final Package pkg2 = builder.getPackage();
+        ruleBase.addPackage( pkg2 );
+
+        workingMemory.fireAllRules();
+
+        // check all now have just one logical assertion each
+        list = workingMemory.getObjects( Person.class );
+        assertEquals( 3,
+                      list.size() );
+        assertTrue( list.contains( new Person( c1.getType() ) ) );
+        assertTrue( list.contains( new Person( c2.getType() ) ) );
+        assertTrue( list.contains( new Person( c3.getType() ) ) );
+
+        // check the packages are correctly populated
+        assertEquals( "org.drools.test",
+                      ruleBase.getPackages()[0].getName() );
+        assertEquals( "org.drools.test2",
+                      ruleBase.getPackages()[1].getName() );
+        assertEquals( "rule1",
+                      ruleBase.getPackages()[0].getRules()[0].getName() );
+        assertEquals( "rule2",
+                      ruleBase.getPackages()[1].getRules()[0].getName() );
+
+        // now remove the first rule
+        if ( reteooRuleBase != null ) {
+            reteooRuleBase.removeRule( ruleBase.getPackages()[0].getName(),
+                                       ruleBase.getPackages()[0].getRules()[0].getName() );
+            // } else if ( leapsRuleBase != null ) {
+            // leapsRuleBase.removeRule( ruleBase.getPackages()[0].getName(),
+            // ruleBase.getPackages()[0].getRules()[0].getName() );
+        }
+
+        // Check the rule was correctly remove
+        assertEquals( 0,
+                      ruleBase.getPackages()[0].getRules().length );
+        assertEquals( 1,
+                      ruleBase.getPackages()[1].getRules().length );
+        assertEquals( "org.drools.test2",
+                      ruleBase.getPackages()[1].getName() );
+        assertEquals( "rule2",
+                      ruleBase.getPackages()[1].getRules()[0].getName() );
+
+        list = workingMemory.getObjects( Person.class );
+        assertEquals( "removal of the rule should result in retraction of c3's logical assertion",
+                      2,
+                      list.size() );
+        assertTrue( "c1's logical assertion should not be retracted",
+                    list.contains( new Person( c1.getType() ) ) );
+        assertTrue( "c2's logical assertion should  not be retracted",
+                    list.contains( new Person( c2.getType() ) ) );
+        assertFalse( "c3's logical assertion should be  retracted",
+                     list.contains( new Person( c3.getType() ) ) );
+
+        c2.setPrice( 3 );
+        workingMemory.modifyObject( h,
+                                    c2 );
+        list = workingMemory.getObjects( Person.class );
+        assertEquals( "c2 now has a higher price, its logical assertion should  be cancelled",
+                      1,
+                      list.size() );
+        assertFalse( "The logical assertion cor c2 should have been retracted",
+                     list.contains( new Person( c2.getType() ) ) );
+        assertTrue( "The logical assertion  for c1 should exist",
+                    list.contains( new Person( c1.getType() ) ) );
+
+        if ( reteooRuleBase != null ) {
+            reteooRuleBase.removeRule( ruleBase.getPackages()[1].getName(),
+                                       ruleBase.getPackages()[1].getRules()[0].getName() );
+            // } else if ( leapsRuleBase != null ) {
+            // leapsRuleBase.removeRule( ruleBase.getPackages()[1].getName(),
+            // ruleBase.getPackages()[1].getRules()[0].getName() );
+        }
+        assertEquals( 0,
+                      ruleBase.getPackages()[0].getRules().length );
+        assertEquals( 0,
+                      ruleBase.getPackages()[1].getRules().length );
+        list = workingMemory.getObjects( Person.class );
+        assertEquals( 0,
+                      list.size() );
+    }
+
+    public void testLogicalAssertionsModifyEqual() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionsModifyEqual.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        List l;
+        final Person p = new Person( "person" );
+        p.setAge( 2 );
+        final FactHandle h = workingMemory.assertObject( p );
+        assertEquals( 1,
+                      workingMemory.getObjects().size() );
+
+        workingMemory.fireAllRules();
+        assertEquals( 2,
+                      workingMemory.getObjects().size() );
+        l = workingMemory.getObjects( CheeseEqual.class );
+        assertEquals( 1,
+                      l.size() );
+        assertEquals( 3,
+                      ((CheeseEqual) l.get( 0 )).getPrice() );
+
+        workingMemory.retractObject( h );
+        assertEquals( 0,
+                      workingMemory.getObjects().size() );
+
+        TruthMaintenanceSystem tms = ((InternalWorkingMemory) workingMemory).getTruthMaintenanceSystem();
+
+        final java.lang.reflect.Field field = tms.getClass().getDeclaredField( "assertMap" );
+        field.setAccessible( true );
+        final ObjectHashMap m = (ObjectHashMap) field.get( tms );
+        field.setAccessible( false );
+        assertEquals( "assertMap should be empty",
+                      0,
+                      m.size() );
+    }
+
+    public void testLogicalAssertionsWithExists() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_LogicalAssertionWithExists.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        final Person p1 = new Person( "p1",
+                                      "stilton",
+                                      20 );
+        p1.setStatus( "europe" );
+        final FactHandle c1FactHandle = workingMemory.assertObject( p1 );
+        final Person p2 = new Person( "p2",
+                                      "stilton",
+                                      30 );
+        p2.setStatus( "europe" );
+        final FactHandle c2FactHandle = workingMemory.assertObject( p2 );
+        final Person p3 = new Person( "p3",
+                                      "stilton",
+                                      40 );
+        p3.setStatus( "europe" );
+        final FactHandle c3FactHandle = workingMemory.assertObject( p3 );
+        workingMemory.fireAllRules();
+
+        // all 3 in europe, so, 2 cheese
+        List cheeseList = workingMemory.getObjects( Cheese.class );
+        assertEquals( 2,
+                      cheeseList.size() );
+
+        // europe=[ 1, 2 ], america=[ 3 ]
+        p3.setStatus( "america" );
+        workingMemory.modifyObject( c3FactHandle,
+                                    p3 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( Cheese.class );
+        assertEquals( 1,
+                      cheeseList.size() );
+
+        // europe=[ 1 ], america=[ 2, 3 ]
+        p2.setStatus( "america" );
+        workingMemory.modifyObject( c2FactHandle,
+                                    p2 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( Cheese.class );
+        assertEquals( 1,
+                      cheeseList.size() );
+
+        // europe=[ ], america=[ 1, 2, 3 ]
+        p1.setStatus( "america" );
+        workingMemory.modifyObject( c1FactHandle,
+                                    p1 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( Cheese.class );
+        assertEquals( 2,
+                      cheeseList.size() );
+
+        // europe=[ 2 ], america=[ 1, 3 ]
+        p2.setStatus( "europe" );
+        workingMemory.modifyObject( c2FactHandle,
+                                    p2 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( Cheese.class );
+        assertEquals( 1,
+                      cheeseList.size() );
+
+        // europe=[ 1, 2 ], america=[ 3 ]
+        p1.setStatus( "europe" );
+        workingMemory.modifyObject( c1FactHandle,
+                                    p1 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( Cheese.class );
+        assertEquals( 1,
+                      cheeseList.size() );
+
+        // europe=[ 1, 2, 3 ], america=[ ]
+        p3.setStatus( "europe" );
+        workingMemory.modifyObject( c3FactHandle,
+                                    p3 );
+        workingMemory.fireAllRules();
+        cheeseList = workingMemory.getObjects( Cheese.class );
+        assertEquals( 2,
+                      cheeseList.size() );
+    }
+    
+    public void testLogicalAssertions3() throws Exception {
+        final PackageBuilder builder = new PackageBuilder();
+        builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test_logicalAssertions3.drl" ) ) );
+        final Package pkg = builder.getPackage();
+
+        final RuleBase ruleBase = getRuleBase();
+        ruleBase.addPackage( pkg );
+        final WorkingMemory workingMemory = ruleBase.newWorkingMemory();
+
+        final List list = new ArrayList();
+        workingMemory.setGlobal( "events",
+                                 list );
+
+        // asserting the sensor object
+        final Sensor sensor = new Sensor( 150,
+                                          100 );
+        final FactHandle sensorHandle = workingMemory.assertObject( sensor );
+
+        workingMemory.fireAllRules();
+
+        // alarm must sound
+        assertEquals( 2,
+                      list.size() );
+        assertEquals( 2,
+                      workingMemory.getObjects().size() );
+
+        // modifying sensor
+        sensor.setTemperature( 125 );
+        workingMemory.modifyObject( sensorHandle,
+                                    sensor );
+        workingMemory.fireAllRules();
+
+        // alarm must continue to sound
+        assertEquals( 4,
+                      list.size() );
+        assertEquals( 2,
+                      workingMemory.getObjects().size() );
+
+        // modifying sensor
+        sensor.setTemperature( 80 );
+        workingMemory.modifyObject( sensorHandle,
+                                    sensor );
+        workingMemory.fireAllRules();
+
+        // no alarms anymore
+        assertEquals( 4,
+                      list.size() );
+        assertEquals( 1,
+                      workingMemory.getObjects().size() );
+
+    }
+    
+
+}




More information about the jboss-svn-commits mailing list