Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.compare.tests')
-rw-r--r--plugins/org.eclipse.emf.compare.tests/META-INF/MANIFEST.MF9
-rw-r--r--plugins/org.eclipse.emf.compare.tests/model/nodes.ecore4
-rw-r--r--plugins/org.eclipse.emf.compare.tests/model/nodes.genmodel14
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/Node.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeEnum.java6
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment2.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapNonContainment.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueEEnumAttribute.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueReference.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedAttribute.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedNonUniqueAttribute.java55
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultipleContainment.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefManyToMany.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToMany.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToOne.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueAttribute.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueContainment.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueEEnumAttribute.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueReference.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesFactory.java9
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesPackage.java107
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainment2Impl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainmentImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapNonContainmentImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueEEnumAttributeImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueReferenceImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedAttributeImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedNonUniqueAttributeImpl.java162
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultipleContainmentImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefManyToManyImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToManyImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToOneImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueAttributeImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueContainmentImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueEEnumAttributeImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueReferenceImpl.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesFactoryImpl.java11
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesPackageImpl.java33
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesAdapterFactory.java18
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesSwitch.java22
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/ComparisonUtilTest.java4
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/FeatureMapMoveDiffTest.java2
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/NonUniqueMultiValuedAttributeTest.java600
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/SingleValuedAttributePseudoConflictTest.java77
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/featuremapmove/FeatureMapMoveDiffInputData.java (renamed from plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/FeatureMapMoveDiffInputData.java)6
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/NonUniqueMultiValuedAttributeInputData.java55
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/left.nodes8
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/origin.nodes8
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/right.nodes8
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/left.nodes12
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/origin.nodes12
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/right.nodes12
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/left.nodes15
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/origin.nodes12
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/right.nodes12
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/SingleValuedAttributePseudoConflictInputData.java31
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/left.nodes4
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/origin.nodes4
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/right.nodes4
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/DanglingReferenceAfterMergeTest.java164
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/IndividualDiffInputData.java12
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/left.nodes9
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/origin.nodes9
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/right.nodes9
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java5
-rw-r--r--plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/utils/EMFCompareTestsUtils.java58
68 files changed, 1610 insertions, 52 deletions
diff --git a/plugins/org.eclipse.emf.compare.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare.tests/META-INF/MANIFEST.MF
index cb70d9fb6..10ec57e89 100644
--- a/plugins/org.eclipse.emf.compare.tests/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.compare.tests/META-INF/MANIFEST.MF
@@ -54,8 +54,9 @@ Export-Package: org.eclipse.emf.compare.tests,
org.eclipse.emf.compare.tests.req.data,
org.eclipse.emf.compare.tests.scope,
org.eclipse.emf.compare.tests.suite,
- org.eclipse.emf.compare.tests.unit
-Import-Package: com.google.common.base;version="[15.0.0,22.0.0)",
- com.google.common.cache;version="[15.0.0,22.0.0)",
- com.google.common.collect;version="[15.0.0,22.0.0)"
+ org.eclipse.emf.compare.tests.unit,
+ org.eclipse.emf.compare.tests.utils
+Import-Package: com.google.common.base;version="[27.0.0,30.2.0)",
+ com.google.common.cache;version="[27.0.0,30.2.0)",
+ com.google.common.collect;version="[27.0.0,30.2.0)"
Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.emf.compare.tests/model/nodes.ecore b/plugins/org.eclipse.emf.compare.tests/model/nodes.ecore
index d85c30e7a..64d4796d6 100644
--- a/plugins/org.eclipse.emf.compare.tests/model/nodes.ecore
+++ b/plugins/org.eclipse.emf.compare.tests/model/nodes.ecore
@@ -26,6 +26,10 @@
<eStructuralFeatures xsi:type="ecore:EAttribute" name="multiValuedAttribute" upperBound="-1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
</eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="NodeMultiValuedNonUniqueAttribute" eSuperTypes="#//Node">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="multiValuedAttribute" unique="false"
+ upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="NodeSingleValueReference" eSuperTypes="#//Node">
<eStructuralFeatures xsi:type="ecore:EReference" name="singleValuedReference"
eType="#//Node"/>
diff --git a/plugins/org.eclipse.emf.compare.tests/model/nodes.genmodel b/plugins/org.eclipse.emf.compare.tests/model/nodes.genmodel
index fac0cb1e2..3fc6d78a3 100644
--- a/plugins/org.eclipse.emf.compare.tests/model/nodes.genmodel
+++ b/plugins/org.eclipse.emf.compare.tests/model/nodes.genmodel
@@ -8,6 +8,11 @@
<genPackages prefix="Nodes" basePackage="org.eclipse.emf.compare.tests" resource="XMI"
disposableProviderFactory="true" contentTypeIdentifier="org.eclipse.emf.compare.test.nodes.contenttype"
ecorePackage="nodes.ecore#/">
+ <genEnums typeSafeEnumCompatible="false" ecoreEnum="nodes.ecore#//NodeEnum">
+ <genEnumLiterals ecoreEnumLiteral="nodes.ecore#//NodeEnum/A"/>
+ <genEnumLiterals ecoreEnumLiteral="nodes.ecore#//NodeEnum/B"/>
+ <genEnumLiterals ecoreEnumLiteral="nodes.ecore#//NodeEnum/C"/>
+ </genEnums>
<genClasses ecoreClass="nodes.ecore#//Node">
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute nodes.ecore#//Node/name"/>
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference nodes.ecore#//Node/containmentRef1"/>
@@ -25,6 +30,9 @@
<genClasses ecoreClass="nodes.ecore#//NodeMultiValuedAttribute">
<genFeatures createChild="false" ecoreFeature="ecore:EAttribute nodes.ecore#//NodeMultiValuedAttribute/multiValuedAttribute"/>
</genClasses>
+ <genClasses ecoreClass="nodes.ecore#//NodeMultiValuedNonUniqueAttribute">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute nodes.ecore#//NodeMultiValuedNonUniqueAttribute/multiValuedAttribute"/>
+ </genClasses>
<genClasses ecoreClass="nodes.ecore#//NodeSingleValueReference">
<genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference nodes.ecore#//NodeSingleValueReference/singleValuedReference"/>
</genClasses>
@@ -58,5 +66,11 @@
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference nodes.ecore#//NodeFeatureMapContainment2/multiple"/>
<genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference nodes.ecore#//NodeFeatureMapContainment2/single"/>
</genClasses>
+ <genClasses ecoreClass="nodes.ecore#//NodeSingleValueEEnumAttribute">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute nodes.ecore#//NodeSingleValueEEnumAttribute/singlevalueEEnumAttribute"/>
+ </genClasses>
+ <genClasses ecoreClass="nodes.ecore#//NodeMultiValueEEnumAttribute">
+ <genFeatures createChild="false" ecoreFeature="ecore:EAttribute nodes.ecore#//NodeMultiValueEEnumAttribute/multiValueEEnumAttribute"/>
+ </genClasses>
</genPackages>
</genmodel:GenModel>
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/Node.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/Node.java
index 8b9626a4a..4de8697dd 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/Node.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/Node.java
@@ -20,11 +20,11 @@ import org.eclipse.emf.ecore.EObject;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.Node#getName <em>Name</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.Node#getContainmentRef1 <em>Containment Ref1</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNode()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeEnum.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeEnum.java
index 836029f92..d5d321330 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeEnum.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeEnum.java
@@ -133,6 +133,8 @@ public enum NodeEnum implements Enumerator {
* Returns the '<em><b>Node Enum</b></em>' literal with the specified literal value.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
+ * @param literal the literal.
+ * @return the matching enumerator or <code>null</code>.
* @generated
*/
public static NodeEnum get(String literal) {
@@ -149,6 +151,8 @@ public enum NodeEnum implements Enumerator {
* Returns the '<em><b>Node Enum</b></em>' literal with the specified name.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
+ * @param name the name.
+ * @return the matching enumerator or <code>null</code>.
* @generated
*/
public static NodeEnum getByName(String name) {
@@ -165,6 +169,8 @@ public enum NodeEnum implements Enumerator {
* Returns the '<em><b>Node Enum</b></em>' literal with the specified integer value.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
+ * @param value the integer value.
+ * @return the matching enumerator or <code>null</code>.
* @generated
*/
public static NodeEnum get(int value) {
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment.java
index 20e562133..799b1c4c7 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment.java
@@ -20,12 +20,12 @@ import org.eclipse.emf.ecore.util.FeatureMap;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapContainment#getMap <em>Map</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapContainment#getFirstKey <em>First Key</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapContainment#getSecondKey <em>Second Key</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeFeatureMapContainment()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment2.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment2.java
index 265237587..cb0b073f6 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment2.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapContainment2.java
@@ -19,12 +19,12 @@ import org.eclipse.emf.ecore.util.FeatureMap;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapContainment2#getMap2 <em>Map2</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapContainment2#getMultiple <em>Multiple</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapContainment2#getSingle <em>Single</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeFeatureMapContainment2()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapNonContainment.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapNonContainment.java
index 68d039507..e879c10f0 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapNonContainment.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeFeatureMapNonContainment.java
@@ -20,12 +20,12 @@ import org.eclipse.emf.ecore.util.FeatureMap;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapNonContainment#getMapNC <em>Map NC</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapNonContainment#getFirstKeyNC <em>First Key NC</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeFeatureMapNonContainment#getSecondKeyNC <em>Second Key NC</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeFeatureMapNonContainment()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueEEnumAttribute.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueEEnumAttribute.java
index 1b3993998..6523f67e1 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueEEnumAttribute.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueEEnumAttribute.java
@@ -19,10 +19,10 @@ import org.eclipse.emf.common.util.EList;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeMultiValueEEnumAttribute#getMultiValueEEnumAttribute <em>Multi Value EEnum Attribute</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeMultiValueEEnumAttribute()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueReference.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueReference.java
index 57d33c54e..35f409200 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueReference.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValueReference.java
@@ -19,10 +19,10 @@ import org.eclipse.emf.common.util.EList;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeMultiValueReference#getMultiValuedReference <em>Multi Valued Reference</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeMultiValueReference()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedAttribute.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedAttribute.java
index 4a7eec1a7..7d14d9f3c 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedAttribute.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedAttribute.java
@@ -19,10 +19,10 @@ import org.eclipse.emf.common.util.EList;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeMultiValuedAttribute#getMultiValuedAttribute <em>Multi Valued Attribute</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeMultiValuedAttribute()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedNonUniqueAttribute.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedNonUniqueAttribute.java
new file mode 100644
index 000000000..25c3c91fe
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultiValuedNonUniqueAttribute.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2011, 2012 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.tests.nodes;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Node Multi Valued Non Unique Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute#getMultiValuedAttribute <em>Multi Valued Attribute</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeMultiValuedNonUniqueAttribute()
+ * @model
+ * @generated
+ */
+public interface NodeMultiValuedNonUniqueAttribute extends Node {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String copyright = "Copyright (c) 2011, 2012 Obeo.\r\nAll rights reserved. This program and the accompanying materials\r\nare made available under the terms of the Eclipse Public License v1.0\r\nwhich accompanies this distribution, and is available at\r\nhttp://www.eclipse.org/legal/epl-v10.html\r\n\r\nContributors:\r\n Obeo - initial API and implementation"; //$NON-NLS-1$
+
+ /**
+ * Returns the value of the '<em><b>Multi Valued Attribute</b></em>' attribute list.
+ * The list contents are of type {@link java.lang.String}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Multi Valued Attribute</em>' attribute list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Multi Valued Attribute</em>' attribute list.
+ * @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeMultiValuedNonUniqueAttribute_MultiValuedAttribute()
+ * @model unique="false"
+ * @generated
+ */
+ EList<String> getMultiValuedAttribute();
+
+} // NodeMultiValuedNonUniqueAttribute
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultipleContainment.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultipleContainment.java
index 64526dd40..c66759e3c 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultipleContainment.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeMultipleContainment.java
@@ -19,11 +19,11 @@ import org.eclipse.emf.common.util.EList;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeMultipleContainment#getContainmentRef2 <em>Containment Ref2</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeMultipleContainment#getContainmentRef3 <em>Containment Ref3</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeMultipleContainment()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefManyToMany.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefManyToMany.java
index 836a13a92..2cf9120f7 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefManyToMany.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefManyToMany.java
@@ -19,11 +19,11 @@ import org.eclipse.emf.common.util.EList;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeOppositeRefManyToMany#getSource <em>Source</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeOppositeRefManyToMany#getDestination <em>Destination</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeOppositeRefManyToMany()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToMany.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToMany.java
index ce511a572..4b6d88861 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToMany.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToMany.java
@@ -19,11 +19,11 @@ import org.eclipse.emf.common.util.EList;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeOppositeRefOneToMany#getSource <em>Source</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeOppositeRefOneToMany#getDestination <em>Destination</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeOppositeRefOneToMany()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToOne.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToOne.java
index 4531296b1..49d09dac2 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToOne.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeOppositeRefOneToOne.java
@@ -18,11 +18,11 @@ package org.eclipse.emf.compare.tests.nodes;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeOppositeRefOneToOne#getSource <em>Source</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeOppositeRefOneToOne#getDestination <em>Destination</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeOppositeRefOneToOne()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueAttribute.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueAttribute.java
index 7a4942d02..178bf0b73 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueAttribute.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueAttribute.java
@@ -18,10 +18,10 @@ package org.eclipse.emf.compare.tests.nodes;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeSingleValueAttribute#getSingleValuedAttribute <em>Single Valued Attribute</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeSingleValueAttribute()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueContainment.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueContainment.java
index 11c04755e..20b44792c 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueContainment.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueContainment.java
@@ -18,10 +18,10 @@ package org.eclipse.emf.compare.tests.nodes;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeSingleValueContainment#getSingleValueContainment <em>Single Value Containment</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeSingleValueContainment()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueEEnumAttribute.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueEEnumAttribute.java
index 0fc9a5a69..cd69bf467 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueEEnumAttribute.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueEEnumAttribute.java
@@ -18,10 +18,10 @@ package org.eclipse.emf.compare.tests.nodes;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeSingleValueEEnumAttribute#getSinglevalueEEnumAttribute <em>Singlevalue EEnum Attribute</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeSingleValueEEnumAttribute()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueReference.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueReference.java
index 598afc863..07173a36b 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueReference.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodeSingleValueReference.java
@@ -18,10 +18,10 @@ package org.eclipse.emf.compare.tests.nodes;
*
* <p>
* The following features are supported:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.NodeSingleValueReference#getSingleValuedReference <em>Single Valued Reference</em>}</li>
* </ul>
- * </p>
*
* @see org.eclipse.emf.compare.tests.nodes.NodesPackage#getNodeSingleValueReference()
* @model
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesFactory.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesFactory.java
index 9827080d7..eb42023ff 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesFactory.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesFactory.java
@@ -82,6 +82,15 @@ public interface NodesFactory extends EFactory {
NodeMultiValuedAttribute createNodeMultiValuedAttribute();
/**
+ * Returns a new object of class '<em>Node Multi Valued Non Unique Attribute</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Node Multi Valued Non Unique Attribute</em>'.
+ * @generated
+ */
+ NodeMultiValuedNonUniqueAttribute createNodeMultiValuedNonUniqueAttribute();
+
+ /**
* Returns a new object of class '<em>Node Single Value Reference</em>'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesPackage.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesPackage.java
index f1237c98f..57e2cf759 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesPackage.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/NodesPackage.java
@@ -310,6 +310,52 @@ public interface NodesPackage extends EPackage {
int NODE_MULTI_VALUED_ATTRIBUTE_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
/**
+ * The meta object id for the '{@link org.eclipse.emf.compare.tests.nodes.impl.NodeMultiValuedNonUniqueAttributeImpl <em>Node Multi Valued Non Unique Attribute</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.compare.tests.nodes.impl.NodeMultiValuedNonUniqueAttributeImpl
+ * @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeMultiValuedNonUniqueAttribute()
+ * @generated
+ */
+ int NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE = 5;
+
+ /**
+ * The feature id for the '<em><b>Name</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__NAME = NODE__NAME;
+
+ /**
+ * The feature id for the '<em><b>Containment Ref1</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__CONTAINMENT_REF1 = NODE__CONTAINMENT_REF1;
+
+ /**
+ * The feature id for the '<em><b>Multi Valued Attribute</b></em>' attribute list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE = NODE_FEATURE_COUNT + 0;
+
+ /**
+ * The number of structural features of the '<em>Node Multi Valued Non Unique Attribute</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
+
+ /**
* The meta object id for the '{@link org.eclipse.emf.compare.tests.nodes.impl.NodeSingleValueReferenceImpl <em>Node Single Value Reference</em>}' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -317,7 +363,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeSingleValueReference()
* @generated
*/
- int NODE_SINGLE_VALUE_REFERENCE = 5;
+ int NODE_SINGLE_VALUE_REFERENCE = 6;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -363,7 +409,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeMultiValueReference()
* @generated
*/
- int NODE_MULTI_VALUE_REFERENCE = 6;
+ int NODE_MULTI_VALUE_REFERENCE = 7;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -409,7 +455,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeOppositeRefOneToOne()
* @generated
*/
- int NODE_OPPOSITE_REF_ONE_TO_ONE = 7;
+ int NODE_OPPOSITE_REF_ONE_TO_ONE = 8;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -464,7 +510,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeOppositeRefOneToMany()
* @generated
*/
- int NODE_OPPOSITE_REF_ONE_TO_MANY = 8;
+ int NODE_OPPOSITE_REF_ONE_TO_MANY = 9;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -519,7 +565,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeOppositeRefManyToMany()
* @generated
*/
- int NODE_OPPOSITE_REF_MANY_TO_MANY = 9;
+ int NODE_OPPOSITE_REF_MANY_TO_MANY = 10;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -574,7 +620,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeFeatureMapContainment()
* @generated
*/
- int NODE_FEATURE_MAP_CONTAINMENT = 10;
+ int NODE_FEATURE_MAP_CONTAINMENT = 11;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -638,7 +684,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeFeatureMapNonContainment()
* @generated
*/
- int NODE_FEATURE_MAP_NON_CONTAINMENT = 11;
+ int NODE_FEATURE_MAP_NON_CONTAINMENT = 12;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -702,7 +748,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeFeatureMapContainment2()
* @generated
*/
- int NODE_FEATURE_MAP_CONTAINMENT2 = 12;
+ int NODE_FEATURE_MAP_CONTAINMENT2 = 13;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -767,7 +813,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeSingleValueEEnumAttribute()
* @generated
*/
- int NODE_SINGLE_VALUE_EENUM_ATTRIBUTE = 13;
+ int NODE_SINGLE_VALUE_EENUM_ATTRIBUTE = 14;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -813,7 +859,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeMultiValueEEnumAttribute()
* @generated
*/
- int NODE_MULTI_VALUE_EENUM_ATTRIBUTE = 14;
+ int NODE_MULTI_VALUE_EENUM_ATTRIBUTE = 15;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -859,7 +905,7 @@ public interface NodesPackage extends EPackage {
* @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeEnum()
* @generated
*/
- int NODE_ENUM = 15;
+ int NODE_ENUM = 16;
/**
@@ -990,6 +1036,27 @@ public interface NodesPackage extends EPackage {
EAttribute getNodeMultiValuedAttribute_MultiValuedAttribute();
/**
+ * Returns the meta object for class '{@link org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute <em>Node Multi Valued Non Unique Attribute</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Node Multi Valued Non Unique Attribute</em>'.
+ * @see org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute
+ * @generated
+ */
+ EClass getNodeMultiValuedNonUniqueAttribute();
+
+ /**
+ * Returns the meta object for the attribute list '{@link org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute#getMultiValuedAttribute <em>Multi Valued Attribute</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute list '<em>Multi Valued Attribute</em>'.
+ * @see org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute#getMultiValuedAttribute()
+ * @see #getNodeMultiValuedNonUniqueAttribute()
+ * @generated
+ */
+ EAttribute getNodeMultiValuedNonUniqueAttribute_MultiValuedAttribute();
+
+ /**
* Returns the meta object for class '{@link org.eclipse.emf.compare.tests.nodes.NodeSingleValueReference <em>Node Single Value Reference</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1437,6 +1504,24 @@ public interface NodesPackage extends EPackage {
EAttribute NODE_MULTI_VALUED_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE = eINSTANCE.getNodeMultiValuedAttribute_MultiValuedAttribute();
/**
+ * The meta object literal for the '{@link org.eclipse.emf.compare.tests.nodes.impl.NodeMultiValuedNonUniqueAttributeImpl <em>Node Multi Valued Non Unique Attribute</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.emf.compare.tests.nodes.impl.NodeMultiValuedNonUniqueAttributeImpl
+ * @see org.eclipse.emf.compare.tests.nodes.impl.NodesPackageImpl#getNodeMultiValuedNonUniqueAttribute()
+ * @generated
+ */
+ EClass NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE = eINSTANCE.getNodeMultiValuedNonUniqueAttribute();
+
+ /**
+ * The meta object literal for the '<em><b>Multi Valued Attribute</b></em>' attribute list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE = eINSTANCE.getNodeMultiValuedNonUniqueAttribute_MultiValuedAttribute();
+
+ /**
* The meta object literal for the '{@link org.eclipse.emf.compare.tests.nodes.impl.NodeSingleValueReferenceImpl <em>Node Single Value Reference</em>}' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainment2Impl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainment2Impl.java
index d3e60c831..390692188 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainment2Impl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainment2Impl.java
@@ -29,12 +29,12 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <em><b>Node Feature Map Containment2</b></em>'. <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapContainment2Impl#getMap2 <em>Map2</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapContainment2Impl#getMultiple <em>Multiple</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapContainment2Impl#getSingle <em>Single</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainmentImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainmentImpl.java
index 2cc9138c5..2afbd09d0 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainmentImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapContainmentImpl.java
@@ -29,12 +29,12 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapContainmentImpl#getMap <em>Map</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapContainmentImpl#getFirstKey <em>First Key</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapContainmentImpl#getSecondKey <em>Second Key</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapNonContainmentImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapNonContainmentImpl.java
index 91f1ddf90..41b092a1e 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapNonContainmentImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeFeatureMapNonContainmentImpl.java
@@ -29,12 +29,12 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapNonContainmentImpl#getMapNC <em>Map NC</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapNonContainmentImpl#getFirstKeyNC <em>First Key NC</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeFeatureMapNonContainmentImpl#getSecondKeyNC <em>Second Key NC</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeImpl.java
index d89af6dfb..c33ddba56 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeImpl.java
@@ -30,11 +30,11 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeImpl#getName <em>Name</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeImpl#getContainmentRef1 <em>Containment Ref1</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueEEnumAttributeImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueEEnumAttributeImpl.java
index b0c247574..758bbe3a4 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueEEnumAttributeImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueEEnumAttributeImpl.java
@@ -28,10 +28,10 @@ import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeMultiValueEEnumAttributeImpl#getMultiValueEEnumAttribute <em>Multi Value EEnum Attribute</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueReferenceImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueReferenceImpl.java
index 1193f31f3..1e110c3d4 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueReferenceImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValueReferenceImpl.java
@@ -25,10 +25,10 @@ import org.eclipse.emf.ecore.util.EObjectResolvingEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeMultiValueReferenceImpl#getMultiValuedReference <em>Multi Valued Reference</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedAttributeImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedAttributeImpl.java
index cef4fa91b..f7e4db40a 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedAttributeImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedAttributeImpl.java
@@ -24,10 +24,10 @@ import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeMultiValuedAttributeImpl#getMultiValuedAttribute <em>Multi Valued Attribute</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedNonUniqueAttributeImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedNonUniqueAttributeImpl.java
new file mode 100644
index 000000000..474b74354
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultiValuedNonUniqueAttributeImpl.java
@@ -0,0 +1,162 @@
+/**
+ * Copyright (c) 2011, 2012 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ */
+package org.eclipse.emf.compare.tests.nodes.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute;
+import org.eclipse.emf.compare.tests.nodes.NodesPackage;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.util.EDataTypeEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Node Multi Valued Non Unique Attribute</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeMultiValuedNonUniqueAttributeImpl#getMultiValuedAttribute <em>Multi Valued Attribute</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class NodeMultiValuedNonUniqueAttributeImpl extends NodeImpl implements NodeMultiValuedNonUniqueAttribute {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public static final String copyright = "Copyright (c) 2011, 2012 Obeo.\r\nAll rights reserved. This program and the accompanying materials\r\nare made available under the terms of the Eclipse Public License v1.0\r\nwhich accompanies this distribution, and is available at\r\nhttp://www.eclipse.org/legal/epl-v10.html\r\n\r\nContributors:\r\n Obeo - initial API and implementation"; //$NON-NLS-1$
+
+ /**
+ * The cached value of the '{@link #getMultiValuedAttribute() <em>Multi Valued Attribute</em>}' attribute list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getMultiValuedAttribute()
+ * @generated
+ * @ordered
+ */
+ protected EList<String> multiValuedAttribute;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected NodeMultiValuedNonUniqueAttributeImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return NodesPackage.Literals.NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EList<String> getMultiValuedAttribute() {
+ if (multiValuedAttribute == null) {
+ multiValuedAttribute = new EDataTypeEList<String>(String.class, this, NodesPackage.NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE);
+ }
+ return multiValuedAttribute;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case NodesPackage.NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE:
+ return getMultiValuedAttribute();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void eSet(int featureID, Object newValue) {
+ switch (featureID) {
+ case NodesPackage.NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE:
+ getMultiValuedAttribute().clear();
+ getMultiValuedAttribute().addAll((Collection<? extends String>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case NodesPackage.NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE:
+ getMultiValuedAttribute().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case NodesPackage.NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE:
+ return multiValuedAttribute != null && !multiValuedAttribute.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String toString() {
+ if (eIsProxy()) return super.toString();
+
+ StringBuffer result = new StringBuffer(super.toString());
+ result.append(" (multiValuedAttribute: "); //$NON-NLS-1$
+ result.append(multiValuedAttribute);
+ result.append(')');
+ return result.toString();
+ }
+
+} //NodeMultiValuedNonUniqueAttributeImpl
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultipleContainmentImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultipleContainmentImpl.java
index 1f1c58834..ef72bfc82 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultipleContainmentImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeMultipleContainmentImpl.java
@@ -28,11 +28,11 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeMultipleContainmentImpl#getContainmentRef2 <em>Containment Ref2</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeMultipleContainmentImpl#getContainmentRef3 <em>Containment Ref3</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefManyToManyImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefManyToManyImpl.java
index 8069746ea..efa564fc2 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefManyToManyImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefManyToManyImpl.java
@@ -27,11 +27,11 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeOppositeRefManyToManyImpl#getSource <em>Source</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeOppositeRefManyToManyImpl#getDestination <em>Destination</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToManyImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToManyImpl.java
index a37ca2c14..e6de81557 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToManyImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToManyImpl.java
@@ -29,11 +29,11 @@ import org.eclipse.emf.ecore.util.InternalEList;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeOppositeRefOneToManyImpl#getSource <em>Source</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeOppositeRefOneToManyImpl#getDestination <em>Destination</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToOneImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToOneImpl.java
index 7f906e1a9..eada64e31 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToOneImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeOppositeRefOneToOneImpl.java
@@ -24,11 +24,11 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeOppositeRefOneToOneImpl#getSource <em>Source</em>}</li>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeOppositeRefOneToOneImpl#getDestination <em>Destination</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueAttributeImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueAttributeImpl.java
index 5deaeab50..d8a0fc10c 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueAttributeImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueAttributeImpl.java
@@ -22,10 +22,10 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeSingleValueAttributeImpl#getSingleValuedAttribute <em>Single Valued Attribute</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueContainmentImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueContainmentImpl.java
index a7d8ed3d8..fc194f15e 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueContainmentImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueContainmentImpl.java
@@ -25,10 +25,10 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeSingleValueContainmentImpl#getSingleValueContainment <em>Single Value Containment</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueEEnumAttributeImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueEEnumAttributeImpl.java
index 81a13749a..ab5226471 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueEEnumAttributeImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueEEnumAttributeImpl.java
@@ -26,10 +26,10 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeSingleValueEEnumAttributeImpl#getSinglevalueEEnumAttribute <em>Singlevalue EEnum Attribute</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueReferenceImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueReferenceImpl.java
index c282695cc..2bd13d01f 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueReferenceImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodeSingleValueReferenceImpl.java
@@ -24,10 +24,10 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
+ * </p>
* <ul>
* <li>{@link org.eclipse.emf.compare.tests.nodes.impl.NodeSingleValueReferenceImpl#getSingleValuedReference <em>Single Valued Reference</em>}</li>
* </ul>
- * </p>
*
* @generated
*/
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesFactoryImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesFactoryImpl.java
index f0d415e97..c59ce298e 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesFactoryImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesFactoryImpl.java
@@ -77,6 +77,7 @@ public class NodesFactoryImpl extends EFactoryImpl implements NodesFactory {
case NodesPackage.NODE_SINGLE_VALUE_CONTAINMENT: return createNodeSingleValueContainment();
case NodesPackage.NODE_SINGLE_VALUE_ATTRIBUTE: return createNodeSingleValueAttribute();
case NodesPackage.NODE_MULTI_VALUED_ATTRIBUTE: return createNodeMultiValuedAttribute();
+ case NodesPackage.NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE: return createNodeMultiValuedNonUniqueAttribute();
case NodesPackage.NODE_SINGLE_VALUE_REFERENCE: return createNodeSingleValueReference();
case NodesPackage.NODE_MULTI_VALUE_REFERENCE: return createNodeMultiValueReference();
case NodesPackage.NODE_OPPOSITE_REF_ONE_TO_ONE: return createNodeOppositeRefOneToOne();
@@ -177,6 +178,16 @@ public class NodesFactoryImpl extends EFactoryImpl implements NodesFactory {
* <!-- end-user-doc -->
* @generated
*/
+ public NodeMultiValuedNonUniqueAttribute createNodeMultiValuedNonUniqueAttribute() {
+ NodeMultiValuedNonUniqueAttributeImpl nodeMultiValuedNonUniqueAttribute = new NodeMultiValuedNonUniqueAttributeImpl();
+ return nodeMultiValuedNonUniqueAttribute;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
public NodeSingleValueReference createNodeSingleValueReference() {
NodeSingleValueReferenceImpl nodeSingleValueReference = new NodeSingleValueReferenceImpl();
return nodeSingleValueReference;
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesPackageImpl.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesPackageImpl.java
index a081f749e..48f3eaf92 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesPackageImpl.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/impl/NodesPackageImpl.java
@@ -18,6 +18,7 @@ import org.eclipse.emf.compare.tests.nodes.NodeFeatureMapNonContainment;
import org.eclipse.emf.compare.tests.nodes.NodeMultiValueEEnumAttribute;
import org.eclipse.emf.compare.tests.nodes.NodeMultiValueReference;
import org.eclipse.emf.compare.tests.nodes.NodeMultiValuedAttribute;
+import org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute;
import org.eclipse.emf.compare.tests.nodes.NodeMultipleContainment;
import org.eclipse.emf.compare.tests.nodes.NodeOppositeRefManyToMany;
import org.eclipse.emf.compare.tests.nodes.NodeOppositeRefOneToMany;
@@ -91,6 +92,13 @@ public class NodesPackageImpl extends EPackageImpl implements NodesPackage {
* <!-- end-user-doc -->
* @generated
*/
+ private EClass nodeMultiValuedNonUniqueAttributeEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
private EClass nodeSingleValueReferenceEClass = null;
/**
@@ -337,6 +345,24 @@ public class NodesPackageImpl extends EPackageImpl implements NodesPackage {
* <!-- end-user-doc -->
* @generated
*/
+ public EClass getNodeMultiValuedNonUniqueAttribute() {
+ return nodeMultiValuedNonUniqueAttributeEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public EAttribute getNodeMultiValuedNonUniqueAttribute_MultiValuedAttribute() {
+ return (EAttribute)nodeMultiValuedNonUniqueAttributeEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
public EClass getNodeSingleValueReference() {
return nodeSingleValueReferenceEClass;
}
@@ -647,6 +673,9 @@ public class NodesPackageImpl extends EPackageImpl implements NodesPackage {
nodeMultiValuedAttributeEClass = createEClass(NODE_MULTI_VALUED_ATTRIBUTE);
createEAttribute(nodeMultiValuedAttributeEClass, NODE_MULTI_VALUED_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE);
+ nodeMultiValuedNonUniqueAttributeEClass = createEClass(NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE);
+ createEAttribute(nodeMultiValuedNonUniqueAttributeEClass, NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE__MULTI_VALUED_ATTRIBUTE);
+
nodeSingleValueReferenceEClass = createEClass(NODE_SINGLE_VALUE_REFERENCE);
createEReference(nodeSingleValueReferenceEClass, NODE_SINGLE_VALUE_REFERENCE__SINGLE_VALUED_REFERENCE);
@@ -722,6 +751,7 @@ public class NodesPackageImpl extends EPackageImpl implements NodesPackage {
nodeSingleValueContainmentEClass.getESuperTypes().add(this.getNode());
nodeSingleValueAttributeEClass.getESuperTypes().add(this.getNode());
nodeMultiValuedAttributeEClass.getESuperTypes().add(this.getNode());
+ nodeMultiValuedNonUniqueAttributeEClass.getESuperTypes().add(this.getNode());
nodeSingleValueReferenceEClass.getESuperTypes().add(this.getNode());
nodeMultiValueReferenceEClass.getESuperTypes().add(this.getNode());
nodeOppositeRefOneToOneEClass.getESuperTypes().add(this.getNode());
@@ -751,6 +781,9 @@ public class NodesPackageImpl extends EPackageImpl implements NodesPackage {
initEClass(nodeMultiValuedAttributeEClass, NodeMultiValuedAttribute.class, "NodeMultiValuedAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
initEAttribute(getNodeMultiValuedAttribute_MultiValuedAttribute(), ecorePackage.getEString(), "multiValuedAttribute", null, 0, -1, NodeMultiValuedAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+ initEClass(nodeMultiValuedNonUniqueAttributeEClass, NodeMultiValuedNonUniqueAttribute.class, "NodeMultiValuedNonUniqueAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+ initEAttribute(getNodeMultiValuedNonUniqueAttribute_MultiValuedAttribute(), ecorePackage.getEString(), "multiValuedAttribute", null, 0, -1, NodeMultiValuedNonUniqueAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+
initEClass(nodeSingleValueReferenceEClass, NodeSingleValueReference.class, "NodeSingleValueReference", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
initEReference(getNodeSingleValueReference_SingleValuedReference(), this.getNode(), null, "singleValuedReference", null, 0, 1, NodeSingleValueReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesAdapterFactory.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesAdapterFactory.java
index 7f5d97b14..612e266a7 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesAdapterFactory.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesAdapterFactory.java
@@ -103,6 +103,10 @@ public class NodesAdapterFactory extends AdapterFactoryImpl {
return createNodeMultiValuedAttributeAdapter();
}
@Override
+ public Adapter caseNodeMultiValuedNonUniqueAttribute(NodeMultiValuedNonUniqueAttribute object) {
+ return createNodeMultiValuedNonUniqueAttributeAdapter();
+ }
+ @Override
public Adapter caseNodeSingleValueReference(NodeSingleValueReference object) {
return createNodeSingleValueReferenceAdapter();
}
@@ -233,6 +237,20 @@ public class NodesAdapterFactory extends AdapterFactoryImpl {
}
/**
+ * Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute <em>Node Multi Valued Non Unique Attribute</em>}'.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ * <!-- end-user-doc -->
+ * @return the new adapter.
+ * @see org.eclipse.emf.compare.tests.nodes.NodeMultiValuedNonUniqueAttribute
+ * @generated
+ */
+ public Adapter createNodeMultiValuedNonUniqueAttributeAdapter() {
+ return null;
+ }
+
+ /**
* Creates a new adapter for an object of class '{@link org.eclipse.emf.compare.tests.nodes.NodeSingleValueReference <em>Node Single Value Reference</em>}'.
* <!-- begin-user-doc -->
* This default implementation returns null so that we can easily ignore cases;
diff --git a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesSwitch.java b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesSwitch.java
index 183d91976..6b8ea51f4 100644
--- a/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesSwitch.java
+++ b/plugins/org.eclipse.emf.compare.tests/src-gen/org/eclipse/emf/compare/tests/nodes/util/NodesSwitch.java
@@ -132,6 +132,13 @@ public class NodesSwitch<T> {
if (result == null) result = defaultCase(theEObject);
return result;
}
+ case NodesPackage.NODE_MULTI_VALUED_NON_UNIQUE_ATTRIBUTE: {
+ NodeMultiValuedNonUniqueAttribute nodeMultiValuedNonUniqueAttribute = (NodeMultiValuedNonUniqueAttribute)theEObject;
+ T result = caseNodeMultiValuedNonUniqueAttribute(nodeMultiValuedNonUniqueAttribute);
+ if (result == null) result = caseNode(nodeMultiValuedNonUniqueAttribute);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
case NodesPackage.NODE_SINGLE_VALUE_REFERENCE: {
NodeSingleValueReference nodeSingleValueReference = (NodeSingleValueReference)theEObject;
T result = caseNodeSingleValueReference(nodeSingleValueReference);
@@ -282,6 +289,21 @@ public class NodesSwitch<T> {
}
/**
+ * Returns the result of interpreting the object as an instance of '<em>Node Multi Valued Non Unique Attribute</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ * <!-- end-user-doc -->
+ * @param object the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>Node Multi Valued Non Unique Attribute</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseNodeMultiValuedNonUniqueAttribute(NodeMultiValuedNonUniqueAttribute object) {
+ return null;
+ }
+
+ /**
* Returns the result of interpreting the object as an instance of '<em>Node Single Value Reference</em>'.
* <!-- begin-user-doc -->
* This implementation returns null;
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/ComparisonUtilTest.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/ComparisonUtilTest.java
index 5929b72d3..87ef5f497 100644
--- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/ComparisonUtilTest.java
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/ComparisonUtilTest.java
@@ -94,13 +94,13 @@ public class ComparisonUtilTest {
leftToRight = false;
subDiffs = ComparisonUtil.getSubDiffs(leftToRight).apply(leftPeriodicalDiff3Way);
- assertEquals(7, Iterables.size(subDiffs));
+ assertEquals(5, Iterables.size(subDiffs));
// Left to right on a deleted element
leftToRight = true;
subDiffs = ComparisonUtil.getSubDiffs(leftToRight).apply(leftPeriodicalDiff3Way);
- assertEquals(7, Iterables.size(subDiffs));
+ assertEquals(5, Iterables.size(subDiffs));
// Right to left on a added element
final Predicate<? super Diff> leftMagazine3Way = and(fromSide(DifferenceSource.LEFT),
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/FeatureMapMoveDiffTest.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/FeatureMapMoveDiffTest.java
index 08b428a29..81a219ac6 100644
--- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/FeatureMapMoveDiffTest.java
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/FeatureMapMoveDiffTest.java
@@ -26,7 +26,7 @@ import org.eclipse.emf.compare.FeatureMapChange;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.compare.scope.DefaultComparisonScope;
import org.eclipse.emf.compare.scope.IComparisonScope;
-import org.eclipse.emf.compare.tests.diff.data.FeatureMapMoveDiffInputData;
+import org.eclipse.emf.compare.tests.diff.data.featuremapmove.FeatureMapMoveDiffInputData;
import org.eclipse.emf.ecore.resource.Resource;
import org.junit.Test;
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/NonUniqueMultiValuedAttributeTest.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/NonUniqueMultiValuedAttributeTest.java
new file mode 100644
index 000000000..58abb9e36
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/NonUniqueMultiValuedAttributeTest.java
@@ -0,0 +1,600 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Laurent Goubet - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.tests.diff;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.BasicMonitor;
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Conflict;
+import org.eclipse.emf.compare.ConflictKind;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.compare.EMFCompare;
+import org.eclipse.emf.compare.merge.IMerger;
+import org.eclipse.emf.compare.scope.DefaultComparisonScope;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+import org.eclipse.emf.compare.tests.diff.data.nonuniquemultivaluedattribute.NonUniqueMultiValuedAttributeInputData;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.junit.Test;
+
+/*
+ * non-unique multi-valued attributes may contain duplicate values and thus present particularities for
+ * both the differencing process and the conflict detection process. During detection, we need to consider
+ * that a if one side has two identical values and the other has three, then there is an addition (and not
+ * a move has was previously detected). Furthermore, we will consider that adding the same value on both
+ * sides of a three-way comparison is a pseudo-conflict (previously, there was no conflict at all since
+ * non-unique values can have the same value more than once and thus the merge of such differences could
+ * be done without issues). The comparison path for 3-way and 2-way being different, we need to make sure
+ * both situations are tested.
+ */
+@SuppressWarnings("nls")
+public class NonUniqueMultiValuedAttributeTest {
+ private NonUniqueMultiValuedAttributeInputData input = new NonUniqueMultiValuedAttributeInputData();
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseA3WayDiff() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseALeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseARight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseAOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+ Diff diff1 = differences.get(0); // ADD 3.03030303E-4
+ Diff diff2 = differences.get(1); // ADD 0.0
+ Diff diff3 = differences.get(2); // DELETE 1.69714
+ Diff diff4 = differences.get(3); // DELETE 5.985E-4
+
+ assertTrue(diff1 instanceof AttributeChange);
+ assertTrue(diff2 instanceof AttributeChange);
+ assertTrue(diff3 instanceof AttributeChange);
+ assertTrue(diff4 instanceof AttributeChange);
+ assertEquals("3.03030303E-4", ((AttributeChange)diff1).getValue());
+ assertEquals("0.0", ((AttributeChange)diff2).getValue());
+ assertEquals("1.69714", ((AttributeChange)diff3).getValue());
+ assertEquals("5.985E-4", ((AttributeChange)diff4).getValue());
+ assertEquals(DifferenceKind.ADD, diff1.getKind());
+ assertEquals(DifferenceKind.ADD, diff2.getKind());
+ assertEquals(DifferenceKind.DELETE, diff3.getKind());
+ assertEquals(DifferenceKind.DELETE, diff4.getKind());
+ assertEquals(DifferenceSource.RIGHT, diff1.getSource());
+ assertEquals(DifferenceSource.RIGHT, diff2.getSource());
+ assertEquals(DifferenceSource.RIGHT, diff3.getSource());
+ assertEquals(DifferenceSource.RIGHT, diff4.getSource());
+
+ // No conflicts
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseA2WayDiff() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseALeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseARight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+ Diff diff1 = differences.get(0); // ADD 1.69714
+ Diff diff2 = differences.get(1); // ADD 5.985E-4
+ Diff diff3 = differences.get(2); // DELETE 3.03030303E-4
+ Diff diff4 = differences.get(3); // DELETE 0.0
+
+ assertTrue(diff1 instanceof AttributeChange);
+ assertTrue(diff2 instanceof AttributeChange);
+ assertTrue(diff3 instanceof AttributeChange);
+ assertTrue(diff4 instanceof AttributeChange);
+ assertEquals("1.69714", ((AttributeChange)diff1).getValue());
+ assertEquals("5.985E-4", ((AttributeChange)diff2).getValue());
+ assertEquals("3.03030303E-4", ((AttributeChange)diff3).getValue());
+ assertEquals("0.0", ((AttributeChange)diff4).getValue());
+ assertEquals(DifferenceKind.ADD, diff1.getKind());
+ assertEquals(DifferenceKind.ADD, diff2.getKind());
+ assertEquals(DifferenceKind.DELETE, diff3.getKind());
+ assertEquals(DifferenceKind.DELETE, diff4.getKind());
+ assertEquals(DifferenceSource.LEFT, diff1.getSource());
+ assertEquals(DifferenceSource.LEFT, diff2.getSource());
+ assertEquals(DifferenceSource.LEFT, diff3.getSource());
+ assertEquals(DifferenceSource.LEFT, diff4.getSource());
+
+ // No conflicts
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseA3WayMergeRtL() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseALeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseARight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseAOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseA3WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have 8 differences, paired in 4 pseudo-conflicts
+ assertEquals(8, comparison.getDifferences().size());
+ assertEquals(4, comparison.getConflicts().size());
+
+ for (Conflict c : comparison.getConflicts()) {
+ assertEquals(2, c.getDifferences().size());
+ assertEquals(ConflictKind.PSEUDO, c.getKind());
+ }
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseA2WayMergeRtL() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseALeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseARight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseA2WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have no differences left
+ assertEquals(0, comparison.getDifferences().size());
+ assertEquals(0, comparison.getConflicts().size());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseA3WayMergeLtR() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseALeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseARight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseAOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseA3WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have 0 differences
+ // (all diffs were on the right side so we cancelled them by merging)
+ assertTrue(comparison.getDifferences().isEmpty());
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseA2WayMergeLtR() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseALeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseARight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseA2WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have no differences left
+ assertEquals(0, comparison.getDifferences().size());
+ assertEquals(0, comparison.getConflicts().size());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseB3WayDiff() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseBLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseBRight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseBOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 3 differences
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(3, differences.size());
+ Diff diff1 = differences.get(0); // MOVE a
+ Diff diff2 = differences.get(1); // ADD a
+ Diff diff3 = differences.get(2); // DELETE b
+
+ assertTrue(diff1 instanceof AttributeChange);
+ assertTrue(diff2 instanceof AttributeChange);
+ assertTrue(diff3 instanceof AttributeChange);
+ assertEquals("a", ((AttributeChange)diff1).getValue());
+ assertEquals("a", ((AttributeChange)diff2).getValue());
+ assertEquals("b", ((AttributeChange)diff3).getValue());
+ assertEquals(DifferenceKind.MOVE, diff1.getKind());
+ assertEquals(DifferenceKind.ADD, diff2.getKind());
+ assertEquals(DifferenceKind.DELETE, diff3.getKind());
+ assertEquals(DifferenceSource.RIGHT, diff1.getSource());
+ assertEquals(DifferenceSource.RIGHT, diff2.getSource());
+ assertEquals(DifferenceSource.RIGHT, diff3.getSource());
+
+ // No conflicts
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseB2WayDiff() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseBLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseBRight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 3 differences
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(3, differences.size());
+ Diff diff1 = differences.get(0); // MOVE b
+ Diff diff2 = differences.get(1); // MOVE d
+ Diff diff3 = differences.get(2); // DELETE a
+
+ assertTrue(diff1 instanceof AttributeChange);
+ assertTrue(diff2 instanceof AttributeChange);
+ assertTrue(diff3 instanceof AttributeChange);
+ assertEquals("b", ((AttributeChange)diff1).getValue());
+ assertEquals("d", ((AttributeChange)diff2).getValue());
+ assertEquals("a", ((AttributeChange)diff3).getValue());
+ assertEquals(DifferenceKind.ADD, diff1.getKind());
+ assertEquals(DifferenceKind.MOVE, diff2.getKind());
+ assertEquals(DifferenceKind.DELETE, diff3.getKind());
+ assertEquals(DifferenceSource.LEFT, diff1.getSource());
+ assertEquals(DifferenceSource.LEFT, diff2.getSource());
+ assertEquals(DifferenceSource.LEFT, diff3.getSource());
+
+ // No conflicts
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseB3WayMergeRtL() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseBLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseBRight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseBOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 3 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseB3WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(3, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have 6 differences, paired in 3 pseudo-conflicts
+ assertEquals(6, comparison.getDifferences().size());
+ assertEquals(3, comparison.getConflicts().size());
+
+ for (Conflict c : comparison.getConflicts()) {
+ assertEquals(2, c.getDifferences().size());
+ assertEquals(ConflictKind.PSEUDO, c.getKind());
+ }
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseB2WayMergeRtL() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseBLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseBRight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 3 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseB2WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(3, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have no differences left
+ assertEquals(0, comparison.getDifferences().size());
+ assertEquals(0, comparison.getConflicts().size());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseB3WayMergeLtR() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseBLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseBRight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseBOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 3 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseB3WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(3, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have 0 differences
+ // (all diffs were on the right side so we cancelled them by merging)
+ assertTrue(comparison.getDifferences().isEmpty());
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseB2WayMergeLtR() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseBLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseBRight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 3 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseB2WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(3, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have no differences left
+ assertEquals(0, comparison.getDifferences().size());
+ assertEquals(0, comparison.getConflicts().size());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseC3WayDiff() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseCLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseCRight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseCOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+ Diff diff1 = differences.get(0); // ADD c
+ Diff diff2 = differences.get(1); // ADD b
+ Diff diff3 = differences.get(2); // ADD b
+ Diff diff4 = differences.get(3); // MOVE d
+
+ assertTrue(diff1 instanceof AttributeChange);
+ assertTrue(diff2 instanceof AttributeChange);
+ assertTrue(diff3 instanceof AttributeChange);
+ assertTrue(diff4 instanceof AttributeChange);
+ assertEquals("c", ((AttributeChange)diff1).getValue());
+ assertEquals("b", ((AttributeChange)diff2).getValue());
+ assertEquals("b", ((AttributeChange)diff3).getValue());
+ assertEquals("d", ((AttributeChange)diff4).getValue());
+ assertEquals(DifferenceKind.ADD, diff1.getKind());
+ assertEquals(DifferenceKind.ADD, diff2.getKind());
+ assertEquals(DifferenceKind.ADD, diff3.getKind());
+ assertEquals(DifferenceKind.MOVE, diff4.getKind());
+ assertEquals(DifferenceSource.LEFT, diff1.getSource());
+ assertEquals(DifferenceSource.LEFT, diff2.getSource());
+ assertEquals(DifferenceSource.LEFT, diff3.getSource());
+ assertEquals(DifferenceSource.LEFT, diff4.getSource());
+
+ // No conflicts
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseC2WayDiff() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseCLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseCRight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+ Diff diff1 = differences.get(0); // ADD c
+ Diff diff2 = differences.get(1); // ADD b
+ Diff diff3 = differences.get(2); // ADD b
+ Diff diff4 = differences.get(3); // MOVE d
+
+ assertTrue(diff1 instanceof AttributeChange);
+ assertTrue(diff2 instanceof AttributeChange);
+ assertTrue(diff3 instanceof AttributeChange);
+ assertTrue(diff4 instanceof AttributeChange);
+ assertEquals("c", ((AttributeChange)diff1).getValue());
+ assertEquals("b", ((AttributeChange)diff2).getValue());
+ assertEquals("b", ((AttributeChange)diff3).getValue());
+ assertEquals("d", ((AttributeChange)diff4).getValue());
+ assertEquals(DifferenceKind.ADD, diff1.getKind());
+ assertEquals(DifferenceKind.ADD, diff2.getKind());
+ assertEquals(DifferenceKind.ADD, diff3.getKind());
+ assertEquals(DifferenceKind.MOVE, diff4.getKind());
+ assertEquals(DifferenceSource.LEFT, diff1.getSource());
+ assertEquals(DifferenceSource.LEFT, diff2.getSource());
+ assertEquals(DifferenceSource.LEFT, diff3.getSource());
+ assertEquals(DifferenceSource.LEFT, diff4.getSource());
+
+ // No conflicts
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseC3WayMergeRtL() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseCLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseCRight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseCOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseC3WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have 0 differences
+ // (all diffs were on the left side so we cancelled them by merging)
+ assertTrue(comparison.getDifferences().isEmpty());
+ assertTrue(comparison.getConflicts().isEmpty());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseC2WayMergeRtL() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseCLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseCRight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseC2WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have no differences left
+ assertEquals(0, comparison.getDifferences().size());
+ assertEquals(0, comparison.getConflicts().size());
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseC3WayMergeLtR() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseCLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseCRight();
+ Resource origin = input.getNonUniqueMultiValuedAttributeCaseCOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseC3WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have 8 differences, paired in 4 pseudo-conflicts
+ assertEquals(8, comparison.getDifferences().size());
+ assertEquals(4, comparison.getConflicts().size());
+
+ for (Conflict c : comparison.getConflicts()) {
+ assertEquals(2, c.getDifferences().size());
+ assertEquals(ConflictKind.PSEUDO, c.getKind());
+ }
+ }
+
+ @Test
+ public void testNonUniqueMultiValuedAttributeCaseC2WayMergeLtR() throws IOException {
+ Resource left = input.getNonUniqueMultiValuedAttributeCaseCLeft();
+ Resource right = input.getNonUniqueMultiValuedAttributeCaseCRight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, null);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // We expect 4 differences and no conflict.
+ // see testNonUniqueMultiValuedAttributeCaseC2WayDiff if this fails
+ assertTrue(comparison.getConflicts().isEmpty());
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(4, differences.size());
+
+ IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+ for (Diff diff : differences) {
+ mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff,
+ BasicMonitor.toMonitor(new NullProgressMonitor()));
+ }
+
+ comparison = EMFCompare.builder().build().compare(scope);
+ // we should now have no differences left
+ assertEquals(0, comparison.getDifferences().size());
+ assertEquals(0, comparison.getConflicts().size());
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/SingleValuedAttributePseudoConflictTest.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/SingleValuedAttributePseudoConflictTest.java
new file mode 100644
index 000000000..928924194
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/SingleValuedAttributePseudoConflictTest.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Laurent Goubet - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.tests.diff;
+
+import static org.eclipse.emf.compare.utils.ReferenceUtil.safeEGet;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.emf.compare.AttributeChange;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Conflict;
+import org.eclipse.emf.compare.ConflictKind;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.compare.EMFCompare;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.scope.DefaultComparisonScope;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+import org.eclipse.emf.compare.tests.diff.data.pseudoconflict.SingleValuedAttributePseudoConflictInputData;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.junit.Test;
+
+public class SingleValuedAttributePseudoConflictTest {
+ private SingleValuedAttributePseudoConflictInputData input = new SingleValuedAttributePseudoConflictInputData();
+
+ @Test
+ public void testSingleValuedAttributePseudoConflict() throws IOException {
+ Resource left = input.getSingleValueAttributePseudoConflictLeft();
+ Resource right = input.getSingleValueAttributePseudoConflictRight();
+ Resource origin = input.getSingleValueAttributePseudoConflictOrigin();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ // There are only two differences
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(2, differences.size());
+ Diff diff1 = differences.get(0);
+ Diff diff2 = differences.get(1);
+
+ // They constitute a single pseudo conflict
+ assertNotNull(diff1.getConflict());
+ assertEquals(diff1.getConflict(), diff2.getConflict());
+ Conflict conflict = diff1.getConflict();
+ assertEquals(ConflictKind.PSEUDO, conflict.getKind());
+
+ // They are both a CHANGE AttributeChange on opposite sides
+ assertTrue(diff1 instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, diff1.getKind());
+ assertEquals(DifferenceSource.LEFT, diff1.getSource());
+ assertTrue(diff2 instanceof AttributeChange);
+ assertEquals(DifferenceKind.CHANGE, diff2.getKind());
+ assertEquals(DifferenceSource.RIGHT, diff2.getSource());
+
+ // And they have their own side as the changed value (not the origin side)
+ Match container = diff1.getMatch();
+ Object leftValue = safeEGet(container.getLeft(), ((AttributeChange)diff1).getAttribute());
+ Object rightValue = safeEGet(container.getRight(), ((AttributeChange)diff2).getAttribute());
+ assertNotNull(leftValue);
+ assertEquals(leftValue, rightValue);
+ assertEquals(leftValue, ((AttributeChange)diff1).getValue());
+ assertEquals(rightValue, ((AttributeChange)diff2).getValue());
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/FeatureMapMoveDiffInputData.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/featuremapmove/FeatureMapMoveDiffInputData.java
index 6f88c9521..d664d8d0f 100644
--- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/FeatureMapMoveDiffInputData.java
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/featuremapmove/FeatureMapMoveDiffInputData.java
@@ -8,7 +8,7 @@
* Contributors:
* Stefan Dirix - initial API and implementation
*******************************************************************************/
-package org.eclipse.emf.compare.tests.diff.data;
+package org.eclipse.emf.compare.tests.diff.data.featuremapmove;
import java.io.IOException;
@@ -18,10 +18,10 @@ import org.eclipse.emf.ecore.resource.Resource;
@SuppressWarnings("nls")
public class FeatureMapMoveDiffInputData extends AbstractInputData {
public Resource getFeatureMapMoveLeft() throws IOException {
- return loadFromClassLoader("featuremapmove/left.nodes");
+ return loadFromClassLoader("left.nodes");
}
public Resource getFeatureMapMoveRight() throws IOException {
- return loadFromClassLoader("featuremapmove/right.nodes");
+ return loadFromClassLoader("right.nodes");
}
}
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/NonUniqueMultiValuedAttributeInputData.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/NonUniqueMultiValuedAttributeInputData.java
new file mode 100644
index 000000000..beb1e8009
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/NonUniqueMultiValuedAttributeInputData.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Laurent Goubet - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.tests.diff.data.nonuniquemultivaluedattribute;
+
+import java.io.IOException;
+
+import org.eclipse.emf.compare.tests.framework.AbstractInputData;
+import org.eclipse.emf.ecore.resource.Resource;
+
+@SuppressWarnings("nls")
+public class NonUniqueMultiValuedAttributeInputData extends AbstractInputData {
+ public Resource getNonUniqueMultiValuedAttributeCaseALeft() throws IOException {
+ return loadFromClassLoader("a/left.nodes");
+ }
+
+ public Resource getNonUniqueMultiValuedAttributeCaseARight() throws IOException {
+ return loadFromClassLoader("a/right.nodes");
+ }
+
+ public Resource getNonUniqueMultiValuedAttributeCaseAOrigin() throws IOException {
+ return loadFromClassLoader("a/origin.nodes");
+ }
+
+ public Resource getNonUniqueMultiValuedAttributeCaseBLeft() throws IOException {
+ return loadFromClassLoader("b/left.nodes");
+ }
+
+ public Resource getNonUniqueMultiValuedAttributeCaseBRight() throws IOException {
+ return loadFromClassLoader("b/right.nodes");
+ }
+
+ public Resource getNonUniqueMultiValuedAttributeCaseBOrigin() throws IOException {
+ return loadFromClassLoader("b/origin.nodes");
+ }
+
+ public Resource getNonUniqueMultiValuedAttributeCaseCLeft() throws IOException {
+ return loadFromClassLoader("c/left.nodes");
+ }
+
+ public Resource getNonUniqueMultiValuedAttributeCaseCRight() throws IOException {
+ return loadFromClassLoader("c/right.nodes");
+ }
+
+ public Resource getNonUniqueMultiValuedAttributeCaseCOrigin() throws IOException {
+ return loadFromClassLoader("c/origin.nodes");
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/left.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/left.nodes
new file mode 100644
index 000000000..f568a018d
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/left.nodes
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>1.69714</multiValuedAttribute>
+ <multiValuedAttribute>5.985E-4</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/origin.nodes
new file mode 100644
index 000000000..f568a018d
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/origin.nodes
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>1.69714</multiValuedAttribute>
+ <multiValuedAttribute>5.985E-4</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/right.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/right.nodes
new file mode 100644
index 000000000..54c3ee361
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/a/right.nodes
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+ <multiValuedAttribute>3.03030303E-4</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+ <multiValuedAttribute>0.0</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/left.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/left.nodes
new file mode 100644
index 000000000..c57e03a20
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/left.nodes
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>c</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>d</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/origin.nodes
new file mode 100644
index 000000000..c57e03a20
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/origin.nodes
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>c</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>d</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/right.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/right.nodes
new file mode 100644
index 000000000..3a9edcfe1
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/b/right.nodes
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>c</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>d</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/left.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/left.nodes
new file mode 100644
index 000000000..a4c319404
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/left.nodes
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>c</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>d</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/origin.nodes
new file mode 100644
index 000000000..35cd66986
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/origin.nodes
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>d</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/right.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/right.nodes
new file mode 100644
index 000000000..35cd66986
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/nonuniquemultivaluedattribute/c/right.nodes
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:NodeMultiValuedNonUniqueAttribute xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_Y7T9MMQPEemKOdaA3QMhmg" name="root">
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>b</multiValuedAttribute>
+ <multiValuedAttribute>d</multiValuedAttribute>
+ <multiValuedAttribute>a</multiValuedAttribute>
+</nodes:NodeMultiValuedNonUniqueAttribute>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/SingleValuedAttributePseudoConflictInputData.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/SingleValuedAttributePseudoConflictInputData.java
new file mode 100644
index 000000000..4cdadcfb1
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/SingleValuedAttributePseudoConflictInputData.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Laurent Goubet - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.tests.diff.data.pseudoconflict;
+
+import java.io.IOException;
+
+import org.eclipse.emf.compare.tests.framework.AbstractInputData;
+import org.eclipse.emf.ecore.resource.Resource;
+
+@SuppressWarnings("nls")
+public class SingleValuedAttributePseudoConflictInputData extends AbstractInputData {
+ public Resource getSingleValueAttributePseudoConflictLeft() throws IOException {
+ return loadFromClassLoader("left.nodes");
+ }
+
+ public Resource getSingleValueAttributePseudoConflictRight() throws IOException {
+ return loadFromClassLoader("right.nodes");
+ }
+
+ public Resource getSingleValueAttributePseudoConflictOrigin() throws IOException {
+ return loadFromClassLoader("origin.nodes");
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/left.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/left.nodes
new file mode 100644
index 000000000..27d2691d0
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/left.nodes
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_wZM5IKhyEemotbw2fRcn-w" name="model">
+ <containmentRef1 xsi:type="nodes:NodeSingleValueAttribute" xmi:id="_yCMQMKhyEemotbw2fRcn-w" name="conflict_container" singleValuedAttribute="changedValue"/>
+</nodes:Node>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/origin.nodes
new file mode 100644
index 000000000..c58414932
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/origin.nodes
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_wZM5IKhyEemotbw2fRcn-w" name="model">
+ <containmentRef1 xsi:type="nodes:NodeSingleValueAttribute" xmi:id="_yCMQMKhyEemotbw2fRcn-w" name="conflict_container" singleValuedAttribute="originValue"/>
+</nodes:Node>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/right.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/right.nodes
new file mode 100644
index 000000000..27d2691d0
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/diff/data/pseudoconflict/right.nodes
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_wZM5IKhyEemotbw2fRcn-w" name="model">
+ <containmentRef1 xsi:type="nodes:NodeSingleValueAttribute" xmi:id="_yCMQMKhyEemotbw2fRcn-w" name="conflict_container" singleValuedAttribute="changedValue"/>
+</nodes:Node>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/DanglingReferenceAfterMergeTest.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/DanglingReferenceAfterMergeTest.java
new file mode 100644
index 000000000..7e4bc1b8a
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/DanglingReferenceAfterMergeTest.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.tests.merge;
+
+import static com.google.common.base.Predicates.and;
+import static org.eclipse.emf.compare.utils.EMFComparePredicates.changedReference;
+import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide;
+import static org.eclipse.emf.compare.utils.EMFComparePredicates.ofKind;
+import static org.eclipse.emf.compare.utils.EMFComparePredicates.onEObject;
+import static org.eclipse.emf.compare.utils.EMFComparePredicates.referenceValueMatch;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterators;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.util.BasicMonitor;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
+import org.eclipse.emf.compare.DifferenceSource;
+import org.eclipse.emf.compare.DifferenceState;
+import org.eclipse.emf.compare.EMFCompare;
+import org.eclipse.emf.compare.merge.BatchMerger;
+import org.eclipse.emf.compare.merge.IMerger;
+import org.eclipse.emf.compare.scope.DefaultComparisonScope;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+import org.eclipse.emf.compare.tests.merge.data.IndividualDiffInputData;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.junit.Test;
+
+/**
+ * This class double-checks that there are no dangling references after a batch merge.
+ * <p>
+ * A particular case that has been isolated presenting such an occurrence is when the user changes the element
+ * contained in a single-valued containment reference while this value is referenced through non-containment
+ * features.
+ * </p>
+ *
+ * @author lgoubet
+ */
+@SuppressWarnings("nls")
+public class DanglingReferenceAfterMergeTest {
+ private IndividualDiffInputData input = new IndividualDiffInputData();
+
+ private final BatchMerger batchMerger = new BatchMerger(IMerger.RegistryImpl.createStandaloneInstance());
+
+ @Test
+ public void testDanglingReferencePostMergeLtR() throws IOException {
+ Resource ancestor = input.getDanglingPostMergeAncestor();
+ Resource left = input.getDanglingPostMergeLeft();
+ Resource right = input.getDanglingPostMergeRight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, ancestor);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(3, differences.size());
+
+ Diff changedReference = Iterators.find(differences.iterator(),
+ and(fromSide(DifferenceSource.RIGHT),
+ changedReference("root.container.ClassA", "singleValuedReference",
+ "root.referencedContainer.ClassB", "root.referencedContainer.ClassC")));
+ Diff addedClassC = Iterators.find(differences.iterator(),
+ and(fromSide(DifferenceSource.RIGHT), addedToSingleValuedReference("root.referencedContainer",
+ "singleValueContainment", "root.referencedContainer.ClassC")));
+ Diff removedClassB = Iterators.find(differences.iterator(),
+ and(fromSide(DifferenceSource.RIGHT),
+ removedFromSingleValuedReference("root.referencedContainer", "singleValueContainment",
+ "root.referencedContainer.ClassB")));
+
+ batchMerger.copyAllLeftToRight(Arrays.asList(addedClassC), new BasicMonitor());
+ assertNoDangling(right);
+ assertNotNull(getNodeNamed(right, "ClassB"));
+ assertEquals(DifferenceState.DISCARDED, changedReference.getState());
+ assertEquals(DifferenceState.DISCARDED, addedClassC.getState());
+ assertEquals(DifferenceState.DISCARDED, removedClassB.getState());
+ }
+
+ @Test
+ public void testDanglingReferencePostMergeRtL() throws IOException {
+ Resource ancestor = input.getDanglingPostMergeAncestor();
+ Resource left = input.getDanglingPostMergeLeft();
+ Resource right = input.getDanglingPostMergeRight();
+
+ IComparisonScope scope = new DefaultComparisonScope(left, right, ancestor);
+ Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+ List<Diff> differences = comparison.getDifferences();
+ assertEquals(3, differences.size());
+
+ Diff changedReference = Iterators.find(differences.iterator(),
+ and(fromSide(DifferenceSource.RIGHT),
+ changedReference("root.container.ClassA", "singleValuedReference",
+ "root.referencedContainer.ClassB", "root.referencedContainer.ClassC")));
+ Diff addedClassC = Iterators.find(differences.iterator(),
+ and(fromSide(DifferenceSource.RIGHT), addedToSingleValuedReference("root.referencedContainer",
+ "singleValueContainment", "root.referencedContainer.ClassC")));
+ Diff removedClassB = Iterators.find(differences.iterator(),
+ and(fromSide(DifferenceSource.RIGHT),
+ removedFromSingleValuedReference("root.referencedContainer", "singleValueContainment",
+ "root.referencedContainer.ClassB")));
+
+ batchMerger.copyAllRightToLeft(Arrays.asList(addedClassC), new BasicMonitor());
+ assertNoDangling(left);
+ assertNotNull(getNodeNamed(left, "ClassC"));
+ assertEquals(DifferenceState.MERGED, changedReference.getState());
+ assertEquals(DifferenceState.MERGED, addedClassC.getState());
+ assertEquals(DifferenceState.MERGED, removedClassB.getState());
+ }
+
+ private void assertNoDangling(Resource res) {
+ TreeIterator<EObject> iterator = res.getAllContents();
+ while (iterator.hasNext()) {
+ EObject next = iterator.next();
+ for (EObject o : next.eCrossReferences()) {
+ assertNotNull(o.eResource());
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private Predicate<? super Diff> addedToSingleValuedReference(String qualifiedName, String referenceName,
+ String addedQualifiedName) {
+ return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName),
+ referenceValueMatch(referenceName, addedQualifiedName, false));
+ }
+
+ @SuppressWarnings("unchecked")
+ private Predicate<? super Diff> removedFromSingleValuedReference(String qualifiedName,
+ String referenceName, String addedQualifiedName) {
+ return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName),
+ referenceValueMatch(referenceName, addedQualifiedName, false));
+ }
+
+ private EObject getNodeNamed(Resource res, String name) {
+ final Iterator<EObject> iterator = EcoreUtil.getAllProperContents(res, false);
+ while (iterator.hasNext()) {
+ final EObject next = iterator.next();
+ final EStructuralFeature nameFeature = next.eClass().getEStructuralFeature("name");
+ if (nameFeature != null && name.equals(next.eGet(nameFeature))) {
+ return next;
+ }
+ }
+ return null;
+ }
+}
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/IndividualDiffInputData.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/IndividualDiffInputData.java
index 805f5d1b6..92c69b74d 100644
--- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/IndividualDiffInputData.java
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/IndividualDiffInputData.java
@@ -820,4 +820,16 @@ public class IndividualDiffInputData extends AbstractInputData {
public Resource getMoveConflictAndPseudoConflictImplicationsRight() throws IOException {
return loadFromClassLoader("dependencies/bug_484579/right.uml");
}
+
+ public Resource getDanglingPostMergeAncestor() throws IOException {
+ return loadFromClassLoader("danglingpostmerge/origin.nodes");
+ }
+
+ public Resource getDanglingPostMergeLeft() throws IOException {
+ return loadFromClassLoader("danglingpostmerge/left.nodes");
+ }
+
+ public Resource getDanglingPostMergeRight() throws IOException {
+ return loadFromClassLoader("danglingpostmerge/right.nodes");
+ }
}
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/left.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/left.nodes
new file mode 100644
index 000000000..337f3daa9
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/left.nodes
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_R8rFcHylEemhG-_oVU730g" name="root">
+ <containmentRef1 xmi:id="_emUtkHylEemhG-_oVU730g" name="container">
+ <containmentRef1 xsi:type="nodes:NodeSingleValueReference" xmi:id="_f6BKEHylEemhG-_oVU730g" name="ClassA" singleValuedReference="_agybkHylEemhG-_oVU730g"/>
+ </containmentRef1>
+ <containmentRef1 xsi:type="nodes:NodeSingleValueContainment" xmi:id="_TurOkHylEemhG-_oVU730g" name="referencedContainer">
+ <singleValueContainment xmi:id="_agybkHylEemhG-_oVU730g" name="ClassB"/>
+ </containmentRef1>
+</nodes:Node>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/origin.nodes
new file mode 100644
index 000000000..337f3daa9
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/origin.nodes
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_R8rFcHylEemhG-_oVU730g" name="root">
+ <containmentRef1 xmi:id="_emUtkHylEemhG-_oVU730g" name="container">
+ <containmentRef1 xsi:type="nodes:NodeSingleValueReference" xmi:id="_f6BKEHylEemhG-_oVU730g" name="ClassA" singleValuedReference="_agybkHylEemhG-_oVU730g"/>
+ </containmentRef1>
+ <containmentRef1 xsi:type="nodes:NodeSingleValueContainment" xmi:id="_TurOkHylEemhG-_oVU730g" name="referencedContainer">
+ <singleValueContainment xmi:id="_agybkHylEemhG-_oVU730g" name="ClassB"/>
+ </containmentRef1>
+</nodes:Node>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/right.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/right.nodes
new file mode 100644
index 000000000..12a13b8ea
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/merge/data/danglingpostmerge/right.nodes
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<nodes:Node xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nodes="http://www.eclipse.org/emf/compare/tests/nodes" xmi:id="_R8rFcHylEemhG-_oVU730g" name="root">
+ <containmentRef1 xmi:id="_emUtkHylEemhG-_oVU730g" name="container">
+ <containmentRef1 xsi:type="nodes:NodeSingleValueReference" xmi:id="_f6BKEHylEemhG-_oVU730g" name="ClassA" singleValuedReference="_kEXqoHylEemhG-_oVU730g"/>
+ </containmentRef1>
+ <containmentRef1 xsi:type="nodes:NodeSingleValueContainment" xmi:id="_TurOkHylEemhG-_oVU730g" name="referencedContainer">
+ <singleValueContainment xmi:id="_kEXqoHylEemhG-_oVU730g" name="ClassC"/>
+ </containmentRef1>
+</nodes:Node>
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java
index 2ecd6fa88..1290f4a28 100644
--- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java
@@ -28,6 +28,8 @@ import org.eclipse.emf.compare.tests.diff.DiffUtilTest;
import org.eclipse.emf.compare.tests.diff.FeatureFilterTest;
import org.eclipse.emf.compare.tests.diff.FeatureMapMoveDiffTest;
import org.eclipse.emf.compare.tests.diff.LCSPerformanceTest;
+import org.eclipse.emf.compare.tests.diff.NonUniqueMultiValuedAttributeTest;
+import org.eclipse.emf.compare.tests.diff.SingleValuedAttributePseudoConflictTest;
import org.eclipse.emf.compare.tests.diff.ThreeWayTextDiffTest;
import org.eclipse.emf.compare.tests.diff.URIDistanceTest;
import org.eclipse.emf.compare.tests.edit.AllEditTests;
@@ -106,7 +108,8 @@ import org.junit.runners.Suite.SuiteClasses;
RankedAdapterFactoryRegistryTest.class, ComparisonScopeAdapterTest.class,
EMFComparePredicatesTest.class, ImplicationsMergeTest.class, GraphTest.class,
ConflictImplicationsTest_Bug484579.class, PseudoConflictDetectionTest.class, ComplexMergeTest.class,
- ConflictSearchTest.class, DiffRelationshipComputerTest.class })
+ ConflictSearchTest.class, DiffRelationshipComputerTest.class,
+ SingleValuedAttributePseudoConflictTest.class, NonUniqueMultiValuedAttributeTest.class, })
public class AllTests {
@BeforeClass
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/utils/EMFCompareTestsUtils.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/utils/EMFCompareTestsUtils.java
new file mode 100644
index 000000000..f2e56f040
--- /dev/null
+++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/utils/EMFCompareTestsUtils.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Obeo.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.emf.compare.tests.utils;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * This utility class provides methods that will be used by test classes.
+ *
+ * @author <a href="mailto:glenn.plouhinec@obeo.fr">Glenn Plouhinec</a>
+ */
+public class EMFCompareTestsUtils {
+ /**
+ * Ensure that the two given lists contain the same elements in the same order. The kind of list does not
+ * matter.
+ *
+ * @param <T>
+ * The type of objects in each list.
+ * @param comparison
+ * The comparison used to compare models.
+ * @param list1
+ * First of the two lists to compare.
+ * @param list2
+ * Second of the two lists to compare.
+ */
+ public static <T extends EObject> void assertEqualContents(Comparison comparison, List<T> list1,
+ List<T> list2) {
+ final int size = list1.size();
+ assertEquals(size, list2.size());
+
+ for (int i = 0; i < size; i++) {
+ final EObject eObject1 = list1.get(i);
+ final EObject eObject2 = list2.get(i);
+ final Match match = comparison.getMatch(eObject1);
+ eObject1.equals(eObject2);
+ if (match.getLeft() == eObject1) {
+ assertEquals(match.getRight(), eObject2);
+ } else {
+ assertEquals(match.getRight(), eObject1);
+ assertEquals(match.getLeft(), eObject2);
+ }
+ }
+ }
+}

Back to the top