summaryrefslogtreecommitdiff
path: root/tests/run/cpp_stl_any.pyx
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run/cpp_stl_any.pyx')
-rw-r--r--tests/run/cpp_stl_any.pyx78
1 files changed, 78 insertions, 0 deletions
diff --git a/tests/run/cpp_stl_any.pyx b/tests/run/cpp_stl_any.pyx
new file mode 100644
index 000000000..ccdc2a01f
--- /dev/null
+++ b/tests/run/cpp_stl_any.pyx
@@ -0,0 +1,78 @@
+# ticket: 2633
+# mode: run
+# tag: cpp, cpp17, werror
+
+from libcpp cimport bool
+from libcpp.any cimport any, any_cast
+from libcpp.pair cimport pair
+from cython.operator cimport typeid
+
+def simple_test():
+ """
+ >>> simple_test()
+ """
+ cdef any u
+ assert not u.has_value()
+ v = new any(u)
+ assert not v.has_value()
+ u = 42
+ assert u.has_value()
+ v = new any(u)
+ assert v.has_value()
+
+def reset_test():
+ """
+ >>> reset_test()
+ """
+ cdef any a
+ assert not a.has_value()
+ a = 42
+ assert a.has_value()
+ a.reset()
+ assert not a.has_value()
+
+def cast_test():
+ """
+ >>> cast_test()
+ """
+ cdef any a
+ a = 1
+ assert a.type() == typeid(int)
+ assert any_cast[int](a) == 1
+ a = 3.14
+ assert a.type() == typeid(double)
+ assert any_cast[double](a) == 3.14
+ a = <bool>(True)
+ assert a.type() == typeid(bool)
+ assert any_cast[bool](a) == True
+ # bad cast
+ try:
+ a = 1
+ b = any_cast[double](a)
+ except TypeError:
+ pass
+
+def emplace_test():
+ """
+ >>> emplace_test()
+ """
+ cdef any a
+ a = 42
+ assert any_cast[int](a) == 42
+ a.emplace[pair[int,int]](1,2)
+ assert any_cast[pair[int,int]](a) == pair[int,int](1,2)
+ a.reset()
+ assert not a.has_value()
+ a.emplace[pair[int,int]](1,2)
+ assert any_cast[pair[int,int]](a) == pair[int,int](1,2)
+
+def swap_test():
+ """
+ >>> swap_test()
+ """
+ cdef any a, b
+ a = 42
+ b = "hello"
+ a.swap(b)
+ assert any_cast[str](a) == "hello"
+ assert any_cast[int](b) == 42