diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/bpmn/data/VariableValue.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/bpmn/data/VariableValue.java index 168d8b307da3f227c32ad26a160da1b84c8e7e62..f48915262d963fdf7b535ac312ed9215cdd87254 100644 --- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/bpmn/data/VariableValue.java +++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/bpmn/data/VariableValue.java @@ -4,6 +4,7 @@ public class VariableValue { private String variable; private Object value; + private boolean required; public VariableValue() { } @@ -28,4 +29,12 @@ public class VariableValue { public void setValue(Object value) { this.value = value; } + + public boolean isRequired() { + return required; + } + + public void setRequired(boolean required) { + this.required = required; + } } \ No newline at end of file diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowElementEnhancedDTO.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowElementEnhancedDTO.java index 1959c0222dc839e444a8e4617d0519bf92e9f346..ef4d2be7bbadd107645a2a337e43e16d53a47dc6 100644 --- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowElementEnhancedDTO.java +++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/dto/FlowElementEnhancedDTO.java @@ -2,10 +2,12 @@ package de.fhmuenster.masterthesis.Testgenerator.rest.dto; import java.util.List; +import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.VariableValue; + public class FlowElementEnhancedDTO { private String name; - private List<String> inputVariables; + private List<VariableValue> inputVariables; private List<String> outputVariables; public FlowElementEnhancedDTO() { @@ -19,11 +21,11 @@ public class FlowElementEnhancedDTO { this.name = name; } - public List<String> getInputVariables() { + public List<VariableValue> getInputVariables() { return inputVariables; } - public void setInputVariables(List<String> inputVariables) { + public void setInputVariables(List<VariableValue> inputVariables) { this.inputVariables = inputVariables; } diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/change/ChangeController.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/change/ChangeController.java index 10031c105b86225366a6582f2e08148a3da446cd..bad7d51948abb1ff720764f268ffc255d7411dee 100644 --- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/change/ChangeController.java +++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/change/ChangeController.java @@ -7,6 +7,7 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import org.eclipse.emf.common.util.BasicEList; @@ -31,6 +32,7 @@ import de.fhmuenster.masterthesis.Testgenerator.utils.ProjectDirectoryUtils; import de.fhmuenster.masterthesis.serialization.TestgeneratorDSLSerializer; import de.fhmuenster.masterthesis.Testgenerator.rest.service.test.TestService; import de.fhmuenster.masterthesis.testgeneratorDSL.Flow; +import de.fhmuenster.masterthesis.testgeneratorDSL.StartFlowElement; import de.fhmuenster.masterthesis.testgeneratorDSL.Test; import de.fhmuenster.masterthesis.testgeneratorDSL.UserTaskFlowElement; import de.fhmuenster.masterthesis.testgeneratorDSL.VariableReference; @@ -145,10 +147,20 @@ public class ChangeController { //Prüfen, ob eine Prozessvariable gelöscht wurde, diese muss dann aus der Testspezifikation raus int index = 0; for(TaskVariables tv : bpmnTestcase.getTaskVariableList()) { - UserTaskFlowElement oldUserTask = (UserTaskFlowElement) oldDSL.getFlowElements(Arrays.asList(tv.getTask())).get(0); - List<VariableReference> oldInputVariables = oldUserTask.getInputVariables(); - UserTaskFlowElement newUserTask = (UserTaskFlowElement) newDSL.getFlowElements(Arrays.asList(tv.getTask())).get(0); - List<VariableReference> newInputVariables = newUserTask.getInputVariables(); + List<VariableReference> oldInputVariables = Collections.emptyList(); + List<VariableReference> newInputVariables = Collections.emptyList(); + if(oldDSL.getFlowElements(Arrays.asList(tv.getTask())).get(0) instanceof UserTaskFlowElement) { + UserTaskFlowElement oldUserTask = (UserTaskFlowElement) oldDSL.getFlowElements(Arrays.asList(tv.getTask())).get(0); + oldInputVariables = oldUserTask.getInputVariables(); + UserTaskFlowElement newUserTask = (UserTaskFlowElement) newDSL.getFlowElements(Arrays.asList(tv.getTask())).get(0); + newInputVariables = newUserTask.getInputVariables(); + } + if(oldDSL.getFlowElements(Arrays.asList(tv.getTask())).get(0) instanceof StartFlowElement) { + StartFlowElement oldUserTask = (StartFlowElement) oldDSL.getFlowElements(Arrays.asList(tv.getTask())).get(0); + oldInputVariables = oldUserTask.getInputVariables(); + StartFlowElement newUserTask = (StartFlowElement) newDSL.getFlowElements(Arrays.asList(tv.getTask())).get(0); + newInputVariables = newUserTask.getInputVariables(); + } List<String> deletedInputVariables = new ArrayList<>(); for(VariableReference v : oldInputVariables) { diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/converters/TestConverter.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/converters/TestConverter.java index 54436ae158000466fd1039fb300fc800d7d0bd40..1f4666c642c4f1c14c85024c230536e0bf39d0c8 100644 --- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/converters/TestConverter.java +++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/converters/TestConverter.java @@ -89,6 +89,7 @@ public class TestConverter { TaskVariables taskVariables = new TaskVariables(); taskVariables.setTask(variableDeclarations.getTaskReference().getRef().getName()); taskVariables.setVariableValues(variableValues); + taskVariableList.add(taskVariables); } diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/test/TestController.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/test/TestController.java index 744767d1172c075f33b2d66f11d3aea4034b0e3c..95c2c8fe2177b6d096bd74de4e51fd6b2ceadd6b 100644 --- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/test/TestController.java +++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/test/TestController.java @@ -12,6 +12,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.BPMNServiceWithMocks; import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.BPMNTestcase; +import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.VariableValue; import de.fhmuenster.masterthesis.Testgenerator.rest.dto.BPMNTestcaseDTO; import de.fhmuenster.masterthesis.Testgenerator.rest.dto.ExternalTopicWithMockDTO; import de.fhmuenster.masterthesis.Testgenerator.rest.dto.FlowElementEnhancedDTO; @@ -28,6 +29,10 @@ import de.fhmuenster.masterthesis.serialization.VariableProposal; import de.fhmuenster.masterthesis.testgeneratorDSL.Flow; import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElement; import de.fhmuenster.masterthesis.testgeneratorDSL.Loop; +import de.fhmuenster.masterthesis.testgeneratorDSL.StartFlowElement; +import de.fhmuenster.masterthesis.testgeneratorDSL.UserTaskFlowElement; +import de.fhmuenster.masterthesis.testgeneratorDSL.ValidationState; +import de.fhmuenster.masterthesis.testgeneratorDSL.VariableReference; @RestController @EnableWebMvc @@ -122,6 +127,45 @@ public class TestController { Flow flow = flowService.getFlow(projectForId.getProjectDirectories(), flowId); List<FlowElement> userInputTasks = testService.getUserInputTasks(flow); List<FlowElementEnhancedDTO> userInputDtos = MAPPER.mapToList(userInputTasks, FlowElementEnhancedDTO.class); + + int index = 0; + for(FlowElement e : userInputTasks) { + if(e instanceof UserTaskFlowElement) { + UserTaskFlowElement ue = (UserTaskFlowElement) e; + int vrIndex = 0; + for(VariableReference vr : ue.getInputVariables()) { + VariableValue vv = userInputDtos.get(index).getInputVariables().get(vrIndex); + vv.setVariable(vr.getRef().getName()); + vv.setValue(null); + if(vr.getValidationStatus().equals(ValidationState.OPTIONAL)) { + vv.setRequired(false); + } + else { + vv.setRequired(true); + } + + vrIndex++; + } + } + if(e instanceof StartFlowElement) { + StartFlowElement se = (StartFlowElement) e; + int vrIndex = 0; + for(VariableReference vr : se.getInputVariables()) { + VariableValue vv = userInputDtos.get(index).getInputVariables().get(vrIndex); + vv.setVariable(vr.getRef().getName()); + vv.setValue(null); + if(vr.getValidationStatus().equals(ValidationState.OPTIONAL)) { + vv.setRequired(false); + } + else { + vv.setRequired(true); + } + vrIndex++; + } + } + index++; + } + List<VariableProposal<?>> variableProposals = testService .getVariableProposals(projectForId.getProjectDirectories()); diff --git a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/test/TestService.java b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/test/TestService.java index 04afa4108245ed50460b95202c9914d9af6c65e7..5ac5ff05d57ed57a94f4d47825886acb543d4cba 100644 --- a/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/test/TestService.java +++ b/Testgenerator/src/main/java/de/fhmuenster/masterthesis/Testgenerator/rest/service/test/TestService.java @@ -3,6 +3,7 @@ package de.fhmuenster.masterthesis.Testgenerator.rest.service.test; import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -33,6 +34,8 @@ import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.BPMNIOParameters; import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.BPMNNumericConstraint; import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.BPMNTestcase; import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.BPMNTestdata; +import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.TaskVariables; +import de.fhmuenster.masterthesis.Testgenerator.bpmn.data.VariableValue; import de.fhmuenster.masterthesis.Testgenerator.bpmn.processfragmentation.BPMNExpressionScanner; import de.fhmuenster.masterthesis.Testgenerator.bpmn.processfragmentation.BPMNFlowScanner; import de.fhmuenster.masterthesis.Testgenerator.bpmn.processfragmentation.BPMNVariableBoundaryScanner; @@ -66,10 +69,14 @@ import de.fhmuenster.masterthesis.testgeneratorDSL.Flow; import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElement; import de.fhmuenster.masterthesis.testgeneratorDSL.FlowElementReference; import de.fhmuenster.masterthesis.testgeneratorDSL.Mock; +import de.fhmuenster.masterthesis.testgeneratorDSL.StartFlowElement; import de.fhmuenster.masterthesis.testgeneratorDSL.Test; import de.fhmuenster.masterthesis.testgeneratorDSL.TestgeneratorDSLFactory; +import de.fhmuenster.masterthesis.testgeneratorDSL.UserTaskFlowElement; +import de.fhmuenster.masterthesis.testgeneratorDSL.ValidationState; import de.fhmuenster.masterthesis.testgeneratorDSL.Variable; import de.fhmuenster.masterthesis.testgeneratorDSL.VariableDeclaration; +import de.fhmuenster.masterthesis.testgeneratorDSL.VariableReference; import de.fhmuenster.masterthesis.utils.TestgeneratorDSLUtils; @Service @@ -325,6 +332,42 @@ public class TestService { Test test = getTest(testId, serializer); BPMNTestcase bpmnTestcase = TestConverter.getBPMNTestcase(test); + + for(TaskVariables t : bpmnTestcase.getTaskVariableList()) { + FlowElement e = serializer.getFlowElements(Arrays.asList(t.getTask())).get(0); + if(e instanceof UserTaskFlowElement) { + UserTaskFlowElement ue = (UserTaskFlowElement) e; + for(VariableReference vr : ue.getInputVariables()) { + for(VariableValue vv : t.getVariableValues()) { + if(vv.getVariable().equals(vr.getRef().getName())) { + if(vr.getValidationStatus().equals(ValidationState.REQUIRED)) { + vv.setRequired(true); + } + else { + vv.setRequired(false); + } + } + } + } + } + if(e instanceof StartFlowElement) { + StartFlowElement se = (StartFlowElement) e; + for(VariableReference vr : se.getInputVariables()) { + for(VariableValue vv : t.getVariableValues()) { + if(vv.getVariable().equals(vr.getRef().getName())) { + if(vr.getValidationStatus().equals(ValidationState.REQUIRED)) { + vv.setRequired(true); + } + else { + vv.setRequired(false); + } + } + } + } + } + } + + return bpmnTestcase; } catch (IOException e) { // @@ -382,7 +425,44 @@ public class TestService { formFields.getVariablesForTask(flowElement.getId())); int dependencies = startVariables.size(); - return TestgeneratorDSLObjectCreator.createStartFlowElement(flowElement.getId(), startVariables); + + HashMap<String, List<BPMNFieldConstraint>> allConstraintsForTask = formFields.getAllTaskSpecificConstraintsForTask(flowElement.getId()); + HashMap<String, List<Constraint>> newTaskSpecificConstraints = new HashMap<>(); + + /* + for(Variable v : startVariables) { + if(allConstraintsForTask.get(v.getName()) != null && !allConstraintsForTask.get(v.getName()).isEmpty()) { + //Constraints kopieren + List<Constraint> variableConstraints = new ArrayList<>(); + for(BPMNFieldConstraint c : allConstraintsForTask.get(v.getName())) { + Constraint newConstraint = TestgeneratorDSLFactory.eINSTANCE.createConstraint(); + if(c instanceof BPMNBooleanConstraint) { + BPMNBooleanConstraint bc = (BPMNBooleanConstraint) c; + newConstraint.setKey("required"); + if(bc.getRequired()) { + newConstraint.setValue(1); + } + else { + newConstraint.setValue(0); + } + variableConstraints.add(newConstraint); + } + } + + newTaskSpecificConstraints.put(v.getName(), variableConstraints); + } + else { + List<Constraint> variableConstraints = new ArrayList<>(); + Constraint newConstraint = TestgeneratorDSLFactory.eINSTANCE.createConstraint(); + newConstraint.setKey("required"); + newConstraint.setValue(0); + variableConstraints.add(newConstraint); + newTaskSpecificConstraints.put(v.getName(), variableConstraints); + } + } + */ + + return TestgeneratorDSLObjectCreator.createStartFlowElement(flowElement.getId(), startVariables, newTaskSpecificConstraints); } else if (flowElement instanceof EndEvent) { return TestgeneratorDSLObjectCreator.createEndFlowElement(flowElement.getId()); } else if (flowElement instanceof Gateway) { @@ -393,7 +473,6 @@ public class TestService { int dependencies = inputVariables.size() + outputVariables.size(); HashMap<String, List<BPMNFieldConstraint>> allConstraintsForTask = formFields.getAllTaskSpecificConstraintsForTask(flowElement.getId()); - HashMap<String, List<Constraint>> newTaskSpecificConstraints = new HashMap<>(); for(Variable v : inputVariables) { diff --git a/testgenerator-web/testgenerator-web/src/app/components/new-external-mock/new-external-mock.component.ts b/testgenerator-web/testgenerator-web/src/app/components/new-external-mock/new-external-mock.component.ts index e0842709e48d579f91da06b8ca8b07ff38079def..7f86a107bb1a3b3544281fd953912f03a5a6a660 100644 --- a/testgenerator-web/testgenerator-web/src/app/components/new-external-mock/new-external-mock.component.ts +++ b/testgenerator-web/testgenerator-web/src/app/components/new-external-mock/new-external-mock.component.ts @@ -250,7 +250,8 @@ export class NewExternalMockComponent implements OnInit { addVariableValueToValue(mockRuleIndex: number) { let variableValue = { variable: "", - value: "" + value: "", + required: false } this.mock.mockRules[mockRuleIndex].variables.push(variableValue); diff --git a/testgenerator-web/testgenerator-web/src/app/components/test/test.component.html b/testgenerator-web/testgenerator-web/src/app/components/test/test.component.html index 836b6800859f04cf6202025c7063f700ba2f92ef..10cd0ac9b472393f6e85a925c1dae14151268d95 100644 --- a/testgenerator-web/testgenerator-web/src/app/components/test/test.component.html +++ b/testgenerator-web/testgenerator-web/src/app/components/test/test.component.html @@ -59,10 +59,13 @@ <!--String and Integer Fields--> <div class="md-form form-group" *ngIf="(dataTypes.get(variableValue.variable) == 'java.lang.Integer') || dataTypes.get(variableValue.variable) == 'java.lang.String'"> <input mdbInput mdbValidate type="number" class="form-control" id="{{variableValue.variable}}-{{i}}-{{v}}" - formControlName="{{variableValue.variable}}" *ngIf="dataTypes.get(variableValue.variable) == 'java.lang.Integer'"> + formControlName="{{variableValue.variable}}" *ngIf="dataTypes.get(variableValue.variable) == 'java.lang.Integer'" + [required]="variableValue.required"> <input mdbInput mdbValidate type="text" class="form-control" id="{{variableValue.variable}}-{{i}}-{{v}}" - formControlName="{{variableValue.variable}}" *ngIf="dataTypes.get(variableValue.variable) == 'java.lang.String'"> - <label for="{{variableValue.variable}}-{{i}}-{{v}}">{{variableValue.variable}}</label> + formControlName="{{variableValue.variable}}" *ngIf="dataTypes.get(variableValue.variable) == 'java.lang.String'" + [required]="variableValue.required"> + <label *ngIf="variableValue.required" class="text-danger" for="{{variableValue.variable}}-{{i}}-{{v}}">{{variableValue.variable}}</label> + <label *ngIf="!variableValue.required" for="{{variableValue.variable}}-{{i}}-{{v}}">{{variableValue.variable}}</label> <p *ngIf="getVariableProposals(variableValue.variable).proposals.length > 0" i18n="proposals">Proposals : [{{getVariableProposals(variableValue.variable) | variableProposals}}]</p> <p *ngIf="getVariableProposals(variableValue.variable).proposals.length == 0" i18n="no proposals">No proposals</p> </div> @@ -148,7 +151,7 @@ <div class="testgen-actionbar testgen-actionbar-right"> <button type="button" class="btn btn-light" [routerLink]="['../']" *ngIf="!isEdit" i18n="cancel">>Cancel</button> <button type="button" class="btn btn-light" [routerLink]="['../../']" *ngIf="isEdit" i18n="cancel">Cancel</button> - <button type="button" class="btn btn-success" (click)="save()" i18n="save testcase">Save testcase</button> + <button type="button" class="btn btn-success" (click)="save()" i18n="save testcase" [disabled]="formGroup.invalid">Save testcase</button> </div> </div> </div> diff --git a/testgenerator-web/testgenerator-web/src/app/components/test/test.component.ts b/testgenerator-web/testgenerator-web/src/app/components/test/test.component.ts index 788d2a3f23f1b4e78e2ab7c7c9d7700a56e27d04..ec50ed81bed29ff26852a43487f3b03acf30b6c4 100644 --- a/testgenerator-web/testgenerator-web/src/app/components/test/test.component.ts +++ b/testgenerator-web/testgenerator-web/src/app/components/test/test.component.ts @@ -104,12 +104,12 @@ export class TestComponent implements OnInit { let valueObj = {}; let variableList = []; for (let variables of userInputs.inputVariables) { - inputProposals.push(this.getVariableProposals(variables)); - let countVariableFrequency = this.countVariable(variables, taskVariableValueList); - let value = this.getVariableValueOrDefault(userInputs.name, variables, countVariableFrequency); - valueObj[variables] = value; + inputProposals.push(this.getVariableProposals(variables.variable)); + let countVariableFrequency = this.countVariable(variables.variable, taskVariableValueList); + let value = this.getVariableValueOrDefault(userInputs.name, variables.variable, countVariableFrequency); + valueObj[variables.variable] = value; - let newVariable = this.createVariableValue(variables, value); + let newVariable = this.createVariableValue(variables.variable, value, variables.required); variableList.push(newVariable); } @@ -187,6 +187,8 @@ export class TestComponent implements OnInit { this.cleanUpServiceWithMocks(); this.initVariableDataTypes(); + + let result2 = await this.flowService.getFlow(this.actualProject, this.actualFlow); this.flow = result2; @@ -248,10 +250,11 @@ export class TestComponent implements OnInit { } } - createVariableValue(variable: string, value: Object): VariableValue { + createVariableValue(variable: string, value: Object, required: boolean): VariableValue { return { variable: variable, - value: value + value: value, + required: required } } @@ -508,8 +511,10 @@ export class TestComponent implements OnInit { private checkIfElementIsRed(task: string): boolean { for(let i=0; i < this.flow.flowElements.length; i++) { - if(this.flow.flowElements[i].flag === 'RED') { - return true; + if(this.flow.flowElements[i].id === task) { + if(this.flow.flowElements[i].flag === 'RED') { + return true; + } } } diff --git a/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow-enhanced-element.ts b/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow-enhanced-element.ts index 09a752d74dfbbbd6c440a6c469ba33d9a69a7fc1..c2457f7777b2a88e16a791103c0837a79a36a499 100644 --- a/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow-enhanced-element.ts +++ b/testgenerator-web/testgenerator-web/src/app/models/bpmn-flow-enhanced-element.ts @@ -1,4 +1,6 @@ +import { VariableValue } from "./variable-value"; + export interface FlowElementEnhanced { name: string; - inputVariables: Array<string>; + inputVariables: Array<VariableValue>; } \ No newline at end of file diff --git a/testgenerator-web/testgenerator-web/src/app/models/variable-value.ts b/testgenerator-web/testgenerator-web/src/app/models/variable-value.ts index 8afad63ba64696fdf321f293b6b1076a3ec36efe..cea82b9f140214f2f2b31079c25aaf6bd0464851 100644 --- a/testgenerator-web/testgenerator-web/src/app/models/variable-value.ts +++ b/testgenerator-web/testgenerator-web/src/app/models/variable-value.ts @@ -2,4 +2,5 @@ export interface VariableValue { variable: string; value: Object; + required: boolean; } \ No newline at end of file