Index: trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorterTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorterTest.java	(revision 5630)
+++ trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSorterTest.java	(revision 5630)
@@ -0,0 +1,61 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.relation.sort;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.io.OsmReader;
+
+public class RelationSorterTest {
+
+    private RelationSorter sorter = new RelationSorter();
+    private static DataSet testDataset;
+
+    @BeforeClass
+    public static void loadData() throws FileNotFoundException, IllegalDataException {
+        Main.pref = new Preferences();
+        Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
+        testDataset = OsmReader.parseDataSet(new FileInputStream("data_nodist/relation_sort.osm"), NullProgressMonitor.INSTANCE);
+    }
+
+    private Relation getRelation(String testType) {
+        for (Relation r: testDataset.getRelations()) {
+            if (testType.equals(r.get("test")))
+                return r;
+        }
+        return null;
+    }
+
+    private String[] getNames(List<RelationMember> members) {
+        String[] result = new String[members.size()];
+        for (int i=0; i<result.length; i++) {
+            result[i] = members.get(i).getMember().get("name");
+        }
+        return result;
+    }
+
+    @Test
+    public void testGeneric() {
+        String[] actual = getNames(sorter.sortMembers(getRelation("generic").getMembers()));
+        Assert.assertArrayEquals(new String[] {"t1w4", "t1w3", "t1w2", "t1w1", "t1w7", "t1w6", "t1w5", "t1n1", "t1n2"}, actual);
+    }
+
+    @Test
+    public void testAssociatedStreet() {
+        String[] actual = getNames(sorter.sortMembers(getRelation("associatedStreet").getMembers()));
+        Assert.assertArrayEquals(new String[] {"t2n1", "t2n2", "t2n3", "t2n4", "t2w1", "t2w2"}, actual);
+    }
+
+}
Index: trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculatorTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculatorTest.java	(revision 5630)
+++ trunk/test/unit/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculatorTest.java	(revision 5630)
@@ -0,0 +1,108 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.relation.sort;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.io.OsmReader;
+
+public class WayConnectionTypeCalculatorTest {
+
+    private RelationSorter sorter = new RelationSorter();
+    private WayConnectionTypeCalculator wayConnectionTypeCalculator = new WayConnectionTypeCalculator();
+    private static DataSet testDataset;
+
+    @BeforeClass
+    public static void loadData() throws FileNotFoundException, IllegalDataException {
+        Main.pref = new Preferences();
+        Main.setProjection(Projections.getProjectionByCode("EPSG:3857")); // Mercator
+        testDataset = OsmReader.parseDataSet(new FileInputStream("data_nodist/relation_sort.osm"), NullProgressMonitor.INSTANCE);
+    }
+
+    private Relation getRelation(String testType) {
+        for (Relation r: testDataset.getRelations()) {
+            if (testType.equals(r.get("test")))
+                return r;
+        }
+        return null;
+    }
+
+    private String getConnections(List<WayConnectionType> connections) {
+        String[] result = new String[connections.size()];
+        for (int i=0; i<result.length; i++) {
+            WayConnectionType wc = connections.get(i);
+
+            if (wc.isValid()) {
+                StringBuilder sb = new StringBuilder();
+                if (wc.isLoop) {
+                    sb.append("L");
+                }
+                if (wc.isOnewayLoopForwardPart) {
+                    sb.append("FP");
+                }
+                if (wc.isOnewayLoopBackwardPart) {
+                    sb.append("BP");
+                }
+                if (wc.isOnewayHead) {
+                    sb.append("H");
+                }
+                if (wc.isOnewayTail) {
+                    sb.append("T");
+                }
+
+                if (sb.length() > 0) {
+                    sb.append(" ");
+                }
+                sb.append(wc.direction);
+                result[i] = sb.toString();
+
+            } else {
+                result[i] = "I";
+            }
+
+        }
+        return Arrays.toString(result);
+    }
+
+    @Test
+    public void testGeneric() {
+        Relation relation = getRelation("generic");
+        String actual = getConnections(wayConnectionTypeCalculator.updateLinks(relation.getMembers()));
+        Assert.assertEquals("[NONE, NONE, FORWARD, FORWARD, NONE, NONE, NONE, I, I]", actual);
+        actual = getConnections(wayConnectionTypeCalculator.updateLinks(sorter.sortMembers(relation.getMembers())));
+        Assert.assertEquals("[BACKWARD, BACKWARD, BACKWARD, BACKWARD, BACKWARD, BACKWARD, NONE, I, I]", actual);
+    }
+
+    @Test
+    public void testAssociatedStreet() {
+        Relation relation = getRelation("associatedStreet");
+        String actual = getConnections(wayConnectionTypeCalculator.updateLinks(relation.getMembers()));
+        Assert.assertEquals("[FORWARD, FORWARD, I, I, I, I]" , actual);
+        actual = getConnections(wayConnectionTypeCalculator.updateLinks(sorter.sortMembers(relation.getMembers())));
+        Assert.assertEquals("[I, I, I, I, FORWARD, FORWARD]", actual);
+    }
+
+    @Test
+    public void testLoop() {
+        Relation relation = getRelation("loop");
+        String actual = getConnections(wayConnectionTypeCalculator.updateLinks(relation.getMembers()));
+        Assert.assertEquals("[FPH FORWARD, FP FORWARD, NONE, FPH FORWARD, NONE, FPH FORWARD, NONE]", actual);
+        //TODO Sorting doesn't work well in this case
+        actual = getConnections(wayConnectionTypeCalculator.updateLinks(sorter.sortMembers(relation.getMembers())));
+        Assert.assertEquals("[BACKWARD, BACKWARD, BACKWARD, FPH FORWARD, FPH FORWARD, FPH FORWARD, FPH FORWARD]", actual);
+    }
+
+
+}
