📄 logicalassertiontest.java
字号:
package org.drools.reteoo;
/*
* Copyright 2005 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import org.drools.Agenda;
import org.drools.Cheese;
import org.drools.DroolsTestCase;
import org.drools.FactException;
import org.drools.FactHandle;
import org.drools.RuleBase;
import org.drools.RuleBaseConfiguration;
import org.drools.WorkingMemory;
import org.drools.base.ClassObjectType;
import org.drools.common.DefaultAgenda;
import org.drools.common.DefaultFactHandle;
import org.drools.common.InternalAgenda;
import org.drools.common.PropagationContextImpl;
import org.drools.rule.Rule;
import org.drools.spi.Consequence;
import org.drools.spi.KnowledgeHelper;
import org.drools.spi.PropagationContext;
public class LogicalAssertionTest extends DroolsTestCase {
public void testSingleLogicalRelationship() throws Exception {
final ReteooRuleBase ruleBase = new ReteooRuleBase();
final Rete rete = ruleBase.getRete();
// create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so we can detect assertions and retractions
final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 1,
new ClassObjectType( String.class ),
rete );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
final Rule rule1 = new Rule( "test-rule1" );
final TerminalNode node = new TerminalNode( 2,
new MockTupleSource( 2 ),
rule1 );
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newWorkingMemory();
final InternalAgenda agenda = (InternalAgenda) workingMemory.getAgenda();
final Consequence consequence = new Consequence() {
/**
*
*/
private static final long serialVersionUID = -5628842901492986740L;
public void evaluate(KnowledgeHelper knowledgeHelper,
WorkingMemory workingMemory) {
// do nothing
}
};
rule1.setConsequence( consequence );
final DefaultFactHandle handle1 = (DefaultFactHandle) workingMemory.assertObject( "o1" );
final ReteTuple tuple1 = new ReteTuple( handle1 );
final PropagationContext context1 = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
null,
null );
// Test single activation for a single logical assertions
node.assertTuple( tuple1,
context1,
workingMemory );
final String logicalString = new String( "logical" );
FactHandle logicalHandle = workingMemory.assertObject( logicalString,
false,
true,
rule1,
tuple1.getActivation() );
// Retract the tuple and test the logically asserted fact was also retracted
node.retractTuple( tuple1,
context1,
workingMemory );
workingMemory.propagateQueuedActions();
assertLength( 1,
sink.getRetracted() );
Object[] values = (Object[]) sink.getRetracted().get( 0 );
assertSame( logicalHandle,
values[0] );
// Test single activation for a single logical assertions. This also
// tests that logical assertions live on after the related Activation
// has fired.
node.assertTuple( tuple1,
context1,
workingMemory );
logicalHandle = workingMemory.assertObject( logicalString,
false,
true,
rule1,
tuple1.getActivation() );
agenda.fireNextItem( null );
node.retractTuple( tuple1,
context1,
workingMemory );
workingMemory.propagateQueuedActions();
assertLength( 2,
sink.getRetracted() );
values = (Object[]) sink.getRetracted().get( 1 );
assertSame( logicalHandle,
values[0] );
}
public void testEqualsMap() throws Exception {
// create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so w can detect assertions and retractions
final Rule rule1 = new Rule( "test-rule1" );
final Rete rete = new Rete();
final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
new ClassObjectType( String.class ),
rete );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
final TerminalNode node = new TerminalNode( 2,
new MockTupleSource( 2 ),
rule1 );
final RuleBase ruleBase = new ReteooRuleBase();
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newWorkingMemory();
final Agenda agenda = workingMemory.getAgenda();
final Consequence consequence = new Consequence() {
/**
*
*/
private static final long serialVersionUID = -6861606249802351389L;
public void evaluate(KnowledgeHelper knowledgeHelper,
WorkingMemory workingMemory) {
// do nothing
}
};
rule1.setConsequence( consequence );
final DefaultFactHandle handle1 = new DefaultFactHandle( 1,
"cheese" );
final ReteTuple tuple1 = new ReteTuple( handle1 );
final PropagationContext context1 = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
null,
null );
// Test single activation for a single logical assertions
node.assertTuple( tuple1,
context1,
workingMemory );
final String logicalString1 = new String( "logical" );
FactHandle logicalHandle1 = workingMemory.assertObject( logicalString1,
false,
true,
rule1,
tuple1.getActivation() );
final String logicalString2 = new String( "logical" );
FactHandle logicalHandle2 = workingMemory.assertObject( logicalString2,
false,
true,
rule1,
tuple1.getActivation() );
assertSame( logicalHandle1,
logicalHandle2 );
// little sanity check using normal assert
logicalHandle1 = workingMemory.assertObject( logicalString1 );
logicalHandle2 = workingMemory.assertObject( logicalString2 );
// If assert behavior in working memory is IDENTITY,
// returned handles must not be the same
if ( RuleBaseConfiguration.WM_BEHAVIOR_IDENTITY.equals( ((ReteooRuleBase) ruleBase).getConfiguration().getProperty( RuleBaseConfiguration.PROPERTY_ASSERT_BEHAVIOR ) ) ) {
assertNotSame( logicalHandle1,
logicalHandle2 );
} else {
// in case behavior is EQUALS, handles should be the same
assertSame( logicalHandle1,
logicalHandle2 );
}
}
/**
* This tests that Stated asserts always take precedent
*
* @throws Exception
*/
public void testStatedOverrideDiscard() throws Exception {
// create a RuleBase with a single ObjectTypeNode we attach a
// MockObjectSink so we can detect assertions and retractions
final Rule rule1 = new Rule( "test-rule1" );
final Rete rete = new Rete();
final ObjectTypeNode objectTypeNode = new ObjectTypeNode( 0,
new ClassObjectType( String.class ),
rete );
objectTypeNode.attach();
final MockObjectSink sink = new MockObjectSink();
objectTypeNode.addObjectSink( sink );
final TerminalNode node = new TerminalNode( 2,
new MockTupleSource( 2 ),
rule1 );
final RuleBase ruleBase = new ReteooRuleBase();
final ReteooWorkingMemory workingMemory = (ReteooWorkingMemory) ruleBase.newWorkingMemory();
final Agenda agenda = workingMemory.getAgenda();
final Consequence consequence = new Consequence() {
/**
*
*/
private static final long serialVersionUID = 8922139904370747909L;
public void evaluate(KnowledgeHelper knowledgeHelper,
WorkingMemory workingMemory) {
// do nothing
}
};
rule1.setConsequence( consequence );
final DefaultFactHandle handle1 = new DefaultFactHandle( 1,
"cheese" );
final ReteTuple tuple1 = new ReteTuple( handle1 );
final PropagationContext context1 = new PropagationContextImpl( 0,
PropagationContext.ASSERTION,
null,
null );
// Test that a STATED assertion overrides a logical assertion
node.assertTuple( tuple1,
context1,
workingMemory );
String logicalString1 = new String( "logical" );
FactHandle logicalHandle1 = workingMemory.assertObject( logicalString1,
false,
true,
rule1,
tuple1.getActivation() );
// This assertion is stated and should override any previous justified
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -