From 37340f19b0f561c0d85f58834e8f716ba6234f10 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Thu, 17 Aug 2023 18:16:48 +0200 Subject: fix: opposite translation error reporting --- .../translator/metamodel/MetamodelBuilder.java | 6 +-- .../translator/metamodel/MetamodelBuilderTest.java | 57 ++++++++++++++++++++++ .../translator/metamodel/MetamodelTest.java | 29 ++++++----- 3 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilderTest.java (limited to 'subprojects/store-reasoning/src') diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java index 92370e25..d0732edc 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilder.java @@ -203,15 +203,15 @@ public class MetamodelBuilder { throw new IllegalArgumentException("Opposite %s of %s is not defined" .formatted(opposite, linkType)); } - if (!oppositeInfo.opposite().equals(linkType)) { + if (!linkType.equals(oppositeInfo.opposite())) { throw new IllegalArgumentException("Expected %s to have opposite %s, got %s instead" .formatted(opposite, linkType, oppositeInfo.opposite())); } - if (!oppositeInfo.sourceType().equals(targetType)) { + if (!targetType.equals(oppositeInfo.sourceType())) { throw new IllegalArgumentException("Expected %s to have source type %s, got %s instead" .formatted(opposite, targetType, oppositeInfo.sourceType())); } - if (!oppositeInfo.targetType().equals(sourceType)) { + if (!sourceType.equals(oppositeInfo.targetType())) { throw new IllegalArgumentException("Expected %s to have target type %s, got %s instead" .formatted(opposite, sourceType, oppositeInfo.targetType())); } diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilderTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilderTest.java new file mode 100644 index 00000000..115ba8cd --- /dev/null +++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelBuilderTest.java @@ -0,0 +1,57 @@ +/* + * SPDX-FileCopyrightText: 2023 The Refinery Authors + * + * SPDX-License-Identifier: EPL-2.0 + */ +package tools.refinery.store.reasoning.translator.metamodel; + +import org.junit.jupiter.api.Test; +import tools.refinery.store.reasoning.representation.PartialRelation; +import tools.refinery.store.reasoning.translator.multiplicity.ConstrainedMultiplicity; +import tools.refinery.store.representation.cardinality.CardinalityIntervals; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +class MetamodelBuilderTest { + private final PartialRelation university = new PartialRelation("University", 1); + private final PartialRelation course = new PartialRelation("Course", 1); + private final PartialRelation courses = new PartialRelation("courses", 2); + private final PartialRelation location = new PartialRelation("location", 2); + + @Test + void missingOppositeTest() { + var builder = Metamodel.builder() + .type(university) + .type(course) + .reference(courses, university, course, location) + .reference(location, course, university); + + assertThrows(IllegalArgumentException.class, builder::build); + } + + @Test + void invalidOppositeTypeTest() { + var builder = Metamodel.builder() + .type(university) + .type(course) + .reference(courses, university, course, location) + .reference(location, course, course, courses); + + assertThrows(IllegalArgumentException.class, builder::build); + } + + @Test + void invalidOppositeMultiplicityTest() { + var invalidMultiplicity = new PartialRelation("invalidMultiplicity", 1); + + var builder = Metamodel.builder() + .type(university) + .type(course) + .reference(courses, university, true, course, location) + .reference(location, course, + ConstrainedMultiplicity.of(CardinalityIntervals.atLeast(2), invalidMultiplicity), + university, courses); + + assertThrows(IllegalArgumentException.class, builder::build); + } +} diff --git a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java index 87e28e80..eabbdffe 100644 --- a/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java +++ b/subprojects/store-reasoning/src/test/java/tools/refinery/store/reasoning/translator/metamodel/MetamodelTest.java @@ -6,6 +6,7 @@ package tools.refinery.store.reasoning.translator.metamodel; import org.junit.jupiter.api.Test; +import tools.refinery.store.model.Model; import tools.refinery.store.model.ModelStore; import tools.refinery.store.query.viatra.ViatraModelQueryAdapter; import tools.refinery.store.reasoning.ReasoningAdapter; @@ -52,13 +53,6 @@ class MetamodelTest { ConstrainedMultiplicity.of(CardinalityIntervals.SOME, invalidStudentCount), student) .build(); - var store = ModelStore.builder() - .with(ViatraModelQueryAdapter.builder()) - .with(ReasoningAdapter.builder()) - .with(new MultiObjectTranslator()) - .with(new MetamodelTranslator(metamodel)) - .build(); - var seed = ModelSeed.builder(5) .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder .reducedValue(CardinalityIntervals.ONE) @@ -87,7 +81,7 @@ class MetamodelTest { .seed(enrolledStudents, builder -> builder.reducedValue(TruthValue.UNKNOWN)) .build(); - var model = store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(seed); + var model = createModel(metamodel, seed); var reasoningAdapter = model.getAdapter(ReasoningAdapter.class); var coursesInterpretation = reasoningAdapter.getPartialInterpretation(Concreteness.PARTIAL, courses); @@ -114,12 +108,6 @@ class MetamodelTest { .reference(courses, university, true, course) .build(); - var store = ModelStore.builder() - .with(ViatraModelQueryAdapter.builder()) - .with(ReasoningAdapter.builder()) - .with(new MultiObjectTranslator()) - .with(new MetamodelTranslator(metamodel)) - .build(); var seed = ModelSeed.builder(4) .seed(MultiObjectTranslator.COUNT_SYMBOL, builder -> builder @@ -141,7 +129,7 @@ class MetamodelTest { .put(Tuple.of(2, 3), TruthValue.TRUE)) .build(); - var model = store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(seed); + var model = createModel(metamodel, seed); var coursesInterpretation = model.getAdapter(ReasoningAdapter.class) .getPartialInterpretation(Concreteness.PARTIAL, courses); @@ -150,4 +138,15 @@ class MetamodelTest { assertThat(coursesInterpretation.get(Tuple.of(2, 1)), is(TruthValue.UNKNOWN)); assertThat(coursesInterpretation.get(Tuple.of(2, 3)), is(TruthValue.TRUE)); } + + private static Model createModel(Metamodel metamodel, ModelSeed seed) { + var store = ModelStore.builder() + .with(ViatraModelQueryAdapter.builder()) + .with(ReasoningAdapter.builder()) + .with(new MultiObjectTranslator()) + .with(new MetamodelTranslator(metamodel)) + .build(); + + return store.getAdapter(ReasoningStoreAdapter.class).createInitialModel(seed); + } } -- cgit v1.2.3-54-g00ecf