Port to Python 3.
[catacomb-python] / t / testutils.py
index b63a902..0ba49c6 100644 (file)
@@ -37,17 +37,33 @@ import unittest as U
 ### Main code.
 
 ## Some compatibility hacks.
-import itertools as I
-def bin(x): return x
-range = xrange
-long = long
-imap = I.imap
-def byteseq(seq): return "".join(map(chr, seq))
-def iterkeys(m): return m.iterkeys()
-def itervalues(m): return m.itervalues()
-def iteritems(m): return m.iteritems()
-from cStringIO import StringIO
-MAXFIXNUM = SYS.maxint
+if SYS.version_info >= (3,):
+  PY2, PY3 = False, True
+  def bin(x): return x.encode('iso8859-1')
+  def py23(x, y): return y
+  range = range
+  byteseq = bytes
+  long = int
+  imap = map
+  def iterkeys(m): return m.keys()
+  def itervalues(m): return m.values()
+  def iteritems(m): return m.items()
+  from io import StringIO
+  MAXFIXNUM = SYS.maxsize
+else:
+  import itertools as I
+  PY2, PY3 = True, False
+  def bin(x): return x
+  def py23(x, y): return x
+  range = xrange
+  long = long
+  imap = I.imap
+  def byteseq(seq): return "".join(map(chr, seq))
+  def iterkeys(m): return m.iterkeys()
+  def itervalues(m): return m.itervalues()
+  def iteritems(m): return m.iteritems()
+  from cStringIO import StringIO
+  MAXFIXNUM = SYS.maxint
 
 DEBUGP = hasattr(SYS, "gettotalrefcount")
 
@@ -127,24 +143,86 @@ class ImmutableMappingTextMixin (U.TestCase):
       any = True
       if k >= limk: limk = k + 1
       me.assertTrue(me._mkkey(k) in map)
-      me.assertTrue(map.has_key(me._mkkey(k)))
+      if PY2: me.assertTrue(map.has_key(me._mkkey(k)))
       me.assertEqual(me._getvalue(map[me._mkkey(k)]), v)
       me.assertEqual(me._getvalue(map.get(me._mkkey(k))), v)
     if any: me.assertTrue(me._mkkey(k) in map)
-    me.assertFalse(map.has_key(me._mkkey(limk)))
+    if PY2: me.assertFalse(map.has_key(me._mkkey(limk)))
     me.assertRaises(KeyError, lambda: map[me._mkkey(limk)])
     me.assertEqual(map.get(me._mkkey(limk)), None)
-    for listfn, getfn in [(lambda x: x.keys(), me._getkey),
-                          (lambda x: x.values(), me._getvalue),
-                          (lambda x: x.items(), me._getitem)]:
-      rlist, mlist = listfn(map), listfn(model)
-      me.assertEqual(type(rlist), list)
-      rlist = B.map(getfn, rlist)
-      rlist.sort(); mlist.sort(); me.assertEqual(rlist, mlist)
-    for iterfn, getfn in [(lambda x: x.iterkeys(), me._getkey),
-                          (lambda x: x.itervalues(), me._getvalue),
-                          (lambda x: x.iteritems(), me._getitem)]:
-      me.assertEqual(set(imap(getfn, iterfn(map))), set(iterfn(model)))
+
+    if PY3:
+      empty = set()
+
+      for k, v in iteritems(map):
+        me.assertTrue(k in map.keys())
+        me.assertTrue((k, v) in map.items())
+      me.assertFalse(me._mkkey(limk) in map.keys())
+
+      for viewfn, getfn in [(lambda x: x.keys(), me._getkey),
+                            (lambda x: x.items(), me._getitem)]:
+        rview, rview2, mview = viewfn(map), viewfn(map), viewfn(model)
+        me.assertEqual(set(imap(getfn, rview)), set(mview))
+        me.assertEqual(rview, rview2)
+        me.assertEqual(rview, set(rview2))
+        me.assertEqual(rview | empty, set(rview))
+        me.assertEqual(rview | rview2, set(rview))
+        me.assertEqual(rview ^ empty, set(rview))
+        me.assertEqual(rview ^ rview, empty)
+        me.assertEqual(rview & empty, empty)
+        me.assertEqual(len(rview), len(model))
+
+        if any: subset = set(rview2); subset.pop()
+        superset = set(rview2); superset.add(object())
+
+        me.assertFalse(rview < rview2)
+        me.assertTrue(rview < superset)
+        me.assertFalse(superset < rview)
+        me.assertFalse(rview < empty)
+        if any:
+          me.assertTrue(empty < rview)
+          me.assertTrue(subset < rview)
+          me.assertFalse(rview < subset)
+
+        me.assertTrue(rview <= rview2)
+        me.assertTrue(rview <= superset)
+        me.assertFalse(superset <= rview)
+        if any:
+          me.assertTrue(empty <= rview)
+          me.assertFalse(rview <= empty)
+          me.assertTrue(subset <= rview)
+          me.assertFalse(rview <= subset)
+
+        me.assertTrue(rview >= rview2)
+        me.assertTrue(superset >= rview)
+        me.assertFalse(rview >= superset)
+        if any:
+          me.assertTrue(rview >= empty)
+          me.assertFalse(empty >= rview)
+          me.assertTrue(rview >= subset)
+          me.assertFalse(subset >= rview)
+
+        me.assertFalse(rview > rview2)
+        me.assertTrue(superset > rview)
+        me.assertFalse(rview > superset)
+        me.assertFalse(empty > rview)
+        if any:
+          me.assertTrue(rview > empty)
+          me.assertTrue(rview > subset)
+          me.assertFalse(subset > rview)
+
+    else:
+      for listfn, getfn in [(lambda x: x.keys(), me._getkey),
+                            (lambda x: x.values(), me._getvalue),
+                            (lambda x: x.items(), me._getitem)]:
+        rlist, mlist = listfn(map), listfn(model)
+        me.assertEqual(type(rlist), list)
+        rlist = B.map(getfn, rlist)
+        rlist.sort(); mlist.sort(); me.assertEqual(rlist, mlist)
+      for iterfn, getfn in [(lambda x: x.iterkeys(), me._getkey),
+                            (lambda x: x.itervalues(), me._getvalue),
+                            (lambda x: x.iteritems(), me._getitem)]:
+        me.assertEqual(set(imap(getfn, iterfn(map))), set(iterfn(model)))
 
 class MutableMappingTestMixin (ImmutableMappingTextMixin):
 
@@ -156,8 +234,16 @@ class MutableMappingTestMixin (ImmutableMappingTextMixin):
     map = emptymapfn()
     me.assertEqual(len(map), 0)
 
-    def check_views():
-      me.check_immutable_mapping(map, model)
+    if not PY3:
+      def check_views():
+        me.check_immutable_mapping(map, model)
+    else:
+      kview, iview, vview = map.keys(), map.items(), map.values()
+      def check_views():
+        me.check_immutable_mapping(map, model)
+        me.assertEqual(set(imap(me._getkey, kview)), model.keys())
+        me.assertEqual(set(imap(me._getitem, iview)), model.items())
+        me.assertEqual(set(imap(me._getvalue, vview)), set(model.values()))
 
     model = { 1: 101, 2: 202, 4: 404 }
     for k, v in iteritems(model): map[me._mkkey(k)] = me._mkvalue(v)