@@ -553,3 +553,70 @@ TEST(OptionalRefTest, SwapNullIntializedWithValue) {
553
553
EXPECT_EQ (o1.value (), 42 );
554
554
EXPECT_TRUE (!o2.has_value ());
555
555
}
556
+
557
+ TEST (OptionalRefTest, AssignFromOptional) {
558
+ int var = 42 ;
559
+ beman::optional26::optional<int &> o1 = beman::optional26::nullopt ;
560
+ beman::optional26::optional<int &> o2 = var;
561
+
562
+ o2 = o1;
563
+
564
+ using beman::optional26::tests::base;
565
+ using beman::optional26::tests::derived;
566
+
567
+ base b{1 };
568
+ derived d (1 , 2 );
569
+ beman::optional26::optional<base&> empty_base;
570
+ beman::optional26::optional<base&> engaged_base{b};
571
+
572
+ beman::optional26::optional<derived&> empty_derived_ref;
573
+ beman::optional26::optional<derived&> engaged_derived_ref{d};
574
+
575
+ beman::optional26::optional<base&> optional_base_ref;
576
+ optional_base_ref = empty_base;
577
+ EXPECT_FALSE (optional_base_ref.has_value ());
578
+ optional_base_ref = engaged_base;
579
+ EXPECT_TRUE (optional_base_ref.has_value ());
580
+
581
+ optional_base_ref = empty_derived_ref;
582
+ EXPECT_FALSE (optional_base_ref.has_value ());
583
+
584
+ optional_base_ref = engaged_derived_ref;
585
+ EXPECT_TRUE (optional_base_ref.has_value ());
586
+
587
+ beman::optional26::optional<derived> empty_derived;
588
+ beman::optional26::optional<derived> engaged_derived{d};
589
+
590
+ static_assert (std::is_constructible_v<const base&, derived>);
591
+
592
+ beman::optional26::optional<const base&> optional_base_const_ref;
593
+ optional_base_const_ref = empty_derived;
594
+ EXPECT_FALSE (optional_base_const_ref.has_value ());
595
+
596
+ optional_base_const_ref = engaged_derived;
597
+ EXPECT_TRUE (optional_base_const_ref.has_value ());
598
+
599
+ if (empty_derived) {
600
+ optional_base_ref = empty_derived.value ();
601
+ } else {
602
+ optional_base_ref.reset ();
603
+ }
604
+ EXPECT_FALSE (optional_base_ref.has_value ());
605
+
606
+ if (engaged_derived) {
607
+ optional_base_ref = engaged_derived.value ();
608
+ } else {
609
+ optional_base_ref.reset ();
610
+ }
611
+ EXPECT_TRUE (optional_base_ref.has_value ());
612
+
613
+ derived d2 (2 , 2 );
614
+ engaged_derived = d2;
615
+ EXPECT_EQ (optional_base_ref.value ().m_i , static_cast <base>(d2).m_i );
616
+
617
+ // delete the rvalue ref overload
618
+ // optional_base_const_ref = beman::optional26::optional<derived>(derived(3, 4));
619
+ // EXPECT_TRUE(optional_base_ref.has_value());
620
+ // EXPECT_EQ(*optional_base_ref, derived(3,4));
621
+
622
+ }
0 commit comments