test_compare.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import unittest
  2. from test.support import ALWAYS_EQ
  3. class Empty:
  4. def __repr__(self):
  5. return '<Empty>'
  6. class Cmp:
  7. def __init__(self,arg):
  8. self.arg = arg
  9. def __repr__(self):
  10. return '<Cmp %s>' % self.arg
  11. def __eq__(self, other):
  12. return self.arg == other
  13. class ComparisonTest(unittest.TestCase):
  14. set1 = [2, 2.0, 2, 2+0j, Cmp(2.0)]
  15. set2 = [[1], (3,), None, Empty()]
  16. candidates = set1 + set2
  17. def test_comparisons(self):
  18. for a in self.candidates:
  19. for b in self.candidates:
  20. if ((a in self.set1) and (b in self.set1)) or a is b:
  21. self.assertEqual(a, b)
  22. else:
  23. self.assertNotEqual(a, b)
  24. def test_id_comparisons(self):
  25. # Ensure default comparison compares id() of args
  26. L = []
  27. for i in range(10):
  28. L.insert(len(L)//2, Empty())
  29. for a in L:
  30. for b in L:
  31. self.assertEqual(a == b, id(a) == id(b),
  32. 'a=%r, b=%r' % (a, b))
  33. def test_ne_defaults_to_not_eq(self):
  34. a = Cmp(1)
  35. b = Cmp(1)
  36. c = Cmp(2)
  37. self.assertIs(a == b, True)
  38. self.assertIs(a != b, False)
  39. self.assertIs(a != c, True)
  40. def test_ne_high_priority(self):
  41. """object.__ne__() should allow reflected __ne__() to be tried"""
  42. calls = []
  43. class Left:
  44. # Inherits object.__ne__()
  45. def __eq__(*args):
  46. calls.append('Left.__eq__')
  47. return NotImplemented
  48. class Right:
  49. def __eq__(*args):
  50. calls.append('Right.__eq__')
  51. return NotImplemented
  52. def __ne__(*args):
  53. calls.append('Right.__ne__')
  54. return NotImplemented
  55. Left() != Right()
  56. self.assertSequenceEqual(calls, ['Left.__eq__', 'Right.__ne__'])
  57. def test_ne_low_priority(self):
  58. """object.__ne__() should not invoke reflected __eq__()"""
  59. calls = []
  60. class Base:
  61. # Inherits object.__ne__()
  62. def __eq__(*args):
  63. calls.append('Base.__eq__')
  64. return NotImplemented
  65. class Derived(Base): # Subclassing forces higher priority
  66. def __eq__(*args):
  67. calls.append('Derived.__eq__')
  68. return NotImplemented
  69. def __ne__(*args):
  70. calls.append('Derived.__ne__')
  71. return NotImplemented
  72. Base() != Derived()
  73. self.assertSequenceEqual(calls, ['Derived.__ne__', 'Base.__eq__'])
  74. def test_other_delegation(self):
  75. """No default delegation between operations except __ne__()"""
  76. ops = (
  77. ('__eq__', lambda a, b: a == b),
  78. ('__lt__', lambda a, b: a < b),
  79. ('__le__', lambda a, b: a <= b),
  80. ('__gt__', lambda a, b: a > b),
  81. ('__ge__', lambda a, b: a >= b),
  82. )
  83. for name, func in ops:
  84. with self.subTest(name):
  85. def unexpected(*args):
  86. self.fail('Unexpected operator method called')
  87. class C:
  88. __ne__ = unexpected
  89. for other, _ in ops:
  90. if other != name:
  91. setattr(C, other, unexpected)
  92. if name == '__eq__':
  93. self.assertIs(func(C(), object()), False)
  94. else:
  95. self.assertRaises(TypeError, func, C(), object())
  96. def test_issue_1393(self):
  97. x = lambda: None
  98. self.assertEqual(x, ALWAYS_EQ)
  99. self.assertEqual(ALWAYS_EQ, x)
  100. y = object()
  101. self.assertEqual(y, ALWAYS_EQ)
  102. self.assertEqual(ALWAYS_EQ, y)
  103. if __name__ == '__main__':
  104. unittest.main()