Index: trunk/test/unit/org/openstreetmap/josm/TestUtils.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/TestUtils.java	(revision 9932)
+++ trunk/test/unit/org/openstreetmap/josm/TestUtils.java	(revision 9933)
@@ -36,4 +36,9 @@
 import java.util.Map;
 
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmUtils;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.progress.AbstractProgressMonitor;
 import org.openstreetmap.josm.gui.progress.CancelHandler;
@@ -545,3 +550,33 @@
     // CHECKSTYLE.ON: MethodLength
     // CHECKSTYLE.ON: AnonInnerLength
+
+    /**
+     * Creates a new way with the given tags (see {@link OsmUtils#createPrimitive(java.lang.String)}) and the nodes added
+     *
+     * @param tags  the tags to set
+     * @param nodes the nodes to add
+     * @return a new way
+     */
+    public static Way newWay(String tags, Node... nodes) {
+        final Way way = (Way) OsmUtils.createPrimitive("way " + tags);
+        for (Node node : nodes) {
+            way.addNode(node);
+        }
+        return way;
+    }
+
+    /**
+     * Creates a new relation with the given tags (see {@link OsmUtils#createPrimitive(java.lang.String)}) and the members added
+     *
+     * @param tags  the tags to set
+     * @param members the members to add
+     * @return a new relation
+     */
+    public static Relation newRelation(String tags, RelationMember... members) {
+        final Relation relation = (Relation) OsmUtils.createPrimitive("relation " + tags);
+        for (RelationMember member : members) {
+            relation.addMember(member);
+        }
+        return relation;
+    }
 }
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/PublicTransportRouteTestTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/PublicTransportRouteTestTest.java	(revision 9933)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/PublicTransportRouteTestTest.java	(revision 9933)
@@ -0,0 +1,70 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Way;
+
+/**
+ * JUnit Test of "Public Transport Route" validation test.
+ */
+public class PublicTransportRouteTestTest {
+
+    final PublicTransportRouteTest test = new PublicTransportRouteTest();
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Performs various tests.
+     */
+    @Test
+    public void test() {
+        final List<Node> nodes = Arrays.asList(new Node(), new Node(), new Node(), new Node(), new Node(), new Node());
+        final Way w1 = TestUtils.newWay("", nodes.get(0), nodes.get(1));
+        final Way w2 = TestUtils.newWay("", nodes.get(1), nodes.get(2));
+        final Way w3 = TestUtils.newWay("", nodes.get(3), nodes.get(2));
+        final Way w4 = TestUtils.newWay("", nodes.get(3), nodes.get(4));
+
+        test.startTest(null);
+        test.visit(TestUtils.newRelation("type=route route=tram public_transport:version=2"));
+        test.visit(TestUtils.newRelation("type=unknown"));
+        assertEquals(0, test.getErrors().size());
+
+        final Relation r2 = TestUtils.newRelation("type=route route=tram public_transport:version=2",
+                new RelationMember("", w1), new RelationMember("", w2), new RelationMember("", w3), new RelationMember("", w4));
+        test.startTest(null);
+        test.visit(r2);
+        assertEquals(0, test.getErrors().size());
+
+        final Relation r3 = TestUtils.newRelation("type=route route=tram public_transport:version=2",
+                new RelationMember("forward", w1));
+        test.startTest(null);
+        test.visit(r3);
+        assertEquals(1, test.getErrors().size());
+        assertEquals("Route relation contains a 'forward/backward' role", test.getErrors().get(0).getMessage());
+
+        final Relation r4 = TestUtils.newRelation("type=route route=tram public_transport:version=2",
+                new RelationMember("", w1), new RelationMember("", w3), new RelationMember("", w2));
+        test.startTest(null);
+        test.visit(r4);
+        assertEquals(1, test.getErrors().size());
+        assertEquals("Route relation contains a gap", test.getErrors().get(0).getMessage());
+
+    }
+}
