Skip to content

Commit c3c020b

Browse files
Revert "organise testcases"
This reverts commit 30d2369.
1 parent 7b833c9 commit c3c020b

1 file changed

Lines changed: 64 additions & 25 deletions

File tree

Lib/test/test_weakref.py

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

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()
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()
545548
dead = weakref.proxy(o)
546549
del o
547550
gc.collect()
548-
549-
# Create live proxy
550-
obj = make_class()
551+
552+
# create live proxy
553+
obj = C()
551554
ref = weakref.ref(obj)
552555
proxy = weakref.proxy(obj)
553-
554-
# run operation
556+
555557
try:
556-
do_op(proxy, dead)
558+
operator.add(proxy, dead)
557559
except ReferenceError:
558560
pass
561+
559562
del proxy, obj, dead
560563
gc.collect()
561-
562-
# verify
563-
self.assertIsNone(ref(), f"Leaked object in '{op_name}' operation")
564-
565-
def test_proxy_unref_binary_refcount(self):
566-
class C:
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):
564+
565+
self.assertIsNone(ref(), "Leaked object in add operation")
566+
567+
def test_proxy_unref_pow_refcount(self):
571568
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-
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+
575593
def test_proxy_unref_richcompare_refcount(self):
576594
class C:
577-
def __eq__(self, o): return NotImplemented
578-
self._assert_no_proxy_refcount_leak(C, lambda p, d: p == d, "Rich Compare")
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")
579618

580619
def test_getweakrefcount(self):
581620
o = C()

0 commit comments

Comments
 (0)