📄 agendatest.java
字号:
assertEquals( 0,
agenda.getFocus().size() );
// add to agendaGroup 3
node3.assertTuple( tuple,
context3,
workingMemory );
assertEquals( 1,
agenda.getFocus().size() );
node3.assertTuple( 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() );
}
//
public void testAutoFocus() throws ConsequenceException {
final RuleBase ruleBase = new ReteooRuleBase();
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newWorkingMemory();
final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
// create the agendaGroup
final AgendaGroupImpl agendaGroup = new AgendaGroupImpl( "agendaGroup" );
agenda.addAgendaGroup( agendaGroup );
// ActivationQueue queue = agendaGroup.getActivationQueue( 0 );
// create the consequence
final Consequence consequence = new Consequence() {
/**
*
*/
private static final long serialVersionUID = -5853809196578694208L;
public void evaluate(KnowledgeHelper knowledgeHelper,
WorkingMemory workingMemory) {
// do nothing
}
};
final ReteTuple tuple = new ReteTuple( new DefaultFactHandle( 1,
"cheese" ) );
// create a rule for the agendaGroup
final Rule rule = new Rule( "test-rule",
"agendaGroup" );
final TerminalNode node = new TerminalNode( 2,
new MockTupleSource( 2 ),
rule );
rule.setConsequence( consequence );
final PropagationContext context = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
rule,
null );
// first test that autoFocus=false works. Here the rule should not fire
// as its agendaGroup does not have focus.
rule.setAutoFocus( false );
node.assertTuple( tuple,
context,
workingMemory );
// // check activation as added to the agendaGroup
// assertEquals( 1,
// queue.size() );
//
// // fire next item, agendaGroup should not fire as its not on the focus
// // stack
// // and thus should retain its sinle activation
// agenda.fireNextItem( null );
// assertEquals( 1,
// queue.size() );
//
// // Clear the agenda we we can test again
// agenda.clearAgenda();
// assertEquals( 0,
// queue.size() );
//
// // Now test that autoFocus=true works. Here the rule should fire as its
// // agendaGroup gets the focus when the activation is created.
// rule.setAutoFocus( true );
//
// node.assertTuple( tuple,
// context,
// workingMemory );
//
// assertEquals( 1,
// queue.size() );
// agenda.fireNextItem( null );
// assertEquals( 0,
// queue.size() );
}
public void testXorGroup() {
final RuleBase ruleBase = new ReteooRuleBase();
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newWorkingMemory();
final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
final List list = new ArrayList();
// create the consequence
final Consequence consequence = new Consequence() {
/**
*
*/
private static final long serialVersionUID = -2596133893109870505L;
public void evaluate(KnowledgeHelper knowledgeHelper,
WorkingMemory workingMemory) {
list.add( knowledgeHelper.getRule() );
}
};
final ReteTuple tuple = new ReteTuple( new DefaultFactHandle( 1,
"cheese" ) );
// create a rule for each agendaGroup
final Rule rule0 = new Rule( "test-rule0" );
rule0.setXorGroup( "activation-group-0" );
final TerminalNode node0 = new TerminalNode( 3,
new MockTupleSource( 2 ),
rule0 );
rule0.setConsequence( consequence );
final PropagationContext context0 = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
rule0,
null );
final Rule rule1 = new Rule( "test-rule1" );
rule1.setXorGroup( "activation-group-0" );
final TerminalNode node1 = new TerminalNode( 5,
new MockTupleSource( 4 ),
rule1 );
rule1.setConsequence( consequence );
final PropagationContext context1 = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
rule1,
null );
final Rule rule2 = new Rule( "test-rule2" );
final TerminalNode node2 = new TerminalNode( 7,
new MockTupleSource( 6 ),
rule2 );
rule2.setConsequence( consequence );
final PropagationContext context2 = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
rule2,
null );
final Rule rule3 = new Rule( "test-rule3",
"agendaGroup3" );
rule3.setXorGroup( "activation-group-3" );
final TerminalNode node3 = new TerminalNode( 9,
new MockTupleSource( 8 ),
rule3 );
rule3.setConsequence( consequence );
final PropagationContext context3 = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
rule3,
null );
// Assert the tuple and check it was added to activation-group-0
node0.assertTuple( tuple,
context0,
workingMemory );
final ActivationGroup activationGroup0 = agenda.getActivationGroup( "activation-group-0" );
assertEquals( 1,
activationGroup0.size() );
// Assert another tuple and check it was added to activation-group-0
node1.assertTuple( tuple,
context1,
workingMemory );
assertEquals( 2,
activationGroup0.size() );
// There should now be two potential activations to fire
assertEquals( 2,
agenda.focusStackSize() );
// The first tuple should fire, adding itself to the List and clearing and cancelling the other Activations in the activation-group-0
agenda.fireNextItem( null );
// Make sure the activation-group-0 is clear
assertEquals( 0,
activationGroup0.size() );
// Make sure the Agenda is empty
assertEquals( 0,
agenda.focusStackSize() );
// List should only have a single item, "rule0"
assertEquals( 1,
list.size() );
assertSame( rule0,
list.get( 0 ) );
list.clear();
//-------------------
// Now try a more complex scenario involving two Xor Groups and one rule not in a Group
node0.assertTuple( tuple,
context0,
workingMemory );
node1.assertTuple( tuple,
context1,
workingMemory );
node2.assertTuple( tuple,
context2,
workingMemory );
node3.assertTuple( tuple,
context3,
workingMemory );
// activation-group-0 should be populated again
assertEquals( 2,
activationGroup0.size() );
// make sure the activation-group-3 is cleared when we can clear the Agenda Group for the activation that is in both
final ActivationGroup activationGroup3 = agenda.getActivationGroup( "activation-group-3" );
assertEquals( 4,
agenda.agendaSize() );
assertEquals( 1,
activationGroup3.size() );
agenda.clearAgendaGroup( "agendaGroup3" );
assertEquals( 3,
agenda.agendaSize() );
assertEquals( 0,
activationGroup3.size() );
// Activation for activation-group-0 should be next - the activation in no activation/agenda group should remain on the agenda
agenda.fireNextItem( null );
assertEquals( 1,
agenda.agendaSize() );
assertEquals( 0,
activationGroup0.size() );
// Fire the last activation and make sure the Agenda Empties
agenda.fireNextItem( null );
assertEquals( 0,
agenda.agendaSize() );
assertEquals( 2,
list.size() );
assertEquals( rule0,
list.get( 0 ) );
assertEquals( rule2,
list.get( 1 ) );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -