X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/8ebc32d8616aeac9892d20cebfbdc1b531b29d2c..e7054c9275c9a4a5d0d677ab027e0c710b24df73:/t/testutils.py diff --git a/t/testutils.py b/t/testutils.py index 42bbd76..67bcc0e 100644 --- a/t/testutils.py +++ b/t/testutils.py @@ -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") @@ -83,10 +99,9 @@ def prep_lenseq(w, n, bigendp, goodp): span(n) + \ byteseq([0xff]) -Z64 = C.ByteString.zero(8) def detrand(seed): """Return a fast deterministic random generator with the given SEED.""" - return C.chacha8rand(C.sha256().hash(bin(seed)).done(), Z64) + return C.chacha8rand(C.sha256().hash(bin(seed)).done()) class GenericTestMixin (U.TestCase): """ @@ -127,24 +142,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 +233,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) @@ -165,8 +250,8 @@ class MutableMappingTestMixin (ImmutableMappingTextMixin): model.update({ 2: 212, 6: 606, 7: 707 }) map.update({ me._mkkey(2): me._mkvalue(212), - me._mkkey(6): me._mkvalue(606), - me._mkkey(7): me._mkvalue(707) }) + me._mkkey(6): me._mkvalue(606) }, + **{ me._mkkey(7): me._mkvalue(707) }) check_views() model[9] = 909