1cimport cython
2
3
4def generator():
5    yield 2
6    yield 1
7    yield 3
8
9
10def returns_set():
11    return {"foo", "bar", "baz"}
12
13
14def returns_tuple():
15    return (1, 2, 3, 0)
16
17
18@cython.test_fail_if_path_exists("//SimpleCallNode")
19def sorted_arg(x):
20    """
21    >>> a = [3, 2, 1]
22    >>> sorted_arg(a)
23    [1, 2, 3]
24    >>> a
25    [3, 2, 1]
26    >>> sorted(generator())
27    [1, 2, 3]
28    >>> sorted(returns_set())
29    ['bar', 'baz', 'foo']
30    >>> sorted(returns_tuple())
31    [0, 1, 2, 3]
32    >>> sorted(object())
33    Traceback (most recent call last):
34    TypeError: 'object' object is not iterable
35    """
36    return sorted(x)
37
38
39@cython.test_assert_path_exists("//GeneralCallNode")
40def sorted_arg_with_key(x):
41    """
42    >>> a = [3, 2, 1]
43    >>> sorted_arg_with_key(a)
44    [3, 2, 1]
45    >>> a
46    [3, 2, 1]
47    >>> sorted_arg_with_key(generator())
48    [3, 2, 1]
49    >>> sorted_arg_with_key(returns_tuple())
50    [3, 2, 1, 0]
51    >>> sorted_arg_with_key(object())
52    Traceback (most recent call last):
53    TypeError: 'object' object is not iterable
54    """
55    return sorted(x, key=lambda x: -x)
56
57
58@cython.test_fail_if_path_exists("//YieldExprNode",
59                                 "//NoneCheckNode")
60@cython.test_assert_path_exists("//InlinedGeneratorExpressionNode")
61def sorted_genexp():
62    """
63    >>> sorted_genexp()
64    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
65    """
66    return sorted(i*i for i in range(10,0,-1))
67
68
69@cython.test_fail_if_path_exists("//SimpleCallNode//SimpleCallNode")
70@cython.test_assert_path_exists("//SimpleCallNode/NameNode[@name = 'range']")
71def sorted_list_of_range():
72    """
73    >>> sorted_list_of_range()
74    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
75    """
76    return sorted(list(range(10,0,-1)))
77
78
79@cython.test_fail_if_path_exists("//SimpleCallNode")
80def sorted_list_literal():
81    """
82    >>> sorted_list_literal()
83    [1, 1, 2, 2, 3, 3]
84    """
85    return sorted([3, 1, 2] * 2)
86
87
88@cython.test_fail_if_path_exists("//SimpleCallNode")
89def sorted_tuple_literal():
90    """
91    >>> sorted_tuple_literal()
92    [1, 1, 2, 2, 3, 3]
93    """
94    return sorted((1, 3, 2) * 2)
95