@Test public void testLogicalInsertionsNoLoop() throws Exception { final PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( new InputStreamReader(getClass().getResourceAsStream("test_LogicalInsertionsNoLoop.drl"))); final Package pkg = builder.getPackage(); RuleBase ruleBase = getRuleBase(); ruleBase.addPackage(pkg); ruleBase = SerializationHelper.serializeObject(ruleBase); final WorkingMemory workingMemory = ruleBase.newStatefulSession(); List list; final List l = new ArrayList(); final Person a = new Person("a"); workingMemory.setGlobal("a", a); workingMemory.setGlobal("l", l); workingMemory.fireAllRules(); list = IteratorToList.convert(workingMemory.iterateObjects(new ClassObjectFilter(a.getClass()))); assertEquals("a still in WM", 0, list.size()); assertEquals("Rule should not loop", 1, l.size()); }
@Test public void testLogicalInsertionsSelfreferencing() throws Exception { final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( "test_LogicalInsertionsSelfreferencing.drl", getClass()), ResourceType.DRL); Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages(); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kpkgs); kbase = SerializationHelper.serializeObject(kbase); final StatefulKnowledgeSession session = createKnowledgeSession(kbase); final Person b = new Person("b"); final Person a = new Person("a"); session.setGlobal("b", b); FactHandle h1 = session.insert(a); session.fireAllRules(); Collection<?> list = session.getObjects(new ClassObjectFilter(a.getClass())); assertEquals(2, list.size()); assertTrue(list.contains(a)); assertTrue(list.contains(b)); session.retract(h1); session.fireAllRules(); list = session.getObjects(new ClassObjectFilter(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.iterator().next()); h1 = session.getFactHandle(b); session.retract(h1); session.fireAllRules(); list = session.getObjects(new ClassObjectFilter(a.getClass())); assertEquals(0, list.size()); }
@Test public void testLogicalInsertionsLoop() throws Exception { final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource("test_LogicalInsertionsLoop.drl", getClass()), ResourceType.DRL); Collection<KnowledgePackage> kpkgs = kbuilder.getKnowledgePackages(); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kpkgs); kbase = SerializationHelper.serializeObject(kbase); final StatefulKnowledgeSession session = createKnowledgeSession(kbase); final List l = new ArrayList(); final Person a = new Person("a"); session.setGlobal("a", a); session.setGlobal("l", l); session.fireAllRules(); Collection<?> list = session.getObjects(new ClassObjectFilter(a.getClass())); assertEquals("a still asserted.", 0, list.size()); assertEquals("Rule has not fired (looped) expected number of times", 10, l.size()); }