Index: trunk/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandling.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandling.java	(revision 2482)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/OsmPrimitiveKeyHandling.java	(revision 2482)
@@ -0,0 +1,147 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openstreetmap.josm.data.coor.LatLon;
+
+/**
+ * Some unit test cases for basic tag management on {@see OsmPrimitive}. Uses
+ * {@see Node} for the tests, {@see OsmPrimitive} is abstract.
+ * 
+ */
+public class OsmPrimitiveKeyHandling {
+
+    /**
+     * test query and get methods on a node withouth keys
+     */
+    @Test
+    public void emptyNode() {
+        Node n = new Node();
+        assertTrue(n.getKeys().size() == 0);
+        assertTrue(!n.hasKeys());
+        assertTrue(!n.hasKey("nosuchkey"));
+        assertTrue(n.keySet().isEmpty());
+        assertTrue(n.entrySet().isEmpty());
+
+        n.remove("nosuchkey"); // should work
+    }
+
+    /**
+     * Add a tag to an empty node and test the query and get methods.
+     * 
+     */
+    @Test
+    public void put() {
+        Node n = new Node();
+        n.put("akey", "avalue");
+        assertTrue(n.get("akey").equals("avalue"));
+        assertTrue(n.getKeys().size() == 1);
+
+        assertTrue(n.keySet().size() == 1);
+        assertTrue(n.keySet().contains("akey"));
+        assertTrue(n.entrySet().size() == 1);
+        assertTrue(n.entrySet().iterator().next().getKey().equals("akey"));
+        assertTrue(n.entrySet().iterator().next().getValue().equals("avalue"));
+    }
+
+    /**
+     * Add two tags to an empty node and test the query and get methods.
+     */
+    @Test
+    public void put2() {
+        Node n = new Node();
+        n.put("key.1", "value.1");
+        n.put("key.2", "value.2");
+        assertTrue(n.get("key.1").equals("value.1"));
+        assertTrue(n.get("key.2").equals("value.2"));
+        assertTrue(n.getKeys().size() == 2);
+        assertTrue(n.hasKeys());
+        assertTrue(n.hasKey("key.1"));
+        assertTrue(n.hasKey("key.2"));
+        assertTrue(!n.hasKey("nosuchkey"));
+    }
+
+    /**
+     * Remove tags from a node with two tags and test the state of the node.
+     * 
+     */
+    @Test
+    public void remove() {
+        Node n = new Node();
+        n.put("key.1", "value.1");
+        n.put("key.2", "value.2");
+
+        n.remove("nosuchkey");               // should work
+        assertTrue(n.getKeys().size() == 2); // still 2 tags ?
+
+        n.remove("key.1");
+        assertTrue(n.getKeys().size() == 1);
+        assertTrue(!n.hasKey("key.1"));
+        assertTrue(n.get("key.1") == null);
+        assertTrue(n.hasKey("key.2"));
+        assertTrue(n.get("key.2").equals("value.2"));
+
+        n.remove("key.2");
+        assertTrue(n.getKeys().size() == 0);
+        assertTrue(!n.hasKey("key.1"));
+        assertTrue(n.get("key.1") == null);
+        assertTrue(!n.hasKey("key.2"));
+        assertTrue(n.get("key.2") == null);
+    }
+
+    /**
+     * Remove all tags from a node
+     * 
+     */
+    @Test
+    public void removeAll() {
+        Node n = new Node();
+
+        n.put("key.1", "value.1");
+        n.put("key.2", "value.2");
+
+        n.removeAll();
+        assertTrue(n.getKeys().size() == 0);
+    }
+
+    /**
+     * Test hasEqualSemanticAttributes on two nodes whose identical tags are added
+     * in different orders.
+     */
+    @Test
+    public void hasEqualSemanticAttributes() {
+        Node n1 = new Node(1);
+        n1.setCoor(new LatLon(0,0));
+        n1.put("key.1", "value.1");
+        n1.put("key.2", "value.2");
+
+        Node n2 = new Node(1);
+        n2.setCoor(new LatLon(0,0));
+        n2.put("key.2", "value.2");
+        n2.put("key.1", "value.1");
+
+        assertTrue(n1.hasEqualSemanticAttributes(n2));
+    }
+
+    /**
+     * Test hasEqualSemanticAttributes on two nodes with different tags.
+     */
+
+    @Test
+    public void hasEqualSemanticAttributes_2() {
+        Node n1 = new Node(1);
+        n1.setCoor(new LatLon(0,0));
+        n1.put("key.1", "value.1");
+        n1.put("key.2", "value.3");
+
+        Node n2 = new Node(1);
+        n2.setCoor(new LatLon(0,0));
+        n2.put("key.1", "value.1");
+        n2.put("key.2", "value.4");
+
+        assertTrue(!n1.hasEqualSemanticAttributes(n2));
+    }
+
+}
