summaryrefslogtreecommitdiff
path: root/tests/run/append.pyx
blob: dcc3fe7c95d37360d61bc49a7cfbe8c7a3f8a89b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
cimport cython

class A:
    def append(self, x):
        print u"appending", x
        return x

class B(list):
    def append(self, *args):
        for arg in args:
            list.append(self, arg)

cdef class C:
    """
    >>> c = C(100)
    appending 100
    """
    def __init__(self, value):
        self.append(value)
    cdef append(self, value):
        print u"appending", value
        return value

def test_append(L):
    """
    >>> test_append([])
    None
    None
    None
    got error
    [1, 2, (3, 4)]
    >>> _ = test_append(A())
    appending 1
    1
    appending 2
    2
    appending (3, 4)
    (3, 4)
    got error
    >>> test_append(B())
    None
    None
    None
    None
    [1, 2, (3, 4), 5, 6]
    """
    print L.append(1)
    print L.append(2)
    print L.append((3,4))
    try:
        print L.append(5,6)
    except TypeError:
        print u"got error"
    return L


def test_append_typed(list L not None):
    """
    >>> test_append_typed([])
    None
    None
    [1, 2, (3, 4)]
    """
    print L.append(1)
    L.append(2)
    print L.append((3,4))
    return L


def append_unused_retval(L):
    """
    >>> append_unused_retval([])
    got error
    [1, 2, (3, 4)]
    >>> _ = append_unused_retval(A())
    appending 1
    appending 2
    appending (3, 4)
    got error
    >>> append_unused_retval(B())
    [1, 2, (3, 4), 5, 6]
    """
    L.append(1)
    L.append(2)
    L.append((3,4))
    try:
        L.append(5,6)
    except TypeError:
        print u"got error"
    return L


def method_name():
    """
    >>> method_name()
    'append'
    """
    return [].append.__name__

@cython.test_assert_path_exists(
    '//PythonCapiCallNode')
def append_optimized(probably_list):
    """
    >>> l = []
    >>> append_optimized(l)
    >>> l
    [1]
    """
    probably_list.append(1)

cdef class AppendBug:
    # https://github.com/cython/cython/issues/4828
    # if the attribute "append" is found it shouldn't be replaced with
    # __Pyx_PyObject_Append
    cdef object append
    def __init__(self, append):
        self.append = append

@cython.test_fail_if_path_exists(
    '//PythonCapiCallNode')
def specific_attribute(AppendBug a):
    """
    >>> def append_to_default_arg(a, arg=[]):
    ...    arg.append(a)
    ...    return arg
    >>> specific_attribute(AppendBug(append_to_default_arg))
    >>> append_to_default_arg(None)
    [1, None]
    """
    a.append(1)