package nebula.flow; import java.util.List; import junit.framework.TestCase; import nebula.data.DataRepos; import nebula.data.DataStore; import nebula.data.Entity; import nebula.data.impl.DefaultDataRepos; import nebula.data.impl.EditableEntity; import nebula.data.impl.TypeDatastore; import nebula.lang.Field; import nebula.lang.Flow; import nebula.lang.Flow.Step; import nebula.lang.RuntimeContext; import nebula.lang.SystemTypeLoader; import nebula.lang.TypeLoaderForFlowTest; public class FlowEngineTest extends TestCase { TypeLoaderForFlowTest typeLoader; DataRepos datarepos; TypeDatastore types; RuntimeContext context = new RuntimeContext() { }; protected void setUp() throws Exception { typeLoader = new TypeLoaderForFlowTest(new SystemTypeLoader()); types = new TypeDatastore(typeLoader); datarepos = new DefaultDataRepos(types); } private Flow parseFlow(String text) { return (Flow) typeLoader.load(text); } protected void tearDown() throws Exception { super.tearDown(); } public final void testFlowEngine() { //@formatter:off String text = "" + "flow Issue { \n" + " @Next(\"GP\") [employee] Begin{ \n" + " data.*; " + " Name;\n" + " Age :=10;\n" + " };\n" + " [employee] Approve | 审批;\n" + " [employee] Approve | 审批审批;\n" + " [employee] End{ };\n" + "};\n"; //@formatter:on String name = "wangshilian"; Long age = 10L; Flow flow = parseFlow(text); FlowEngine engine = new FlowEngine(datarepos, flow); // 启动流程 EditableEntity data = engine.start(context); // 初始画面 List<Entity> steps = data.get("steps"); Entity currentStepEntity = steps.get(steps.size() - 1); Step currentStep = flow.getSteps().get((String) currentStepEntity.get(Step.Field_ActualCurrrentStep)); assertEquals("Begin", currentStep.getName()); assertEquals("GP", currentStep.getAttrs().get(Step.NextAnnotation)); assertNull(data.get("Name")); assertNull(data.get("Age")); for (Field field : currentStep.getType().getActions()) { if (!field.isInternal()) { System.out.println("Action : " + field.getDisplayName()); } } // 录入数据,提交 currentStepEntity.put("Name", name); currentStepEntity.put("Age", age); engine.stepSubmit(context, data); // 进入审批画面 steps = data.get("steps"); assertEquals("审批", data.get("curStep")); assertEquals(name, data.get("Name")); currentStepEntity = steps.get(steps.size() - 1); currentStep = flow.getSteps().get((String) currentStepEntity.get(Step.Field_ActualCurrrentStep)); assertEquals("Approve", currentStep.getName()); assertEquals(name, data.get("Name")); assertEquals(age, data.get("Age")); for (Field field : currentStep.getType().getActions()) { if (!field.isInternal()) { System.out.println("Action : " + field.getDisplayName()); } } // 审批通过 assertNull(currentStepEntity.get("Comment")); currentStepEntity.put("Comment", "Approve2 OK"); engine.stepSubmit(context, data); // 进入审批画面 steps = data.get("steps"); currentStepEntity = steps.get(steps.size() - 1); currentStep = flow.getSteps().get((String) currentStepEntity.get(Step.Field_ActualCurrrentStep)); assertEquals("Approve2", currentStep.getName()); assertEquals(name, data.get("Name")); assertEquals(age, data.get("Age")); for (Field field : currentStep.getType().getActions()) { if (!field.isInternal()) { System.out.println("Action : " + field.getDisplayName()); } } // 审批通过 assertNull(currentStepEntity.get("Comment")); currentStepEntity.put("Comment", "Approve3 OK"); engine.stepSubmit(context, data); // 进入结束Step steps = data.get("steps"); currentStepEntity = steps.get(steps.size() - 1); currentStep = flow.getSteps().get((String) currentStepEntity.get(Step.Field_ActualCurrrentStep)); assertEquals("End", currentStep.getName()); assertEquals(name, data.get("Name")); assertEquals(age, data.get("Age")); DataStore<Entity> d = datarepos.define(String.class, Entity.class, flow.getName()); Entity entity = d.listAll().get(0); System.out.println(entity); } public final void testFlowEngine_Skip() { //@formatter:off String text = "" + "flow Issue { \n" + " [ALL] Begin{ \n" + " Name;\n" + " Age :=0;\n" + " <init>(){this.Age=10;}\n" + " };\n" + " [owner] Approve{ \n" + " Age;" + " <init>() {\n" + " if(this.Age==10)this.skip();\n" + " };\n" + "};\n" + " [employee] Approve;\n" + " [employee] End{ };\n" + "};\n"; //@formatter:on String name = "wangshilian"; Long age = 10L; Flow flow = parseFlow(text); FlowEngine engine = new FlowEngine(datarepos, flow); // 启动流程 EditableEntity data = engine.start(context); // 初始画面 List<Entity> steps = data.get("steps"); Entity currentStepEntity = steps.get(steps.size() - 1); Step currentStep = flow.getSteps().get((String) currentStepEntity.get(Step.Field_ActualCurrrentStep)); assertEquals("Begin", currentStep.getName()); assertNull(data.get("Name")); assertNull(data.get("Age")); for (Field field : currentStep.getType().getActions()) { if (!field.isInternal()) { System.out.println("Action : " + field.getDisplayName()); } } // 录入数据,提交 currentStepEntity.put("Name", name); currentStepEntity.put("Age", age); engine.stepSubmit(context,data); // 跳过第一级审批画面 // assertEquals("Approve", currentStep.getName()); // assertEquals(name, data.get("Name")); // assertEquals(age, data.get("Age")); // 审批通过 // engine.stepSubmit(); // 进入第二级审批画面 steps = data.get("steps"); currentStepEntity = steps.get(steps.size() - 1); currentStep = flow.getSteps().get((String) currentStepEntity.get(Step.Field_ActualCurrrentStep)); assertEquals("Approve2", currentStep.getName()); assertEquals(name, data.get("Name")); assertEquals(age, data.get("Age")); for (Field field : currentStep.getType().getActions()) { if (!field.isInternal()) { System.out.println("Action : " + field.getDisplayName()); } } // 审批通过 engine.stepSubmit(context,data); // 进入结束Step steps = data.get("steps"); currentStepEntity = steps.get(steps.size() - 1); currentStep = flow.getSteps().get((String) currentStepEntity.get(Step.Field_ActualCurrrentStep)); assertEquals("End", currentStep.getName()); assertEquals(name, data.get("Name")); assertEquals(age, data.get("Age")); } // // public final void testStart() { // fail("Not yet implemented"); // } // // public final void testStartSubmitString() { // fail("Not yet implemented"); // } // // public final void testStartSubmit() { // fail("Not yet implemented"); // } }