示例#1
0
 def setUp(self):
     # need to keep references to them
     self.items = [ustr(c) for c in ("a", "b", "c")]
     self.items2 = [ustr(c) for c in ("x", "y", "z")]
     self.letters = [ustr(c) for c in string.ascii_letters]
     self.s = WeakSet(self.items)
     self.d = dict.fromkeys(self.items)
     self.obj = ustr("F")
     self.fs = WeakSet([self.obj])
 def setUp(self):
     # need to keep references to them
     self.items = [ustr(c) for c in ('a', 'b', 'c')]
     self.items2 = [ustr(c) for c in ('x', 'y', 'z')]
     self.letters = [ustr(c) for c in string.ascii_letters]
     self.s = WeakSet(self.items)
     self.d = dict.fromkeys(self.items)
     self.obj = ustr('F')
     self.fs = WeakSet([self.obj])
 def setUp(self):
     # need to keep references to them
     self.items = [ustr(c) for c in ('a', 'b', 'c')]
     self.items2 = [ustr(c) for c in ('x', 'y', 'z')]
     self.letters = [ustr(c) for c in string.ascii_letters]
     self.s = WeakSet(self.items)
     self.d = dict.fromkeys(self.items)
     self.obj = ustr('F')
     self.fs = WeakSet([self.obj])
 def testcontext():
     try:
         it = iter(s)
         yielded = ustr(str(next(it)))
         u = ustr(str(items.pop()))
         if yielded == u:
             next(it)
         gc.collect()
         yield u
     finally:
         it = None
示例#5
0
 def testcontext():
     try:
         it = iter(s)
         # Start iterator
         yielded = ustr(str(next(it)))
         # Schedule an item for removal and recreate it
         u = ustr(str(items.pop()))
         if yielded == u:
             # The iterator still has a reference to the removed item,
             # advance it (issue #20006).
             next(it)
         gc.collect()      # just in case
         yield u
     finally:
         it = None           # should commit all removals
示例#6
0
 def testcontext():
     try:
         it = iter(s)
         # Start iterator
         yielded = ustr(str(next(it)))
         # Schedule an item for removal and recreate it
         u = ustr(str(items.pop()))
         if yielded == u:
             # The iterator still has a reference to the removed item,
             # advance it (issue #20006).
             next(it)
         gc.collect()      # just in case
         yield u
     finally:
         it = None           # should commit all removals
    def test_weak_destroy_and_mutate_while_iterating(self):
        # Issue #7105: iterators shouldn't crash when a key is implicitly removed
        items = [ustr(c) for c in string.ascii_letters]
        s = WeakSet(items)
        @contextlib.contextmanager
        def testcontext():
            try:
                it = iter(s)
                next(it)
                del it
                # Schedule an item for removal and recreate it
                u = ustr(str(items.pop()))
                gc.collect()      # just in case
                yield u
            finally:
                it = None           # should commit all removals

        with testcontext() as u:
            self.assertNotIn(u, s)
        with testcontext() as u:
            self.assertRaises(KeyError, s.remove, u)
        self.assertNotIn(u, s)
        with testcontext() as u:
            s.add(u)
        self.assertIn(u, s)
        t = s.copy()
        with testcontext() as u:
            s.update(t)
        self.assertEqual(len(s), len(t))
        with testcontext() as u:
            s.clear()
        self.assertEqual(len(s), 0)
示例#8
0
 def test_contains(self):
     for c in self.letters:
         self.assertEqual(c in self.s, c in self.d)
     self.assertRaises(TypeError, self.s.__contains__, [[]])
     self.assert_(self.obj in self.fs)
     del self.obj
     self.assert_(ustr('F') not in self.fs)
示例#9
0
    def test_weak_destroy_and_mutate_while_iterating(self):
        # Issue #7105: iterators shouldn't crash when a key is implicitly removed
        items = [ustr(c) for c in string.ascii_letters]
        s = WeakSet(items)
        @contextlib.contextmanager
        def testcontext():
            try:
                it = iter(s)
                next(it)
                del it
                # Schedule an item for removal and recreate it
                u = ustr(str(items.pop()))
                gc.collect()      # just in case
                yield u
            finally:
                it = None           # should commit all removals

        with testcontext() as u:
            self.assertNotIn(u, s)
        with testcontext() as u:
            self.assertRaises(KeyError, s.remove, u)
        self.assertNotIn(u, s)
        with testcontext() as u:
            s.add(u)
        self.assertIn(u, s)
        t = s.copy()
        with testcontext() as u:
            s.update(t)
        self.assertEqual(len(s), len(t))
        with testcontext() as u:
            s.clear()
        self.assertEqual(len(s), 0)
示例#10
0
 def test_contains(self):
     for c in self.letters:
         self.assertEqual(c in self.s, c in self.d)
     self.assertNotIn(1, self.s)
     self.assertIn(self.obj, self.fs)
     del self.obj
     self.assertNotIn(ustr('F'), self.fs)
示例#11
0
    def test_weak_destroy_and_mutate_while_iterating(self):
        items = [ustr(c) for c in string.ascii_letters]
        s = WeakSet(items)

        @contextlib.contextmanager
        def testcontext():
            try:
                it = iter(s)
                yielded = ustr(str(next(it)))
                u = ustr(str(items.pop()))
                if yielded == u:
                    next(it)
                gc.collect()
                yield u
            finally:
                it = None

        with testcontext() as u:
            self.assertNotIn(u, s)
        with testcontext() as u:
            self.assertRaises(KeyError, s.remove, u)
        self.assertNotIn(u, s)
        with testcontext() as u:
            s.add(u)
        self.assertIn(u, s)
        t = s.copy()
        with testcontext() as u:
            s.update(t)
        self.assertEqual(len(s), len(t))
        with testcontext() as u:
            s.clear()
        self.assertEqual(len(s), 0)
示例#12
0
 def test_contains(self):
     for c in self.letters:
         self.assertEqual(c in self.s, c in self.d)
     self.assertRaises(TypeError, self.s.__contains__, [[]])
     self.assert_(self.obj in self.fs)
     del self.obj
     self.assert_(ustr("F") not in self.fs)
示例#13
0
 def test_contains(self):
     for c in self.letters:
         self.assertEqual(c in self.s, c in self.d)
     self.assertRaises(TypeError, self.s.__contains__, [[]])
     self.assertIn(self.obj, self.fs)
     del self.obj
     self.assertNotIn(ustr('F'), self.fs)
示例#14
0
 def test_contains(self):
     for c in self.letters:
         self.assertEqual(c in self.s, c in self.d)
     # 1 is not weakref'able, but that TypeError is caught by __contains__
     self.assertNotIn(1, self.s)
     self.assertIn(self.obj, self.fs)
     del self.obj
     self.assertNotIn(ustr('F'), self.fs)
示例#15
0
 def test_contains(self):
     for c in self.letters:
         self.assertEqual(c in self.s, c in self.d)
     # 1 is not weakref'able, but that TypeError is caught by __contains__
     self.assertNotIn(1, self.s)
     self.assertIn(self.obj, self.fs)
     del self.obj
     self.assertNotIn(ustr('F'), self.fs)
示例#16
0
 def test_contains(self):
     for c in self.letters:
         self.assertEqual(c in self.s, c in self.d)
     # 1 is not weakref'able, but that TypeError is caught by __contains__
     self.assertNotIn(1, self.s)
     self.assertIn(self.obj, self.fs)
     del self.obj
     support.gc_collect()  # For PyPy or other GCs.
     self.assertNotIn(ustr('F'), self.fs)
示例#17
0
def test_weakref_hash():
    from collections import UserString as ustr
    from weakref import ref
    import gc

    o1 = ustr('a')
    o2 = ustr('a')
    o3 = ustr('b')
    r1 = ref(o1)
    r2 = ref(o2)
    r3 = ref(o3)
    r1_hash = hash(r1)
    assert hash(o1) == hash(r1)
    assert hash(o2) == hash(r2)
    assert hash(r1) == hash(r2)

    # we need a function that calls 'hash' otherwise 'hash' is inlined and will specialize differently
    def do_hash(item):
        return hash(item)

    o1 = None
    o2 = None
    o3 = None

    # let them die

    # try hard to collect the two objects but avoid infinite loop
    i = 0
    while not (r1() is None and r3() is None) and i < 10000:
        gc.collect()
        i += 1

    # We still cannot guarantee that the objects were collected; so avoid introducing transient errors and just do
    # not test if they weren't collected.
    if r1() is None and r3() is None:
        try:
            # it's important that we've never computed the has for r3 before
            do_hash(r3)
        except TypeError as e:
            pass
        else:
            assert False, "could compute hash for r3 but should have failed"

        assert r1_hash == do_hash(r1)
示例#18
0
 def testcontext():
     try:
         it = iter(s)
         next(it)
         # Schedule an item for removal and recreate it
         u = ustr(str(items.pop()))
         gc.collect()  # just in case
         yield u
     finally:
         it = None  # should commit all removals
示例#19
0
 def test_weak_destroy_while_iterating(self):
     items = [ustr(c) for c in ('a', 'b', 'c')]
     s = WeakSet(items)
     it = iter(s)
     next(it)
     del items[-1]
     gc.collect()
     self.assertIn(len(list(it)), [len(items), len(items) - 1])
     del it
     self.assertEqual(len(s), len(items))
 def testcontext():
     try:
         it = iter(s)
         next(it)
         # Schedule an item for removal and recreate it
         u = ustr(str(items.pop()))
         gc.collect()  # just in case
         yield u
     finally:
         it = None  # should commit all removals
示例#21
0
 def test_add(self):
     x = ustr('Q')
     self.s.add(x)
     self.assertIn(x, self.s)
     dup = self.s.copy()
     self.s.add(x)
     self.assertEqual(self.s, dup)
     self.assertRaises(TypeError, self.s.add, [])
     self.fs.add(Foo())
     self.assertTrue(len(self.fs) == 1)
     self.fs.add(self.obj)
     self.assertTrue(len(self.fs) == 1)
示例#22
0
 def test_add(self):
     x = ustr("Q")
     self.s.add(x)
     self.assert_(x in self.s)
     dup = self.s.copy()
     self.s.add(x)
     self.assertEqual(self.s, dup)
     self.assertRaises(TypeError, self.s.add, [])
     self.fs.add(Foo())
     self.assert_(len(self.fs) == 1)
     self.fs.add(self.obj)
     self.assert_(len(self.fs) == 1)
示例#23
0
 def test_add(self):
     x = ustr('Q')
     self.s.add(x)
     self.assertIn(x, self.s)
     dup = self.s.copy()
     self.s.add(x)
     self.assertEqual(self.s, dup)
     self.assertRaises(TypeError, self.s.add, [])
     self.fs.add(Foo())
     self.assertTrue(len(self.fs) == 1)
     self.fs.add(self.obj)
     self.assertTrue(len(self.fs) == 1)
示例#24
0
 def test_add(self):
     x = ustr('Q')
     self.s.add(x)
     self.assertIn(x, self.s)
     dup = self.s.copy()
     self.s.add(x)
     self.assertEqual(self.s, dup)
     self.assertRaises(TypeError, self.s.add, [])
     self.fs.add(Foo())
     support.gc_collect()  # For PyPy or other GCs.
     self.assertTrue(len(self.fs) == 1)
     self.fs.add(self.obj)
     self.assertTrue(len(self.fs) == 1)
示例#25
0
 def test_add(self):
     x = ustr('Q')
     self.s.add(x)
     self.assertIn(x, self.s)
     dup = self.s.copy()
     self.s.add(x)
     self.assertEqual(self.s, dup)
     self.assertRaises(TypeError, self.s.add, [])
     self.fs.add(Foo())
     gc.collect()  # required for IronPython
     self.assertTrue(len(self.fs) == 1)
     self.fs.add(self.obj)
     self.assertTrue(len(self.fs) == 1)
示例#26
0
 def test_weak_destroy_while_iterating(self):
     # Issue #7105: iterators shouldn't crash when a key is implicitly removed
     # Create new items to be sure no-one else holds a reference
     items = [ustr(c) for c in ('a', 'b', 'c')]
     s = WeakSet(items)
     it = iter(s)
     next(it)             # Trigger internal iteration
     # Destroy an item
     del items[-1]
     gc.collect()    # just in case
     # We have removed either the first consumed items, or another one
     self.assertIn(len(list(it)), [len(items), len(items) - 1])
     del it
     # The removal has been committed
     self.assertEqual(len(s), len(items))
示例#27
0
 def test_weak_destroy_while_iterating(self):
     # Issue #7105: iterators shouldn't crash when a key is implicitly removed
     # Create new items to be sure no-one else holds a reference
     items = [ustr(c) for c in ('a', 'b', 'c')]
     s = WeakSet(items)
     it = iter(s)
     next(it)             # Trigger internal iteration
     # Destroy an item
     del items[-1]
     gc.collect()    # just in case
     # We have removed either the first consumed items, or another one
     self.assertIn(len(list(it)), [len(items), len(items) - 1])
     del it
     # The removal has been committed
     self.assertEqual(len(s), len(items))
示例#28
0
 def setUp(self):
     self.items = [ustr(c) for c in ('a', 'b', 'c')]
     self.items2 = [ustr(c) for c in ('x', 'y', 'z')]
     self.ab_items = [ustr(c) for c in 'ab']
     self.abcde_items = [ustr(c) for c in 'abcde']
     self.def_items = [ustr(c) for c in 'def']
     self.ab_weakset = WeakSet(self.ab_items)
     self.abcde_weakset = WeakSet(self.abcde_items)
     self.def_weakset = WeakSet(self.def_items)
     self.letters = [ustr(c) for c in string.ascii_letters]
     self.s = WeakSet(self.items)
     self.d = dict.fromkeys(self.items)
     self.obj = ustr('F')
     self.fs = WeakSet([self.obj])
 def test_sub_and_super(self):
     pl, ql, rl = map(lambda s: [ustr(c) for c in s], ['ab', 'abcde', 'def'])
     p, q, r = map(WeakSet, (pl, ql, rl))
     self.assert_(p < q)
     self.assert_(p <= q)
     self.assert_(q <= q)
     self.assert_(q > p)
     self.assert_(q >= p)
     self.failIf(q < r)
     self.failIf(q <= r)
     self.failIf(q > r)
     self.failIf(q >= r)
     self.assert_(set('a').issubset('abc'))
     self.assert_(set('abc').issuperset('a'))
     self.failIf(set('a').issubset('cbs'))
     self.failIf(set('cbs').issuperset('a'))
示例#30
0
 def test_sub_and_super(self):
     pl, ql, rl = map(lambda s: [ustr(c) for c in s], ["ab", "abcde", "def"])
     p, q, r = map(WeakSet, (pl, ql, rl))
     self.assert_(p < q)
     self.assert_(p <= q)
     self.assert_(q <= q)
     self.assert_(q > p)
     self.assert_(q >= p)
     self.failIf(q < r)
     self.failIf(q <= r)
     self.failIf(q > r)
     self.failIf(q >= r)
     self.assert_(set("a").issubset("abc"))
     self.assert_(set("abc").issuperset("a"))
     self.failIf(set("a").issubset("cbs"))
     self.failIf(set("cbs").issuperset("a"))
 def test_sub_and_super(self):
     pl, ql, rl = map(lambda s: [ustr(c) for c in s], ['ab', 'abcde', 'def'])
     p, q, r = map(WeakSet, (pl, ql, rl))
     self.assertTrue(p < q)
     self.assertTrue(p <= q)
     self.assertTrue(q <= q)
     self.assertTrue(q > p)
     self.assertTrue(q >= p)
     self.assertFalse(q < r)
     self.assertFalse(q <= r)
     self.assertFalse(q > r)
     self.assertFalse(q >= r)
     self.assertTrue(set('a').issubset('abc'))
     self.assertTrue(set('abc').issuperset('a'))
     self.assertFalse(set('a').issubset('cbs'))
     self.assertFalse(set('cbs').issuperset('a'))
示例#32
0
 def test_discard(self):
     a, q = ustr('a'), ustr('Q')
     self.s.discard(a)
     self.assertNotIn(a, self.s)
     self.s.discard(q)
     self.assertRaises(TypeError, self.s.discard, [])
示例#33
0
 def test_remove(self):
     x = ustr('a')
     self.s.remove(x)
     self.assertNotIn(x, self.s)
     self.assertRaises(KeyError, self.s.remove, x)
     self.assertRaises(TypeError, self.s.remove, [])
示例#34
0
 def test_discard(self):
     a, q = ustr("a"), ustr("Q")
     self.s.discard(a)
     self.assert_(a not in self.s)
     self.s.discard(q)
     self.assertRaises(TypeError, self.s.discard, [])
示例#35
0
 def test_discard(self):
     a, q = ustr('a'), ustr('Q')
     self.s.discard(a)
     self.assertNotIn(a, self.s)
     self.s.discard(q)
     self.assertRaises(TypeError, self.s.discard, [])
示例#36
0
 def test_remove(self):
     x = ustr('a')
     self.s.remove(x)
     self.assertTrue(x not in self.s)
     self.assertRaises(KeyError, self.s.remove, x)
     self.assertRaises(TypeError, self.s.remove, [])
示例#37
0
 def test_discard(self):
     a, q = ustr('a'), ustr('Q')
     self.s.discard(a)
     self.assertTrue(a not in self.s)
     self.s.discard(q)
     self.assertRaises(TypeError, self.s.discard, [])
示例#38
0
 def test_remove(self):
     x = ustr("a")
     self.s.remove(x)
     self.assert_(x not in self.s)
     self.assertRaises(KeyError, self.s.remove, x)
     self.assertRaises(TypeError, self.s.remove, [])
示例#39
0
 def test_remove(self):
     x = ustr('a')
     self.s.remove(x)
     self.assertNotIn(x, self.s)
     self.assertRaises(KeyError, self.s.remove, x)
     self.assertRaises(TypeError, self.s.remove, [])