@@ -153,6 +153,53 @@ TEST(OptionalTest, OptionalOfOptional) {
153153 EXPECT_TRUE (oo2.value () == 43 );
154154}
155155
156+ TEST (OptionalTest, EmplaceVariadic) {
157+ struct for_emplace {
158+ int a;
159+ int b;
160+ int c;
161+ } f{4 , 5 , 6 };
162+
163+ beman::optional::optional<for_emplace> o3;
164+ o3.emplace (1 , 2 , 3 );
165+ EXPECT_TRUE (o3.has_value ());
166+
167+ beman::optional::optional<for_emplace> engaged{f};
168+ engaged.emplace (1 , 2 , 3 );
169+ EXPECT_TRUE (engaged.has_value ());
170+ EXPECT_EQ (engaged->a , 1 );
171+ }
172+
173+ TEST (OptionalTest, EmplaceInitializerList) {
174+ struct for_emplace {
175+ std::vector<int > v; // something to construct with list
176+ std::string name = " " ;
177+ for_emplace (std::initializer_list<int > l) : v(l) {}
178+ for_emplace (std::initializer_list<int > l, std::string n) : v(l), name(n) {}
179+ } f{{1 , 2 , 3 }};
180+
181+ beman::optional::optional<for_emplace> o3;
182+ o3.emplace ({1 , 2 , 3 });
183+ EXPECT_TRUE (o3.has_value ());
184+
185+ beman::optional::optional<for_emplace> engaged{f};
186+
187+ auto e1 = engaged.emplace ({1 , 2 , 3 });
188+
189+ EXPECT_TRUE (engaged.has_value ());
190+ EXPECT_EQ (engaged->v [0 ], 1 );
191+ EXPECT_EQ (engaged->name , std::string (" " ));
192+ EXPECT_EQ (engaged->v [0 ], e1 .v [0 ]);
193+ EXPECT_EQ (engaged->name , e1 .name );
194+
195+ auto e2 = engaged.emplace ({2 , 3 , 4 }, " Name" );
196+ EXPECT_TRUE (engaged.has_value ());
197+ EXPECT_EQ (engaged->v [0 ], 2 );
198+ EXPECT_EQ (engaged->name , std::string (" Name" ));
199+ EXPECT_EQ (engaged->v [0 ], e2 .v [0 ]);
200+ EXPECT_EQ (engaged->name , e2 .name );
201+ }
202+
156203TEST (OptionalTest, AssignmentValue) {
157204 beman::optional::optional<int > o1 = 42 ;
158205 beman::optional::optional<int > o2 = 12 ;
@@ -192,6 +239,15 @@ TEST(OptionalTest, AssignmentValue) {
192239 o1 = s;
193240 EXPECT_TRUE (*o1 == 54 );
194241
242+ beman::optional::optional<short > emptyShort;
243+ o1 = emptyShort;
244+ EXPECT_FALSE (o1);
245+
246+ o1 = o4;
247+ EXPECT_TRUE (*o1 == 42 );
248+ o1 = std::move (emptyShort);
249+ EXPECT_FALSE (o1);
250+
195251 struct not_trivial_copy_assignable {
196252 int i_;
197253 constexpr not_trivial_copy_assignable (int i) : i_(i) {}
@@ -243,6 +299,58 @@ TEST(OptionalTest, AssignmentValue) {
243299 EXPECT_FALSE (o8);
244300}
245301
302+ TEST (OptionalTest, ConvertingAssignmentValue) {
303+ beman::optional::optional<int > o1 = 42 ;
304+ beman::optional::optional<int > o2;
305+
306+ short s = 9 ;
307+ o1 = s;
308+ o2 = s;
309+ EXPECT_TRUE (o1);
310+ EXPECT_TRUE (o2);
311+ }
312+
313+ TEST (OptionalTest, ConvertingValueAssignment) {
314+ struct base {};
315+
316+ struct convertible {
317+ operator base () { return base{}; }
318+ };
319+
320+ beman::optional::optional<base> empty;
321+ beman::optional::optional<base> engaged (base{});
322+
323+ empty = convertible{};
324+ engaged = convertible{};
325+ EXPECT_TRUE (empty);
326+ EXPECT_TRUE (engaged);
327+ }
328+
329+ TEST (OptionalTest, ValueObserver) {
330+ beman::optional::optional<int > empty;
331+ beman::optional::optional<int > bound{5 };
332+ EXPECT_TRUE (bound);
333+ EXPECT_FALSE (empty);
334+ EXPECT_EQ (*bound, 5 );
335+ EXPECT_EQ (bound.value (), 5 );
336+ EXPECT_EQ (std::as_const (bound).value (), 5 );
337+ EXPECT_EQ (std::move (bound).value (), 5 );
338+
339+ EXPECT_THROW (
340+ {
341+ try {
342+ empty.value ();
343+ } catch (const beman::optional::bad_optional_access& e) {
344+ EXPECT_STREQ (" Optional has no value" , e.what ());
345+ throw ;
346+ }
347+ },
348+ beman::optional::bad_optional_access);
349+
350+ EXPECT_THROW ({ std::as_const (empty).value (); }, beman::optional::bad_optional_access);
351+ EXPECT_THROW ({ std::move (empty).value (); }, beman::optional::bad_optional_access);
352+ }
353+
246354TEST (OptionalTest, Triviality) {
247355 EXPECT_TRUE (std::is_trivially_copy_constructible<beman::optional::optional<int >>::value);
248356 EXPECT_TRUE (std::is_trivially_copy_assignable<beman::optional::optional<int >>::value);
@@ -401,6 +509,16 @@ TEST(OptionalTest, MakeOptional) {
401509 EXPECT_TRUE (o5->v [1 ] == 1 );
402510 EXPECT_TRUE (std::get<0 >(o5->t ) == 2 );
403511 EXPECT_TRUE (std::get<1 >(o5->t ) == 3 );
512+
513+ struct for_variadic {
514+ int a;
515+ int b;
516+ int c;
517+ };
518+
519+ auto o6 = beman::optional::make_optional<for_variadic>(0 , 1 , 3 );
520+ EXPECT_TRUE (o6);
521+ EXPECT_EQ (o6->a , 0 );
404522}
405523
406524TEST (OptionalTest, Nullopt) {
0 commit comments