summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2019-08-08 05:42:54 (GMT)
committerGitHub <noreply@github.com>2019-08-08 05:42:54 (GMT)
commit662db125cddbca1db68116c547c290eb3943d98e (patch)
tree06151487dbe4493ef173dd8cc378f4b6cf5c0e4a /Lib/test
parent4c69be22df3852f17873a74d015528d9a8ae92d6 (diff)
downloadcpython-662db125cddbca1db68116c547c290eb3943d98e.zip
cpython-662db125cddbca1db68116c547c290eb3943d98e.tar.gz
cpython-662db125cddbca1db68116c547c290eb3943d98e.tar.bz2
bpo-37685: Fixed __eq__, __lt__ etc implementations in some classes. (GH-14952)
They now return NotImplemented for unsupported type of the other operand.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_asyncio/test_events.py23
-rw-r--r--Lib/test/test_email/test_headerregistry.py19
-rw-r--r--Lib/test/test_traceback.py16
-rw-r--r--Lib/test/test_weakref.py9
-rw-r--r--Lib/test/test_xmlrpc.py25
5 files changed, 82 insertions, 10 deletions
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
index e5ad72f..5bc1bc2 100644
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -32,6 +32,7 @@ from asyncio import proactor_events
from asyncio import selector_events
from test.test_asyncio import utils as test_utils
from test import support
+from test.support import ALWAYS_EQ, LARGEST, SMALLEST
def tearDownModule():
@@ -2364,6 +2365,28 @@ class TimerTests(unittest.TestCase):
self.assertIs(NotImplemented, h1.__eq__(h3))
self.assertIs(NotImplemented, h1.__ne__(h3))
+ with self.assertRaises(TypeError):
+ h1 < ()
+ with self.assertRaises(TypeError):
+ h1 > ()
+ with self.assertRaises(TypeError):
+ h1 <= ()
+ with self.assertRaises(TypeError):
+ h1 >= ()
+ self.assertFalse(h1 == ())
+ self.assertTrue(h1 != ())
+
+ self.assertTrue(h1 == ALWAYS_EQ)
+ self.assertFalse(h1 != ALWAYS_EQ)
+ self.assertTrue(h1 < LARGEST)
+ self.assertFalse(h1 > LARGEST)
+ self.assertTrue(h1 <= LARGEST)
+ self.assertFalse(h1 >= LARGEST)
+ self.assertFalse(h1 < SMALLEST)
+ self.assertTrue(h1 > SMALLEST)
+ self.assertFalse(h1 <= SMALLEST)
+ self.assertTrue(h1 >= SMALLEST)
+
class AbstractEventLoopTests(unittest.TestCase):
diff --git a/Lib/test/test_email/test_headerregistry.py b/Lib/test/test_email/test_headerregistry.py
index 5d9b357..4758f4b 100644
--- a/Lib/test/test_email/test_headerregistry.py
+++ b/Lib/test/test_email/test_headerregistry.py
@@ -7,6 +7,7 @@ from email.message import Message
from test.test_email import TestEmailBase, parameterize
from email import headerregistry
from email.headerregistry import Address, Group
+from test.support import ALWAYS_EQ
DITTO = object()
@@ -1525,6 +1526,24 @@ class TestAddressAndGroup(TestEmailBase):
self.assertEqual(m['to'], 'foo bar:;')
self.assertEqual(m['to'].addresses, g.addresses)
+ def test_address_comparison(self):
+ a = Address('foo', 'bar', 'example.com')
+ self.assertEqual(Address('foo', 'bar', 'example.com'), a)
+ self.assertNotEqual(Address('baz', 'bar', 'example.com'), a)
+ self.assertNotEqual(Address('foo', 'baz', 'example.com'), a)
+ self.assertNotEqual(Address('foo', 'bar', 'baz'), a)
+ self.assertFalse(a == object())
+ self.assertTrue(a == ALWAYS_EQ)
+
+ def test_group_comparison(self):
+ a = Address('foo', 'bar', 'example.com')
+ g = Group('foo bar', [a])
+ self.assertEqual(Group('foo bar', (a,)), g)
+ self.assertNotEqual(Group('baz', [a]), g)
+ self.assertNotEqual(Group('foo bar', []), g)
+ self.assertFalse(g == object())
+ self.assertTrue(g == ALWAYS_EQ)
+
class TestFolding(TestHeaderBase):
diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 96d85e2..72dc7af 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -7,7 +7,7 @@ import sys
import unittest
import re
from test import support
-from test.support import TESTFN, Error, captured_output, unlink, cpython_only
+from test.support import TESTFN, Error, captured_output, unlink, cpython_only, ALWAYS_EQ
from test.support.script_helper import assert_python_ok
import textwrap
@@ -887,6 +887,8 @@ class TestFrame(unittest.TestCase):
# operator fallbacks to FrameSummary.__eq__.
self.assertEqual(tuple(f), f)
self.assertIsNone(f.locals)
+ self.assertNotEqual(f, object())
+ self.assertEqual(f, ALWAYS_EQ)
def test_lazy_lines(self):
linecache.clearcache()
@@ -1083,6 +1085,18 @@ class TestTracebackException(unittest.TestCase):
self.assertEqual(exc_info[0], exc.exc_type)
self.assertEqual(str(exc_info[1]), str(exc))
+ def test_comparison(self):
+ try:
+ 1/0
+ except Exception:
+ exc_info = sys.exc_info()
+ exc = traceback.TracebackException(*exc_info)
+ exc2 = traceback.TracebackException(*exc_info)
+ self.assertIsNot(exc, exc2)
+ self.assertEqual(exc, exc2)
+ self.assertNotEqual(exc, object())
+ self.assertEqual(exc, ALWAYS_EQ)
+
def test_unhashable(self):
class UnhashableException(Exception):
def __eq__(self, other):
diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py
index ce5bbfc..41f78e7 100644
--- a/Lib/test/test_weakref.py
+++ b/Lib/test/test_weakref.py
@@ -11,7 +11,7 @@ import time
import random
from test import support
-from test.support import script_helper
+from test.support import script_helper, ALWAYS_EQ
# Used in ReferencesTestCase.test_ref_created_during_del() .
ref_from_del = None
@@ -794,6 +794,10 @@ class ReferencesTestCase(TestBase):
self.assertTrue(a != c)
self.assertTrue(a == d)
self.assertFalse(a != d)
+ self.assertFalse(a == x)
+ self.assertTrue(a != x)
+ self.assertTrue(a == ALWAYS_EQ)
+ self.assertFalse(a != ALWAYS_EQ)
del x, y, z
gc.collect()
for r in a, b, c:
@@ -1102,6 +1106,9 @@ class WeakMethodTestCase(unittest.TestCase):
_ne(a, f)
_ne(b, e)
_ne(b, f)
+ # Compare with different types
+ _ne(a, x.some_method)
+ _eq(a, ALWAYS_EQ)
del x, y, z
gc.collect()
# Dead WeakMethods compare by identity
diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py
index 52bacc1..e5c3496 100644
--- a/Lib/test/test_xmlrpc.py
+++ b/Lib/test/test_xmlrpc.py
@@ -15,6 +15,7 @@ import re
import io
import contextlib
from test import support
+from test.support import ALWAYS_EQ, LARGEST, SMALLEST
try:
import gzip
@@ -530,14 +531,10 @@ class DateTimeTestCase(unittest.TestCase):
# some other types
dbytes = dstr.encode('ascii')
dtuple = now.timetuple()
- with self.assertRaises(TypeError):
- dtime == 1970
- with self.assertRaises(TypeError):
- dtime != dbytes
- with self.assertRaises(TypeError):
- dtime == bytearray(dbytes)
- with self.assertRaises(TypeError):
- dtime != dtuple
+ self.assertFalse(dtime == 1970)
+ self.assertTrue(dtime != dbytes)
+ self.assertFalse(dtime == bytearray(dbytes))
+ self.assertTrue(dtime != dtuple)
with self.assertRaises(TypeError):
dtime < float(1970)
with self.assertRaises(TypeError):
@@ -547,6 +544,18 @@ class DateTimeTestCase(unittest.TestCase):
with self.assertRaises(TypeError):
dtime >= dtuple
+ self.assertTrue(dtime == ALWAYS_EQ)
+ self.assertFalse(dtime != ALWAYS_EQ)
+ self.assertTrue(dtime < LARGEST)
+ self.assertFalse(dtime > LARGEST)
+ self.assertTrue(dtime <= LARGEST)
+ self.assertFalse(dtime >= LARGEST)
+ self.assertFalse(dtime < SMALLEST)
+ self.assertTrue(dtime > SMALLEST)
+ self.assertFalse(dtime <= SMALLEST)
+ self.assertTrue(dtime >= SMALLEST)
+
+
class BinaryTestCase(unittest.TestCase):
# XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff"