diff --git a/next-release-problem/mdeo/nrp/src/main/java/models/nrp/fitness/MaximiseSatisfaction.xtend b/next-release-problem/mdeo/nrp/src/main/java/models/nrp/fitness/MaximiseSatisfaction.xtend index e69c98c..a4552ae 100644 --- a/next-release-problem/mdeo/nrp/src/main/java/models/nrp/fitness/MaximiseSatisfaction.xtend +++ b/next-release-problem/mdeo/nrp/src/main/java/models/nrp/fitness/MaximiseSatisfaction.xtend @@ -47,7 +47,7 @@ class MaximiseSatisfaction implements IGuidanceFunction { println("Found satisfaction: " + satisfaction) - return -1 * satisfaction; + return -1d * satisfaction; } /** @@ -121,13 +121,12 @@ class MaximiseSatisfaction implements IGuidanceFunction { * realisation directly or indirectly depends on are selected in the solution. */ def isImplemented(EObject realisation) { - realisation.getReferenceFeature('dependsOn').forall[sa | sa.isSelected - && sa.getReferenceFeature('requires').forall[reqSa| reqSa.isSelected] - ] + realisation.getReferenceFeature('dependsOn').forall[sa | sa.isSelectedWithRequirements] } - def isSelected(EObject softwareArtifact) { - softwareArtifact.getReferenceFeature('solutions').head !== null + def boolean isSelectedWithRequirements(EObject softwareArtifact) { + (softwareArtifact.getReferenceFeature('solutions').head !== null) + && softwareArtifact.getReferenceFeature('requires').forall[reqSa| reqSa.isSelectedWithRequirements] } def Object getFeature (EObject o, String feature) { diff --git a/next-release-problem/mdeo/nrp/src/test/java/models/nrp/fitness/MaximiseSatisfactionTest.java b/next-release-problem/mdeo/nrp/src/test/java/models/nrp/fitness/MaximiseSatisfactionTest.java index f58e3c7..25dd48d 100644 --- a/next-release-problem/mdeo/nrp/src/test/java/models/nrp/fitness/MaximiseSatisfactionTest.java +++ b/next-release-problem/mdeo/nrp/src/test/java/models/nrp/fitness/MaximiseSatisfactionTest.java @@ -12,6 +12,7 @@ import org.junit.jupiter.api.Test; import models.nrp.fitness.MaximiseSatisfaction; +import uk.ac.kcl.inf.mdeoptimiser.libraries.core.optimisation.interpreter.guidance.Solution; public class MaximiseSatisfactionTest { @@ -29,84 +30,91 @@ public class MaximiseSatisfactionTest { // System.out.println(); // } // }; -// -// @Test -// @DisplayName("Get all valuations of the dependencies of a requirement. ") -// public void testCollectingValuationsOfHierarchicalRequirement() { -// model = ModelLoadHelper.loadModel("simple-dependencies.xmi"); -// EObject customer = objective.getReferenceFeature(model, "customers").iterator().next(); -// EObject requirement = objective.getReferenceFeature(model, "requirements").iterator().next(); -// List expected = Arrays.asList(4.0, 1.0); -// -// List actual = new ArrayList(); -// for (EObject obj : objective.getDependencyValuations(requirement, customer)) { -// actual.add((Double)objective.getFeature(obj, "value")); -// } -// assertIterableEquals(expected, actual); -// -// } -// -// @Test -// @DisplayName("Fitness: Direct requirement has multiple valuations of the same customer. Only the highest should be considered") -// public void testFitnessOfMultiValuationsWithoutDependencies() { -// model = ModelLoadHelper.loadModel("direct-requirement-with-multiple-valuations-for-same-customer.xmi"); -// assertEquals(-0.9d, objective.computeFitness(model), DELTA); -// } -// -// @Test -// @DisplayName("Fitness: Requirement has a dependency with multiple valuations of the same customer. Only the highest should be considered.") -// public void testFitnessOfMultiValuationsWithDependencies() { -// model = ModelLoadHelper.loadModel("dependencies-with-multiple-valuations-for-same-customer.xmi"); -// assertEquals(-0.9d, objective.computeFitness(model), DELTA); -// } -// -// @Test -// @DisplayName("Fitness: Direct requirement has multiple partial realisations. Only the highest should be considered.") -// public void testMultipleRealisations() { -// model = ModelLoadHelper.loadModel("multiple-realisations.xmi"); -// assertEquals(-0.8d, objective.computeFitness(model), DELTA); -// } -// -// @Test -// @DisplayName("Fitness: Requirement has multiple dependencies with different valuations.") -// public void testSimpleDependencies() { -// model = ModelLoadHelper.loadModel("simple-dependencies.xmi"); -// assertEquals(-0.9d, objective.computeFitness(model), DELTA); -// } -// -// @Test -// @DisplayName("Fitness: No artifact is selected for the solution.") -// public void testEmptySolution() { -// model = ModelLoadHelper.loadModel("empty-solution.xmi"); -// assertEquals(0.0d, objective.computeFitness(model), DELTA); -// } -// -// @Test -// @DisplayName("Fitness: Artifact of single artifact realisation is not selected.") -// public void testSingleArtifactRealisationMissingArtifact() { -// model = ModelLoadHelper.loadModel("single-artifact-realisation-missing-artifact.xmi"); -// assertEquals(-0.4d, objective.computeFitness(model), DELTA); -// } -// -// @Test -// @DisplayName("Fitness: Artifact of multiple artifact realisation is not selected.") -// public void testMultipleArtifactRealisationMissingArtifact() { -// model = ModelLoadHelper.loadModel("multiple-artifact-realisation-missing-artifact.xmi"); -// assertEquals(-0.5d, objective.computeFitness(model), DELTA); -// } -// -// @Test -// @DisplayName("Fitness: Artifact in artifact hierarchy of realisation is not selected.") -// public void testRealisationMissingArtifactInArtifactHierarchy() { -// model = ModelLoadHelper.loadModel("realisation-missing-artifact-in-hierarchy.xmi"); -// assertEquals(0.0d, objective.computeFitness(model), DELTA); -// } -// -// @Test -// @DisplayName("Fitness: Multiple customers have different importance.") -// public void testMultipleCustomersWithDifferentImportance() { -// model = ModelLoadHelper.loadModel("multiple-customers-with-different-importance.xmi"); -// assertEquals(-5.0d, objective.computeFitness(model), DELTA); -// } + + @Test + @DisplayName("Get all valuations of the dependencies of a requirement. ") + public void testCollectingValuationsOfHierarchicalRequirement() { + model = ModelLoadHelper.loadModel("simple-dependencies.xmi"); + EObject customer = objective.getReferenceFeature(model, "customers").iterator().next(); + EObject requirement = objective.getReferenceFeature(model, "requirements").iterator().next(); + List expected = Arrays.asList(4.0, 1.0); + + List actual = new ArrayList(); + for (EObject obj : objective.getDependencyValuations(requirement, customer)) { + actual.add((Double)objective.getFeature(obj, "value")); + } + assertIterableEquals(expected, actual); + + } + + @Test + @DisplayName("Fitness: Direct requirement has multiple valuations of the same customer. Only the highest should be considered") + public void testFitnessOfMultiValuationsWithoutDependencies() { + model = ModelLoadHelper.loadModel("direct-requirement-with-multiple-valuations-for-same-customer.xmi"); + assertEquals(0.9d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: Requirement has a dependency with multiple valuations of the same customer. Only the highest should be considered.") + public void testFitnessOfMultiValuationsWithDependencies() { + model = ModelLoadHelper.loadModel("dependencies-with-multiple-valuations-for-same-customer.xmi"); + assertEquals(0.9d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: Direct requirement has multiple partial realisations. Only the highest should be considered.") + public void testMultipleRealisations() { + model = ModelLoadHelper.loadModel("multiple-realisations.xmi"); + assertEquals(0.8d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: Requirement has multiple dependencies with different valuations.") + public void testSimpleDependencies() { + model = ModelLoadHelper.loadModel("simple-dependencies.xmi"); + assertEquals(0.9d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: No artifact is selected for the solution.") + public void testEmptySolution() { + model = ModelLoadHelper.loadModel("empty-solution.xmi"); + assertEquals(0.0d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: Artifact of single artifact realisation is not selected.") + public void testSingleArtifactRealisationMissingArtifact() { + model = ModelLoadHelper.loadModel("single-artifact-realisation-missing-artifact.xmi"); + assertEquals(0.4d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: Artifact of multiple artifact realisation is not selected.") + public void testMultipleArtifactRealisationMissingArtifact() { + model = ModelLoadHelper.loadModel("multiple-artifact-realisation-missing-artifact.xmi"); + assertEquals(0.5d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: Artifact which is direct requirement of a needed artifact of realisation is not selected.") + public void testRealisationMissingDirectRequirementOfNeededArtifact() { + model = ModelLoadHelper.loadModel("realisation-missing-direct-requirement-of-needed-artifact.xmi"); + assertEquals(0.0d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: Artifact which is indirect requirement of a needed artifact of realisation is not selected.") + public void testRealisationMissingHierarchicalRequirementOfNeededArtifact() { + model = ModelLoadHelper.loadModel("realisation-missing-hierarchical-requirement-of-needed-artifact.xmi"); + assertEquals(0.0d, objective.computeFitness(new Solution(model)), DELTA); + } + + @Test + @DisplayName("Fitness: Multiple customers have different importance.") + public void testMultipleCustomersWithDifferentImportance() { + model = ModelLoadHelper.loadModel("multiple-customers-with-different-importance.xmi"); + assertEquals(5.0d, objective.computeFitness(new Solution(model)), DELTA); + } } diff --git a/next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-artifact-in-hierarchy.xmi b/next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-direct-requirement-of-needed-artifact.xmi similarity index 75% rename from next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-artifact-in-hierarchy.xmi rename to next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-direct-requirement-of-needed-artifact.xmi index a772183..0216d2b 100644 --- a/next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-artifact-in-hierarchy.xmi +++ b/next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-direct-requirement-of-needed-artifact.xmi @@ -17,6 +17,13 @@ + + + @@ -33,8 +40,8 @@ value="1.0" assignedBy="//@customers.0"/> + dependsOn="//@availableArtifacts.1 //@availableArtifacts.2"/> + selectedArtifacts="//@availableArtifacts.0 //@availableArtifacts.1"/> diff --git a/next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-hierarchical-requirement-of-needed-artifact.xmi b/next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-hierarchical-requirement-of-needed-artifact.xmi new file mode 100644 index 0000000..0216d2b --- /dev/null +++ b/next-release-problem/mdeo/nrp/src/test/resources/realisation-missing-hierarchical-requirement-of-needed-artifact.xmi @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + +