PropagationContext.ASSERTION,
rule3,
null,
null );
final DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda();
// create the AgendaGroups
final AgendaGroup agendaGroup1 = new BinaryHeapQueueAgendaGroup( "agendaGroup1",
ruleBase );
agenda.addAgendaGroup( agendaGroup1 );
final AgendaGroup agendaGroup2 = new BinaryHeapQueueAgendaGroup( "agendaGroup2",
ruleBase );
agenda.addAgendaGroup( agendaGroup2 );
final AgendaGroup agendaGroup3 = new BinaryHeapQueueAgendaGroup( "agendaGroup3",
ruleBase );
agenda.addAgendaGroup( agendaGroup3 );
// focus at this point is MAIN
assertEquals( 0,
agenda.focusStackSize() );
node0.assertLeftTuple( tuple,
context0,
workingMemory );
// check focus is main
final AgendaGroup main = agenda.getAgendaGroup( AgendaGroup.MAIN );
assertEquals( agenda.getFocus(),
main );
// check main got the tuple
assertEquals( 1,
agenda.getFocus().size() );
node2.assertLeftTuple( tuple,
context2,
workingMemory );
// main is still focus and this tuple went to agendaGroup 2
assertEquals( 1,
agenda.getFocus().size() );
// check agendaGroup2 still got the tuple
assertEquals( 1,
agendaGroup2.size() );
// make sure total agenda size reflects this
assertEquals( 2,
agenda.agendaSize() );
// put another one on agendaGroup 2
node2.assertLeftTuple( tuple,
context2,
workingMemory );
// main is still focus so shouldn't have increased
assertEquals( 1,
agenda.getFocus().size() );
// check agendaGroup2 still got the tuple
assertEquals( 2,
agendaGroup2.size() );
// make sure total agenda size reflects this
assertEquals( 3,
agenda.agendaSize() );
// set the focus to agendaGroup1, note agendaGroup1 has no activations
agenda.setFocus( "agendaGroup1" );
// add agendaGroup2 onto the focus stack
agenda.setFocus( "agendaGroup2" );
// finally add agendaGroup3 to the top of the focus stack
agenda.setFocus( "agendaGroup3" );
// agendaGroup3, the current focus, has no activations
assertEquals( 0,
agenda.getFocus().size() );
// add to agendaGroup 3
node3.assertLeftTuple( tuple,
context3,
workingMemory );
assertEquals( 1,
agenda.getFocus().size() );
node3.assertLeftTuple( tuple,
context3,
workingMemory );
// agendaGroup3 now has 2 activations
assertEquals( 2,
agenda.getFocus().size() );
// check totalAgendaSize still works
assertEquals( 5,
agenda.agendaSize() );
// ok now lets check that stacks work with fireNextItem
agenda.fireNextItem( null );
// agendaGroup3 should still be the current agendaGroup
assertEquals( agenda.getFocus(),
agendaGroup3 );
// agendaGroup3 has gone from 2 to one activations
assertEquals( 1,
agenda.getFocus().size() );
// check totalAgendaSize has reduced too
assertEquals( 4,
agenda.agendaSize() );
// now repeat the process
agenda.fireNextItem( null );
// focus is still agendaGroup3, but now its empty
assertEquals( agenda.getFocus(),
agendaGroup3 );
assertEquals( 0,
agenda.getFocus().size() );
assertEquals( 3,
agenda.agendaSize() );
// repeat fire again
agenda.fireNextItem( null );
// agendaGroup3 is empty so it should be popped from the stack making````````````````````
// agendaGroup2
// the current agendaGroup
assertEquals( agendaGroup2,
agenda.getFocus() );
// agendaGroup2 had 2 activations, now it only has 1
assertEquals( 1,
agenda.getFocus().size() );
assertEquals( 2,
agenda.agendaSize() );
// repeat fire again
agenda.fireNextItem( null );
assertEquals( agenda.getFocus(),
agendaGroup2 );
assertEquals( 0,
agenda.getFocus().size() );
assertEquals( 1,
agenda.agendaSize() );
// this last fire is more interesting as it demonstrates that
// agendaGroup1 on
// the stack before agendaGroup2 gets skipped as it has no activations
agenda.fireNextItem( null );
assertEquals( agenda.getFocus(),
main );
assertEquals( 0,
agenda.getFocus().size() );
assertEquals( 0,
agenda.agendaSize() );
}