Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(6)

## Side by Side Diff: Lib/test/test_binop.py

Issue 25958: Implicit ABCs have no means of "anti-registration"
Patch Set: Created 4 years, 2 months ago
 Left: Base Patch Set 1: None Patch Set 2: None Patch Set 3: None Patch Set 4: None Patch Set 5: None Patch Set 6: None Patch Set 7: None Right: Patch Set 1: None Patch Set 2: None Patch Set 3: None Patch Set 4: None Patch Set 5: None Patch Set 6: None Patch Set 7: None
OLDNEW
1 """Tests for binary operators on subtypes of built-in types.""" 1 """Tests for binary operators on subtypes of built-in types."""
2 2
3 import unittest 3 import unittest
4 from test import support 4 from test import support
5 from operator import eq, ne, lt, gt, le, ge 5 from operator import eq, ne, lt, gt, le, ge
6 from abc import ABCMeta 6 from abc import ABCMeta
7 7
8 def gcd(a, b): 8 def gcd(a, b):
9 """Greatest common divisor using Euclid's algorithm.""" 9 """Greatest common divisor using Euclid's algorithm."""
10 while a: 10 while a:
(...skipping 370 matching lines...)
381 self.assertEqual(op_sequence(le, A, A), ['A.__le__', 'A.__ge__']) 381 self.assertEqual(op_sequence(le, A, A), ['A.__le__', 'A.__ge__'])
382 self.assertEqual(op_sequence(le, A, B), ['A.__le__', 'B.__ge__']) 382 self.assertEqual(op_sequence(le, A, B), ['A.__le__', 'B.__ge__'])
383 self.assertEqual(op_sequence(le, B, A), ['B.__le__', 'A.__ge__']) 383 self.assertEqual(op_sequence(le, B, A), ['B.__le__', 'A.__ge__'])
384 self.assertEqual(op_sequence(le, B, C), ['C.__ge__', 'B.__le__']) 384 self.assertEqual(op_sequence(le, B, C), ['C.__ge__', 'B.__le__'])
385 self.assertEqual(op_sequence(le, C, B), ['C.__le__', 'B.__ge__']) 385 self.assertEqual(op_sequence(le, C, B), ['C.__le__', 'B.__ge__'])
386 386
387 self.assertTrue(issubclass(V, B)) 387 self.assertTrue(issubclass(V, B))
388 self.assertEqual(op_sequence(eq, B, V), ['B.__eq__', 'V.__eq__']) 388 self.assertEqual(op_sequence(eq, B, V), ['B.__eq__', 'V.__eq__'])
389 self.assertEqual(op_sequence(le, B, V), ['B.__le__', 'V.__ge__']) 389 self.assertEqual(op_sequence(le, B, V), ['B.__le__', 'V.__ge__'])
390 390
391 class E(object):
392 """Class that can test equality"""
393 def __eq__(self, other):
394 return True
395
396 class S(E):
397 """Subclass of E that should fail"""
398 __eq__ = None
391 399
400 class F(object):
401 """Independent class that should fall back"""
402
403 class X(object):
404 """Independent class that should fail"""
405 __eq__ = None
406
407 class SN(E):
408 """Subclass of E that can test equality, but not non-equality"""
409 __ne__ = None
410
411 class XN:
412 """Independent class that can test equality, but not non-equality"""
413 def __eq__(self, other):
414 return True
415 __ne__ = None
416
417 class FallbackBlockingTests(unittest.TestCase):
418 """Unit tests for None method blocking"""
419
420 def test_fallback_rmethod_blocking(self):
421 e, f, s, x = E(), F(), S(), X()
Martin Panter 2016/01/09 02:34:57 Maybe move the classes into the test method, to av
abarnert 2016/01/18 20:28:42 Some of the classes are used in multiple test meth
Martin Panter 2016/02/02 03:10:13 Yes the common base class E is shared; that’s why
422 self.assertEqual(e, e)
423 self.assertEqual(e, f)
424 self.assertEqual(f, e)
425 # left operand is checked first
426 self.assertEqual(e, x)
427 self.assertRaises(TypeError, eq, x, e)
428 # S is a subclass, so it's always checked first
429 self.assertRaises(TypeError, eq, e, s)
430 self.assertRaises(TypeError, eq, s, e)
431
432 def test_fallback_ne_blocking(self):
433 e, sn, xn = E(), SN(), XN()
434 self.assertFalse(e != e)
435 self.assertRaises(TypeError, ne, e, sn)
436 self.assertRaises(TypeError, ne, sn, e)
437 self.assertFalse(e != xn)
438 self.assertRaises(TypeError, ne, xn, e)
439
392 if __name__ == "__main__": 440 if __name__ == "__main__":
393 unittest.main() 441 unittest.main()
OLDNEW

This is Rietveld 894c83f36cb7+