From 847deb7a4e419f77745e4233134e78c1b9241e40 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sat, 20 Dec 2025 17:26:51 -0500 Subject: [PATCH 1/4] ST6RI-901 Created Junit tests to check object and subobject constraints. - checkFeatureObjectSpecialization and checkFeatureSubobjectSpecialization for an OccurrenceUsage with a Structure type. - checkFeatureSubobjectSpecialization for a composite PortUsage explicitly typed by a PortDefinition. --- .../tests/SysMLSpecializationSpecialTest.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/semantics/tests/SysMLSpecializationSpecialTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/semantics/tests/SysMLSpecializationSpecialTest.java index 902200f35..840410790 100644 --- a/org.omg.sysml.interactive.tests/src/org/omg/sysml/semantics/tests/SysMLSpecializationSpecialTest.java +++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/semantics/tests/SysMLSpecializationSpecialTest.java @@ -30,6 +30,10 @@ import org.junit.Ignore; import org.junit.Test; import org.omg.sysml.lang.sysml.Element; +import org.omg.sysml.lang.sysml.ItemDefinition; +import org.omg.sysml.lang.sysml.OccurrenceUsage; +import org.omg.sysml.lang.sysml.PortDefinition; +import org.omg.sysml.lang.sysml.PortUsage; import org.omg.sysml.lang.sysml.StateUsage; import org.omg.sysml.lang.sysml.SysMLFactory; import org.omg.sysml.lang.sysml.SysMLPackage; @@ -37,6 +41,7 @@ import org.omg.sysml.lang.sysml.Type; import org.omg.sysml.lang.sysml.util.SysMLLibraryUtil; import org.omg.sysml.util.ElementUtil; +import org.omg.sysml.util.FeatureUtil; import org.omg.sysml.util.NamespaceUtil; import org.omg.sysml.util.TypeUtil; @@ -91,6 +96,93 @@ public void checkTransitionUsageStateSpecialization_StateUsage() { checkTransitionUsageStateSpecialization("StateUsage"); } + @Test + public void checkFeatureObjectSpecialization_OccurrenceUsage() { + //create and add root package + org.omg.sysml.lang.sysml.Package root = SysMLFactory.eINSTANCE.createPackage(); + getResource().getContents().add(root); + + //check if library element exists + Element libraryElement = SysMLLibraryUtil.getLibraryElement(root, "Objects::objects"); + assertTrue(libraryElement instanceof Type); + + //create owning package + org.omg.sysml.lang.sysml.Package owner = SysMLFactory.eINSTANCE.createPackage(); + NamespaceUtil.addOwnedMemberTo(root, owner); + + //create occurrence usage + OccurrenceUsage occurrence = SysMLFactory.eINSTANCE.createOccurrenceUsage(); + occurrence.setIsReference(false); + NamespaceUtil.addOwnedMemberTo(owner, occurrence); + + //create structure type + ItemDefinition type = SysMLFactory.eINSTANCE.createItemDefinition(); + FeatureUtil.addFeatureTypingTo(occurrence).setType(type); + + //run transformation, add implicit elements + ElementUtil.transformAll(root, true); + + assertTrue(String.format("OccurrenceUsage specializes subobjects instead of %s", getSpecifics(occurrence)), occurrence.specializes((Type)libraryElement)); + } + + @Test + public void checkFeatureSubobjectSpecialization_OccurrenceUsage() { + //create and add root package + org.omg.sysml.lang.sysml.Package root = SysMLFactory.eINSTANCE.createPackage(); + getResource().getContents().add(root); + + //check if library element exists + Element libraryElement = SysMLLibraryUtil.getLibraryElement(root, "Objects::Object::subobjects"); + assertTrue(libraryElement instanceof Type); + + //create owning type + Type owner = (Type) SysMLFactory.eINSTANCE.createItemDefinition(); + NamespaceUtil.addOwnedMemberTo(root, owner); + + //create occurrence usage + OccurrenceUsage occurrence = SysMLFactory.eINSTANCE.createOccurrenceUsage(); + occurrence.setIsReference(false); + TypeUtil.addOwnedFeatureTo(owner, occurrence); + + //create structure type + ItemDefinition type = SysMLFactory.eINSTANCE.createItemDefinition(); + FeatureUtil.addFeatureTypingTo(occurrence).setType(type); + + //run transformation, add implicit elements + ElementUtil.transformAll(root, true); + + assertTrue(String.format("OccurrenceUsage specializes subobjects instead of %s", getSpecifics(occurrence)), occurrence.specializes((Type)libraryElement)); + } + + @Test + public void checkFeatureSubobjectSpecialization_PortUsage() { + //create and add root package + org.omg.sysml.lang.sysml.Package root = SysMLFactory.eINSTANCE.createPackage(); + getResource().getContents().add(root); + + //check if library element exists + Element libraryElement = SysMLLibraryUtil.getLibraryElement(root, "Objects::Object::subobjects"); + assertTrue(libraryElement instanceof Type); + + //create owning type + Type owner = (Type) SysMLFactory.eINSTANCE.createPortDefinition(); + NamespaceUtil.addOwnedMemberTo(root, owner); + + //create occurrence usage + PortUsage occurrence = SysMLFactory.eINSTANCE.createPortUsage(); + occurrence.setIsReference(false); + TypeUtil.addOwnedFeatureTo(owner, occurrence); + + //create structure type + PortDefinition type = SysMLFactory.eINSTANCE.createPortDefinition(); + FeatureUtil.addFeatureTypingTo(occurrence).setType(type); + + //run transformation, add implicit elements + ElementUtil.transformAll(root, true); + + assertTrue(String.format("OccurrenceUsage specializes subobjects instead of %s", getSpecifics(occurrence)), occurrence.specializes((Type)libraryElement)); + } + @Test @Ignore("TBD") public void checkUsageVariationUsageSpecialization() { From ca5ef01a7ab4b8b065383ecbf941d9762e26318a Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sat, 20 Dec 2025 17:28:23 -0500 Subject: [PATCH 2/4] ST6RI-901 Updated implicit specialization for OccurrenceUsage/PortUsage. So checkFeatureObjectSpecialization and checkFeatureSubobjectSpecialization are properly satisfied when they apply. --- .../org/omg/sysml/adapter/OccurrenceUsageAdapter.java | 11 ++++++++++- .../src/org/omg/sysml/adapter/PortUsageAdapter.java | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/org.omg.sysml/src/org/omg/sysml/adapter/OccurrenceUsageAdapter.java b/org.omg.sysml/src/org/omg/sysml/adapter/OccurrenceUsageAdapter.java index 01912ba44..28c4eca70 100644 --- a/org.omg.sysml/src/org/omg/sysml/adapter/OccurrenceUsageAdapter.java +++ b/org.omg.sysml/src/org/omg/sysml/adapter/OccurrenceUsageAdapter.java @@ -50,6 +50,9 @@ public void postProcess() { // Implicit Generalization /** + * @satisfies checkFeatureObjectSpecialization + * @satisfies checkFeatureSubobjectSpecialization + * @satisfies checkFeatureDataValueSpecialization * @satisfies checkOccurrenceUsageSnapshotSpecialization * @satisfies checkOccurrenceUsageSuboccurrenceSpecialization * @satisfies checkOccurrenceUsageTimeSliceSpecialization @@ -57,7 +60,13 @@ public void postProcess() { @Override public void addDefaultGeneralType() { super.addDefaultGeneralType(); - if (isSuboccurrence()) { + if (hasDataType()) { + addDefaultGeneralType("dataValue"); + } + if (hasStructureType()) { + addDefaultGeneralType(isSubobject()? "subobject": "object"); + } + else if (isSuboccurrence()) { addDefaultGeneralType("suboccurrence"); } PortionKind portionKind = getTarget().getPortionKind(); diff --git a/org.omg.sysml/src/org/omg/sysml/adapter/PortUsageAdapter.java b/org.omg.sysml/src/org/omg/sysml/adapter/PortUsageAdapter.java index 53dcdb61e..cdbd9b1ab 100644 --- a/org.omg.sysml/src/org/omg/sysml/adapter/PortUsageAdapter.java +++ b/org.omg.sysml/src/org/omg/sysml/adapter/PortUsageAdapter.java @@ -39,6 +39,14 @@ public PortUsage getTarget() { // Implicit Generalization + @Override + public void addDefaultGeneralType() { + super.addDefaultGeneralType(); + if (isStructureOwnedComposite()) { + addDefaultGeneralType("subobject"); + } + } + /** * @satisfies checkPortUsageOwnedPortSpecialization * @satisfies checkPortUsageSubportSpecialization From ee9749d91300d4925821c5f7d4b07c7370fd9e68 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 21 Dec 2025 00:25:00 -0500 Subject: [PATCH 3/4] ST6RI-901 Corrected AnnotationTest and ViewRendering_valid Xpect tests. --- .../tests/simpletests/AnnotationTest.sysml.xt | 18 ++++++------------ .../invalid/ViewRendering_invalid.sysml.xt | 8 ++++++++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/AnnotationTest.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/AnnotationTest.sysml.xt index 822dc25a0..408a334d2 100644 --- a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/AnnotationTest.sysml.xt +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/AnnotationTest.sysml.xt @@ -5,14 +5,11 @@ XPECT_SETUP org.omg.sysml.xpect.tests.simpletests.SysMLTests File {from ="/library.kernel/Base.kerml"} File {from ="/library.kernel/Occurrences.kerml"} File {from ="/library.kernel/Objects.kerml"} + File {from ="/library.kernel/Metaobjects.kerml"} File {from ="/library.kernel/Performances.kerml"} - File {from ="/library.kernel/ControlPerformances.kerml"} - File {from ="/library.kernel/TransitionPerformances.kerml"} - File {from ="/library.kernel/Transfers.kerml"} File {from ="/library.kernel/ScalarValues.kerml"} File {from ="/library.systems/Items.sysml"} - File {from ="/library.systems/Parts.sysml"} - File {from ="/library.systems/Ports.sysml"} + File {from ="/library.systems/Metadata.sysml"} File {from ="/library.systems/Actions.sysml"} File {from ="/library.domain/Analysis/AnalysisTooling.sysml"} } @@ -23,14 +20,11 @@ XPECT_SETUP org.omg.sysml.xpect.tests.simpletests.SysMLTests File {from ="/library.kernel/Base.kerml"} File {from ="/library.kernel/Occurrences.kerml"} File {from ="/library.kernel/Objects.kerml"} + File {from ="/library.kernel/Metaobjects.kerml"} File {from ="/library.kernel/Performances.kerml"} - File {from ="/library.kernel/ControlPerformances.kerml"} - File {from ="/library.kernel/TransitionPerformances.kerml"} - File {from ="/library.kernel/Transfers.kerml"} File {from ="/library.kernel/ScalarValues.kerml"} File {from ="/library.systems/Items.sysml"} - File {from ="/library.systems/Parts.sysml"} - File {from ="/library.systems/Ports.sysml"} + File {from ="/library.systems/Metadata.sysml"} File {from ="/library.systems/Actions.sysml"} File {from ="/library.domain/Analysis/AnalysisTooling.sysml"} } @@ -52,8 +46,8 @@ package AnalysisAnnotation { in dt : Real { @ToolVariable { name = "deltaT"; } } in whlpwr : Real { @ToolVariable { name = "power"; } } in Cd : Real { @ToolVariable { name = "C_D"; } } - in Cf: Real { @ToolVariable { name = "C_F"; } } - in tm :Real { @ToolVariable { name = "mass"; } } + in Cf : Real { @ToolVariable { name = "C_F"; } } + in tm : Real { @ToolVariable { name = "mass"; } } in v_in : Real { @ToolVariable { name = "v0"; } } in x_in : Real { @ToolVariable { name = "x0"; } } diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ViewRendering_invalid.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ViewRendering_invalid.sysml.xt index f40a5d52f..5dfaa2654 100644 --- a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ViewRendering_invalid.sysml.xt +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/ViewRendering_invalid.sysml.xt @@ -7,8 +7,12 @@ XPECT_SETUP org.omg.sysml.xpect.tests.validation.invalid.SysMLTests File {from ="/library.kernel/Objects.kerml"} File {from ="/library.kernel/Occurrences.kerml"} File {from ="/library.kernel/Performances.kerml"} + File {from ="/library.systems/Items.sysml"} + File {from ="/library.systems/Parts.sysml"} File {from ="/library.systems/Constraints.sysml"} File {from ="/library.systems/Requirements.sysml"} + File {from ="/library.systems/Actions.sysml"} + File {from ="/library.systems/Calculations.sysml"} File {from ="/library.systems/Views.sysml"} } Workspace { @@ -20,8 +24,12 @@ XPECT_SETUP org.omg.sysml.xpect.tests.validation.invalid.SysMLTests File {from ="/library.kernel/Objects.kerml"} File {from ="/library.kernel/Occurrences.kerml"} File {from ="/library.kernel/Performances.kerml"} + File {from ="/library.systems/Items.sysml"} + File {from ="/library.systems/Parts.sysml"} File {from ="/library.systems/Constraints.sysml"} File {from ="/library.systems/Requirements.sysml"} + File {from ="/library.systems/Actions.sysml"} + File {from ="/library.systems/Calculations.sysml"} File {from ="/library.systems/Views.sysml"} } } From 78e91043c852549995a0fb240d64ce631d1a1d68 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 21 Dec 2025 00:44:15 -0500 Subject: [PATCH 4/4] ST6RI-901 Adjusted handling of subobject specialization in ItemAdapter. --- .../src/org/omg/sysml/adapter/ItemUsageAdapter.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/org.omg.sysml/src/org/omg/sysml/adapter/ItemUsageAdapter.java b/org.omg.sysml/src/org/omg/sysml/adapter/ItemUsageAdapter.java index 58f4e5b51..778b01220 100644 --- a/org.omg.sysml/src/org/omg/sysml/adapter/ItemUsageAdapter.java +++ b/org.omg.sysml/src/org/omg/sysml/adapter/ItemUsageAdapter.java @@ -55,6 +55,11 @@ protected boolean isSuboccurrence() { return super.isSuboccurrence() && !isSubitem(); } + @Override + protected boolean isSubobject() { + return super.isSubobject() && !isSubitem(); + } + public boolean isSubitem() { ItemUsage target = getTarget(); Type owningType = target.getOwningType();