* Test auto-deactivation of RuleFlowGroup.
*/
public void testRuleFlowGroup4() {
ReteooRuleBase ruleBase = (ReteooRuleBase) RuleBaseFactory.newRuleBase();
IdGenerator idGenerator = ruleBase.getReteooBuilder().getIdGenerator();
final InternalWorkingMemory workingMemory = (InternalWorkingMemory) ruleBase.newStatefulSession();;
final DefaultAgenda agenda = (DefaultAgenda) workingMemory.getAgenda();
// create rule0
final Consequence consequence0 = new Consequence() {
private static final long serialVersionUID = 400L;
public void evaluate(KnowledgeHelper knowledgeHelper,
WorkingMemory w) {
// do nothing
}
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
}
public void writeExternal(ObjectOutput out) throws IOException {
}
};
final Rule rule0 = new Rule( "test-rule0" );
rule0.setRuleFlowGroup( "rule-flow-group-0" );
rule0.setConsequence( consequence0 );
final RuleTerminalNode node0 = new RuleTerminalNode( idGenerator.getNextId(),
new MockTupleSource( idGenerator.getNextId() ),
rule0,
rule0.getLhs(),
buildContext );
final RuleFlowGroup ruleFlowGroup0 = agenda.getRuleFlowGroup( "rule-flow-group-0" );
assertTrue( ruleFlowGroup0.isAutoDeactivate() );
ruleFlowGroup0.setAutoDeactivate( false );
assertFalse( ruleFlowGroup0.isAutoDeactivate() );
// create context
final PropagationContext context0 = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
rule0,
null,
null );
// Create an activation for this rule
final LeftTuple tuple0 = new LeftTuple( new DefaultFactHandle( 1,
"cheese" ),
null,
true );
node0.assertLeftTuple( tuple0,
context0,
workingMemory );
// RuleFlowGroup should be populated, but the agenda shouldn't be
assertEquals( 1,
ruleFlowGroup0.size() );
assertEquals( 0,
agenda.agendaSize() );
// Activate the RuleFlowGroup, the activations stay in the group, but
// should now also be in the Agenda
agenda.activateRuleFlowGroup( "rule-flow-group-0" );
assertEquals( 1,
ruleFlowGroup0.size() );
assertEquals( 1,
agenda.agendaSize() );
// Execute activation
agenda.fireNextItem( null );
assertEquals( 0,
ruleFlowGroup0.size() );
assertEquals( 0,
agenda.agendaSize() );
assertTrue( ruleFlowGroup0.isActive() );
// Set auto-deactivation status to true
ruleFlowGroup0.setAutoDeactivate( true );
assertTrue( ruleFlowGroup0.isAutoDeactivate() );
assertFalse( ruleFlowGroup0.isActive() );
// Add another activation and activate RuleFlowGroup again
final LeftTuple tuple1 = new LeftTuple( new DefaultFactHandle( 1,
"cheese" ),
null,
true );
node0.assertLeftTuple( tuple1,
context0,
workingMemory );
agenda.activateRuleFlowGroup( "rule-flow-group-0" );
assertEquals( 1,
ruleFlowGroup0.size() );
assertEquals( 1,
agenda.agendaSize() );
assertTrue( ruleFlowGroup0.isActive() );
// Execute the activation, the RuleFlowGroup should automatically deactivate
agenda.fireNextItem( null );
assertEquals( 0,
ruleFlowGroup0.size() );
assertEquals( 0,
agenda.agendaSize() );
workingMemory.executeQueuedActions();
assertFalse( ruleFlowGroup0.isActive() );
// A new activation should now be added to the RuleFlowGroup but not to the agenda
final LeftTuple tuple2 = new LeftTuple( new DefaultFactHandle( 1,
"cheese" ),