summaryrefslogtreecommitdiff
path: root/tests/run/cpp_scoped_enums.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run/cpp_scoped_enums.pyx')
-rw-r--r--tests/run/cpp_scoped_enums.pyx136
1 files changed, 136 insertions, 0 deletions
diff --git a/tests/run/cpp_scoped_enums.pyx b/tests/run/cpp_scoped_enums.pyx
new file mode 100644
index 000000000..7a2bc912f
--- /dev/null
+++ b/tests/run/cpp_scoped_enums.pyx
@@ -0,0 +1,136 @@
+# mode: run
+# tag: cpp, cpp11
+
+from libcpp.limits cimport numeric_limits
+
+cdef extern from *:
+ """
+ enum class Enum1 {
+ Item1,
+ Item2
+ };
+ """
+ cdef enum class Enum1:
+ Item1
+ Item2
+
+
+cdef extern from * namespace "Namespace1":
+ """
+ namespace Namespace1 {
+ enum class Enum2 {
+ Item1,
+ Item2
+ };
+ }
+ """
+ cdef enum class Enum2:
+ Item1
+ Item2
+
+
+cdef enum class Enum3(int):
+ a = 1
+ b = 2
+
+
+cdef extern from *:
+ """
+ enum class sorted
+ {
+ a = 1,
+ b = 0
+ };
+ """
+ cdef enum class Enum4 "sorted":
+ a
+ b
+
+
+cdef extern from *:
+ """
+ #include <limits>
+
+ enum class LongIntEnum : long int {
+ val = std::numeric_limits<long int>::max(),
+ };
+ """
+ enum class LongIntEnum(long int):
+ val
+
+
+def test_compare_enums():
+ """
+ >>> test_compare_enums()
+ (True, True, False, False)
+ """
+ cdef Enum1 x, y
+ x = Enum1.Item1
+ y = Enum1.Item2
+
+ return (
+ x == Enum1.Item1,
+ y == Enum1.Item2,
+ x == Enum1.Item2,
+ y == Enum1.Item1
+ )
+
+
+def test_compare_namespace_enums():
+ """
+ >>> test_compare_enums()
+ (True, True, False, False)
+ """
+ cdef Enum2 z, w
+
+ z = Enum2.Item1
+ w = Enum2.Item2
+
+ return (
+ z == Enum2.Item1,
+ w == Enum2.Item2,
+ z == Enum2.Item2,
+ w == Enum2.Item1
+ )
+
+
+def test_coerce_to_from_py_value(object i):
+ """
+ >>> test_coerce_to_from_py_value(1)
+ (True, False)
+
+ >>> test_coerce_to_from_py_value(2)
+ (False, True)
+
+ >>> test_coerce_to_from_py_value(3)
+ (False, False)
+
+ >>> test_coerce_to_from_py_value(11111111111111111111111111111111111111111111)
+ Traceback (most recent call last):
+ OverflowError: Python int too large to convert to C long
+ """
+ cdef Enum3 x = i
+ y = Enum3.b
+
+ return (
+ x == Enum3.a,
+ y == int(i)
+ )
+
+
+def test_reserved_cname():
+ """
+ >>> test_reserved_cname()
+ True
+ """
+ cdef Enum4 x = Enum4.a
+ return Enum4.a == int(1)
+
+
+def test_large_enum():
+ """
+ >>> test_large_enum()
+ True
+ """
+ long_max = int(numeric_limits[long].max())
+ return LongIntEnum.val == long_max