Skip to content

Commit 30d2369

Browse files
organise testcases
1 parent 39919e8 commit 30d2369

File tree

1 file changed

+25
-64
lines changed

1 file changed

+25
-64
lines changed

Lib/test/test_weakref.py

Lines changed: 25 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -538,83 +538,44 @@ 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()
590-
591-
self.assertIsNone(ref(), "Leaked object in pow operation")
592-
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+
593575
def test_proxy_unref_richcompare_refcount(self):
594576
class C:
595-
def __eq__(self, o):
596-
return NotImplemented
597-
598-
# create dead proxy
599-
o = C()
600-
dead = weakref.proxy(o)
601-
del o
602-
gc.collect()
603-
604-
# create live proxy
605-
obj = C()
606-
ref = weakref.ref(obj)
607-
proxy = weakref.proxy(obj)
608-
609-
try:
610-
proxy == dead
611-
except ReferenceError:
612-
pass
613-
614-
del proxy, obj, dead
615-
gc.collect()
616-
617-
self.assertIsNone(ref(), "Leaked object in richcompare operation")
577+
def __eq__(self, o): return NotImplemented
578+
self._assert_no_proxy_refcount_leak(C, lambda p, d: p == d, "Rich Compare")
618579

619580
def test_getweakrefcount(self):
620581
o = C()

0 commit comments

Comments
 (0)