Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/ConditionalKeysTest.groovy
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/ConditionalKeysTest.groovy	(revision 11394)
+++ 	(revision )
@@ -1,43 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.validation.tests
-
-import org.openstreetmap.josm.JOSMFixture
-import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
-
-class ConditionalKeysTest extends GroovyTestCase {
-
-    ConditionalKeys test = new ConditionalKeys()
-
-    @Override
-    void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-        TaggingPresets.readFromPreferences()
-        test.initialize()
-    }
-
-    void testKeyValid() {
-        assert test.isKeyValid("maxspeed:conditional")
-        assert test.isKeyValid("motor_vehicle:conditional")
-        assert test.isKeyValid("bicycle:conditional")
-        assert test.isKeyValid("overtaking:hgv:conditional")
-        assert test.isKeyValid("maxspeed:hgv:backward:conditional")
-        assert test.isKeyValid("oneway:backward:conditional")
-        assert test.isKeyValid("fee:conditional")
-        assert !test.isKeyValid("maxspeed:hgv:conditional:backward")
-    }
-
-    void testValueValid() {
-        assert test.isValueValid("maxspeed:conditional", "120 @ (06:00-19:00)")
-        assert !test.isValueValid("maxspeed:conditional", " @ (06:00-19:00)")
-        assert !test.isValueValid("maxspeed:conditional", "120 (06:00-19:00)")
-        assert !test.isValueValid("maxspeed:conditional", "120 @ ()")
-        assert !test.isValueValid("maxspeed:conditional", "120 @ ")
-        assert !test.isValueValid("maxspeed:conditional", "120 @ (06:00/19:00)")
-        assert test.isValueValid("maxspeed:conditional", "120 @ (06:00-20:00); 100 @ (22:00-06:00)")
-        assert test.isValueValid("motor_vehicle:conditional", "delivery @ (Mo-Fr 06:00-11:00,17:00-19:00;Sa 03:30-19:00)")
-        assert test.isValueValid("motor_vehicle:conditional", "no @ (10:00-18:00 AND length>5)")
-        assert !test.isValueValid("motor_vehicle:conditional", "foo @ (10:00-18:00 AND length>5)")
-        assert !test.isValueValid("motor_vehicle:conditional", "no @ (10:00until18:00 AND length>5)")
-        assert test.isValueValid("maxspeed:hgv:conditional", "60 @ (weight>7.5)")
-    }
-}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/ConditionalKeysTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/ConditionalKeysTest.java	(revision 11403)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/ConditionalKeysTest.java	(revision 11403)
@@ -0,0 +1,63 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
+
+/**
+ * Unit test of {@link ConditionalKeys}.
+ */
+public class ConditionalKeysTest {
+
+    private final ConditionalKeys test = new ConditionalKeys();
+
+    /**
+     * Setup test
+     * @throws Exception if an error occurs
+     */
+    @Before
+    public void setUp() throws Exception {
+        JOSMFixture.createUnitTestFixture().init();
+        TaggingPresets.readFromPreferences();
+        test.initialize();
+    }
+
+    /**
+     * Unit test of {@link ConditionalKeys#isKeyValid}.
+     */
+    @Test
+    public void testKeyValid() {
+        assertTrue(test.isKeyValid("maxspeed:conditional"));
+        assertTrue(test.isKeyValid("motor_vehicle:conditional"));
+        assertTrue(test.isKeyValid("bicycle:conditional"));
+        assertTrue(test.isKeyValid("overtaking:hgv:conditional"));
+        assertTrue(test.isKeyValid("maxspeed:hgv:backward:conditional"));
+        assertTrue(test.isKeyValid("oneway:backward:conditional"));
+        assertTrue(test.isKeyValid("fee:conditional"));
+        assertFalse(test.isKeyValid("maxspeed:hgv:conditional:backward"));
+    }
+
+    /**
+     * Unit test of {@link ConditionalKeys#isValueValid}.
+     */
+    @Test
+    public void testValueValid() {
+        assertTrue(test.isValueValid("maxspeed:conditional", "120 @ (06:00-19:00)"));
+        assertFalse(test.isValueValid("maxspeed:conditional", " @ (06:00-19:00)"));
+        assertFalse(test.isValueValid("maxspeed:conditional", "120 (06:00-19:00)"));
+        assertFalse(test.isValueValid("maxspeed:conditional", "120 @ ()"));
+        assertFalse(test.isValueValid("maxspeed:conditional", "120 @ "));
+        assertFalse(test.isValueValid("maxspeed:conditional", "120 @ (06:00/19:00)"));
+        assertTrue(test.isValueValid("maxspeed:conditional", "120 @ (06:00-20:00); 100 @ (22:00-06:00)"));
+        assertTrue(test.isValueValid("motor_vehicle:conditional", "delivery @ (Mo-Fr 06:00-11:00,17:00-19:00;Sa 03:30-19:00)"));
+        assertTrue(test.isValueValid("motor_vehicle:conditional", "no @ (10:00-18:00 AND length>5)"));
+        assertFalse(test.isValueValid("motor_vehicle:conditional", "foo @ (10:00-18:00 AND length>5)"));
+        assertFalse(test.isValueValid("motor_vehicle:conditional", "no @ (10:00until18:00 AND length>5)"));
+        assertTrue(test.isValueValid("maxspeed:hgv:conditional", "60 @ (weight>7.5)"));
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/HighwaysTest.groovy
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/HighwaysTest.groovy	(revision 11394)
+++ 	(revision )
@@ -1,77 +1,0 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.data.validation.tests
-
-import org.openstreetmap.josm.JOSMFixture
-import org.openstreetmap.josm.data.coor.LatLon
-import org.openstreetmap.josm.data.osm.DataSet
-import org.openstreetmap.josm.data.osm.Node
-import org.openstreetmap.josm.data.osm.Way
-
-class HighwaysTest extends GroovyTestCase {
-
-    @Override
-    void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    public static Way createTestSetting(String highway, String highwayLink) {
-        def ds = new DataSet()
-
-        def n00 = new Node(LatLon.ZERO)
-        def n10 = new Node(new LatLon(1, 0))
-        def n20 = new Node(new LatLon(2, 0))
-        def n01 = new Node(new LatLon(0, 1))
-        def n11 = new Node(new LatLon(1, 1))
-        def n21 = new Node(new LatLon(2, 1))
-
-        ds.addPrimitive(n00)
-        ds.addPrimitive(n10)
-        ds.addPrimitive(n20)
-        ds.addPrimitive(n01)
-        ds.addPrimitive(n11)
-        ds.addPrimitive(n21)
-
-        def major = new Way()
-        major.addNode(n00)
-        major.addNode(n10)
-        major.addNode(n20)
-        major.put("highway", highway)
-        def link = new Way()
-        link.addNode(n10)
-        link.addNode(n11)
-        link.put("highway", highwayLink)
-        def unclassified = new Way()
-        unclassified.addNode(n01)
-        unclassified.addNode(n11)
-        unclassified.addNode(n21)
-        unclassified.put("highway", "unclassified")
-
-        ds.addPrimitive(major)
-        ds.addPrimitive(link)
-        ds.addPrimitive(unclassified)
-
-        return link
-    }
-
-    void testCombinations() {
-        assert Highways.isHighwayLinkOkay(createTestSetting("primary", "primary_link"))
-        assert Highways.isHighwayLinkOkay(createTestSetting("primary", "primary"))
-        assert !Highways.isHighwayLinkOkay(createTestSetting("primary", "secondary_link"))
-        assert !Highways.isHighwayLinkOkay(createTestSetting("secondary", "primary_link"))
-        assert !Highways.isHighwayLinkOkay(createTestSetting("secondary", "tertiary_link"))
-        assert Highways.isHighwayLinkOkay(createTestSetting("residential", "residential"))
-    }
-
-    void testSourceMaxSpeedUnitedKingdom() {
-        def link = createTestSetting("primary", "primary")
-        link.put("maxspeed", "60 mph")
-        link.put("source:maxspeed", "UK:nsl_single")
-        def test = new Highways()
-        test.visit(link)
-        assert test.errors.size() == 1
-        def error = test.errors.get(0)
-        assert error.isFixable()
-        assert error.getFix().executeCommand()
-        assert "GB:nsl_single".equals(link.get("source:maxspeed"))
-    }
-}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/HighwaysTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/HighwaysTest.java	(revision 11403)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/HighwaysTest.java	(revision 11403)
@@ -0,0 +1,98 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.validation.TestError;
+
+/**
+ * Unit test of {@link HighwaysTest}.
+ */
+public class HighwaysTest {
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    private static Way createTestSetting(String highway, String highwayLink) {
+        DataSet ds = new DataSet();
+
+        Node n00 = new Node(LatLon.ZERO);
+        Node n10 = new Node(new LatLon(1, 0));
+        Node n20 = new Node(new LatLon(2, 0));
+        Node n01 = new Node(new LatLon(0, 1));
+        Node n11 = new Node(new LatLon(1, 1));
+        Node n21 = new Node(new LatLon(2, 1));
+
+        ds.addPrimitive(n00);
+        ds.addPrimitive(n10);
+        ds.addPrimitive(n20);
+        ds.addPrimitive(n01);
+        ds.addPrimitive(n11);
+        ds.addPrimitive(n21);
+
+        Way major = new Way();
+        major.addNode(n00);
+        major.addNode(n10);
+        major.addNode(n20);
+        major.put("highway", highway);
+        Way link = new Way();
+        link.addNode(n10);
+        link.addNode(n11);
+        link.put("highway", highwayLink);
+        Way unclassified = new Way();
+        unclassified.addNode(n01);
+        unclassified.addNode(n11);
+        unclassified.addNode(n21);
+        unclassified.put("highway", "unclassified");
+
+        ds.addPrimitive(major);
+        ds.addPrimitive(link);
+        ds.addPrimitive(unclassified);
+
+        return link;
+    }
+
+    /**
+     * Unit test of {@link Highways#isHighwayLinkOkay}.
+     */
+    @Test
+    public void testCombinations() {
+        assertTrue(Highways.isHighwayLinkOkay(createTestSetting("primary", "primary_link")));
+        assertTrue(Highways.isHighwayLinkOkay(createTestSetting("primary", "primary")));
+        assertFalse(Highways.isHighwayLinkOkay(createTestSetting("primary", "secondary_link")));
+        assertFalse(Highways.isHighwayLinkOkay(createTestSetting("secondary", "primary_link")));
+        assertFalse(Highways.isHighwayLinkOkay(createTestSetting("secondary", "tertiary_link")));
+        assertTrue(Highways.isHighwayLinkOkay(createTestSetting("residential", "residential")));
+    }
+
+    /**
+     * Test source:maxspeed in United Kingdom.
+     */
+    @Test
+    public void testSourceMaxSpeedUnitedKingdom() {
+        Way link = createTestSetting("primary", "primary");
+        link.put("maxspeed", "60 mph");
+        link.put("source:maxspeed", "UK:nsl_single");
+        Highways test = new Highways();
+        test.visit(link);
+        assertEquals(1, test.getErrors().size());
+        TestError error = test.getErrors().get(0);
+        assertTrue(error.isFixable());
+        assertTrue(error.getFix().executeCommand());
+        assertEquals("GB:nsl_single", link.get("source:maxspeed"));
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/LanesTest.groovy
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/LanesTest.groovy	(revision 11394)
+++ 	(revision )
@@ -1,69 +1,0 @@
-package org.openstreetmap.josm.data.validation.tests
-
-import org.openstreetmap.josm.JOSMFixture
-import org.openstreetmap.josm.data.osm.OsmUtils
-
-class LanesTest extends GroovyTestCase {
-
-    Lanes lanes = new Lanes()
-
-    @Override
-    void setUp() {
-        JOSMFixture.createUnitTestFixture().init()
-        lanes.initialize()
-        lanes.startTest(null)
-    }
-
-    void testLanesCount() {
-        assert lanes.getLanesCount("") == 0
-        assert lanes.getLanesCount("left") == 1
-        assert lanes.getLanesCount("left|right") == 2
-        assert lanes.getLanesCount("yes|no|yes") == 3
-        assert lanes.getLanesCount("yes||") == 3
-    }
-
-    void test1() {
-        lanes.check(OsmUtils.createPrimitive("way turn:lanes=left|right change:lanes=only_left|not_right|yes"))
-        assert lanes.errors.get(0).getMessage() == "Number of lane dependent values inconsistent"
-    }
-
-    void test2() {
-        lanes.check(OsmUtils.createPrimitive("way width:lanes:forward=1|2|3 psv:lanes:forward=no|designated"))
-        assert lanes.errors.get(0).getMessage() == "Number of lane dependent values inconsistent in forward direction"
-    }
-
-    void test3() {
-        lanes.check(OsmUtils.createPrimitive("way change:lanes:forward=yes|no turn:lanes:backward=left|right|left"))
-        assert lanes.errors.isEmpty()
-    }
-
-    void test4() {
-        lanes.check(OsmUtils.createPrimitive("way turn:lanes:forward=left|right change:lanes:forward=yes|no|yes width:backward=1|2|3"))
-        assert lanes.errors.get(0).getMessage() == "Number of lane dependent values inconsistent in forward direction"
-    }
-
-    void test5() {
-        lanes.check(OsmUtils.createPrimitive("way lanes:forward=5 turn:lanes:forward=left|right"))
-        assert lanes.errors.get(0).getMessage() == "Number of lanes:forward greater than *:lanes:forward"
-    }
-
-    void test6() {
-        lanes.check(OsmUtils.createPrimitive("way lanes:forward=foo|bar turn:lanes:forward=foo+bar"))
-        assert lanes.errors.isEmpty()
-    }
-
-    void test7() {
-        lanes.check(OsmUtils.createPrimitive("way lanes=3 lanes:forward=3 lanes:backward=7"))
-        assert lanes.errors.get(0).getMessage() == "Number of lanes:forward+lanes:backward greater than lanes"
-    }
-
-    void test8() {
-        lanes.check(OsmUtils.createPrimitive("way destination:country:lanes=X|Y;Z|none destination:ref:lanes=xyz|| destination:sign:lanes=none|airport|none"))
-        assert lanes.errors.isEmpty()
-    }
-
-    void test9() {
-        lanes.check(OsmUtils.createPrimitive("way highway=secondary lanes=2 source:lanes=survey"))
-        assert lanes.errors.isEmpty()
-    }
-}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/LanesTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/LanesTest.java	(revision 11403)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/LanesTest.java	(revision 11403)
@@ -0,0 +1,96 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.OsmUtils;
+
+/**
+ * Unit tests of {@link Lanes}.
+ */
+public class LanesTest {
+
+    private final Lanes lanes = new Lanes();
+
+    /**
+     * Setup test.
+     * @throws Exception if an error occurs
+     */
+    @Before
+    public void setUp() throws Exception {
+        JOSMFixture.createUnitTestFixture().init();
+        lanes.initialize();
+        lanes.startTest(null);
+    }
+
+    /**
+     * Unit test of {@link Lanes#getLanesCount}.
+     */
+    @Test
+    public void testLanesCount() {
+        assertEquals(0, Lanes.getLanesCount(""));
+        assertEquals(1, Lanes.getLanesCount("left"));
+        assertEquals(2, Lanes.getLanesCount("left|right"));
+        assertEquals(3, Lanes.getLanesCount("yes|no|yes"));
+        assertEquals(3, Lanes.getLanesCount("yes||"));
+    }
+
+    @Test
+    public void test1() {
+        lanes.check(OsmUtils.createPrimitive("way turn:lanes=left|right change:lanes=only_left|not_right|yes"));
+        assertEquals("Number of lane dependent values inconsistent", lanes.getErrors().get(0).getMessage());
+    }
+
+    @Test
+    public void test2() {
+        lanes.check(OsmUtils.createPrimitive("way width:lanes:forward=1|2|3 psv:lanes:forward=no|designated"));
+        assertEquals("Number of lane dependent values inconsistent in forward direction", lanes.getErrors().get(0).getMessage());
+    }
+
+    @Test
+    public void test3() {
+        lanes.check(OsmUtils.createPrimitive("way change:lanes:forward=yes|no turn:lanes:backward=left|right|left"));
+        assertTrue(lanes.getErrors().isEmpty());
+    }
+
+    @Test
+    public void test4() {
+        lanes.check(OsmUtils.createPrimitive("way turn:lanes:forward=left|right change:lanes:forward=yes|no|yes width:backward=1|2|3"));
+        assertEquals("Number of lane dependent values inconsistent in forward direction", lanes.getErrors().get(0).getMessage());
+    }
+
+    @Test
+    public void test5() {
+        lanes.check(OsmUtils.createPrimitive("way lanes:forward=5 turn:lanes:forward=left|right"));
+        assertEquals("Number of lanes:forward greater than *:lanes:forward", lanes.getErrors().get(0).getMessage());
+    }
+
+    @Test
+    public void test6() {
+        lanes.check(OsmUtils.createPrimitive("way lanes:forward=foo|bar turn:lanes:forward=foo+bar"));
+        assertTrue(lanes.getErrors().isEmpty());
+    }
+
+    @Test
+    public void test7() {
+        lanes.check(OsmUtils.createPrimitive("way lanes=3 lanes:forward=3 lanes:backward=7"));
+        assertEquals("Number of lanes:forward+lanes:backward greater than lanes", lanes.getErrors().get(0).getMessage());
+    }
+
+    @Test
+    public void test8() {
+        lanes.check(OsmUtils.createPrimitive(
+                "way destination:country:lanes=X|Y;Z|none destination:ref:lanes=xyz|| destination:sign:lanes=none|airport|none"));
+        assertTrue(lanes.getErrors().isEmpty());
+    }
+
+    @Test
+    public void test9() {
+        lanes.check(OsmUtils.createPrimitive("way highway=secondary lanes=2 source:lanes=survey"));
+        assertTrue(lanes.getErrors().isEmpty());
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.groovy
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.groovy	(revision 11394)
+++ 	(revision )
@@ -1,142 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.validation.tests
-
-import static org.openstreetmap.josm.data.osm.OsmUtils.createPrimitive
-
-import org.openstreetmap.josm.JOSMFixture
-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.data.validation.TestError
-import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
-
-class RelationCheckerTest extends GroovyTestCase {
-
-    @Override
-    void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-        getRelationChecker()
-    }
-
-    static def RelationChecker getRelationChecker() {
-        def checker = new RelationChecker()
-        TaggingPresets.readFromPreferences()
-        checker.initialize()
-        return checker
-    }
-
-    static def List<TestError> testRelation(Relation r) {
-        def checker = getRelationChecker()
-        checker.visit(r)
-        return checker.getErrors()
-    }
-
-    static def Relation createRelation(String tags) {
-        return (Relation) createPrimitive("relation "+ tags)
-    }
-
-    void testUnknownType() {
-        def errors = testRelation(createRelation("type=foobar"))
-        assert errors.size() >= 1
-        assert errors.get(0).getMessage() == "Relation type is unknown"
-    }
-
-    void testEmpty() {
-        def errors = testRelation(createRelation("type=multipolygon"))
-        assert errors.size() == 1
-        assert errors.get(0).getMessage() == "Relation is empty"
-    }
-
-    void testNormal() {
-        def r = createRelation("type=multipolygon")
-        r.addMember(new RelationMember("outer", new Way()))
-        r.addMember(new RelationMember("inner", new Way()))
-        assert testRelation(r).isEmpty()
-    }
-
-    void testOuter2() {
-        def r = createRelation("type=multipolygon")
-        r.addMember(new RelationMember("outer", new Way()))
-        r.addMember(new RelationMember("outer2", new Way()))
-
-        def errors = testRelation(r)
-        assert errors.size() == 1
-        assert errors.get(0).getDescription() == "Role outer2 unknown in templates outer/inner"
-    }
-
-    void testRestrictionViaMissing() {
-        def r = createRelation("type=restriction")
-        r.addMember(new RelationMember("from", new Way()))
-        r.addMember(new RelationMember("to", new Way()))
-
-        def errors = testRelation(r)
-        assert errors.size() == 1
-        assert errors.get(0).getDescription() == "Role via missing"
-    }
-
-    void testRestrictionViaRelation() {
-        def r = createRelation("type=restriction")
-        r.addMember(new RelationMember("from", new Way()))
-        r.addMember(new RelationMember("to", new Way()))
-        r.addMember(new RelationMember("via", new Relation()))
-
-        def errors = testRelation(r)
-        assert errors.size() == 1
-        assert errors.get(0).getDescription() == "Role member type relation does not match accepted list of node/way in template Turn Restriction"
-    }
-
-    void testRestrictionTwoFrom() {
-        def r = createRelation("type=restriction")
-        r.addMember(new RelationMember("from", new Way()))
-        r.addMember(new RelationMember("from", new Way()))
-        r.addMember(new RelationMember("to", new Way()))
-        r.addMember(new RelationMember("via", new Way()))
-
-        def errors = testRelation(r)
-        assert errors.size() == 1
-        assert errors.get(0).getDescription() == "Number of from roles too high (2)"
-    }
-
-    void testRestrictionEmpty() {
-        def r = createRelation("type=restriction")
-        r.addMember(new RelationMember("from", new Way()))
-        r.addMember(new RelationMember("to", new Way()))
-        r.addMember(new RelationMember("via", new Way()))
-        r.addMember(new RelationMember("", new Way()))
-
-        def errors = testRelation(r)
-        assert errors.size() == 1
-        assert errors.get(0).getDescription().startsWith("Empty role type found when expecting one of")
-    }
-
-    void testPowerMemberExpression() {
-        def r = createRelation("type=route route=power")
-        r.addMember(new RelationMember("", new Way()))
-
-        def errors = testRelation(r)
-        assert errors.size() == 1
-        assert errors.get(0).getDescription() == "Role member does not match expression power in template Power Route"
-    }
-
-    void testRouteMemberExpression() {
-        def r = createRelation("type=route route=tram public_transport:version=2")
-        r.addMember(new RelationMember("", createPrimitive("way railway=tram")))
-        r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position tram=yes")))
-        r.addMember(new RelationMember("platform", createPrimitive("node public_transport=platform tram=yes")))
-        assert testRelation(r).size() == 0
-
-        r.addMember(new RelationMember("", createPrimitive("way no-rail-way=yes")))
-        assert testRelation(r).size() == 1
-        assert testRelation(r).get(0).getDescription() == "Role member does not match expression railway in template Public Transport Route (Rail)"
-
-        r.removeMember(3)
-        r.addMember(new RelationMember("stop", createPrimitive("way no-rail-way=yes")))
-        assert testRelation(r).size() == 1
-        assert testRelation(r).get(0).getDescription() == "Role member type way does not match accepted list of node in template Public Transport Route (Rail)"
-
-        r.removeMember(3)
-        r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position bus=yes")))
-        assert testRelation(r).size() == 1
-        assert testRelation(r).get(0).getDescription() == "Role member does not match expression public_transport=stop_position && (train=yes || subway=yes || monorail=yes || tram=yes || light_rail=yes) in template Public Transport Route (Rail)"
-    }
-}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.java	(revision 11403)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.java	(revision 11403)
@@ -0,0 +1,166 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.openstreetmap.josm.data.osm.OsmUtils.createPrimitive;
+
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+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.data.validation.TestError;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
+
+public class RelationCheckerTest {
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+        getRelationChecker();
+    }
+
+    private static RelationChecker getRelationChecker() {
+        RelationChecker checker = new RelationChecker();
+        TaggingPresets.readFromPreferences();
+        checker.initialize();
+        return checker;
+    }
+
+    private static List<TestError> testRelation(Relation r) {
+        RelationChecker checker = getRelationChecker();
+        checker.visit(r);
+        return checker.getErrors();
+    }
+
+    private static Relation createRelation(String tags) {
+        return (Relation) createPrimitive("relation "+ tags);
+    }
+
+    @Test
+    public void testUnknownType() {
+        List<TestError> errors = testRelation(createRelation("type=foobar"));
+        assertTrue(errors.size() >= 1);
+        assertEquals("Relation type is unknown", errors.get(0).getMessage());
+    }
+
+    @Test
+    public void testEmpty() {
+        List<TestError> errors = testRelation(createRelation("type=multipolygon"));
+        assertEquals(1, errors.size());
+        assertEquals("Relation is empty", errors.get(0).getMessage());
+    }
+
+    @Test
+    public void testNormal() {
+        Relation r = createRelation("type=multipolygon");
+        r.addMember(new RelationMember("outer", new Way()));
+        r.addMember(new RelationMember("inner", new Way()));
+        assertTrue(testRelation(r).isEmpty());
+    }
+
+    @Test
+    public void testOuter2() {
+        Relation r = createRelation("type=multipolygon");
+        r.addMember(new RelationMember("outer", new Way()));
+        r.addMember(new RelationMember("outer2", new Way()));
+
+        List<TestError> errors = testRelation(r);
+        assertEquals(1, errors.size());
+        assertEquals("Role outer2 unknown in templates outer/inner", errors.get(0).getDescription());
+    }
+
+    @Test
+    public void testRestrictionViaMissing() {
+        Relation r = createRelation("type=restriction");
+        r.addMember(new RelationMember("from", new Way()));
+        r.addMember(new RelationMember("to", new Way()));
+
+        List<TestError> errors = testRelation(r);
+        assertEquals(1, errors.size());
+        assertEquals("Role via missing", errors.get(0).getDescription());
+    }
+
+    @Test
+    public void testRestrictionViaRelation() {
+        Relation r = createRelation("type=restriction");
+        r.addMember(new RelationMember("from", new Way()));
+        r.addMember(new RelationMember("to", new Way()));
+        r.addMember(new RelationMember("via", new Relation()));
+
+        List<TestError> errors = testRelation(r);
+        assertEquals(1, errors.size());
+        assertEquals("Role member type relation does not match accepted list of node/way in template Turn Restriction",
+                errors.get(0).getDescription());
+    }
+
+    @Test
+    public void testRestrictionTwoFrom() {
+        Relation r = createRelation("type=restriction");
+        r.addMember(new RelationMember("from", new Way()));
+        r.addMember(new RelationMember("from", new Way()));
+        r.addMember(new RelationMember("to", new Way()));
+        r.addMember(new RelationMember("via", new Way()));
+
+        List<TestError> errors = testRelation(r);
+        assertEquals(1, errors.size());
+        assertEquals("Number of from roles too high (2)", errors.get(0).getDescription());
+    }
+
+    @Test
+    public void testRestrictionEmpty() {
+        Relation r = createRelation("type=restriction");
+        r.addMember(new RelationMember("from", new Way()));
+        r.addMember(new RelationMember("to", new Way()));
+        r.addMember(new RelationMember("via", new Way()));
+        r.addMember(new RelationMember("", new Way()));
+
+        List<TestError> errors = testRelation(r);
+        assertEquals(1, errors.size());
+        assertTrue(errors.get(0).getDescription().startsWith("Empty role type found when expecting one of"));
+    }
+
+    @Test
+    public void testPowerMemberExpression() {
+        Relation r = createRelation("type=route route=power");
+        r.addMember(new RelationMember("", new Way()));
+
+        List<TestError> errors = testRelation(r);
+        assertEquals(1, errors.size());
+        assertEquals("Role member does not match expression power in template Power Route", errors.get(0).getDescription());
+    }
+
+    @Test
+    public void testRouteMemberExpression() {
+        Relation r = createRelation("type=route route=tram public_transport:version=2");
+        r.addMember(new RelationMember("", createPrimitive("way railway=tram")));
+        r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position tram=yes")));
+        r.addMember(new RelationMember("platform", createPrimitive("node public_transport=platform tram=yes")));
+        assertTrue(testRelation(r).isEmpty());
+
+        r.addMember(new RelationMember("", createPrimitive("way no-rail-way=yes")));
+        assertEquals(1, testRelation(r).size());
+        assertEquals("Role member does not match expression railway in template Public Transport Route (Rail)",
+                testRelation(r).get(0).getDescription());
+
+        r.removeMember(3);
+        r.addMember(new RelationMember("stop", createPrimitive("way no-rail-way=yes")));
+        assertEquals(1, testRelation(r).size());
+        assertEquals("Role member type way does not match accepted list of node in template Public Transport Route (Rail)",
+                testRelation(r).get(0).getDescription());
+
+        r.removeMember(3);
+        r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position bus=yes")));
+        assertEquals(1, testRelation(r).size());
+        assertEquals("Role member does not match expression public_transport=stop_position && "+
+                "(train=yes || subway=yes || monorail=yes || tram=yes || light_rail=yes) in template Public Transport Route (Rail)",
+                testRelation(r).get(0).getDescription());
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SimilarNamedWaysTest.groovy
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SimilarNamedWaysTest.groovy	(revision 11394)
+++ 	(revision )
@@ -1,107 +1,0 @@
-// License: GPL. See LICENSE file for details.
-package org.openstreetmap.josm.data.validation.tests
-
-import static org.junit.Assert.assertEquals
-
-import org.openstreetmap.josm.JOSMFixture
-import org.openstreetmap.josm.data.coor.LatLon
-import org.openstreetmap.josm.data.osm.DataSet
-import org.openstreetmap.josm.data.osm.Node
-import org.openstreetmap.josm.data.osm.Way
-import org.openstreetmap.josm.data.validation.TestError
-
-class SimilarNamedWaysTest extends GroovyTestCase {
-
-    SimilarNamedWays test = new SimilarNamedWays()
-
-    @Override
-    void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    public static List<TestError> testWays(String namea, String nameb) {
-        def ds = new DataSet()
-
-        def n00 = new Node(LatLon.ZERO)
-        def n10 = new Node(new LatLon(1, 0))
-        def n20 = new Node(new LatLon(2, 0))
-        def n30 = new Node(new LatLon(3, 0))
-        def n40 = new Node(new LatLon(4, 0))
-
-        ds.addPrimitive(n00)
-        ds.addPrimitive(n10)
-        ds.addPrimitive(n20)
-        ds.addPrimitive(n30)
-        ds.addPrimitive(n40)
-
-        def waya = new Way()
-        waya.addNode(n00)
-        waya.addNode(n10)
-        waya.addNode(n20)
-        waya.put("name", namea)
-        def wayb = new Way()
-        wayb.addNode(n20)
-        wayb.addNode(n30)
-        wayb.addNode(n40)
-        wayb.put("name", nameb)
-
-        ds.addPrimitive(waya)
-        ds.addPrimitive(wayb)
-
-        assert waya.isUsable()
-        assert wayb.isUsable()
-
-        def t = new SimilarNamedWays()
-        t.startTest(null)
-        t.visit(waya)
-        t.visit(wayb)
-        return t.errors
-    }
-
-    void testCombinations() {
-        assert testWays("Church Street", "Water Street").isEmpty()
-        assert !testWays("Main Street", "Maim Street").isEmpty()
-        assert !testWays("First Street", "Frist Street").isEmpty()
-
-        assert testWays("1st Street", "2nd Street").isEmpty()
-        assert testWays("First Avenue", "Second Avenue").isEmpty()
-        assert testWays("West Main Street", "East Main Street").isEmpty()
-        assert testWays("A Street", "B Street").isEmpty()
-    }
-
-    void checkSimilarity(String message, String name1, String name2, boolean expected) {
-        boolean actual = test.similaryName(name1, name2);
-        assertEquals(message, expected, actual);
-    }
-
-    void testSimilarNames() {
-        checkSimilarity("same string", "Testname", "Testname", false);
-        checkSimilarity("different case", "Testname", "TestName", true);
-        checkSimilarity("typo", "Testname", "Testxame", true);
-        checkSimilarity("missing char", "Testname", "Testame", true);
-        checkSimilarity("additional char", "Testname", "Testxname", true);
-        checkSimilarity("2 changes", "Testname", "Tostxname", true);
-        checkSimilarity("3 changes", "Testname", "Tostxnam", false);
-
-        // regular expression rule
-        checkSimilarity("same number", "track 1", "track 1", false);
-        checkSimilarity("different number", "track 1", "track 2", false);
-        checkSimilarity("different number length", "track 9", "track 10", false);
-        checkSimilarity("multiple numbers", "track 8 - 9", "track 10 - 11", false);
-
-        checkSimilarity("1st and 2nd", "1st Street", "2nd Street", false);
-        checkSimilarity("1st case", "1St Street", "1st Street", true);
-        checkSimilarity("1st and 2nd case", "1St Street", "2nd Street", true);
-        checkSimilarity("3rd and 4th", "2rd Street", "4th Street", false);
-
-        // synonyms
-        checkSimilarity("east and west", "East Foothill Drive", "West Foothill Drive", false);
-        checkSimilarity("east and west case", "east Foothill Drive", "West Foothill Drive", true);
-        checkSimilarity("first and second", "First Street", "Second Street", false);
-        checkSimilarity("first and second case", "First Street", "second Street", true);
-        checkSimilarity("first and second typo", "Forst Street", "Second Street", true);
-        checkSimilarity("first and second typo2", "First Street", "Socond Street", true);
-        checkSimilarity("first and second 2 changes", "First Street", "Soconds Street", true);
-        checkSimilarity("first and second 3 changes", "First Street", "Soconds Stret", false);
-    }
-}
Index: trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SimilarNamedWaysTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SimilarNamedWaysTest.java	(revision 11403)
+++ trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SimilarNamedWaysTest.java	(revision 11403)
@@ -0,0 +1,121 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.validation.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.validation.TestError;
+
+/**
+ * Unit test of {@link SimilarNamedWays}
+ */
+public class SimilarNamedWaysTest {
+
+    private final SimilarNamedWays test = new SimilarNamedWays();
+
+    /**
+     * Setup test
+     */
+    @Before
+    public void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    private static List<TestError> testWays(String namea, String nameb) {
+        DataSet ds = new DataSet();
+
+        Node n00 = new Node(LatLon.ZERO);
+        Node n10 = new Node(new LatLon(1, 0));
+        Node n20 = new Node(new LatLon(2, 0));
+        Node n30 = new Node(new LatLon(3, 0));
+        Node n40 = new Node(new LatLon(4, 0));
+
+        ds.addPrimitive(n00);
+        ds.addPrimitive(n10);
+        ds.addPrimitive(n20);
+        ds.addPrimitive(n30);
+        ds.addPrimitive(n40);
+
+        Way waya = new Way();
+        waya.addNode(n00);
+        waya.addNode(n10);
+        waya.addNode(n20);
+        waya.put("name", namea);
+        Way wayb = new Way();
+        wayb.addNode(n20);
+        wayb.addNode(n30);
+        wayb.addNode(n40);
+        wayb.put("name", nameb);
+
+        ds.addPrimitive(waya);
+        ds.addPrimitive(wayb);
+
+        assertTrue(waya.isUsable());
+        assertTrue(wayb.isUsable());
+
+        SimilarNamedWays t = new SimilarNamedWays();
+        t.startTest(null);
+        t.visit(waya);
+        t.visit(wayb);
+        return t.getErrors();
+    }
+
+    @Test
+    public void testCombinations() {
+        assertTrue(testWays("Church Street", "Water Street").isEmpty());
+        assertFalse(testWays("Main Street", "Maim Street").isEmpty());
+        assertFalse(testWays("First Street", "Frist Street").isEmpty());
+
+        assertTrue(testWays("1st Street", "2nd Street").isEmpty());
+        assertTrue(testWays("First Avenue", "Second Avenue").isEmpty());
+        assertTrue(testWays("West Main Street", "East Main Street").isEmpty());
+        assertTrue(testWays("A Street", "B Street").isEmpty());
+    }
+
+    private void checkSimilarity(String message, String name1, String name2, boolean expected) {
+        boolean actual = test.similaryName(name1, name2);
+        assertEquals(message, expected, actual);
+    }
+
+    @Test
+    public void testSimilarNames() {
+        checkSimilarity("same string", "Testname", "Testname", false);
+        checkSimilarity("different case", "Testname", "TestName", true);
+        checkSimilarity("typo", "Testname", "Testxame", true);
+        checkSimilarity("missing char", "Testname", "Testame", true);
+        checkSimilarity("additional char", "Testname", "Testxname", true);
+        checkSimilarity("2 changes", "Testname", "Tostxname", true);
+        checkSimilarity("3 changes", "Testname", "Tostxnam", false);
+
+        // regular expression rule
+        checkSimilarity("same number", "track 1", "track 1", false);
+        checkSimilarity("different number", "track 1", "track 2", false);
+        checkSimilarity("different number length", "track 9", "track 10", false);
+        checkSimilarity("multiple numbers", "track 8 - 9", "track 10 - 11", false);
+
+        checkSimilarity("1st and 2nd", "1st Street", "2nd Street", false);
+        checkSimilarity("1st case", "1St Street", "1st Street", true);
+        checkSimilarity("1st and 2nd case", "1St Street", "2nd Street", true);
+        checkSimilarity("3rd and 4th", "2rd Street", "4th Street", false);
+
+        // synonyms
+        checkSimilarity("east and west", "East Foothill Drive", "West Foothill Drive", false);
+        checkSimilarity("east and west case", "east Foothill Drive", "West Foothill Drive", true);
+        checkSimilarity("first and second", "First Street", "Second Street", false);
+        checkSimilarity("first and second case", "First Street", "second Street", true);
+        checkSimilarity("first and second typo", "Forst Street", "Second Street", true);
+        checkSimilarity("first and second typo2", "First Street", "Socond Street", true);
+        checkSimilarity("first and second 2 changes", "First Street", "Soconds Street", true);
+        checkSimilarity("first and second 3 changes", "First Street", "Soconds Stret", false);
+    }
+}
