package org.jbpm.jpdl.el;
import org.jbpm.AbstractJbpmTestCase;
import org.jbpm.JbpmException;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
public class DecisionExpressionTest extends AbstractJbpmTestCase {
public static class Customer {
String priority;
int number;
public Customer(String priority) {
this.priority = priority;
}
public Customer(int number) {
this.number = number;
}
public String getPriority() {
return priority;
}
public int getNumber() {
return number;
}
}
public ProcessDefinition createCustomerPriorityProcess() {
return ProcessDefinition.parseXmlString("<process-definition>"
+ " <start-state>"
+ " <transition to='d'/>"
+ " </start-state>"
+ " <decision name='d' expression='#{customer.priority}'>"
+ " <transition name='LOW' to='l' />"
+ " <transition name='MEDIUM' to='m' />"
+ " <transition name='HIGH' to='h' />"
+ " </decision>"
+ " <state name='l' />"
+ " <state name='m' />"
+ " <state name='h' />"
+ "</process-definition>");
}
public void testCustomerPriorityLow() {
ProcessDefinition processDefinition = createCustomerPriorityProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer("LOW"));
processInstance.signal();
assertEquals("l", processInstance.getRootToken().getNode().getName());
}
public void testCustomerPriorityMedium() {
ProcessDefinition processDefinition = createCustomerPriorityProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer("MEDIUM"));
processInstance.signal();
assertEquals("m", processInstance.getRootToken().getNode().getName());
}
public void testCustomerPriorityUndefined() {
ProcessDefinition processDefinition = createCustomerPriorityProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer("UNDEFINED"));
try {
processInstance.signal();
fail("expected exception");
}
catch (JbpmException e) {
assert e.getMessage().indexOf("UNDEFINED") != -1 : e;
}
}
public void testCustomerPriorityNull() {
ProcessDefinition processDefinition = createCustomerPriorityProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer(null));
try {
processInstance.signal();
fail("expected exception");
}
catch (JbpmException e) {
assert e.getMessage().indexOf("transition") != -1 : e;
}
}
public ProcessDefinition createBooleanExpressionProcess() {
return ProcessDefinition.parseXmlString("<process-definition>"
+ " <start-state>"
+ " <transition to='d'/>"
+ " </start-state>"
+ " <decision name='d' expression='#{customer.number > 5}'>"
+ " <transition name='true' to='high-numbered-customer' />"
+ " <transition name='false' to='low-numbered-customer' />"
+ " </decision>"
+ " <state name='high-numbered-customer' />"
+ " <state name='low-numbered-customer' />"
+ "</process-definition>");
}
public void testBooleanExpressionTrue() {
ProcessDefinition processDefinition = createBooleanExpressionProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer(9));
processInstance.signal();
assertEquals("high-numbered-customer", processInstance.getRootToken().getNode().getName());
}
public void testBooleanExpressionFalse() {
ProcessDefinition processDefinition = createBooleanExpressionProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer(3));
processInstance.signal();
assertEquals("low-numbered-customer", processInstance.getRootToken().getNode().getName());
}
public ProcessDefinition createConditionProcess() {
return ProcessDefinition.parseXmlString("<process-definition>"
+ " <start-state>"
+ " <transition to='d'/>"
+ " </start-state>"
+ " <decision name='d'>"
+ " <transition to='high-numbered-customer'>"
+ " <condition expression='#{customer.number > 5}' />"
+ " </transition>"
+ " <transition to='medium-numbered-customer'>"
+ " <condition expression='#{customer.number == 5}' />"
+ " </transition>"
+ " <transition to='low-numbered-customer' />"
+ " </decision>"
+ " <state name='high-numbered-customer' />"
+ " <state name='medium-numbered-customer' />"
+ " <state name='low-numbered-customer' />"
+ "</process-definition>");
}
public void testConditionHigh() {
ProcessDefinition processDefinition = createConditionProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer(9));
processInstance.signal();
assertEquals("high-numbered-customer", processInstance.getRootToken().getNode().getName());
}
public void testConditionMedium() {
ProcessDefinition processDefinition = createConditionProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer(5));
processInstance.signal();
assertEquals("medium-numbered-customer", processInstance.getRootToken().getNode().getName());
}
public void testConditionLow() {
ProcessDefinition processDefinition = createConditionProcess();
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("customer", new Customer(3));
processInstance.signal();
assertEquals("low-numbered-customer", processInstance.getRootToken().getNode().getName());
}
}