public class MVELConsequenceBuilderTest {
@Test
public void testSimpleExpression() throws Exception {
PackageDescr pkgDescr = new PackageDescr( "pkg1" );
KnowledgeBuilderImpl pkgBuilder = new KnowledgeBuilderImpl();
pkgBuilder.addPackage( pkgDescr );
InternalKnowledgePackage pkg = pkgBuilder.getPackageRegistry( "pkg1" ).getPackage();
final RuleDescr ruleDescr = new RuleDescr( "rule 1" );
ruleDescr.setNamespace( "pkg1" );
ruleDescr.setConsequence( "modify (cheese) {price = 5 };\nretract (cheese)" );
DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
MVELDialect mvelDialect = (MVELDialect) dialectRegistry.getDialect( "mvel" );
final InstrumentedBuildContent context = new InstrumentedBuildContent( pkgBuilder,
ruleDescr,
dialectRegistry,
pkg,
mvelDialect );
final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
final ObjectType cheeseObjeectType = new ClassObjectType( Cheese.class );
final Pattern pattern = new Pattern( 0,
cheeseObjeectType,
"cheese" );
final GroupElement subrule = new GroupElement( GroupElement.AND );
subrule.addChild( pattern );
final Map<String, Declaration> map = new HashMap<String, Declaration>();
map.put( "cheese",
pattern.getDeclaration() );
declarationResolver.setDeclarations( map );
context.setDeclarationResolver( declarationResolver );
final MVELConsequenceBuilder builder = new MVELConsequenceBuilder();
builder.build( context, RuleImpl.DEFAULT_CONSEQUENCE_NAME );
InternalKnowledgeBase kBase = (InternalKnowledgeBase) KnowledgeBaseFactory.newKnowledgeBase();
PropagationContextFactory pctxFactory = kBase.getConfiguration().getComponentFactory().getPropagationContextFactory();
kBase.addPackage(pkg);
StatefulKnowledgeSessionImpl ksession = (StatefulKnowledgeSessionImpl)kBase.newStatefulKnowledgeSession();
final Cheese cheddar = new Cheese( "cheddar", 10 );
final InternalFactHandle f0 = (InternalFactHandle) ksession.insert( cheddar );
final LeftTupleImpl tuple = new LeftTupleImpl( f0, null, true );
f0.removeLeftTuple(tuple);
final AgendaItem item = new AgendaItemImpl( 0, tuple, 10,
pctxFactory.createPropagationContext(1, 1, null, tuple, null),
new RuleTerminalNode(0, new CompositeObjectSinkAdapterTest.MockBetaNode(), context.getRule(), subrule, 0, new BuildContext( kBase, null )), null);
final DefaultKnowledgeHelper kbHelper = new DefaultKnowledgeHelper( ksession );
kbHelper.setActivation( item );
((MVELConsequence) context.getRule().getConsequence()).compile( (MVELDialectRuntimeData) pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectRuntimeRegistry().getDialectData( "mvel" ));
context.getRule().getConsequence().evaluate( kbHelper,
ksession );
assertEquals( 5,
cheddar.getPrice() );