PropagationContext.INSERTION,
rule0,
null,
new DefaultFactHandle());
final RuleFlowGroup ruleFlowGroup0 = agenda.getRuleFlowGroup("rule-flow-group-0");
final RuleFlowGroup ruleFlowGroup1 = agenda.getRuleFlowGroup("rule-flow-group-1");
final RuleFlowGroup ruleFlowGroup2 = agenda.getRuleFlowGroup("rule-flow-group-2");
final RuleTerminalNodeLeftTuple tuple0 = new RuleTerminalNodeLeftTuple(new DefaultFactHandle(1,
"cheese"),
node0,
true);
node0.assertLeftTuple(tuple0,
context0,
ksession);
final RuleTerminalNodeLeftTuple tuple1 = new RuleTerminalNodeLeftTuple(new DefaultFactHandle(1,
"cheese"),
node1,
true);
node0.assertLeftTuple(tuple1,
context0,
ksession);
final RuleTerminalNodeLeftTuple tuple2 = new RuleTerminalNodeLeftTuple(new DefaultFactHandle(1,
"cheese"),
node2,
true);
node1.assertLeftTuple(tuple2,
context0,
ksession);
final RuleTerminalNodeLeftTuple tuple3 = new RuleTerminalNodeLeftTuple(new DefaultFactHandle(1,
"cheese"),
node0,
true);
node2.assertLeftTuple(tuple3,
context0,
ksession);
agenda.unstageActivations();
assertEquals(2,
ruleFlowGroup0.size());
assertEquals(1,
ruleFlowGroup1.size());
assertEquals(1,
ruleFlowGroup2.size());
assertEquals(4,
agenda.agendaSize());
// Activate the RuleFlowGroup, the nodes stay in the group, but should now also be in the Agenda
agenda.activateRuleFlowGroup("rule-flow-group-0");
assertEquals(2,
ruleFlowGroup0.size());
assertEquals(4,
agenda.agendaSize());
// As we fire each rule they are removed from both the Agenda and the RuleFlowGroup
agenda.fireNextItem(null, 0, -1);
assertEquals(1,
ruleFlowGroup0.size());
assertEquals(3,
agenda.agendaSize());
// After firing all activations of RuleFlowGroup 0, the agenda is empty
agenda.fireNextItem(null, 0, -1);
assertEquals(0,
ruleFlowGroup0.size());
assertEquals(2,
agenda.agendaSize());
// Now we activate two RuleFlowGroups together
// All their activations should be added to the agenda.
agenda.activateRuleFlowGroup("rule-flow-group-1");
agenda.activateRuleFlowGroup("rule-flow-group-2");
assertEquals(1,
ruleFlowGroup1.size());
assertEquals(1,
ruleFlowGroup2.size());
assertEquals(2,
agenda.agendaSize());
// we set the salience higher on rule2, so it sould fire first and empty ruleFlowGroup2
agenda.fireNextItem(null, 0, -1);
assertEquals(1,
ruleFlowGroup1.size());
assertEquals(0,
ruleFlowGroup2.size());
assertEquals(1,
agenda.agendaSize());
// this is the last activation, so everything should be empty after this
agenda.fireNextItem(null, 0, -1);
assertEquals(0,
ruleFlowGroup0.size());
assertEquals(0,
ruleFlowGroup1.size());
assertEquals(0,
ruleFlowGroup2.size());
assertEquals(0,
agenda.agendaSize());
}