@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());
  }