cython
1# ticket: 3293
2# mode: run
3# tag: cpp, cpp17, werror
4
5from cython.operator cimport dereference as deref
6from libcpp.optional cimport optional, nullopt, make_optional
7from libcpp.string cimport string
8from libcpp.pair cimport pair
9
10def simple_test():
11"""
12>>> simple_test()
13"""
14cdef optional[int] o
15assert(not o.has_value())
16try:
17o.value()
18except Exception as err:
19pass
20else:
21assert False, "value() did not raise a catchable error"
22o = 5
23assert(o.has_value())
24assert(o.value()==5)
25o.reset()
26assert(not o.has_value())
27
28def operator_test():
29"""
30>>> operator_test()
31"""
32cdef optional[int] o1, o2
33
34# operator bool
35assert(not o1)
36o1 = 5
37assert(o1)
38
39# operator *
40assert(deref(o1) == 5)
41
42# operator =,==,!=,>,<,>=,<=
43assert(not o1 == o2)
44assert(o1 != o2)
45o2 = o1
46assert(o1 == o2)
47assert(not o1 > o2)
48assert(not o1 < o2)
49assert(o1 >= o2)
50assert(o1 <= o2)
51
52# operators =,== for other types (all related operators are identical)
53o1 = 6
54assert(o1 == 6)
55o2 = nullopt
56assert(o2 == nullopt)
57
58def misc_methods_test():
59"""
60>>> misc_methods_test()
61"""
62
63# make_optional
64cdef optional[int] o
65o = make_optional[int](5)
66assert(o == 5)
67
68# swap
69o.swap(optional[int](6))
70assert(o == 6)
71
72# emplace
73cdef optional[pair[int,int]] op
74cdef pair[int,int]* val_ptr = &op.emplace(1,2)
75assert(op.has_value())
76assert(op.value() == pair[int,int](1,2))
77assert(&op.value() == val_ptr) # check returned reference
78
79