[Python-checkins] python/dist/src/Lib/test test_coercion.py, 1.7, 1.8

arigo at users.sourceforge.net arigo at users.sourceforge.net
Thu Dec 23 23:13:15 CET 2004


Update of /cvsroot/python/python/dist/src/Lib/test
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21400/Lib/test

Modified Files:
	test_coercion.py 
Log Message:
Dima Dorfman's patch for coercion/comparison of C types (patch #995939), with
a minor change after the coercion, to accept two objects not necessarily of
the same type but with the same tp_compare.



Index: test_coercion.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/test/test_coercion.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- test_coercion.py	10 Mar 2004 17:30:03 -0000	1.7
+++ test_coercion.py	23 Dec 2004 22:13:13 -0000	1.8
@@ -125,9 +125,45 @@
                 else:
                     print '=', format_result(x)
 
+# New-style class version of CoerceNumber
+class CoerceTo(object):
+    def __init__(self, arg):
+        self.arg = arg
+    def __coerce__(self, other):
+        if isinstance(other, CoerceTo):
+            return self.arg, other.arg
+        else:
+            return self.arg, other
+
+def assert_(expr, msg=None):
+    if not expr:
+        raise AssertionError, msg
+
+def do_cmptypes():
+    # Built-in tp_compare slots expect their arguments to have the
+    # same type, but a user-defined __coerce__ doesn't have to obey.
+    # SF #980352
+    evil_coercer = CoerceTo(42)
+    # Make sure these don't crash any more
+    assert_(cmp(u'fish', evil_coercer) != 0)
+    assert_(cmp(slice(1), evil_coercer) != 0)
+    # ...but that this still works
+    class WackyComparer(object):
+        def __cmp__(self, other):
+            assert_(other == 42, 'expected evil_coercer, got %r' % other)
+            return 0
+    assert_(cmp(WackyComparer(), evil_coercer) == 0)
+    # ...and classic classes too, since that code path is a little different
+    class ClassicWackyComparer:
+        def __cmp__(self, other):
+            assert_(other == 42, 'expected evil_coercer, got %r' % other)
+            return 0
+    assert_(cmp(ClassicWackyComparer(), evil_coercer) == 0)
+
 warnings.filterwarnings("ignore",
                         r'complex divmod\(\), // and % are deprecated',
                         DeprecationWarning,
                         r'test.test_coercion$')
 do_infix_binops()
 do_prefix_binops()
+do_cmptypes()



More information about the Python-checkins mailing list