Skip to content

Commit bcdaaac

Browse files
organize testcases
1 parent cf9b237 commit bcdaaac

1 file changed

Lines changed: 27 additions & 39 deletions

File tree

Lib/test/test_weakref.py

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -538,57 +538,45 @@ class MyObj:
538538
with self.assertRaises(TypeError):
539539
hash(weakref.proxy(obj))
540540

541-
def test_proxy_unref_add_refcount(self):
542-
class C:
543-
def __add__(self, o):
544-
return NotImplemented
545-
546-
# create dead proxy
547-
o = C()
541+
def _assert_no_proxy_refcount_leak(self, make_class, do_op, op_name):
542+
"""Helper: verify a proxy operation doesn't leak."""
543+
# Create dead proxy
544+
o = make_class()
548545
dead = weakref.proxy(o)
549546
del o
550547
gc.collect()
551-
552-
# create live proxy
553-
obj = C()
548+
549+
# Create live proxy
550+
obj = make_class()
554551
ref = weakref.ref(obj)
555552
proxy = weakref.proxy(obj)
556-
553+
554+
# run operation
557555
try:
558-
operator.add(proxy, dead)
556+
do_op(proxy, dead)
559557
except ReferenceError:
560558
pass
561-
562559
del proxy, obj, dead
563560
gc.collect()
564-
565-
self.assertIsNone(ref(), "Leaked object in add operation")
566-
567-
def test_proxy_unref_pow_refcount(self):
561+
562+
# verify
563+
self.assertIsNone(ref(), f"Leaked object in '{op_name}' operation")
564+
565+
def test_proxy_unref_binary_refcount(self):
568566
class C:
569-
def __pow__(self, o, m=None):
570-
return NotImplemented
571-
572-
# create dead proxy
573-
o = C()
574-
dead = weakref.proxy(o)
575-
del o
576-
gc.collect()
577-
578-
# create live proxy
579-
obj = C()
580-
ref = weakref.ref(obj)
581-
proxy = weakref.proxy(obj)
582-
583-
try:
584-
pow(proxy, dead, None)
585-
except ReferenceError:
586-
pass
587-
588-
del proxy, obj, dead
589-
gc.collect()
567+
def __add__(self, o): return NotImplemented
568+
self._assert_no_proxy_refcount_leak(C, operator.add, "Binary")
569+
570+
def test_proxy_unref_ternary_refcount(self):
571+
class C:
572+
def __pow__(self, o, m=None): return NotImplemented
573+
self._assert_no_proxy_refcount_leak(C, lambda p, d: pow(p, d, None), "Ternary")
574+
575+
def test_proxy_unref_richcompare_refcount(self):
576+
class C:
577+
def __eq__(self, o): return NotImplemented
578+
self._assert_no_proxy_refcount_leak(C, lambda p, d: p == d, "Rich Compare")
590579

591-
self.assertIsNone(ref(), "Leaked object in pow operation")
592580

593581
def test_getweakrefcount(self):
594582
o = C()

0 commit comments

Comments
 (0)