1 // This file is part of OpenCV project.
2 // It is subject to the license terms in the LICENSE file found in the top-level directory
3 // of this distribution and at http://opencv.org/license.html.
5 // Copyright (C) 2018-2019 Intel Corporation
8 #include "test_precomp.hpp"
9 #include "opencv2/gapi/util/optional.hpp"
10 #include <opencv2/gapi/util/compiler_hints.hpp> //suppress_unused_warning
15 TEST(Optional, EmptyCtor)
17 util::optional<int> o;
18 EXPECT_FALSE(o.has_value());
19 EXPECT_FALSE(static_cast<bool>(o));
22 TEST(Optional, ValueCTor)
24 util::optional<int> o(42);
25 EXPECT_TRUE(o.has_value());
26 EXPECT_TRUE(static_cast<bool>(o));
29 TEST(Optional, MoveCtr)
31 util::optional<std::string> os1(std::string("text"));
32 EXPECT_TRUE(os1.has_value());
34 util::optional<std::string> os2(std::move(os1));
35 EXPECT_FALSE(os1.has_value());
36 EXPECT_TRUE(os2.has_value());
37 EXPECT_EQ("text", os2.value());
40 TEST(Optional, EmptyThrows)
42 struct foo { int bar; };
43 util::optional<foo> om;
44 const util::optional<foo> oc;
48 EXPECT_THROW(dummy = om->bar, util::bad_optional_access);
49 EXPECT_THROW(dummy = oc->bar, util::bad_optional_access);
50 cv::util::suppress_unused_warning(dummy);
51 EXPECT_THROW(*om, util::bad_optional_access);
52 EXPECT_THROW(*oc, util::bad_optional_access);
53 EXPECT_THROW(om.value(), util::bad_optional_access);
54 EXPECT_THROW(oc.value(), util::bad_optional_access);
57 TEST(Optional, ValueNoThrow)
59 struct foo { int bar; };
60 util::optional<foo> om(foo{42});
61 const util::optional<foo> oc(foo{42});
64 EXPECT_NO_THROW(dummy = om->bar);
65 EXPECT_NO_THROW(dummy = oc->bar);
66 cv::util::suppress_unused_warning(dummy);
69 EXPECT_NO_THROW(om.value());
70 EXPECT_NO_THROW(oc.value());
75 util::optional<int> oi(42);
77 struct foo { int bar; };
78 util::optional<foo> of(foo{42});
80 EXPECT_EQ(42, oi.value());
83 EXPECT_EQ(42, of.value().bar);
84 EXPECT_EQ(42, of->bar);
87 TEST(Optional, Mutable)
89 util::optional<int> oi(42);
93 struct foo { int bar; int baz; };
94 util::optional<foo> of(foo{11,22});
97 EXPECT_EQ(42, of->bar);
98 EXPECT_EQ(22, of->baz);
101 EXPECT_EQ(42, of->bar);
102 EXPECT_EQ(33, of->baz);
105 TEST(Optional, MoveAssign)
107 util::optional<int> e, i(42);
109 EXPECT_FALSE(e.has_value());
110 EXPECT_TRUE(i.has_value());
114 EXPECT_TRUE(e.has_value());
115 EXPECT_FALSE(i.has_value());
119 TEST(Optional, CopyAssign)
121 util::optional<int> e;
122 const util::optional<int> i(42);
124 EXPECT_FALSE(e.has_value());
125 EXPECT_TRUE(i.has_value());
129 EXPECT_TRUE(e.has_value());
130 EXPECT_TRUE(i.has_value());
135 TEST(Optional, ValueOr)
137 util::optional<int> e;
138 EXPECT_FALSE(e.has_value());
139 EXPECT_EQ(42, e.value_or(42));
140 EXPECT_EQ(42, e.value_or(42.1));
145 util::optional<int> e, i(42);
147 EXPECT_FALSE(e.has_value());
148 EXPECT_TRUE(i.has_value());
153 EXPECT_TRUE(e.has_value());
154 EXPECT_FALSE(i.has_value());
158 TEST(Optional, Reset)
160 util::optional<int> i(42);
161 EXPECT_TRUE(i.has_value());
164 EXPECT_FALSE(i.has_value());
167 TEST(Optional, MakeOptional)
169 std::string s("text");
170 auto os = util::make_optional(s);
171 EXPECT_TRUE(os.has_value());
172 EXPECT_EQ(s, os.value());
175 } // namespace opencv_test