1# mode: run
2# ticket: 372
3
4cimport cython
5
6@cython.test_assert_path_exists("//ForFromStatNode")
7@cython.test_fail_if_path_exists("//ForInStatNode")
8def test_modify():
9    """
10    >>> test_modify()
11    0
12    1
13    2
14    3
15    4
16    <BLANKLINE>
17    (4, 0)
18    """
19    cdef int i, n = 5
20    for i in range(n):
21        print i
22        n = 0
23    print
24    return i,n
25
26
27@cython.test_assert_path_exists("//ForFromStatNode")
28@cython.test_fail_if_path_exists("//ForInStatNode")
29def test_negindex():
30    """
31    >>> test_negindex()
32    6
33    5
34    4
35    3
36    2
37    (2, 0)
38    """
39    cdef int i, n = 5
40    for i in range(n+1, 1, -1):
41        print i
42        n = 0
43    return i,n
44
45
46@cython.test_assert_path_exists("//ForFromStatNode",
47                                "//ForFromStatNode//PrintStatNode//CoerceToPyTypeNode")
48@cython.test_fail_if_path_exists("//ForInStatNode")
49def test_negindex_inferred():
50    """
51    >>> test_negindex_inferred()
52    5
53    4
54    3
55    2
56    (2, 0)
57    """
58    cdef int n = 5
59    for i in range(n, 1, -1):
60        print i
61        n = 0
62    return i,n
63
64
65@cython.test_assert_path_exists("//ForFromStatNode")
66@cython.test_fail_if_path_exists("//ForInStatNode")
67def test_fix():
68    """
69    >>> test_fix()
70    0
71    1
72    2
73    3
74    4
75    <BLANKLINE>
76    4
77    """
78    cdef int i
79    for i in range(5):
80        print i
81    print
82    return i
83
84
85@cython.test_assert_path_exists("//ForFromStatNode")
86@cython.test_fail_if_path_exists("//ForInStatNode")
87def test_break():
88    """
89    >>> test_break()
90    0
91    1
92    2
93    <BLANKLINE>
94    (2, 0)
95    """
96    cdef int i, n = 5
97    for i in range(n):
98        print i
99        n = 0
100        if i == 2:
101            break
102    else:
103        print "FAILED!"
104    print
105    return i,n
106
107
108@cython.test_assert_path_exists("//ForFromStatNode")
109@cython.test_fail_if_path_exists("//ForInStatNode")
110def test_return():
111    """
112    >>> test_return()
113    0
114    1
115    2
116    (2, 0)
117    """
118    cdef int i, n = 5
119    for i in range(n):
120        print i
121        n = 0
122        if i == 2:
123            return i,n
124    print
125    return "FAILED!"
126
127
128ctypedef enum RangeEnum:
129    EnumValue1
130    EnumValue2
131    EnumValue3
132
133
134@cython.test_assert_path_exists("//ForFromStatNode")
135@cython.test_fail_if_path_exists("//ForInStatNode")
136def test_enum_range():
137    """
138    # NOTE: it's not entirely clear that this is the expected behaviour, but that's how it currently is.
139    >>> test_enum_range()
140    'RangeEnum'
141    """
142    cdef RangeEnum n = EnumValue3
143    for i in range(n):
144        assert 0 <= <int>i < <int>n
145        assert cython.typeof(i) == "RangeEnum", cython.typeof(i)
146    return cython.typeof(i)
147