1
2cimport cython
3
4module_level_tuple = (1,2,3)
5
6def return_module_level_tuple():
7    """
8    >>> return_module_level_tuple()
9    (1, 2, 3)
10    """
11    return module_level_tuple
12
13@cython.test_assert_path_exists("//TupleNode",
14                                "//TupleNode[@is_literal = true]")
15@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
16def return_empty_tuple():
17    """
18    >>> return_empty_tuple()
19    ()
20    """
21    return ()
22
23@cython.test_assert_path_exists("//TupleNode",
24                                "//TupleNode[@is_literal = true]")
25@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
26def return_constant_tuple1():
27    """
28    >>> return_constant_tuple1()
29    (1,)
30    """
31    return (1,)
32
33@cython.test_assert_path_exists("//TupleNode",
34                                "//TupleNode[@is_literal = true]")
35@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
36def return_folded_tuple():
37    """
38    >>> return_folded_tuple()
39    (1, 2, 3)
40    """
41    return (1, 1+1, 1+1+1)
42
43@cython.test_assert_path_exists("//TupleNode",
44                                "//TupleNode[@is_literal = true]")
45@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
46def return_nested_tuple():
47    """
48    >>> return_nested_tuple()
49    (1, (2, 3), (3, (4, 5), (2, 3, 2, 3)))
50    """
51    return (1, (2, 3), (3, (4, 5), (2, 3) * 2))
52
53@cython.test_assert_path_exists("//TupleNode",
54                                "//TupleNode[@is_literal = true]")
55@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
56def constant_tuple1():
57    """
58    >>> constant_tuple1()
59    (1,)
60    """
61    tuple1 = (1,)
62    return tuple1
63
64@cython.test_assert_path_exists("//TupleNode",
65                                "//TupleNode[@is_literal = true]")
66@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
67def return_constant_tuple2():
68    """
69    >>> return_constant_tuple2()
70    (1, 2)
71    """
72    return (1,2)
73
74
75def return_multiplied_constant_tuple(n):
76    """
77    >>> tuples = return_multiplied_constant_tuple(2)
78    >>> type(tuples) is tuple
79    True
80    >>> for t in tuples: print(t)
81    ()
82    (1, 2, 3)
83    (1, 2, 3, 1, 2, 3)
84    (1, 2, 3, 1, 2, 3, 1, 2, 3)
85    (1, 2, 3, 1, 2, 3)
86    (1, 2, 3, 1, 2, 3)
87    ((1, 2, 3, 1, 2, 3), (1, 2, 3), (1, 2, 3, 1, 2, 3))
88    """
89    return (
90        (1, 2, 3) * 0,
91        (1, 2, 3) * 1,
92        (1, 2, 3) * 2,
93        (1, 2, 3) * 3,
94        (1, 2, 3) * 2,
95        (1, 2, 3) * n,
96        ((1, 2, 3) * n, (1, 2, 3), (1, 2, 3) * n),
97    )
98
99
100@cython.test_assert_path_exists("//TupleNode",
101                                "//TupleNode[@is_literal = true]")
102@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
103def return_constant_tuple_strings():
104    """
105    >>> return_constant_tuple_strings()
106    ('tuple_1', 'bc', 'tuple_2')
107    """
108    return ('tuple_1', 'bc', 'tuple_2')
109
110@cython.test_assert_path_exists("//TupleNode",
111                                "//TupleNode[@is_literal = true]")
112@cython.test_fail_if_path_exists("//TupleNode[@is_literal = false]")
113def return_constant_tuples_string_types():
114    """
115    >>> a,b,c = return_constant_tuples_string_types()
116    >>> a is b
117    False
118    >>> a is c
119    False
120    >>> b is c
121    False
122    """
123    return ('a', 'bc'), (u'a', u'bc'), (b'a', b'bc')
124
125@cython.test_assert_path_exists("//ReturnStatNode//TupleNode",
126                                "//ReturnStatNode//TupleNode[@is_literal = false]")
127@cython.test_fail_if_path_exists("//ReturnStatNode//TupleNode[@is_literal = true]")
128def return_nonconstant_tuple():
129    """
130    >>> return_nonconstant_tuple()
131    ('a', 1, 'd')
132    """
133    a = eval("1")
134    return ('a', a, 'd')
135
136
137def constant_types_comparing_equal():
138    """
139    >>> constant_types_comparing_equal()
140    ((False, False), (0, 0), (0.0, 0.0), (0, False), (False, 0.0), (0, 0.0))
141    """
142    bool_tuple= (False, False)
143    int_tuple = (0, 0)
144    float_tuple = (0.0, 0.0)
145    int_bool = (0, False)
146    bool_float = (False, 0.0)
147    int_float = (0, 0.0)
148
149    assert bool_tuple is (False, False)
150    assert int_tuple is (0, 0)
151    assert bool_tuple == int_tuple
152    assert bool_tuple is not int_tuple
153    assert float_tuple is (0., 0.)
154    assert float_tuple == int_tuple
155    assert float_tuple is not int_tuple
156    assert int_bool is (0, False)
157    assert int_bool == bool_tuple
158    assert int_bool is not bool_tuple
159    assert int_bool is not int_tuple
160    assert bool_float is (False, 0.)
161    assert bool_float == bool_tuple
162    assert bool_float is not bool_tuple
163    assert bool_float is not float_tuple
164    assert int_float is (0, 0.)
165    assert int_float == int_tuple
166    assert int_float is not int_tuple
167    assert int_float is not float_tuple
168
169    return bool_tuple, int_tuple, float_tuple, int_bool, bool_float, int_float
170