}
@Test
public void testPopulatedSharedLiaNode() throws Exception {
KnowledgeBase kbase1 = buildKnowledgeBase("r1", " A() B(1;) C() D() E()\n");
ReteooWorkingMemoryInterface wm = ((StatefulKnowledgeSessionImpl)kbase1.newStatefulKnowledgeSession()).session;
List list = new ArrayList();
wm.setGlobal("list", list);
wm.insert(new A(1));
wm.insert(new A(2));
wm.insert(new A(3));
wm.insert(new B(1));
wm.insert(new B(2));
wm.insert(new C(1));
wm.insert(new D(1));
wm.insert(new E(1));
wm.fireAllRules();
assertEquals( 3, list.size() );
assertEquals( 13, countNodeMemories(wm.getNodeMemories()));
kbase1.addKnowledgePackages( buildKnowledgePackage("r2", " a : A() B(2;) C() D() E()\n") );
wm.fireAllRules();
assertEquals( 19, countNodeMemories(wm.getNodeMemories()));
ObjectTypeNode aotn = getObjectTypeNode(kbase1, A.class );
LeftInputAdapterNode liaNode = (LeftInputAdapterNode) aotn.getSinkPropagator().getSinks()[0];
JoinNode b1Node = (JoinNode) liaNode.getSinkPropagator().getFirstLeftTupleSink();
JoinNode b2Node = (JoinNode) liaNode.getSinkPropagator().getLastLeftTupleSink();
JoinNode c1Node = (JoinNode) b1Node.getSinkPropagator().getLastLeftTupleSink();
LiaNodeMemory lm = ( LiaNodeMemory ) wm.getNodeMemory(liaNode);
SegmentMemory sm = lm.getSegmentMemory();
BetaMemory b1Mem = ( BetaMemory ) wm.getNodeMemory(b1Node);
assertSame( sm.getFirst(), b1Mem.getSegmentMemory());
assertEquals( 3, b1Mem.getLeftTupleMemory().size() );
assertEquals( 1, b1Mem.getRightTupleMemory().size() );
BetaMemory b2Mem = ( BetaMemory ) wm.getNodeMemory(b2Node);
SegmentMemory b2Smem = sm.getFirst().getNext();
assertSame( b2Smem, b2Mem.getSegmentMemory());
assertEquals( 3, b2Mem.getLeftTupleMemory().size() );
assertEquals( 1, b2Mem.getRightTupleMemory().size() );
assertEquals(6, list.size() );
BetaMemory c1Mem = ( BetaMemory ) wm.getNodeMemory(c1Node);
assertSame( b1Mem.getSegmentMemory(), c1Mem.getSegmentMemory() );
assertNotSame(b1Mem.getSegmentMemory(), b2Mem.getSegmentMemory());
wm.fireAllRules();
assertEquals(6, list.size() );
assertEquals( 19, countNodeMemories(wm.getNodeMemories()));
kbase1.removeRule("org.kie", "r2");
assertEquals( 13, countNodeMemories(wm.getNodeMemories()));
assertSame( sm, b1Mem.getSegmentMemory());
assertSame( sm, c1Mem.getSegmentMemory());
assertNull(sm.getFirst());
assertEquals( 3, b1Mem.getLeftTupleMemory().size() );
assertEquals( 1, b1Mem.getRightTupleMemory().size() );
//SegmentMemory b2Smem = sm.getFirst().remove();
assertSame( b2Smem, b2Mem.getSegmentMemory());
assertEquals( 0, b2Mem.getLeftTupleMemory().size() );
assertEquals( 0, b2Mem.getRightTupleMemory().size() );
wm.insert(new A(1));
wm.fireAllRules();
assertEquals( "r1", ((Match)list.get(6)).getRule().getName() );
assertEquals(7, list.size() ); // only one more added, as second rule as removed
}