Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateRelationTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateRelationTest.java	(revision 18974)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateRelationTest.java	(revision 18976)
@@ -4,4 +4,5 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -12,6 +13,4 @@
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
-
-import org.junit.jupiter.api.Test;
 
 /**
@@ -45,4 +44,6 @@
             assertEquals(expected.code, error.getCode());
             assertEquals(expected.fixable, error.isFixable());
+            if (error.isFixable())
+                error.getFix();
         }
     }
@@ -64,6 +65,6 @@
     void testDuplicateRelationNoTags() {
         doTest("", "",
-                new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true),
-                new ExpectedResult(DuplicateRelation.SAME_RELATION, false));
+                new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true)
+                );
     }
 
@@ -74,6 +75,6 @@
     void testDuplicateRelationSameTags() {
         doTest("type=boundary", "type=boundary",
-                new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true),
-                new ExpectedResult(DuplicateRelation.SAME_RELATION, false));
+                new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true)
+                );
     }
 
@@ -84,5 +85,121 @@
     void testDuplicateRelationDifferentTags() {
         doTest("type=boundary", "type=multipolygon",
-                new ExpectedResult(DuplicateRelation.SAME_RELATION, false));
+                new ExpectedResult(DuplicateRelation.IDENTICAL_MEMBERLIST, false));
+    }
+
+    /**
+     * Test of duplicate "tmc" relation, should not be ignored
+     */
+    @Test
+    void testTMCRelation1() {
+        doTest("type=tmc t1=v1", "type=tmc t1=v1",
+                new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true));
+    }
+
+    /**
+     * Test of "tmc" relation with equal members but different tags, should be ignored
+     */
+    @Test
+    void testTMCRelation2() {
+        doTest("type=tmc t1=v1", "type=tmc t1=v2");
+    }
+
+    /**
+     * Test with incomplete members
+     */
+    @Test
+    void testIncomplete() {
+        DataSet ds = new DataSet();
+
+        Node a = new Node(1234);
+        ds.addPrimitive(a);
+        ds.addPrimitive(TestUtils.newRelation("type=multipolygon", new RelationMember(null, a)));
+        ds.addPrimitive(TestUtils.newRelation("type=multipolygon", new RelationMember(null, a)));
+        performTest(ds, new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true));
+    }
+
+    /**
+     * Test with different order of members, order doesn't count
+     */
+    @Test
+    void testMemberOrder1() {
+        DataSet ds = new DataSet();
+
+        Node a = new Node(1);
+        Node b = new Node(2);
+        ds.addPrimitive(a);
+        ds.addPrimitive(b);
+        ds.addPrimitive(TestUtils.newRelation("type=multipolygon", new RelationMember(null, a), new RelationMember(null, b)));
+        ds.addPrimitive(TestUtils.newRelation("type=multipolygon", new RelationMember(null, b), new RelationMember(null, a)));
+        performTest(ds, new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true));
+    }
+
+    /**
+     * Test with different order of members, order counts
+     */
+    @Test
+    void testMemberOrder2() {
+        DataSet ds = new DataSet();
+
+        Node a = new Node(1);
+        a.setCoor(new LatLon(10.0, 5.0));
+        Node b = new Node(2);
+        b.setCoor(new LatLon(10.0, 6.0));
+        ds.addPrimitive(a);
+        ds.addPrimitive(b);
+        ds.addPrimitive(TestUtils.newRelation("type=route", new RelationMember(null, a), new RelationMember(null, b)));
+        ds.addPrimitive(TestUtils.newRelation("type=route", new RelationMember(null, b), new RelationMember(null, a)));
+        performTest(ds, new ExpectedResult(DuplicateRelation.SAME_RELATION, false));
+    }
+
+    /**
+     * Test with different order of members, one is duplicated, order doesn't matter
+     */
+    @Test
+    void testMemberOrder3() {
+        DataSet ds = new DataSet();
+
+        Node a = new Node(1);
+        Node b = new Node(2);
+        ds.addPrimitive(a);
+        ds.addPrimitive(b);
+        ds.addPrimitive(TestUtils.newRelation("type=restriction", new RelationMember(null, a),
+                new RelationMember(null, b), new RelationMember(null, a)));
+        ds.addPrimitive(TestUtils.newRelation("type=restriction", new RelationMember(null, b),
+                new RelationMember(null, a), new RelationMember(null, a)));
+        performTest(ds, new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true));
+    }
+
+    /**
+     * Test with different order of members, one is duplicated in one of the relations
+     */
+    @Test
+    void testMemberOrder4() {
+        DataSet ds = new DataSet();
+        Node a = new Node(new LatLon(10.0, 5.0));
+        Node b = new Node(new LatLon(10.0, 6.0));
+        ds.addPrimitive(a);
+        ds.addPrimitive(b);
+        ds.addPrimitive(TestUtils.newRelation("", new RelationMember(null, a), new RelationMember(null, b)));
+        ds.addPrimitive(TestUtils.newRelation("", new RelationMember(null, b), new RelationMember(null, a), new RelationMember(null, b)));
+        performTest(ds);
+    }
+
+    /**
+     * Test with two relations where members are different but geometry is equal.
+     */
+    @Test
+    void testImport() {
+        DataSet ds = new DataSet();
+        Node a = new Node(1234, 1);
+        a.setCoor(new LatLon(10.0, 5.0));
+
+        Node b = new Node(new LatLon(10.0, 5.0));
+
+        ds.addPrimitive(a);
+        ds.addPrimitive(b);
+        ds.addPrimitive(TestUtils.newRelation("type=multipolygon", new RelationMember(null, a)));
+        ds.addPrimitive(TestUtils.newRelation("type=multipolygon", new RelationMember(null, b)));
+        performTest(ds, new ExpectedResult(DuplicateRelation.DUPLICATE_RELATION, true));
     }
 }
