package org.jbpm.process.builder;
import org.drools.compiler.builder.impl.KnowledgeBuilderImpl;
import org.drools.compiler.compiler.DialectCompiletimeRegistry;
import org.drools.compiler.compiler.ReturnValueDescr;
import org.drools.compiler.lang.descr.ProcessDescr;
import org.drools.core.common.InternalKnowledgeRuntime;
import org.drools.core.definitions.InternalKnowledgePackage;
import org.drools.core.definitions.impl.KnowledgePackageImpl;
import org.jbpm.process.builder.dialect.javascript.JavaScriptReturnValueEvaluatorBuilder;
import org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator;
import org.jbpm.ruleflow.instance.RuleFlowProcessInstance;
import org.jbpm.workflow.core.impl.WorkflowProcessImpl;
import org.jbpm.workflow.instance.node.SplitInstance;
import org.junit.Test;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.definition.KnowledgePackage;
import org.kie.internal.runtime.StatefulKnowledgeSession;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import static junit.framework.TestCase.assertFalse;
import static org.junit.Assert.assertTrue;
public class JavaScriptReturnValueConstraintEvaluatorBuilderTest {
@Test
public void testSimpleReturnValueConstraintEvaluator() throws Exception {
final InternalKnowledgePackage pkg = new KnowledgePackageImpl( "pkg1" );
ProcessDescr processDescr = new ProcessDescr();
processDescr.setClassName( "Process1" );
processDescr.setName( "Process1" );
WorkflowProcessImpl process = new WorkflowProcessImpl();
process.setName( "Process1" );
process.setPackageName("pkg1");
ReturnValueDescr descr = new ReturnValueDescr();
descr.setText("function validate() {return value;} validate();");
KnowledgeBuilderImpl pkgBuilder = new KnowledgeBuilderImpl( pkg );
DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
ProcessBuildContext context = new ProcessBuildContext( pkgBuilder,
pkg,
process,
processDescr,
dialectRegistry,
null );
pkgBuilder.addPackageFromDrl(new StringReader("package pkg1;\n global Boolean value;\n"));
ReturnValueConstraintEvaluator node = new ReturnValueConstraintEvaluator();
final JavaScriptReturnValueEvaluatorBuilder builder = new JavaScriptReturnValueEvaluatorBuilder();
builder.build(context,
node,
descr,
null);
final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
List<KnowledgePackage> packages = new ArrayList<KnowledgePackage>();
packages.add( pkgBuilder.getPackage() );
kbase.addKnowledgePackages(packages);
final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
RuleFlowProcessInstance processInstance = new RuleFlowProcessInstance();
processInstance.setKnowledgeRuntime((InternalKnowledgeRuntime) ksession);
SplitInstance splitInstance = new SplitInstance();
splitInstance.setProcessInstance(processInstance);
ksession.setGlobal("value", true);
assertTrue(node.evaluate(splitInstance,
null,
null)
);
// Build second time with reutrn value evaulator returning false
ReturnValueDescr descr2 = new ReturnValueDescr();
descr.setText("function invalidate() {return false;} invalidate();");
final JavaScriptReturnValueEvaluatorBuilder builder2 = new JavaScriptReturnValueEvaluatorBuilder();
builder2.build(context,
node,
descr,
null);
assertFalse(node.evaluate(splitInstance,
null,
null)
);
}
}