diff --git a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionCellEditor.java index 7d6d99b..8ca07ef 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/editor/stages/PushPullSelectionCellEditor.java @@ -82,8 +82,7 @@ } } if (selected != null) { - options.remove(selected); - options.add(0, selected); + attr.selectOption(selected); } graphComponent.labelChanged(cell, attr, trig); } diff --git a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java index ce047c7..569fe28 100644 --- a/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java +++ b/AlgebraicDataflowArchitectureModel/src/application/simulator/InputEventCellEditor.java @@ -244,8 +244,7 @@ } } if (selected != null) { - options.remove(selected); - options.add(0, selected); + attr.selectOption(selected); } graphComponent.labelChanged(cell, attr, trig); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java index 2a7db3b..e6d273a 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGenerator.java @@ -207,7 +207,7 @@ // For each incoming PUSH transfer. for (Edge chToRes: curResNode.getInEdges()) { for (Edge resToCh: chToRes.getSource().getInEdges()) { - if (!(resToCh instanceof DataFlowEdge) || ((PushPullAttribute)((DataFlowEdge) resToCh).getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + if (!(resToCh instanceof DataFlowEdge) || ((PushPullAttribute)((DataFlowEdge) resToCh).getAttribute()).getSelectedOption() == PushPullValue.PUSH) { topologicalSort((ResourceNode) resToCh.getSource(), allNodes, dependedRootComponentGraph, visited, orderedList); } } @@ -216,7 +216,7 @@ if (curResNode instanceof ResourceNode) { for (Edge resToCh: curResNode.getOutEdges()) { DataFlowEdge de = (DataFlowEdge) resToCh; - if (((PushPullAttribute) de.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + if (((PushPullAttribute) de.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { for (Edge chToRes : resToCh.getDestination().getOutEdges()) { topologicalSort((ResourceNode) chToRes.getDestination(), allNodes, dependedRootComponentGraph, visited, orderedList); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java index f8ecbc6..e5b3ce5 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/CodeGeneratorFromDataFlowGraph.java @@ -338,7 +338,7 @@ break; } } - if ((((PushPullAttribute) ((DataFlowEdge) resToCh).getAttribute()).getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { + if ((((PushPullAttribute) ((DataFlowEdge) resToCh).getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // for PUSH transfer // ResourceHierarchy dstRes = addReference(component, constructor, ((ResourceNode) chToRes.getDestination()).getOutSideResource().getResourceHierarchy(), langSpec); // if (outsideOutputResource) { @@ -375,7 +375,7 @@ break; } } - if ((((PushPullAttribute) ((DataFlowEdge) resToCh).getAttribute()).getOptions().get(0) != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { + if ((((PushPullAttribute) ((DataFlowEdge) resToCh).getAttribute()).getSelectedOption() != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { // for PULL transfer // srcRes = addReference(component, constructor, ((ResourceNode) resToCh.getSource()).getOutSideResource().getResourceHierarchy(), langSpec); // if (outsideInputResource) { @@ -460,7 +460,7 @@ break; } } - if ((((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { + if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // Declare a field in the parent component to refer to the destination resource of push transfer. if (!generatesComponent(dstRes)) { dstRes = dstRes.getParent(); @@ -549,7 +549,7 @@ break; } } - if ((((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { + if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { noPullTransfer = false; // Declare a field in the parent/this component to refer to the source resource of pull transfer. if (!generatesComponent(srcRes.getResourceHierarchy())) { @@ -719,7 +719,7 @@ break; } } - if (((PushPullAttribute) dIn.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + if (((PushPullAttribute) dIn.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { // PUSH transfer isContainedPush = true; inputResourceToStateAccessor.put(in, getPushAccessor()); @@ -838,7 +838,7 @@ } } } - if ((((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { + if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // for push data transfer // Declare an update method in the type of the destination resource. @@ -1129,7 +1129,7 @@ } } } - if ((((PushPullAttribute) dOut.getAttribute()).getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource2) || outsideOutputResource2) { + if ((((PushPullAttribute) dOut.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource2) || outsideOutputResource2) { // PUSH transfer List params = new ArrayList<>(); // Values of path parameters. @@ -1632,7 +1632,7 @@ } } } - if ((((PushPullAttribute) dOut.getAttribute()).getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource2) || outsideOutputResource2) { + if ((((PushPullAttribute) dOut.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource2) || outsideOutputResource2) { // PUSH transfer Map> referredResources = new HashMap<>(); List params = new ArrayList<>(); diff --git a/AlgebraicDataflowArchitectureModel/src/generators/DataTransferMethodAnalyzer.java b/AlgebraicDataflowArchitectureModel/src/generators/DataTransferMethodAnalyzer.java index 518ec7f..d15f6ad 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/DataTransferMethodAnalyzer.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/DataTransferMethodAnalyzer.java @@ -37,7 +37,7 @@ boolean flag = true; for (Edge chToRes: resource.getInEdges()) { for (Edge resToCh: chToRes.getSource().getInEdges()) { - if (((PushPullAttribute) resToCh.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + if (((PushPullAttribute) resToCh.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { // Traverse pull edges only. trackNode((ResourceNode) resToCh.getSource()); flag = false; diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java index a15057e..48f226e 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaCodeGenerator.java @@ -173,7 +173,7 @@ String fieldInitializer = "new " + resourceName + "("; for (Edge resToCh: resourceNode.getOutEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; - if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + if (((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { for (Edge chToRes: re.getDestination().getOutEdges()) { ResourceHierarchy dstRes = ((ResourceNode) chToRes.getDestination()).getResourceHierarchy(); String resName = getComponentName(dstRes); @@ -188,7 +188,7 @@ DataFlowEdge re = (DataFlowEdge) resToCh; ResourceHierarchy srcRes = ((ResourceNode) re.getSource()).getResourceHierarchy(); String resName = getComponentName(srcRes); - if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + if (((PushPullAttribute) re.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { depends.add(srcRes); fieldInitializer += toVariableName(resName) + ","; f = true; @@ -348,7 +348,7 @@ break; } } - if ((((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { + if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { noPullTransfer = false; } } @@ -434,7 +434,7 @@ break; } } - if ((((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { + if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // Declare a field to refer to the destination resource of push transfer. if (!generatesComponent(dstRes)) { dstRes = dstRes.getParent(); @@ -515,7 +515,7 @@ srcRes2 = srcRes.getParent(); srcResName2 = getComponentName(srcRes2.getResourceHierarchy()); } - if ((((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { + if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { // Declare a field to refer to the source resource of pull transfer. depends.add(srcRes2.getResourceHierarchy()); FieldDeclaration srcRefField = new FieldDeclaration(new Type(srcResName2, srcResName2), toVariableName(srcResName2)); @@ -967,7 +967,7 @@ for (Edge chToRes: curResNode.getInEdges()) { for (Edge resToCh: chToRes.getSource().getInEdges()) { DataFlowEdge re = (DataFlowEdge) resToCh; - if (((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + if (((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { topologicalSort((ResourceNode) re.getSource(), graph, dependedRootComponentGraph, visited, orderedList); } } @@ -975,7 +975,7 @@ // For each outgoing PULL transfer. for (Edge resToCh: curResNode.getOutEdges()) { DataFlowEdge de = (DataFlowEdge) resToCh; - if (((PushPullAttribute) de.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + if (((PushPullAttribute) de.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { for (Edge chToRes : resToCh.getDestination().getOutEdges()) { topologicalSort((ResourceNode) chToRes.getDestination(), graph, dependedRootComponentGraph, visited, orderedList); } diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java index 283e16e..74345b1 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JavaMethodBodyGenerator.java @@ -85,7 +85,7 @@ } // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = out.isOutside(); - if ((pushPull.getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { + if ((pushPull.getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // for push data transfer MethodDeclaration update = null; if (dstComponent == null) { @@ -416,7 +416,7 @@ srcInput.addStatement("this." + JavaCodeGenerator.toVariableName(dstComponent.getTypeName()) + "." + updateMethodName + "(" + pathParams + chParams + srcFieldName + refParams + ");"); } } - } else if ((pushPull.getOptions().get(0) != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { + } else if ((pushPull.getSelectedOption() != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { // for pull (or push/pull) data transfer if (dstComponent == null) { String dstParentResourceName = JavaCodeGenerator.getComponentName(dst.getResourceHierarchy().getParent()); @@ -442,7 +442,7 @@ break; } } - if (((PushPullAttribute) dIn.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) { + if (((PushPullAttribute) dIn.getAttribute()).getSelectedOption() == PushPullValue.PUSH) { isContainedPush = true; inputResourceToStateAccessor.put(in, JavaCodeGenerator.pushAccessor); } else { @@ -526,7 +526,7 @@ } else { boolean isPush = true; for (Edge resToCh2: chToRes2.getSource().getInEdges()) { - if (((PushPullAttribute) resToCh2.getAttribute()).getOptions().get(0) != PushPullValue.PUSH) { + if (((PushPullAttribute) resToCh2.getAttribute()).getSelectedOption() != PushPullValue.PUSH) { isPush = false; break; } @@ -554,7 +554,7 @@ } } } else { - if (pushPull2.getOptions().get(0) == PushPullValue.PUSH) { + if (pushPull2.getSelectedOption() == PushPullValue.PUSH) { // In an update method of the destination component. MethodDeclaration update = null; if (JavaCodeGenerator.generatesComponent(dst.getResourceHierarchy())) { diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java index 125e133..6182314 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JerseyCodeGenerator.java @@ -484,7 +484,7 @@ ResourcePath dstRes = cm.getResource(); // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = cm.isOutside(); - if (!bDeclareClientField && ((((PushPullAttribute) re.getAttribute()).getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource)) { + if (!bDeclareClientField && ((((PushPullAttribute) re.getAttribute()).getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource)) { // For push transfer. if (!generatesComponent(dstRes.getResourceHierarchy())) { dstRes = dstRes.getParent(); @@ -553,7 +553,7 @@ if (!generatesComponent(srcRes.getResourceHierarchy())) { srcRes = srcRes.getParent(); } - if ((((PushPullAttribute) re.getAttribute()).getOptions().get(0) != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { + if ((((PushPullAttribute) re.getAttribute()).getSelectedOption() != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { // For pull transfer. if (outsideInputResource || (resourceNode.getInSideResource(ch).getCommonPrefix(srcRes) == null && differentTreesAsDifferentServices)) { // Inter-service diff --git a/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java b/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java index 621bd82..8fd6590 100644 --- a/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java +++ b/AlgebraicDataflowArchitectureModel/src/generators/JerseyMethodBodyGenerator.java @@ -94,7 +94,7 @@ } // Check if the output resource is outside of the channel scope. boolean outsideOutputResource = out.isOutside(); - if ((pushPull.getOptions().get(0) == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { + if ((pushPull.getSelectedOption() == PushPullValue.PUSH && !outsideInputResource) || outsideOutputResource) { // for push data transfer MethodDeclaration update = null; if (dstComponent == null) { @@ -639,7 +639,7 @@ } } } - } else if ((pushPull.getOptions().get(0) != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { + } else if ((pushPull.getSelectedOption() != PushPullValue.PUSH && !outsideOutputResource) || outsideInputResource) { // for pull (or push/pull) data transfer if (dstComponent == null) { String dstParentResourceName = JerseyCodeGenerator.getComponentName(dst.getResourceHierarchy().getParent()); diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullAttribute.java b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullAttribute.java index 598894a..ad0da87 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullAttribute.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataFlowModel/PushPullAttribute.java @@ -20,6 +20,10 @@ public List getOptions() { return options; } + + public PushPullValue getSelectedOption() { + return options.get(0); + } public void setOptions(List options) { this.options = options; @@ -37,6 +41,13 @@ this.options.retainAll(options); } + public boolean selectOption(PushPullValue option) { + if (!options.contains(option)) return false; + options.remove(option); + options.add(0, option); + return true; + } + public String[] getOptionStrings() { String[] optionString = new String[options.size()]; for (int i = 0; i < options.size(); i++) { diff --git a/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java b/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java index 572e43b..b6267f2 100644 --- a/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java +++ b/AlgebraicDataflowArchitectureModel/src/tests/JavaCodeGeneratorTest.java @@ -8,11 +8,9 @@ import java.io.FileReader; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Set; import org.junit.Test; @@ -25,6 +23,7 @@ import generators.DataTransferMethodAnalyzer; import generators.JavaCodeGenerator; import generators.JavaMethodBodyGenerator; +import models.Edge; import models.dataFlowModel.*; import parser.*; import parser.exceptions.ExpectedAssignment; @@ -48,76 +47,1321 @@ @Test public void test() { + testAccounts(); + testClock(); +// testCustomerManagement(); // There is a non-implemented feature for Java prototype generation. + testGroupChat(); + testInventoryManagement(); + testOnlineBattleGame(); testPOS(); + testSimpleTwitter(); + testWeatherObservationSystem(); } - private void testPOS() { + private void testAccounts() { try { - ArrayList generatedCode = generateCode("models/POS.model"); + ArrayList generatedCode = generateCode("models/Accounts.model", null); Map, // field name to type Map, // arg types + Entry, // arg types Integer>>>>> // lines of code exprectedStructure = new HashMap<>(); - exprectedStructure.put("Main", Map.entry(Map.of("history", "History", - "total", "Total", - "payment", "Payment", - "points", "Points"), - Map.of("Main", Map.entry("void", - Map.entry(Set.of(), - 4)), - "getHistory", Map.entry("List", - Map.entry(Set.of(), - 1)), - "getTotal", Map.entry("int", - Map.entry(Set.of(), - 1)), - "getPayment", Map.entry("int", - Map.entry(Set.of(), - 1)), - "purchase", Map.entry("void", - Map.entry(Set.of("int"), - 1)), - "getPoints", Map.entry("int", - Map.entry(Set.of(), - 1))))); - exprectedStructure.put("History", Map.entry(Map.of(), - Map.of("getValue", Map.entry("List", - Map.entry(Set.of(), - 1)), - "updateFromPayment", Map.entry("void", - Map.entry(Set.of("int"), - 1))))); - exprectedStructure.put("Total", Map.entry(Map.of(), - Map.of("getValue", Map.entry("int", - Map.entry(Set.of(), - 1)), - "Total", Map.entry("void", - Map.entry(Set.of("History"), - 1))))); - exprectedStructure.put("Payment", Map.entry(Map.of("value", "int", - "history", "History"), - Map.of("getValue", Map.entry("int", - Map.entry(Set.of(), - 1)), - "purchase", Map.entry("void", - Map.entry(Set.of("int"), - 2)), - "Payment", Map.entry("void", - Map.entry(Set.of("History"), - 1))))); - exprectedStructure.put("Points", Map.entry(Map.of(), - Map.of("getValue", Map.entry("int", - Map.entry(Set.of(), - 1)), - "Points", Map.entry("void", - Map.entry(Set.of("Payment"), - 1))))); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("int"), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of("int"), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("int","String"), + 1))), + Map.entry("getAccounts", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("signup", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Account", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("int","String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("int"), + 1))), + Map.entry("signup", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + + private void testClock() { + try { + // check PULL-first + ArrayList generatedCode = generateCode("models/Clock.model", PushPullValue.PULL); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("hour", "Hour"), + Map.entry("hour_ang", "Hour_ang"), + Map.entry("min", "Min"), + Map.entry("min_ang", "Min_ang")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 4))), + Map.entry("getHour", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getHour_ang", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("getMin", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("tick", Map.entry("void", + Map.entry(List.of(), + 1))), + Map.entry("getMin_ang", Map.entry("double", + Map.entry(List.of(), + 1)))))); + exprectedStructure.put("Hour", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updateFromMin", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); + exprectedStructure.put("Hour_ang", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("Hour_ang", Map.entry("void", + Map.entry(List.of("Hour"), + 1)))))); + exprectedStructure.put("Min", Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("hour", "Hour")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("tick", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("Min", Map.entry("void", + Map.entry(List.of("Hour"), + 1)))))); + exprectedStructure.put("Min_ang", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("Min_ang", Map.entry("void", + Map.entry(List.of("Min"), + 1)))))); checkStructure(generatedCode, exprectedStructure); - // generateCheckCode(generatedCode); +// generateCheckCode(generatedCode); + + // check PUSH-first + generatedCode = generateCode("models/Clock.model", PushPullValue.PUSH); + exprectedStructure.clear(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("hour_ang", "Hour_ang"), + Map.entry("min_ang", "Min_ang"), + Map.entry("hour", "Hour"), + Map.entry("min", "Min")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 4))), + Map.entry("getHour_ang", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("getMin_ang", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("getHour", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getMin", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("tick", Map.entry("void", + Map.entry(List.of(), + 1)))))); + exprectedStructure.put("Hour_ang", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromHour", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); + exprectedStructure.put("Min_ang", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromMin", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); + exprectedStructure.put("Hour", Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("hour_ang", "Hour_ang")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updateFromMin", Map.entry("void", + Map.entry(List.of("int"), + 2))), + Map.entry("Hour", Map.entry("void", + Map.entry(List.of("Hour_ang"), + 1)))))); + exprectedStructure.put("Min", Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("min_ang", "Min_ang"), + Map.entry("hour", "Hour")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("tick", Map.entry("void", + Map.entry(List.of(), + 3))), + Map.entry("Min", Map.entry("void", + Map.entry(List.of("Min_ang","Hour"), + 2)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + + private void testCustomerManagement() { + try { + // check PULL-first + ArrayList generatedCode = generateCode("models/CustomerManagement.model", PushPullValue.PULL); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); + + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("companies", "Companies"), + Map.entry("customers", "Customers")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("setAddress", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getCustomer", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getCompanies", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("addCampany", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getOrganization", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("setOrganization", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("getCompany", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getCustomers", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("addCustomer", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Customer", Map.entry(Map.ofEntries(Map.entry("organization", "String"), + Map.entry("company", "Company"), + Map.entry("companies", "Companies")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getOrganization", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("setOrganization", Map.entry("void", + Map.entry(List.of("String","String"), + 2))), + Map.entry("Customer", Map.entry("void", + Map.entry(List.of("String","Companies"), + 3)))))); + exprectedStructure.put("Companies", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getCompany", Map.entry("Company", + Map.entry(List.of("String"), + 1))), + Map.entry("addCampany", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Company", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("setAddress", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Company", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Customers", Map.entry(Map.ofEntries(Map.entry("value", "Map"), + Map.entry("companies", "Companies")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getCustomer", Map.entry("Customer", + Map.entry(List.of("String"), + 1))), + Map.entry("addCustomer", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Customers", Map.entry("void", + Map.entry(List.of("Companies"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + + // check PUSH-first + generatedCode = generateCode("models/CustomerManagement.model", PushPullValue.PUSH); + exprectedStructure.clear(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("companies", "Companies"), + Map.entry("customers", "Customers")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getCustomer", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getCompany", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("getOrganization", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("setOrganization", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("setAddress", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getCompanies", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("addCampany", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getCustomers", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("addCustomer", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Customer", Map.entry(Map.ofEntries(Map.entry("company", "Company"), + Map.entry("companies", "Companies"), + Map.entry("organization", "String")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getOrganization", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("updateAddressFromOrganization", Map.entry("void", + Map.entry(List.of("String","String","String"), + 2))), + Map.entry("setOrganization", Map.entry("void", + Map.entry(List.of("String","String"), + 3))), + Map.entry("Customer", Map.entry("void", + Map.entry(List.of("Companies","String"), + 3)))))); + exprectedStructure.put("Company", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAddress", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("setAddress", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Company", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Companies", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getCompany", Map.entry("Company", + Map.entry(List.of("String"), + 1))), + Map.entry("addCampany", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Customers", Map.entry(Map.ofEntries(Map.entry("value", "Map"), + Map.entry("companies", "Companies")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getCustomer", Map.entry("Customer", + Map.entry(List.of("String"), + 1))), + Map.entry("addCustomer", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Customers", Map.entry("void", + Map.entry(List.of("Companies"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + + private void testGroupChat() { + try { + // check PULL-first + ArrayList generatedCode = generateCode("models/GroupChat.model", PushPullValue.PULL); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("accounts", "Accounts"), + Map.entry("groups", "Groups")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getNotifications", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("hasRead", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getMembers", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("addGroupMember", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getGroup", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String"), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getGroups", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("createGroup", Map.entry("void", + Map.entry(List.of("String"), + 1))), + Map.entry("getMessages", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("postMessage", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Members", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("addGroupMember", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Group", Map.entry(Map.ofEntries(Map.entry("members", "Members"), + Map.entry("messages", "List")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getMembers", Map.entry("Members", + Map.entry(List.of(), + 1))), + Map.entry("getMessages", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("postMessage", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Group", Map.entry("void", + Map.entry(List.of("List"), + 1)))))); + exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Account", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getNotifications", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("hasRead", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("Map"), + 1)))))); + exprectedStructure.put("Groups", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getGroup", Map.entry("Group", + Map.entry(List.of("String"), + 1))), + Map.entry("createGroup", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + + // check PUSH-first + generatedCode = generateCode("models/GroupChat.model", PushPullValue.PUSH); + exprectedStructure.clear(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("groups", "Groups"), + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getMembers", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("addGroupMember", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getMessages", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("postMessage", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getNotifications", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("hasRead", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getGroup", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getGroups", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("createGroup", Map.entry("void", + Map.entry(List.of("String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String"), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Members", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("addGroupMember", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Group", Map.entry(Map.ofEntries(Map.entry("members", "Members"), + Map.entry("messages", "List")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getMembers", Map.entry("Members", + Map.entry(List.of(), + 1))), + Map.entry("getMessages", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("postMessage", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Group", Map.entry("void", + Map.entry(List.of("List"), + 1)))))); + exprectedStructure.put("Groups", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getGroup", Map.entry("Group", + Map.entry(List.of("String"), + 1))), + Map.entry("createGroup", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Account", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getNotifications", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("hasRead", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("Map"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + + private void testInventoryManagement() { + try { + ArrayList generatedCode = generateCode("models/InventoryManagement.model", null); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 1))), + Map.entry("getInventoryElement", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getInventory", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("registerItem", Map.entry("void", + Map.entry(List.of("String","int","String"), + 1))), + Map.entry("getCount", Map.entry("int", + Map.entry(List.of("String"), + 1))), + Map.entry("receiveOrShip", Map.entry("void", + Map.entry(List.of("String","int"), + 1)))))); + exprectedStructure.put("InventoryElement", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getCount", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("receiveOrShip", Map.entry("void", + Map.entry(List.of("String","int"), + 1))), + Map.entry("InventoryElement", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); + exprectedStructure.put("Inventory", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getInventoryElement", Map.entry("InventoryElement", + Map.entry(List.of("String"), + 1))), + Map.entry("registerItem", Map.entry("void", + Map.entry(List.of("String","int","String"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + + private void testOnlineBattleGame() { + try { + // check PULL-first + ArrayList generatedCode = generateCode("models/OnlineBattleGame.model", PushPullValue.PULL); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("accounts", "Accounts"), + Map.entry("rooms", "Rooms")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getRoom", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getBlue_id", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeBlueId", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getRed_id", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeRedId", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getRooms", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String","String","String"), + 1))), + Map.entry("getRed_name", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("getBlue_name", Map.entry("String", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Room", Map.entry(Map.ofEntries(Map.entry("blue_id", "String"), + Map.entry("red_id", "String"), + Map.entry("account", "Account"), + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getBlue_id", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getRed_id", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getRed_name", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getBlue_name", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("changeRedId", Map.entry("void", + Map.entry(List.of("String","String"), + 2))), + Map.entry("changeBlueId", Map.entry("void", + Map.entry(List.of("String","String"), + 2))), + Map.entry("Room", Map.entry("void", + Map.entry(List.of("String","String","Accounts"), + 5)))))); + exprectedStructure.put("Account", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Rooms", Map.entry(Map.ofEntries(Map.entry("value", "Map"), + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getRoom", Map.entry("Room", + Map.entry(List.of("String"), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String","String","String"), + 1))), + Map.entry("Rooms", Map.entry("void", + Map.entry(List.of("Accounts"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + + // check PUSH-first + generatedCode = generateCode("models/OnlineBattleGame.model", PushPullValue.PUSH); + exprectedStructure.clear(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("accounts", "Accounts"), + Map.entry("rooms", "Rooms")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 2))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getBlue_name", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("getBlue_id", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeBlueId", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getRed_name", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("getRed_id", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeRedId", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of("String"), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getRooms", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String","String","String"), + 1))), + Map.entry("getRoom", Map.entry("Map", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Account", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getName", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("changeName", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("String"), + 1)))))); + exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Rooms", Map.entry(Map.ofEntries(Map.entry("value", "Map"), + Map.entry("accounts", "Accounts")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getRoom", Map.entry("Room", + Map.entry(List.of("String"), + 1))), + Map.entry("createRoom", Map.entry("void", + Map.entry(List.of("String","String","String"), + 1))), + Map.entry("Rooms", Map.entry("void", + Map.entry(List.of("Accounts"), + 1)))))); + exprectedStructure.put("Room", Map.entry(Map.ofEntries(Map.entry("account", "Account"), + Map.entry("accounts", "Accounts"), + Map.entry("blue_id", "String"), + Map.entry("red_id", "String")), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getBlue_name", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getBlue_id", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getRed_name", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("getRed_id", Map.entry("String", + Map.entry(List.of(), + 1))), + Map.entry("updateBlue_nameFromBlue_id", Map.entry("void", + Map.entry(List.of("String","String","String"), + 2))), + Map.entry("updateRed_nameFromRed_id", Map.entry("void", + Map.entry(List.of("String","String","String"), + 2))), + Map.entry("changeRedId", Map.entry("void", + Map.entry(List.of("String","String"), + 3))), + Map.entry("changeBlueId", Map.entry("void", + Map.entry(List.of("String","String"), + 3))), + Map.entry("Room", Map.entry("void", + Map.entry(List.of("Accounts","String","String"), + 5)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + + private void testPOS() { + try { + // check PULL-first + ArrayList generatedCode = generateCode("models/POS.model", PushPullValue.PULL); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("history", "History"), + Map.entry("total", "Total"), + Map.entry("payment", "Payment"), + Map.entry("points", "Points")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 4))), + Map.entry("getHistory", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("getTotal", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getPayment", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("purchase", Map.entry("void", + Map.entry(List.of("int"), + 1))), + Map.entry("getPoints", Map.entry("int", + Map.entry(List.of(), + 1)))))); + exprectedStructure.put("History", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("updateFromPayment", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); + exprectedStructure.put("Total", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("Total", Map.entry("void", + Map.entry(List.of("History"), + 1)))))); + exprectedStructure.put("Payment", Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("history", "History")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("purchase", Map.entry("void", + Map.entry(List.of("int"), + 2))), + Map.entry("Payment", Map.entry("void", + Map.entry(List.of("History"), + 1)))))); + exprectedStructure.put("Points", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("Points", Map.entry("void", + Map.entry(List.of("Payment"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + + // check PUSH-first + generatedCode = generateCode("models/POS.model", PushPullValue.PUSH); + exprectedStructure.clear(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("points", "Points"), + Map.entry("total", "Total"), + Map.entry("history", "History"), + Map.entry("payment", "Payment")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 4))), + Map.entry("getPoints", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getTotal", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("getHistory", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("getPayment", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("purchase", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); + exprectedStructure.put("Points", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updateFromPayment", Map.entry("void", + Map.entry(List.of("int"), + 1)))))); + exprectedStructure.put("Total", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("updateFromHistory", Map.entry("void", + Map.entry(List.of("List"), + 1)))))); + exprectedStructure.put("History", Map.entry(Map.ofEntries(Map.entry("value", "List"), + Map.entry("total", "Total")), + Map.ofEntries(Map.entry("getValue", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("updateFromPayment", Map.entry("void", + Map.entry(List.of("int"), + 2))), + Map.entry("History", Map.entry("void", + Map.entry(List.of("Total"), + 1)))))); + exprectedStructure.put("Payment", Map.entry(Map.ofEntries(Map.entry("value", "int"), + Map.entry("points", "Points"), + Map.entry("history", "History")), + Map.ofEntries(Map.entry("getValue", Map.entry("int", + Map.entry(List.of(), + 1))), + Map.entry("purchase", Map.entry("void", + Map.entry(List.of("int"), + 3))), + Map.entry("Payment", Map.entry("void", + Map.entry(List.of("Points","History"), + 2)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + + private void testSimpleTwitter() { + try { + ArrayList generatedCode = generateCode("models/SimpleTwitter.model", null); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Map", + Map.entry(List.of("String"), + 1))), + Map.entry("getAccounts", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("getTweets", Map.entry("List", + Map.entry(List.of("String"), + 1))), + Map.entry("tweet", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + exprectedStructure.put("Account", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getTweets", Map.entry("List", + Map.entry(List.of(), + 1))), + Map.entry("tweet", Map.entry("void", + Map.entry(List.of("String","String"), + 1))), + Map.entry("Account", Map.entry("void", + Map.entry(List.of("List"), + 1)))))); + exprectedStructure.put("Accounts", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("Map", + Map.entry(List.of(), + 1))), + Map.entry("getAccount", Map.entry("Account", + Map.entry(List.of("String"), + 1))), + Map.entry("signUp", Map.entry("void", + Map.entry(List.of("String","String"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + } catch (FileNotFoundException + | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword + | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression + | WrongRHSExpression | ExpectedRightBracket | ExpectedAssignment | ExpectedRightCurlyBracket + | WrongPathExpression | WrongJsonExpression | ExpectedColon | ExpectedDoubleQuotation e) { + e.printStackTrace(); + } + } + + private void testWeatherObservationSystem() { + try { + // check PULL-first + ArrayList generatedCode = generateCode("models/WeatherObservationSystem.model", PushPullValue.PULL); + Map, // field name to type + Map, // arg types + Integer>>>>> // lines of code + exprectedStructure = new HashMap<>(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("highest", "Highest"), + Map.entry("temp_f", "Temp_f"), + Map.entry("temp_c", "Temp_c")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 3))), + Map.entry("getHighest", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("reset", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("getTemp_f", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("observe", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("getTemp_c", Map.entry("double", + Map.entry(List.of(), + 1)))))); + exprectedStructure.put("Highest", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromTemp_f", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("reset", Map.entry("void", + Map.entry(List.of("double"), + 1)))))); + exprectedStructure.put("Temp_f", Map.entry(Map.ofEntries(Map.entry("value", "double"), + Map.entry("highest", "Highest")), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("observe", Map.entry("void", + Map.entry(List.of("double"), + 2))), + Map.entry("Temp_f", Map.entry("void", + Map.entry(List.of("Highest"), + 1)))))); + exprectedStructure.put("Temp_c", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("Temp_c", Map.entry("void", + Map.entry(List.of("Temp_f"), + 1)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); + + // check PUSH-first + generatedCode = generateCode("models/WeatherObservationSystem.model", PushPullValue.PUSH); + exprectedStructure.clear(); + exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("temp_c", "Temp_c"), + Map.entry("highest", "Highest"), + Map.entry("temp_f", "Temp_f")), + Map.ofEntries(Map.entry("Main", Map.entry("void", + Map.entry(List.of(), + 3))), + Map.entry("getTemp_c", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("getHighest", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("reset", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("getTemp_f", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("observe", Map.entry("void", + Map.entry(List.of("double"), + 1)))))); + exprectedStructure.put("Temp_c", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromTemp_f", Map.entry("void", + Map.entry(List.of("double"), + 1)))))); + exprectedStructure.put("Highest", Map.entry(Map.ofEntries(), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("updateFromTemp_f", Map.entry("void", + Map.entry(List.of("double"), + 1))), + Map.entry("reset", Map.entry("void", + Map.entry(List.of("double"), + 1)))))); + exprectedStructure.put("Temp_f", Map.entry(Map.ofEntries(Map.entry("value", "double"), + Map.entry("highest", "Highest"), + Map.entry("temp_c", "Temp_c")), + Map.ofEntries(Map.entry("getValue", Map.entry("double", + Map.entry(List.of(), + 1))), + Map.entry("observe", Map.entry("void", + Map.entry(List.of("double"), + 3))), + Map.entry("Temp_f", Map.entry("void", + Map.entry(List.of("Highest","Temp_c"), + 2)))))); + + checkStructure(generatedCode, exprectedStructure); +// generateCheckCode(generatedCode); } catch (FileNotFoundException | ExpectedChannel | ExpectedChannelName | ExpectedLeftCurlyBracket | ExpectedInOrOutOrRefOrSubKeyword | ExpectedStateTransition | ExpectedEquals | ExpectedRHSExpression | WrongLHSExpression @@ -127,7 +1371,7 @@ } } - private ArrayList generateCode(String fileName) throws FileNotFoundException, + private ArrayList generateCode(String fileName, PushPullValue pushPullValue) throws FileNotFoundException, ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedRightCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation { @@ -137,16 +1381,26 @@ model = parser.doParse(); DataFlowGraph graph = DataTransferModelAnalyzer.createDataFlowGraphWithStateStoringAttribute(model); DataTransferModelAnalyzer.annotateWithSelectableDataTransferAttiribute(graph); + if (pushPullValue != null) { + // Select a specified push/pull transfer method if possible. + for (Edge e : graph.getEdges()) { + if (!((DataFlowEdge) e).isChannelToResource() && ((DataFlowEdge) e).getAttribute() instanceof PushPullAttribute) { + PushPullAttribute ppat = (PushPullAttribute) ((DataFlowEdge) e).getAttribute(); + ppat.selectOption(pushPullValue); + } + } + } + TypeInference.infer(model); DataTransferMethodAnalyzer.decideToStoreResourceStates(graph); ArrayList codetree = JavaMethodBodyGenerator.doGenerate(graph, model, JavaCodeGenerator.doGenerate(graph, model)); return codetree; } private void checkStructure(ArrayList generatedCode, - Map, Map, Integer>>>>> exprectedStructure) { + Map, Map, Integer>>>>> exprectedStructure) { for (var classEnt: exprectedStructure.entrySet()) { String expectedClassName = classEnt.getKey(); - Entry, Map, Integer>>>> expectedClassStructure = classEnt.getValue(); + Entry, Map, Integer>>>> expectedClassStructure = classEnt.getValue(); TypeDeclaration generatedClass = null; for (CompilationUnit cu: generatedCode) { for (TypeDeclaration type: cu.types()) { @@ -159,7 +1413,7 @@ assertNotNull(generatedClass); Map exprectedFields = expectedClassStructure.getKey(); - Map, Integer>>> exprectedMethods = expectedClassStructure.getValue(); + Map, Integer>>> exprectedMethods = expectedClassStructure.getValue(); for (String expectedFieldName: exprectedFields.keySet()) { FieldDeclaration generatedField = null; @@ -178,58 +1432,94 @@ assertEquals(generatedField.getType().getInterfaceTypeName(), expectedFieldType); } } + + for (String expectedMethodName: exprectedMethods.keySet()) { + MethodDeclaration generatedMethod= null; + for (MethodDeclaration method: generatedClass.getMethods()) { + if (method.getName().equals(expectedMethodName)) { + generatedMethod = method; + break; + } + } + assertNotNull(generatedMethod); + + Entry, Integer>> expectedMethodInfo = exprectedMethods.get(expectedMethodName); + String expectedReturnType = expectedMethodInfo.getKey(); + if (expectedReturnType.equals("void")) { + if (generatedMethod.getReturnType() != null) { + assertEquals(generatedMethod.getReturnType().getInterfaceTypeName(), expectedReturnType); + } else { + assertNull(generatedMethod.getReturnType()); + } + } else { + assertEquals(generatedMethod.getReturnType().getInterfaceTypeName(), expectedReturnType); + } + Entry, Integer> expectedMethodInfo2 = expectedMethodInfo.getValue(); + List expectedArgTypes = expectedMethodInfo2.getKey(); + for (String expectedArgType: expectedArgTypes) { + boolean existsArg = false; + for (VariableDeclaration var: generatedMethod.getParameters()) { + if (expectedArgType.equals(var.getType().getInterfaceTypeName())) { + existsArg = true; + } + } + assertTrue(existsArg); + } + int expectedLinesOfCode = expectedMethodInfo2.getValue(); + assertEquals(generatedMethod.getBody().getStatements().size(), expectedLinesOfCode); + } } } private void generateCheckCode(ArrayList generatedCode) { -// exprectedStructure.put("Main", Map.entry(Map.of("history", "History", -// "total", "Total", -// "payment", "Payment", -// "points", "Points"), -// Map.of("Main", Map.entry("void", -// Map.entry(Set.of(), -// 4)), -// "getHistory", Map.entry("List", -// Map.entry(Set.of(), -// 1)), -// "getTotal", Map.entry("int", -// Map.entry(Set.of(), -// 1)), -// "getPayment", Map.entry("int", -// Map.entry(Set.of(), -// 1)), -// "purchase", Map.entry("void", -// Map.entry(Set.of("int"), -// 1)), -// "getPoints", Map.entry("int", -// Map.entry(Set.of(), -// 1))))); +// exprectedStructure.put("Main", Map.entry(Map.ofEntries(Map.entry("history", "History"), +// Map.entry("total", "Total"), +// Map.entry("payment", "Payment"), +// Map.entry("points", "Points")), +// Map.ofEntries(Map.entry("Main", Map.entry("void", +// Map.entry(List.of(), +// 4))), +// Map.entry("getHistory", Map.entry("List", +// Map.entry(List.of(), +// 1))), +// Map.entry("getTotal", Map.entry("int", +// Map.entry(List.of(), +// 1))), +// Map.entry("getPayment", Map.entry("int", +// Map.entry(List.of(), +// 1))), +// Map.entry("purchase", Map.entry("void", +// Map.entry(List.of("int"), +// 1))), +// Map.entry("getPoints", Map.entry("int", +// Map.entry(List.of(), +// 1)))))); for (CompilationUnit cu: generatedCode) { for (TypeDeclaration type: cu.types()) { List fields = type.getFields(); List methods = type.getMethods(); // fields if (fields.size() == 0) { - System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.of(),"); + System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.ofEntries(),"); } if (fields.size() == 1) { - System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.of(),"); + System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.ofEntries(),"); } else { int i = 0; for (FieldDeclaration field: fields) { if (i == 0) { - System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.of(\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\","); + System.out.println("\t\t\texprectedStructure.put(\"" + type.getTypeName() + "\", Map.entry(Map.ofEntries(Map.entry(\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\"),"); } else { - System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); - for (int j = 0; j < type.getTypeName().length() / 4; j++) { + System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); + for (int j = 0; j < (type.getTypeName().length() + 3) / 4; j++) { System.out.print("\t"); } - for (int j = 0; j < type.getTypeName().length() % 4; j++) { + for (int j = 0; j < (type.getTypeName().length() + 3) % 4; j++) { System.out.print(" "); } if (i < fields.size() - 1) { - System.out.println("\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\","); + System.out.println("Map.entry(\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\"),"); } else { - System.out.println("\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\"),"); + System.out.println("Map.entry(\"" + field.getName() + "\", \"" + field.getType().getInterfaceTypeName() + "\")),"); } } i++; @@ -244,7 +1534,7 @@ for (int j = 0; j < (type.getTypeName().length() + 1) % 4; j++) { System.out.print(" "); } - System.out.println("Map.of())));"); + System.out.println("Map.ofEntries())));"); } else { int i = 0; for (MethodDeclaration method: methods) { @@ -258,36 +1548,36 @@ System.out.print(" "); } if (method.getReturnType() == null) { - System.out.println("Map.of(\"" + method.getName() + "\", Map.entry(\"void\", "); + System.out.println("Map.ofEntries(Map.entry(\"" + method.getName() + "\", Map.entry(\"void\", "); } else { - System.out.println("Map.of(\"" + method.getName() + "\", Map.entry(\"" + method.getReturnType().getInterfaceTypeName() + "\", "); + System.out.println("Map.ofEntries(Map.entry(\"" + method.getName() + "\", Map.entry(\"" + method.getReturnType().getInterfaceTypeName() + "\", "); } } else { - System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); - for (int j = 0; j < type.getTypeName().length() / 4; j++) { + System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); + for (int j = 0; j < (type.getTypeName().length() + 3) / 4; j++) { System.out.print("\t"); } - for (int j = 0; j < type.getTypeName().length() % 4; j++) { + for (int j = 0; j < (type.getTypeName().length() + 3) % 4; j++) { System.out.print(" "); } if (method.getReturnType() == null) { - System.out.println("\"" + method.getName() + "\", Map.entry(\"void\", "); + System.out.println("Map.entry(\"" + method.getName() + "\", Map.entry(\"void\", "); } else { - System.out.println("\"" + method.getName() + "\", Map.entry(\"" + method.getReturnType().getInterfaceTypeName() + "\", "); + System.out.println("Map.entry(\"" + method.getName() + "\", Map.entry(\"" + method.getReturnType().getInterfaceTypeName() + "\", "); } } // method parameters - System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); - for (int j = 0; j < (type.getTypeName().length() + method.getName().length() + 2) / 4; j++) { + System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); + for (int j = 0; j < (type.getTypeName().length() + method.getName().length() + 3) / 4; j++) { System.out.print("\t"); } - for (int j = 0; j < (type.getTypeName().length() + method.getName().length() + 2) % 4; j++) { + for (int j = 0; j < (type.getTypeName().length() + method.getName().length() + 3) % 4; j++) { System.out.print(" "); } if (method.getParameters() == null || method.getParameters().size() == 0) { - System.out.println("Map.entry(Set.of(),"); + System.out.println("Map.entry(List.of(),"); } else { - System.out.print("Map.entry(Set.of("); + System.out.print("Map.entry(List.of("); String delim = ""; for (VariableDeclaration arg: method.getParameters()) { System.out.print(delim + "\"" + arg.getType().getInterfaceTypeName() + "\""); @@ -296,17 +1586,17 @@ System.out.println("),"); } // method lines of code - System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); - for (int j = 0; j < (type.getTypeName().length() + method.getName().length()) / 4; j++) { + System.out.print("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"); + for (int j = 0; j < (type.getTypeName().length() + method.getName().length() + 3) / 4; j++) { System.out.print("\t"); } - for (int j = 0; j < (type.getTypeName().length() + method.getName().length()) % 4; j++) { + for (int j = 0; j < (type.getTypeName().length() + method.getName().length() + 3) % 4; j++) { System.out.print(" "); } if (i < methods.size() - 1) { - System.out.println("" + method.getBody().getStatements().size() + ")),"); + System.out.println("" + method.getBody().getStatements().size() + "))),"); } else { - System.out.println("" + method.getBody().getStatements().size() + ")))));"); + System.out.println("" + method.getBody().getStatements().size() + "))))));"); } i++; }