package org.drools.compiler.rule.builder.dialect.mvel;
import java.util.HashMap;
import java.util.Map;
import org.drools.compiler.Cheese;
import org.drools.compiler.compiler.DialectCompiletimeRegistry;
import org.drools.compiler.compiler.PackageBuilder;
import org.drools.core.RuleBase;
import org.drools.core.WorkingMemory;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import org.drools.core.RuleBaseFactory;
import org.drools.core.base.ClassFieldAccessorCache;
import org.drools.core.base.ClassFieldAccessorStore;
import org.drools.core.base.ClassObjectType;
import org.drools.core.base.mvel.MVELEvalExpression;
import org.drools.core.common.InternalFactHandle;
import org.drools.compiler.compiler.PackageBuilderConfiguration;
import org.drools.compiler.lang.descr.EvalDescr;
import org.drools.compiler.lang.descr.RuleDescr;
import org.drools.core.reteoo.LeftTupleImpl;
import org.drools.compiler.reteoo.MockLeftTupleSink;
import org.drools.core.rule.Declaration;
import org.drools.core.rule.EvalCondition;
import org.drools.core.rule.MVELDialectRuntimeData;
import org.drools.core.rule.Package;
import org.drools.core.rule.Pattern;
import org.drools.core.spi.InternalReadAccessor;
public class MVELEvalBuilderTest {
ClassFieldAccessorStore store = new ClassFieldAccessorStore();
@Before
public void setUp() throws Exception {
store.setClassFieldAccessorCache( new ClassFieldAccessorCache( Thread.currentThread().getContextClassLoader() ) );
store.setEagerWire( true );
}
@Test
public void testSimpleExpression() {
final Package pkg = new Package( "pkg1" );
final RuleDescr ruleDescr = new RuleDescr( "rule 1" );
PackageBuilder pkgBuilder = new PackageBuilder( pkg );
final PackageBuilderConfiguration conf = pkgBuilder.getPackageBuilderConfiguration();
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 InternalReadAccessor extractor = store.getReader( Cheese.class,
"price",
getClass().getClassLoader() );
final Pattern pattern = new Pattern( 0,
new ClassObjectType( int.class ) );
final Declaration declaration = new Declaration( "a",
extractor,
pattern );
final Map map = new HashMap();
map.put( "a",
declaration );
declarationResolver.setDeclarations( map );
context.setDeclarationResolver( declarationResolver );
final EvalDescr evalDescr = new EvalDescr();
evalDescr.setContent( "a == 10" );
final MVELEvalBuilder builder = new MVELEvalBuilder();
final EvalCondition eval = (EvalCondition) builder.build( context,
evalDescr );
((MVELEvalExpression) eval.getEvalExpression()).compile( (MVELDialectRuntimeData) pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectRuntimeRegistry().getDialectData( "mvel" ) );
final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
final WorkingMemory wm = ruleBase.newStatefulSession();
MockLeftTupleSink sink = new MockLeftTupleSink();
final Cheese cheddar = new Cheese( "cheddar",
10 );
final InternalFactHandle f0 = (InternalFactHandle) wm.insert( cheddar );
final LeftTupleImpl tuple = new LeftTupleImpl( f0, sink, true );
Object evalContext = eval.createContext();
assertTrue( eval.isAllowed( tuple,
wm,
evalContext ) );
cheddar.setPrice( 9 );
wm.update( f0,
cheddar );
assertFalse( eval.isAllowed( tuple,
wm,
evalContext ) );
}
}