]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-117797: Improve `test_descr.test_not_implemented` (GH-117798) (#117921)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 16 Apr 2024 09:50:10 +0000 (11:50 +0200)
committerGitHub <noreply@github.com>
Tue, 16 Apr 2024 09:50:10 +0000 (12:50 +0300)
gh-117797: Improve `test_descr.test_not_implemented` (GH-117798)
(cherry picked from commit 1a1e013a4a526546c373afd887f2e25eecc984ad)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Lib/test/test_descr.py

index a969f04b10a865eceed60a4906c7bd8fc0e4382e..3a11435e3e254305080620f46927aa6799564d2d 100644 (file)
@@ -4594,18 +4594,16 @@ order (MRO) for bases """
     def test_not_implemented(self):
         # Testing NotImplemented...
         # all binary methods should be able to return a NotImplemented
-        import operator
 
         def specialmethod(self, other):
             return NotImplemented
 
         def check(expr, x, y):
-            try:
-                exec(expr, {'x': x, 'y': y, 'operator': operator})
-            except TypeError:
-                pass
-            else:
-                self.fail("no TypeError from %r" % (expr,))
+            with (
+                self.subTest(expr=expr, x=x, y=y),
+                self.assertRaises(TypeError),
+            ):
+                exec(expr, {'x': x, 'y': y})
 
         N1 = sys.maxsize + 1    # might trigger OverflowErrors instead of
                                 # TypeErrors
@@ -4626,12 +4624,23 @@ order (MRO) for bases """
                 ('__and__',      'x & y',                   'x &= y'),
                 ('__or__',       'x | y',                   'x |= y'),
                 ('__xor__',      'x ^ y',                   'x ^= y')]:
-            rname = '__r' + name[2:]
+            # Defines 'left' magic method:
             A = type('A', (), {name: specialmethod})
             a = A()
             check(expr, a, a)
             check(expr, a, N1)
             check(expr, a, N2)
+            # Defines 'right' magic method:
+            rname = '__r' + name[2:]
+            B = type('B', (), {rname: specialmethod})
+            b = B()
+            check(expr, b, b)
+            check(expr, a, b)
+            check(expr, b, a)
+            check(expr, b, N1)
+            check(expr, b, N2)
+            check(expr, N1, b)
+            check(expr, N2, b)
             if iexpr:
                 check(iexpr, a, a)
                 check(iexpr, a, N1)