package nebula.lang; import junit.framework.TestCase; import nebula.lang.Flow.Step; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; public class NebulaParser_Flow_BasicTest extends TestCase { RuntimeContext context = new RuntimeContext() { }; TypeLoaderForFlowTest typeLoader; @Override protected void setUp() throws Exception { typeLoader = new TypeLoaderForFlowTest(new SystemTypeLoader()); } private Flow parseFlow(String text) { try { NebulaLexer lexer = new NebulaLexer(new ANTLRStringStream(text)); CommonTokenStream tokens = new CommonTokenStream(lexer); NebulaParser parser = new NebulaParser(tokens, typeLoader); Flow flow = parser.flowDefinition(); assertEquals(0, parser.getNumberOfSyntaxErrors()); return flow; } catch (RecognitionException e) { fail(e.toString()); return null; } } private Step parseStep(String text) { try { NebulaLexer lexer = new NebulaLexer(new ANTLRStringStream(text)); CommonTokenStream tokens = new CommonTokenStream(lexer); NebulaParser parser = new NebulaParser(tokens, typeLoader); Flow flow = new Flow(typeLoader, typeLoader.findType(TypeStandalone.Flow.name()), "Test"); flow.addStep("test", "Approve", typeLoader.findType("Approve")); Step step = parser.stepDefinition(flow); assertEquals(0, parser.getNumberOfSyntaxErrors()); return step; } catch (RecognitionException e) { fail(e.toString()); return null; } } public void testFlowDefinition_basic() { //@formatter:off String text = "" + "flow Issue { \n" + " [employee] Begin{ \n" + " Name;\n" + " Age;\n" + " };\n" + " [me.department.$leader] Approve{ \n" + " };\n" + " [me.company.hr.$leader] Approve{ \n" + " };\n" + " [me.company.hr.$leader] Approve;\n" + " [me.company.hr.$leader] Step1: Approve{ \n" + " };\n" + " [me.company.hr.$leader] Step2 : Approve;\n" + "};\n"; //@formatter:on Flow flow = parseFlow(text); assertEquals(TypeStandalone.Flow, flow.getStandalone()); assertEquals("Issue", flow.name); assertEquals("Issue", flow.name); assertEquals(6, flow.steps.size()); Flow.Step step = flow.steps.get(0); assertEquals("Begin", step.name); assertEquals("Issue$Begin1", step.type.getName()); assertEquals(2, step.type.getDeclaredFields().size()); int i = 0; assertEquals("Name", step.type.getDeclaredFields().get(i++).name); assertEquals("Age", step.type.getDeclaredFields().get(i++).name); step = null; step = flow.steps.get(1); assertEquals("Approve", step.name); assertEquals("Issue$Approve2", step.type.getName()); i = 0; step = null; step = flow.steps.get(2); assertEquals("Approve2", step.name); assertEquals("Issue$Approve3", step.type.getName()); i = 0; step = null; step = flow.steps.get(3); assertEquals("Approve3", step.name); assertEquals("Issue$Approve4", step.type.getName()); i = 0; step = null; step = flow.steps.get(4); assertEquals("Step1", step.name); assertEquals("Issue$Step1", step.type.getName()); assertEquals("FlowApprove", step.type.getSuperType().getName()); i = 0; step = null; step = flow.steps.get(5); assertEquals("Step2", step.name); assertEquals("Issue$Step2", step.type.getName()); i = 0; step = null; } public void testFlowDefinition_Flow() { //@formatter:off String text = "" + "flow Issue { \n" + " [employee] Begin{ \n" + " Name;\n" + " Age;\n" + " };\n" + " [me.department.$leader] Approve{ \n" + " };\n" + " [me.company.hr.$leader] Approve{ \n" + " };\n" + " [me.company.hr.$leader] Approve;\n" + " [me.company.hr.$leader] Step1: Approve{ \n" + " };\n" + " [me.company.hr.$leader] Step2 : Approve;\n" + "};\n"; //@formatter:on Flow flow = parseFlow(text); assertEquals("Issue", flow.name); assertEquals("Issue", flow.name); assertEquals(6, flow.steps.size()); Flow.Step step = flow.steps.get(0); assertEquals("Begin", step.name); assertEquals("Issue$Begin1", step.type.getName()); assertEquals(2, step.type.getDeclaredFields().size()); int i = 0; assertEquals("Name", step.type.getDeclaredFields().get(i++).name); assertEquals("Age", step.type.getDeclaredFields().get(i++).name); step = null; step = flow.steps.get(1); assertEquals("Approve", step.name); assertEquals("Issue$Approve2", step.type.getName()); i = 0; step = null; step = flow.steps.get(2); assertEquals("Approve2", step.name); assertEquals("Issue$Approve3", step.type.getName()); i = 0; step = null; step = flow.steps.get(3); assertEquals("Approve3", step.name); assertEquals("Issue$Approve4", step.type.getName()); i = 0; step = null; step = flow.steps.get(4); assertEquals("Step1", step.name); assertEquals("Issue$Step1", step.type.getName()); assertEquals("FlowApprove", step.type.getSuperType().getName()); i = 0; step = null; step = flow.steps.get(5); assertEquals("Step2", step.name); assertEquals("Issue$Step2", step.type.getName()); i = 0; step = null; } public void testFlowDefinition_action() { //@formatter:off String text = "" + "flow Issue { \n" + " [employee] Begin{ \n" + " Name;\n" + " Age :=0;\n" + " init(){this.Age=10;}\n" + " };\n" + "};\n"; //@formatter:on Flow flow = parseFlow(text); assertEquals("Issue", flow.name); assertEquals("Issue", flow.name); assertEquals(1, flow.steps.size()); Flow.Step step = flow.steps.get(0); assertEquals("Begin", step.name); assertEquals("启动", step.getDisplayName()); assertEquals("Issue$Begin1", step.type.getName()); assertEquals(2, step.type.getDeclaredFields().size()); int i = 0; assertEquals("Name", step.type.getDeclaredFields().get(i++).name); assertEquals("Age", step.type.getDeclaredFields().get(i++).name); } public void testStepDefinition() { // String text = null; Step step = null; step = parseStep("Begin;"); assertEquals("Begin", step.name); assertEquals("Test$Begin2", step.type.getName()); step = parseStep("Approve;"); assertEquals("Approve2", step.name); assertEquals("Test$Approve2", step.type.getName()); step = parseStep("@Next(\"GP\") Approve;"); assertEquals("Approve2", step.name); assertEquals("Test$Approve2", step.type.getName()); assertEquals("GP", step.getAttrs().get(Step.NextAnnotation)); step = parseStep("aa : Approve;"); assertEquals("aa", step.name); assertEquals("Test$aa", step.type.getName()); step = parseStep("aa extends Approve;"); assertEquals("aa", step.name); assertEquals("Test$aa", step.type.getName()); assertEquals("FlowApprove", step.type.getSuperType().getName()); step = parseStep("AA extends Approve{};"); assertEquals("AA", step.name); assertEquals(step.resideFlow.name + "$AA", step.type.getName()); assertEquals("FlowApprove", step.type.getSuperType().getName()); step = parseStep("Begin{ };"); assertEquals("Begin", step.name); assertEquals(step.resideFlow.name + "$Begin2", step.type.getName()); assertEquals("FlowBegin", step.type.getSuperType().getName()); step = parseStep("Begin{data.*; };"); assertEquals("Begin", step.name); assertEquals(step.resideFlow.name + "$Begin2", step.type.getName()); assertEquals("FlowBegin", step.type.getSuperType().getName()); assertEquals("WithAllField", step.type.getAttrs().get("WithAllField")); step = parseStep("Approve { };"); assertEquals("Approve2", step.name); assertEquals(step.resideFlow.name + "$Approve2", step.type.getName()); assertEquals("FlowApprove", step.type.getSuperType().getName()); String query = "dfdsf"; step = parseStep("[" + query + "] Approve { };"); assertEquals("Approve2", step.name); assertEquals("[" + query + "]", step.actorQuery); assertEquals(step.resideFlow.name + "$Approve2", step.type.getName()); assertEquals("FlowApprove", step.type.getSuperType().getName()); step = parseStep("[" + query + "] Approve { Age; };"); assertEquals("Approve2", step.name); assertEquals("[" + query + "]", step.actorQuery); assertEquals(step.resideFlow.name + "$Approve2", step.type.getName()); assertEquals("FlowApprove", step.type.getSuperType().getName()); assertEquals(1, step.type.getDeclaredFields().size()); assertEquals("Age", step.type.getDeclaredFields().get(0).name); } }