diff options
Diffstat (limited to 'tests/run/builtin_subtype_methods_T653.pyx')
-rw-r--r-- | tests/run/builtin_subtype_methods_T653.pyx | 47 |
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) |