String rule1 = "$b : B( a == 15) @watch(c, !a) A( a == 10, b == 15, b == $b.b ) @watch(c, !b)";
String rule2 = "$b : B( a == 15) @watch(j) A( a == 10, i == 20, b == $b.b ) @watch(s, !a)";
KnowledgeBase kbase = getKnowledgeBase(rule1, rule2);
ReteooWorkingMemoryInterface wm = ((StatefulKnowledgeSessionImpl)kbase.newStatefulKnowledgeSession());
ObjectTypeNode otn = getObjectTypeNode(kbase, "A" );
assertNotNull( otn );
List<String> sp = getSettableProperties(wm, otn);
AlphaNode alphaNode1 = ( AlphaNode ) otn.getSinkPropagator().getSinks()[0];
assertEquals( calculatePositiveMask(list("a"), sp), alphaNode1.getDeclaredMask( ) );
assertEquals( calculatePositiveMask(list("a", "b", "c", "s", "i"), sp), alphaNode1.getInferredMask() );
// first share
AlphaNode alphaNode1_1 = ( AlphaNode ) alphaNode1.getSinkPropagator().getSinks()[0];
assertEquals( calculatePositiveMask(list("b"), sp), alphaNode1_1.getDeclaredMask( ) );
assertEquals( calculatePositiveMask(list("a", "b", "c"), sp), alphaNode1_1.getInferredMask() );
BetaNode betaNode1 = ( BetaNode ) alphaNode1_1.getSinkPropagator().getSinks()[0];
assertEquals( calculatePositiveMask(list("b", "c"), sp), betaNode1.getRightDeclaredMask() );
assertEquals( calculatePositiveMask(list("a", "c"), sp), betaNode1.getRightInferredMask() );
assertEquals( calculateNegativeMask(list("!b"), sp), betaNode1.getRightNegativeMask() );
assertEquals( calculatePositiveMask(list("c"), sp), betaNode1.getLeftDeclaredMask() );
assertEquals( calculatePositiveMask(list("c"), sp), betaNode1.getLeftInferredMask() );
assertEquals( calculateNegativeMask(list("!a"), sp), betaNode1.getLeftNegativeMask() );
// second share
AlphaNode alphaNode1_2 = ( AlphaNode ) alphaNode1.getSinkPropagator().getSinks()[1];
assertEquals( calculatePositiveMask(list("i"), sp), alphaNode1_2.getDeclaredMask( ) );
assertEquals( calculatePositiveMask(list("a", "i", "b", "s"), sp), alphaNode1_2.getInferredMask() );
BetaNode betaNode2 = ( BetaNode ) alphaNode1_2.getSinkPropagator().getSinks()[0];
assertEquals( calculatePositiveMask(list("b", "s"), sp), betaNode2.getRightDeclaredMask() );
assertEquals( calculatePositiveMask(list("i", "b", "s"), sp), betaNode2.getRightInferredMask() );
assertEquals( calculateNegativeMask(list("!a"), sp), betaNode2.getRightNegativeMask() );
assertEquals( calculateNegativeMask(list("!a"), sp), betaNode1.getLeftNegativeMask() );
assertEquals( calculatePositiveMask(list("j"), sp), betaNode2.getLeftDeclaredMask() );
assertEquals( calculatePositiveMask(list("a", "j"), sp), betaNode2.getLeftInferredMask() );
assertEquals( EmptyBitMask.get(), betaNode2.getLeftNegativeMask() );
// test rule removal
kbase.removeRule( "org.drools.compiler.integrationtests", "r0" );
assertEquals( calculatePositiveMask(list("a"), sp), alphaNode1.getDeclaredMask( ) );
assertEquals( calculatePositiveMask(list("a", "i", "b", "s"), sp), alphaNode1.getInferredMask() );
assertEquals( calculatePositiveMask(list("i"), sp), alphaNode1_2.getDeclaredMask( ) );
assertEquals( calculatePositiveMask(list("a", "i", "b", "s"), sp), alphaNode1_2.getInferredMask() );
assertEquals( calculatePositiveMask(list("b", "s"), sp), betaNode2.getRightDeclaredMask() );
assertEquals( calculatePositiveMask(list("i", "b", "s"), sp), betaNode2.getRightInferredMask() );
assertEquals( calculateNegativeMask(list("!a"), sp), betaNode2.getRightNegativeMask() );
assertEquals( calculatePositiveMask(list("j"), sp), betaNode2.getLeftDeclaredMask() );
assertEquals( calculatePositiveMask(list("a", "j"), sp), betaNode2.getLeftInferredMask() );
assertEquals( EmptyBitMask.get(), betaNode2.getLeftNegativeMask() );
// have to rebuild to remove r1
kbase = getKnowledgeBase(rule1, rule2);
kbase.removeRule( "org.drools.compiler.integrationtests", "r1" );
otn = getObjectTypeNode(kbase, "A" );
alphaNode1 = ( AlphaNode ) otn.getSinkPropagator().getSinks()[0];
assertEquals( calculatePositiveMask(list("a"), sp), alphaNode1.getDeclaredMask( ) );
assertEquals( calculatePositiveMask(list("a", "b", "c"), sp), alphaNode1.getInferredMask() );
alphaNode1_1 = ( AlphaNode ) alphaNode1.getSinkPropagator().getSinks()[0];
assertEquals( calculatePositiveMask(list("b"), sp), alphaNode1_1.getDeclaredMask( ) );