cython
1# mode: run
2# tag: cpp, cpp11
3
4from libcpp.limits cimport numeric_limits
5
6cdef extern from *:
7"""
8enum class Enum1 {
9Item1,
10Item2
11};
12"""
13cdef enum class Enum1:
14Item1
15Item2
16
17
18cdef extern from * namespace "Namespace1":
19"""
20namespace Namespace1 {
21enum class Enum2 {
22Item1,
23Item2
24};
25}
26"""
27cdef enum class Enum2:
28Item1
29Item2
30
31
32cdef enum class Enum3(int):
33a = 1
34b = 2
35
36
37cdef extern from *:
38"""
39enum class sorted
40{
41a = 1,
42b = 0
43};
44"""
45cdef enum class Enum4 "sorted":
46a
47b
48
49
50cdef extern from *:
51"""
52#include <limits>
53
54enum class LongIntEnum : long int {
55val = std::numeric_limits<long int>::max(),
56};
57"""
58enum class LongIntEnum(long int):
59val
60
61
62def test_compare_enums():
63"""
64>>> test_compare_enums()
65(True, True, False, False)
66"""
67cdef Enum1 x, y
68x = Enum1.Item1
69y = Enum1.Item2
70
71return (
72x == Enum1.Item1,
73y == Enum1.Item2,
74x == Enum1.Item2,
75y == Enum1.Item1
76)
77
78
79def test_compare_namespace_enums():
80"""
81>>> test_compare_enums()
82(True, True, False, False)
83"""
84cdef Enum2 z, w
85
86z = Enum2.Item1
87w = Enum2.Item2
88
89return (
90z == Enum2.Item1,
91w == Enum2.Item2,
92z == Enum2.Item2,
93w == Enum2.Item1
94)
95
96
97def test_coerce_to_from_py_value(object i):
98"""
99>>> test_coerce_to_from_py_value(1)
100(True, False)
101
102>>> test_coerce_to_from_py_value(2)
103(False, True)
104
105>>> test_coerce_to_from_py_value(3)
106(False, False)
107
108>>> test_coerce_to_from_py_value(11111111111111111111111111111111111111111111)
109Traceback (most recent call last):
110OverflowError: Python int too large to convert to C long
111"""
112cdef Enum3 x = i
113y = Enum3.b
114
115return (
116x == Enum3.a,
117y == int(i)
118)
119
120
121def test_reserved_cname():
122"""
123>>> test_reserved_cname()
124True
125"""
126cdef Enum4 x = Enum4.a
127return Enum4.a == int(1)
128
129
130def test_large_enum():
131"""
132>>> test_large_enum()
133True
134"""
135long_max = int(numeric_limits[long].max())
136return LongIntEnum.val == long_max
137