Added insert_after, insert_before, insert_first and insert_last
authorJoel Rosdahl <joel@rosdahl.net>
Fri, 16 Dec 2005 22:16:47 +0000 (22:16 +0000)
committerJoel Rosdahl <joel@rosdahl.net>
Fri, 16 Dec 2005 22:16:47 +0000 (22:16 +0000)
methods to InsertionOrderedMapping.

src/packages/kofoto/insertionorderedmapping.py
src/test/iomtests.py

index 3215a70..81c8e97 100644 (file)
@@ -122,6 +122,24 @@ class InsertionOrderedMapping:
     def has_key(self, key):
         return self._map.has_key(key)
 
+    def insert_after(self, refkey, key, value):
+        self._insert_after_or_before(refkey, key, value, True)
+
+    def insert_before(self, refkey, key, value):
+        self._insert_after_or_before(refkey, key, value, False)
+
+    def insert_first(self, key, value):
+        self[key] = value
+
+    def insert_last(self, key, value):
+        if key in self._map:
+            node = self._map[key][0]
+            node.unlink()
+        else:
+            node = _KeyListNode(key)
+        self._map[key] = (node, value)
+        node.insert_before(self._keylist_tail)
+
     def items(self):
         return list(self.iteritems())
 
@@ -196,3 +214,17 @@ class InsertionOrderedMapping:
 
     def values(self):
         return list(self.itervalues())
+
+    def _insert_after_or_before(self, refkey, key, value, after):
+        refnode = self._map[refkey][0]
+        if refkey == key:
+            self._map[refkey] = (refnode, value)
+        else:
+            if key in self._map:
+                del self[key]
+            node = _KeyListNode(key)
+            self._map[key] = (node, value)
+            if after:
+                node.insert_after(refnode)
+            else:
+                node.insert_before(refnode)
index 6905d58..1e86be2 100644 (file)
@@ -79,9 +79,11 @@ class TestInsertionOrderedMapping(unittest.TestCase):
 
     def test___setitem__(self):
         self.iom[0] = "-"
-        assert self.iom.keys() == [0, 2, 3, 1]
+        assert self.iom.items() == [
+            (0, "-"), (2, "b"), (3, "c"), (1, "a")]
         self.iom[4] = "d"
-        assert self.iom.keys() == [4, 0, 2, 3, 1]
+        assert self.iom.items() == [
+            (4, "d"), (0, "-"), (2, "b"), (3, "c"), (1, "a")]
 
     def test_clear(self):
         self.iom.clear()
@@ -106,6 +108,60 @@ class TestInsertionOrderedMapping(unittest.TestCase):
         assert self.iom.has_key(2)
         assert self.iom.has_key(3)
 
+    def test_insert_after(self):
+        self.iom.insert_after(1, 1, "z")
+        assert self.iom.items() == [(2, "b"), (3, "c"), (1, "z")]
+        assert len(self.iom) == 3
+        self.iom.insert_after(2, 0, "x")
+        assert self.iom.items() == [(2, "b"), (0, "x"), (3, "c"), (1, "z")]
+        assert len(self.iom) == 4
+        self.iom.insert_after(1, 0, "y")
+        assert self.iom.items() == [(2, "b"), (3, "c"), (1, "z"), (0, "y")]
+        assert len(self.iom) == 4
+        try:
+            self.iom.insert_after(5, 1, "a")
+        except KeyError:
+            pass
+        else:
+            assert False
+        assert self.iom.items() == [(2, "b"), (3, "c"), (1, "z"), (0, "y")]
+        assert len(self.iom) == 4
+
+    def test_insert_before(self):
+        self.iom.insert_before(1, 1, "z")
+        assert self.iom.items() == [(2, "b"), (3, "c"), (1, "z")]
+        assert len(self.iom) == 3
+        self.iom.insert_before(2, 0, "x")
+        assert self.iom.items() == [(0, "x"), (2, "b"), (3, "c"), (1, "z")]
+        assert len(self.iom) == 4
+        self.iom.insert_before(1, 0, "y")
+        assert self.iom.items() == [(2, "b"), (3, "c"), (0, "y"), (1, "z")]
+        assert len(self.iom) == 4
+        try:
+            self.iom.insert_before(5, 1, "a")
+        except KeyError:
+            pass
+        else:
+            assert False
+        assert self.iom.items() == [(2, "b"), (3, "c"), (0, "y"), (1, "z")]
+        assert len(self.iom) == 4
+
+    def test_insert_first(self):
+        self.iom.insert_first(0, "-")
+        assert self.iom.items() == [
+            (0, "-"), (2, "b"), (3, "c"), (1, "a")]
+        self.iom.insert_first(4, "d")
+        assert self.iom.items() == [
+            (4, "d"), (0, "-"), (2, "b"), (3, "c"), (1, "a")]
+
+    def test_insert_last(self):
+        self.iom.insert_last(0, "-")
+        assert self.iom.items() == [
+            (2, "b"), (3, "c"), (1, "a"), (0, "-")]
+        self.iom.insert_last(4, "d")
+        assert self.iom.items() == [
+            (2, "b"), (3, "c"), (1, "a"), (0, "-"), (4, "d")]
+
     def test_items(self):
         assert self.iom.items() == [(2, "b"), (3, "c"), (1, "a")]