summaryrefslogtreecommitdiff
path: root/tests/run/builtin_subtype_methods_T653.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run/builtin_subtype_methods_T653.pyx')
-rw-r--r--tests/run/builtin_subtype_methods_T653.pyx47
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/run/builtin_subtype_methods_T653.pyx b/tests/run/builtin_subtype_methods_T653.pyx
index bcfda81f0..e02326598 100644
--- a/tests/run/builtin_subtype_methods_T653.pyx
+++ b/tests/run/builtin_subtype_methods_T653.pyx
@@ -4,7 +4,21 @@
cimport cython
+# The "contains" tests relate to GH-4785 - replacing the method
+# call with PySequence_Contains was causing infinite recursion
+# for some classes
+
cdef class MyList(list):
+ """
+ >>> l = MyList()
+ >>> l.__contains__(1)
+ MyList.__contains__
+ False
+ >>> l.append(1)
+ >>> l.__contains__(1)
+ MyList.__contains__
+ True
+ """
def test_append(self, x):
"""
>>> l = MyList()
@@ -18,7 +32,13 @@ cdef class MyList(list):
"""
self.append(x)
+ def __contains__(self, value):
+ print "MyList.__contains__"
+ return list.__contains__(self, value) # probably optimized
+
cdef class MyDict(dict):
+ # tests for __contains__ are in the global __doc__ to version-check a PyPy bug
+
@cython.test_assert_path_exists("//ComprehensionNode//AttributeNode",
"//ComprehensionNode//AttributeNode[@attribute='items']")
@cython.test_fail_if_path_exists("//ComprehensionNode//CMethodSelfCloneNode")
@@ -40,6 +60,19 @@ cdef class MyDict(dict):
l.sort()
return l
+ def __contains__(self, key):
+ print "MyDict.__contains__"
+ return dict.__contains__(self, key)
+
+import sys
+pypy_version = getattr(sys, 'pypy_version_info', None)
+if not (pypy_version and pypy_version < (7, 3, 10)):
+ __doc__ = """
+ >>> MyDict(a=1).__contains__("a")
+ MyDict.__contains__
+ True
+ """
+
@cython.final
cdef class MyDictFinal(dict):
@cython.test_assert_path_exists("//ComprehensionNode//CMethodSelfCloneNode")
@@ -155,3 +188,17 @@ cdef class MyDictOverride2(MyDict):
l = [ v for v in self.values() ]
l.sort()
return l
+
+class MyBytes(bytes):
+ """
+ >>> mb = MyBytes(b"abc")
+ >>> mb.__contains__(b"a")
+ MyBytes.__contains__
+ True
+ >>> mb.__contains__(b"z")
+ MyBytes.__contains__
+ False
+ """
+ def __contains__(self, value):
+ print "MyBytes.__contains__"
+ return bytes.__contains__(self, value)