Index: /trunk/test/unit/org/openstreetmap/josm/TestUtils.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/TestUtils.java	(revision 11103)
+++ /trunk/test/unit/org/openstreetmap/josm/TestUtils.java	(revision 11104)
@@ -9,4 +9,5 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.Collection;
@@ -164,4 +165,17 @@
 
     /**
+     * Returns a private field value.
+     * @param obj object
+     * @param fieldName private field name
+     * @return private field value
+     * @throws ReflectiveOperationException if a reflection operation error occurs
+     */
+    public static Object getPrivateField(Object obj, String fieldName) throws ReflectiveOperationException {
+        Field f = obj.getClass().getDeclaredField(fieldName);
+        f.setAccessible(true);
+        return f.get(obj);
+    }
+
+    /**
      * Returns an instance of {@link AbstractProgressMonitor} which keeps track of the monitor state,
      * but does not show the progress.
Index: unk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.groovy
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.groovy	(revision 11103)
+++ 	(revision )
@@ -1,75 +1,0 @@
-package org.openstreetmap.josm.actions
-
-import org.junit.BeforeClass
-import org.junit.Test
-import org.openstreetmap.josm.JOSMFixture
-import org.openstreetmap.josm.TestUtils
-import org.openstreetmap.josm.actions.search.SearchAction
-import org.openstreetmap.josm.actions.search.SearchCompiler
-import org.openstreetmap.josm.data.osm.Relation
-import org.openstreetmap.josm.data.osm.Way
-import org.openstreetmap.josm.io.OsmReader
-import org.openstreetmap.josm.tools.SubclassFilteredCollection
-
-public class CreateMultipolygonActionTest {
-
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    static def getRefToRoleMap(Relation relation) {
-        def refToRole = new TreeMap<String, String>()
-        for (i in relation.getMembers()) {
-            refToRole.put(i.member.get("ref"), i.role);
-        }
-        return refToRole;
-    }
-
-    static def regexpSearch(String search) {
-        def setting = new SearchAction.SearchSetting()
-        setting.text = search
-        setting.regexSearch = true
-        return setting
-    }
-
-    @Test
-    public void testCreate1() {
-        def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
-        def mp = CreateMultipolygonAction.createMultipolygonCommand(ds.getWays(), null)
-        assert mp.a.getDescriptionText() == "Sequence: Create multipolygon"
-        assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer, 1.1.2:outer, 1.2:inner]"
-    }
-
-    @Test
-    public void testCreate2() {
-        def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
-        def ways = SubclassFilteredCollection.filter(ds.getWays(), SearchCompiler.compile("ref=1 OR ref:1.1."))
-        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
-        assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1.1:inner, 1.1.2:inner]"
-    }
-
-    @Test
-    public void testUpdate1() {
-        def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
-        def ways = SubclassFilteredCollection.filter(ds.getWays(), SearchCompiler.compile(regexpSearch("ref=\".*1\$\"")))
-        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
-        assert mp.b.getMembersCount() == 3
-        assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer]"
-        def ways2 = SubclassFilteredCollection.filter(ds.getWays(), SearchCompiler.compile(regexpSearch("ref=1.2")))
-        def mp2 = CreateMultipolygonAction.createMultipolygonCommand(ways2 as Collection<Way>, mp.b)
-        assert mp2.b.getMembersCount() == 4
-        assert getRefToRoleMap(mp2.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer, 1.2:inner]"
-    }
-
-    @Test
-    public void testUpdate2() {
-        def ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
-        def ways = SubclassFilteredCollection.filter(ds.getWays(), SearchCompiler.compile("ref=1 OR ref:1.1.1"))
-        def mp = CreateMultipolygonAction.createMultipolygonCommand(ways as Collection<Way>, null)
-        assert getRefToRoleMap(mp.b).toString() == "[1:outer, 1.1.1:inner]"
-        def ways2 = SubclassFilteredCollection.filter(ds.getWays(), SearchCompiler.compile(regexpSearch("ref=1.1 OR ref=1.2 OR ref=1.1.2")))
-        def mp2 = CreateMultipolygonAction.createMultipolygonCommand(ways2 as Collection<Way>, mp.b)
-        assert getRefToRoleMap(mp2.b).toString() == "[1:outer, 1.1:inner, 1.1.1:outer, 1.1.2:outer, 1.2:inner]"
-    }
-}
Index: /trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.java	(revision 11104)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/CreateMultipolygonActionTest.java	(revision 11104)
@@ -0,0 +1,97 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.FileInputStream;
+import java.util.Collection;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
+import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError;
+import org.openstreetmap.josm.command.SequenceCommand;
+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.osm.Way;
+import org.openstreetmap.josm.io.OsmReader;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.tools.Pair;
+import org.openstreetmap.josm.tools.SubclassFilteredCollection;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+/**
+ * Unit test of {@link CreateMultipolygonAction}
+ */
+public class CreateMultipolygonActionTest {
+
+    /**
+     * Setup test.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().projection();
+
+    private static Map<String, String> getRefToRoleMap(Relation relation) {
+        Map<String, String> refToRole = new TreeMap<>();
+        for (RelationMember i : relation.getMembers()) {
+            refToRole.put(i.getMember().get("ref"), i.getRole());
+        }
+        return refToRole;
+    }
+
+    private static SearchSetting regexpSearch(String search) {
+        SearchSetting setting = new SearchSetting();
+        setting.text = search;
+        setting.regexSearch = true;
+        return setting;
+    }
+
+    @SuppressWarnings("unchecked")
+    private static Pair<SequenceCommand, Relation> createMultipolygonCommand(Collection<Way> ways, String pattern, Relation r)
+            throws ParseError {
+        return CreateMultipolygonAction.createMultipolygonCommand(
+            (Collection<Way>) (Collection<?>) SubclassFilteredCollection.filter(ways, SearchCompiler.compile(regexpSearch(pattern))), r);
+    }
+
+    @Test
+    public void testCreate1() throws Exception {
+        DataSet ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
+        Pair<SequenceCommand, Relation> mp = CreateMultipolygonAction.createMultipolygonCommand(ds.getWays(), null);
+        assertEquals("Sequence: Create multipolygon", mp.a.getDescriptionText());
+        assertEquals("{1=outer, 1.1=inner, 1.1.1=outer, 1.1.2=outer, 1.2=inner}", getRefToRoleMap(mp.b).toString());
+    }
+
+    @Test
+    public void testCreate2() throws Exception {
+        DataSet ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
+        Pair<SequenceCommand, Relation> mp = createMultipolygonCommand(ds.getWays(), "ref=1 OR ref:1.1.", null);
+        assertEquals("{1=outer, 1.1.1=inner, 1.1.2=inner}", getRefToRoleMap(mp.b).toString());
+    }
+
+    @Test
+    public void testUpdate1() throws Exception {
+        DataSet ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
+        Pair<SequenceCommand, Relation> mp = createMultipolygonCommand(ds.getWays(), "ref=\".*1$\"", null);
+        assertEquals(3, mp.b.getMembersCount());
+        assertEquals("{1=outer, 1.1=inner, 1.1.1=outer}", getRefToRoleMap(mp.b).toString());
+        Pair<SequenceCommand, Relation> mp2 = createMultipolygonCommand(ds.getWays(), "ref=1.2", mp.b);
+        assertEquals(4, mp2.b.getMembersCount());
+        assertEquals("{1=outer, 1.1=inner, 1.1.1=outer, 1.2=inner}", getRefToRoleMap(mp2.b).toString());
+    }
+
+    @Test
+    public void testUpdate2() throws Exception {
+        DataSet ds = OsmReader.parseDataSet(new FileInputStream(TestUtils.getTestDataRoot() + "create_multipolygon.osm"), null);
+        Pair<SequenceCommand, Relation> mp = createMultipolygonCommand(ds.getWays(), "ref=1 OR ref:1.1.1", null);
+        assertEquals("{1=outer, 1.1.1=inner}", getRefToRoleMap(mp.b).toString());
+        Pair<SequenceCommand, Relation> mp2 = createMultipolygonCommand(ds.getWays(), "ref=1.1 OR ref=1.2 OR ref=1.1.2", mp.b);
+        assertEquals("{1=outer, 1.1=inner, 1.1.1=outer, 1.1.2=outer, 1.2=inner}", getRefToRoleMap(mp2.b).toString());
+    }
+}
Index: unk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.groovy	(revision 11103)
+++ 	(revision )
@@ -1,164 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-import static org.junit.Assert.*
-
-import org.junit.Test
-
-class ChangesetCacheTest {
-
-    @Test
-    public void testConstructor() {
-        ChangesetCache cache = ChangesetCache.getInstance()
-        assert cache != null
-    }
-
-    @Test
-    public void testAddAndRemoveListeners() {
-        ChangesetCache cache = ChangesetCache.getInstance()
-        cache.clear()
-
-        // should work
-        cache.addChangesetCacheListener null
-
-        // should work
-        def listener = new ChangesetCacheListener() {
-            public void changesetCacheUpdated(ChangesetCacheEvent event) {}
-        }
-        cache.addChangesetCacheListener listener
-        // adding a second time - should work too
-        cache.addChangesetCacheListener listener
-        assert cache.@listeners.size() == 1 // ... but only added once
-
-        cache.removeChangesetCacheListener null
-
-        cache.removeChangesetCacheListener listener
-        assert cache.@listeners.size() == 0
-    }
-
-    @Test
-    public void updateGetRemoveCycle() {
-        ChangesetCache cache = ChangesetCache.getInstance()
-        cache.clear()
-
-        cache.update new Changeset(1)
-        assert cache.size() == 1
-        assert cache.get(1) != null
-        assert cache.get(1).id == 1
-        cache.remove(1)
-        assert cache.size() == 0
-    }
-
-    @Test
-    public void updateTwice() {
-        ChangesetCache cache = ChangesetCache.getInstance()
-        cache.clear()
-
-        Changeset cs = new Changeset(1)
-        cs.incomplete = false
-        cs.put "key1", "value1"
-        cs.open = true
-        cache.update cs
-
-        Changeset cs2 = new Changeset(cs)
-        assert cs2 != null
-        cs2.put "key2", "value2"
-        cs2.open = false
-        cache.update(cs2)
-
-        assert cache.size() == 1
-        assert cache.get(1) != null
-
-        cs = cache.get(1)
-        assert cs.get("key1") == "value1"
-        assert cs.get("key2") == "value2"
-        assert !cs.open
-    }
-
-
-    @Test
-    public void contains() {
-        ChangesetCache cache = ChangesetCache.getInstance()
-        cache.@listeners.clear()
-        cache.clear()
-
-
-        Changeset cs = new Changeset(1)
-        cache.update cs
-
-        assert cache.contains(1)
-        assert cache.contains(cs)
-        assert cache.contains(new Changeset(cs))
-
-        assert ! cache.contains(2)
-        assert ! cache.contains(new Changeset(2))
-        assert ! cache.contains(null)
-    }
-
-    @Test
-    public void fireingEventsAddAChangeset() {
-        ChangesetCache cache = ChangesetCache.getInstance()
-        cache.clear()
-        cache.@listeners.clear()
-
-        // should work
-        def listener = new ChangesetCacheListener() {
-                    public void changesetCacheUpdated(ChangesetCacheEvent event) {
-                        assert event != null
-                        assert event.getAddedChangesets().size() == 1
-                        assert event.getRemovedChangesets().empty
-                        assert event.getUpdatedChangesets().empty
-                        assert event.getSource() == cache
-                    }
-        }
-        cache.addChangesetCacheListener listener
-        cache.update(new Changeset(1))
-        cache.removeChangesetCacheListener listener
-    }
-
-    @Test
-    public void fireingEventsUpdateChangeset() {
-        ChangesetCache cache = ChangesetCache.getInstance()
-        cache.clear()
-        cache.@listeners.clear()
-
-        // should work
-        def listener = new ChangesetCacheListener() {
-                    public void changesetCacheUpdated(ChangesetCacheEvent event) {
-                        assert event != null
-                        assert event.getAddedChangesets().empty
-                        assert event.getRemovedChangesets().empty
-                        assert event.getUpdatedChangesets().size() == 1
-                        assert event.getSource() == cache
-                    }
-                }
-        cache.update(new Changeset(1))
-
-        cache.addChangesetCacheListener listener
-        cache.update(new Changeset(1))
-        cache.removeChangesetCacheListener listener
-    }
-
-    @Test
-    public void fireingEventsRemoveChangeset() {
-        ChangesetCache cache = ChangesetCache.getInstance()
-        cache.clear()
-        cache.@listeners.clear()
-
-        // should work
-        def listener = new ChangesetCacheListener() {
-                    public void changesetCacheUpdated(ChangesetCacheEvent event) {
-                        assert event != null
-                        assert event.getAddedChangesets().empty
-                        assert event.getRemovedChangesets().size() == 1
-                        assert event.getUpdatedChangesets().empty
-                        assert event.getSource() == cache
-                    }
-                }
-        cache.update(new Changeset(1))
-
-        cache.addChangesetCacheListener listener
-        cache.remove 1
-        cache.removeChangesetCacheListener listener
-    }
-}
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.java	(revision 11104)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.java	(revision 11104)
@@ -0,0 +1,182 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openstreetmap.josm.TestUtils;
+
+/**
+ * Unit test of {@link ChangesetCache}
+ */
+public class ChangesetCacheTest {
+
+    /**
+     * Unit test of {@link ChangesetCache#ChangesetCache}
+     */
+    @Test
+    public void testConstructor() {
+        assertNotNull(ChangesetCache.getInstance());
+    }
+
+    @SuppressWarnings("unchecked")
+    private static List<ChangesetCacheListener> getListeners(ChangesetCache cache) throws ReflectiveOperationException {
+        return (List<ChangesetCacheListener>) TestUtils.getPrivateField(cache, "listeners");
+    }
+
+    @Test
+    public void testAddAndRemoveListeners() throws ReflectiveOperationException {
+        ChangesetCache cache = ChangesetCache.getInstance();
+        cache.clear();
+
+        // should work
+        cache.addChangesetCacheListener(null);
+
+        // should work
+        ChangesetCacheListener listener = new ChangesetCacheListener() {
+            @Override
+            public void changesetCacheUpdated(ChangesetCacheEvent event) {}
+        };
+        cache.addChangesetCacheListener(listener);
+        // adding a second time - should work too
+        cache.addChangesetCacheListener(listener);
+        assertEquals(1, getListeners(cache).size()); // ... but only added once
+
+        cache.removeChangesetCacheListener(null);
+
+        cache.removeChangesetCacheListener(listener);
+        assertTrue(getListeners(cache).isEmpty());
+    }
+
+    @Test
+    public void updateGetRemoveCycle() {
+        ChangesetCache cache = ChangesetCache.getInstance();
+        cache.clear();
+
+        cache.update(new Changeset(1));
+        assertEquals(1, cache.size());
+        assertNotNull(cache.get(1));
+        assertEquals(1, cache.get(1).getId());
+        cache.remove(1);
+        assertEquals(0, cache.size());
+    }
+
+    @Test
+    public void updateTwice() {
+        ChangesetCache cache = ChangesetCache.getInstance();
+        cache.clear();
+
+        Changeset cs = new Changeset(1);
+        cs.setIncomplete(false);
+        cs.put("key1", "value1");
+        cs.setOpen(true);
+        cache.update(cs);
+
+        Changeset cs2 = new Changeset(cs);
+        assertNotNull(cs2);
+        cs2.put("key2", "value2");
+        cs2.setOpen(false);
+        cache.update(cs2);
+
+        assertEquals(1, cache.size());
+        assertNotNull(cache.get(1));
+
+        cs = cache.get(1);
+        assertEquals("value1", cs.get("key1"));
+        assertEquals("value2", cs.get("key2"));
+        assertFalse(cs.isOpen());
+    }
+
+    @Test
+    public void contains() throws ReflectiveOperationException {
+        ChangesetCache cache = ChangesetCache.getInstance();
+        getListeners(cache).clear();
+        cache.clear();
+
+        Changeset cs = new Changeset(1);
+        cache.update(cs);
+
+        assertTrue(cache.contains(1));
+        assertTrue(cache.contains(cs));
+        assertTrue(cache.contains(new Changeset(cs)));
+
+        assertFalse(cache.contains(2));
+        assertFalse(cache.contains(new Changeset(2)));
+        assertFalse(cache.contains(null));
+    }
+
+    @Test
+    public void fireingEventsAddAChangeset() throws ReflectiveOperationException {
+        ChangesetCache cache = ChangesetCache.getInstance();
+        cache.clear();
+        getListeners(cache).clear();
+
+        // should work
+        ChangesetCacheListener listener = new ChangesetCacheListener() {
+            @Override
+            public void changesetCacheUpdated(ChangesetCacheEvent event) {
+                assertNotNull(event);
+                assertEquals(1, event.getAddedChangesets().size());
+                assertTrue(event.getRemovedChangesets().isEmpty());
+                assertTrue(event.getUpdatedChangesets().isEmpty());
+                assertEquals(cache, event.getSource());
+            }
+        };
+        cache.addChangesetCacheListener(listener);
+        cache.update(new Changeset(1));
+        cache.removeChangesetCacheListener(listener);
+    }
+
+    @Test
+    public void fireingEventsUpdateChangeset() throws ReflectiveOperationException {
+        ChangesetCache cache = ChangesetCache.getInstance();
+        cache.clear();
+        getListeners(cache).clear();
+
+        // should work
+        ChangesetCacheListener listener = new ChangesetCacheListener() {
+            @Override
+            public void changesetCacheUpdated(ChangesetCacheEvent event) {
+                assertNotNull(event);
+                assertTrue(event.getAddedChangesets().isEmpty());
+                assertTrue(event.getRemovedChangesets().isEmpty());
+                assertEquals(1, event.getUpdatedChangesets().size());
+                assertEquals(cache, event.getSource());
+            }
+        };
+        cache.update(new Changeset(1));
+
+        cache.addChangesetCacheListener(listener);
+        cache.update(new Changeset(1));
+        cache.removeChangesetCacheListener(listener);
+    }
+
+    @Test
+    public void fireingEventsRemoveChangeset() throws ReflectiveOperationException {
+        ChangesetCache cache = ChangesetCache.getInstance();
+        cache.clear();
+        getListeners(cache).clear();
+
+        // should work
+        ChangesetCacheListener listener = new ChangesetCacheListener() {
+            @Override
+            public void changesetCacheUpdated(ChangesetCacheEvent event) {
+                assertNotNull(event);
+                assertTrue(event.getAddedChangesets().isEmpty());
+                assertEquals(1, event.getRemovedChangesets().size());
+                assertTrue(event.getUpdatedChangesets().isEmpty());
+                assertEquals(cache, event.getSource());
+            }
+        };
+        cache.update(new Changeset(1));
+
+        cache.addChangesetCacheListener(listener);
+        cache.remove(1);
+        cache.removeChangesetCacheListener(listener);
+    }
+}
Index: unk/test/unit/org/openstreetmap/josm/data/osm/SimplePrimitiveIdTest.groovy
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/SimplePrimitiveIdTest.groovy	(revision 11103)
+++ 	(revision )
@@ -1,61 +1,0 @@
-package org.openstreetmap.josm.data.osm
-
-class SimplePrimitiveIdTest extends GroovyTestCase {
-
-    void testNode() {
-        assert SimplePrimitiveId.fromString("node/123") == new SimplePrimitiveId(123, OsmPrimitiveType.NODE)
-        assert SimplePrimitiveId.fromString("n123") == new SimplePrimitiveId(123, OsmPrimitiveType.NODE)
-        assert SimplePrimitiveId.fromString("node123") == new SimplePrimitiveId(123, OsmPrimitiveType.NODE)
-        assert SimplePrimitiveId.fromString("n123456789123456789") == new SimplePrimitiveId(123456789123456789, OsmPrimitiveType.NODE)
-    }
-
-    void testWay() {
-        assert SimplePrimitiveId.fromString("way/123") == new SimplePrimitiveId(123, OsmPrimitiveType.WAY)
-        assert SimplePrimitiveId.fromString("w123") == new SimplePrimitiveId(123, OsmPrimitiveType.WAY)
-        assert SimplePrimitiveId.fromString("way123") == new SimplePrimitiveId(123, OsmPrimitiveType.WAY)
-        assert SimplePrimitiveId.fromString("w123456789123456789") == new SimplePrimitiveId(123456789123456789, OsmPrimitiveType.WAY)
-    }
-
-    void testRelation() {
-        assert SimplePrimitiveId.fromString("relation/123") == new SimplePrimitiveId(123, OsmPrimitiveType.RELATION)
-        assert SimplePrimitiveId.fromString("r123") == new SimplePrimitiveId(123, OsmPrimitiveType.RELATION)
-        assert SimplePrimitiveId.fromString("rel123") == new SimplePrimitiveId(123, OsmPrimitiveType.RELATION)
-        assert SimplePrimitiveId.fromString("relation123") == new SimplePrimitiveId(123, OsmPrimitiveType.RELATION)
-    }
-
-    void testBad() {
-        shouldFail { SimplePrimitiveId.fromString("foobar") }
-    }
-
-    void testFuzzy() {
-        assert SimplePrimitiveId.fuzzyParse("foo relation/123 bar").toString() == "[relation 123]"
-        assert SimplePrimitiveId.fuzzyParse("foo relation/123 and way/345 but also node/789").toString() == "[relation 123, way 345, node 789]"
-        assert SimplePrimitiveId.fuzzyParse("foo relation/123-24 and way/345-346 but also node/789").toString() == "[relation 123, relation 124, way 345, way 346, node 789]"
-    }
-
-    void testFromCopyAction() {
-        assert SimplePrimitiveId.fromString("node 123") == new SimplePrimitiveId(123, OsmPrimitiveType.NODE)
-        assert SimplePrimitiveId.fromString("way 123") == new SimplePrimitiveId(123, OsmPrimitiveType.WAY)
-        assert SimplePrimitiveId.fromString("relation 123") == new SimplePrimitiveId(123, OsmPrimitiveType.RELATION)
-    }
-
-    void testMultipleIDs() {
-        assert SimplePrimitiveId.multipleFromString("node/234").toString() == "[node 234]"
-        assert SimplePrimitiveId.multipleFromString("node/234-234").toString() == "[node 234]"
-        assert SimplePrimitiveId.multipleFromString("node/2-1").toString() == "[]"
-        assert SimplePrimitiveId.multipleFromString("node/123-124").toString() == "[node 123, node 124]"
-        assert SimplePrimitiveId.multipleFromString("n/123-124").toString() == "[node 123, node 124]"
-        assert SimplePrimitiveId.multipleFromString("node123-126").toString() == "[node 123, node 124, node 125, node 126]"
-        assert SimplePrimitiveId.multipleFromString("way/123-123").toString() == "[way 123]"
-        assert SimplePrimitiveId.multipleFromString("w/123-127").toString() == "[way 123, way 124, way 125, way 126, way 127]"
-        assert SimplePrimitiveId.multipleFromString("way123-125").toString() == "[way 123, way 124, way 125]"
-        assert SimplePrimitiveId.multipleFromString("relation/123-125").toString() == "[relation 123, relation 124, relation 125]"
-        assert SimplePrimitiveId.multipleFromString("r/123-125").toString() == "[relation 123, relation 124, relation 125]"
-        assert SimplePrimitiveId.multipleFromString("relation123-125").toString() == "[relation 123, relation 124, relation 125]"
-        assert SimplePrimitiveId.multipleFromString("node/234-5").toString() == "[node 234, node 235]"
-        assert SimplePrimitiveId.multipleFromString("node/234-35").toString() == "[node 234, node 235]"
-        assert SimplePrimitiveId.multipleFromString("node/234-235").toString() == "[node 234, node 235]"
-        assert SimplePrimitiveId.multipleFromString("node/998-1001").toString() == "[node 998, node 999, node 1000, node 1001]"
-        shouldFail { SimplePrimitiveId.multipleFromString("foo node123 bar") }
-    }
-}
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/SimplePrimitiveIdTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/SimplePrimitiveIdTest.java	(revision 11104)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/SimplePrimitiveIdTest.java	(revision 11104)
@@ -0,0 +1,104 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+/**
+ * Unit tests of {@link SimplePrimitiveId} class.
+ */
+public class SimplePrimitiveIdTest {
+
+    /**
+     * Unit test of {@link SimplePrimitiveId#fromString} for nodes.
+     */
+    @Test
+    public void testFromStringNode() {
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.NODE), SimplePrimitiveId.fromString("node/123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.NODE), SimplePrimitiveId.fromString("n123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.NODE), SimplePrimitiveId.fromString("node123"));
+        assertEquals(new SimplePrimitiveId(123456789123456789L, OsmPrimitiveType.NODE), SimplePrimitiveId.fromString("n123456789123456789"));
+    }
+
+    /**
+     * Unit test of {@link SimplePrimitiveId#fromString} for ways.
+     */
+    @Test
+    public void testFromStringWay() {
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.WAY), SimplePrimitiveId.fromString("way/123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.WAY), SimplePrimitiveId.fromString("w123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.WAY), SimplePrimitiveId.fromString("way123"));
+        assertEquals(new SimplePrimitiveId(123456789123456789L, OsmPrimitiveType.WAY), SimplePrimitiveId.fromString("w123456789123456789"));
+    }
+
+    /**
+     * Unit test of {@link SimplePrimitiveId#fromString} for relations.
+     */
+    @Test
+    public void testFromStringRelation() {
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.RELATION), SimplePrimitiveId.fromString("relation/123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.RELATION), SimplePrimitiveId.fromString("r123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.RELATION), SimplePrimitiveId.fromString("rel123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.RELATION), SimplePrimitiveId.fromString("relation123"));
+    }
+
+    /**
+     * Unit test of {@link SimplePrimitiveId#fromString} for invalid input.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testFromStringBad() {
+        SimplePrimitiveId.fromString("foobar");
+    }
+
+    /**
+     * Unit test of {@link SimplePrimitiveId#fuzzyParse}.
+     */
+    @Test
+    public void testFuzzyParse() {
+        assertEquals("[relation 123]",
+                SimplePrimitiveId.fuzzyParse("foo relation/123 bar").toString());
+        assertEquals("[relation 123, way 345, node 789]",
+                SimplePrimitiveId.fuzzyParse("foo relation/123 and way/345 but also node/789").toString());
+        assertEquals("[relation 123, relation 124, way 345, way 346, node 789]",
+                SimplePrimitiveId.fuzzyParse("foo relation/123-24 and way/345-346 but also node/789").toString());
+    }
+
+    @Test
+    public void testFromCopyAction() {
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.NODE), SimplePrimitiveId.fromString("node 123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.WAY), SimplePrimitiveId.fromString("way 123"));
+        assertEquals(new SimplePrimitiveId(123, OsmPrimitiveType.RELATION), SimplePrimitiveId.fromString("relation 123"));
+    }
+
+    /**
+     * Unit test of {@link SimplePrimitiveId#multipleFromString}.
+     */
+    @Test
+    public void testMultipleFromString() {
+        assertEquals("[node 234]", SimplePrimitiveId.multipleFromString("node/234").toString());
+        assertEquals("[node 234]", SimplePrimitiveId.multipleFromString("node/234-234").toString());
+        assertEquals("[]", SimplePrimitiveId.multipleFromString("node/2-1").toString());
+        assertEquals("[node 123, node 124]", SimplePrimitiveId.multipleFromString("node/123-124").toString());
+        assertEquals("[node 123, node 124]", SimplePrimitiveId.multipleFromString("n/123-124").toString());
+        assertEquals("[node 123, node 124, node 125, node 126]", SimplePrimitiveId.multipleFromString("node123-126").toString());
+        assertEquals("[way 123]", SimplePrimitiveId.multipleFromString("way/123-123").toString());
+        assertEquals("[way 123, way 124, way 125, way 126, way 127]", SimplePrimitiveId.multipleFromString("w/123-127").toString());
+        assertEquals("[way 123, way 124, way 125]", SimplePrimitiveId.multipleFromString("way123-125").toString());
+        assertEquals("[relation 123, relation 124, relation 125]", SimplePrimitiveId.multipleFromString("relation/123-125").toString());
+        assertEquals("[relation 123, relation 124, relation 125]", SimplePrimitiveId.multipleFromString("r/123-125").toString());
+        assertEquals("[relation 123, relation 124, relation 125]", SimplePrimitiveId.multipleFromString("relation123-125").toString());
+        assertEquals("[node 234, node 235]", SimplePrimitiveId.multipleFromString("node/234-5").toString());
+        assertEquals("[node 234, node 235]", SimplePrimitiveId.multipleFromString("node/234-35").toString());
+        assertEquals("[node 234, node 235]", SimplePrimitiveId.multipleFromString("node/234-235").toString());
+        assertEquals("[node 998, node 999, node 1000, node 1001]", SimplePrimitiveId.multipleFromString("node/998-1001").toString());
+    }
+
+    /**
+     * Unit test of {@link SimplePrimitiveId#multipleFromString} for invalid data.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testMultipleFromStringBad() {
+        SimplePrimitiveId.multipleFromString("foo node123 bar");
+    }
+}
