Home | History | Annotate | Download | only in libpdx
      1 #include <array>
      2 #include <cstdint>
      3 #include <functional>
      4 #include <memory>
      5 #include <string>
      6 #include <type_traits>
      7 
      8 #include <gtest/gtest.h>
      9 #include <pdx/rpc/variant.h>
     10 
     11 using namespace android::pdx;
     12 using namespace android::pdx::rpc;
     13 
     14 namespace {
     15 
     16 struct BaseType {
     17   BaseType(int value) : value(value) {}
     18   int value;
     19 };
     20 
     21 struct DerivedType : BaseType {
     22   DerivedType(int value) : BaseType{value} {};
     23 };
     24 
     25 template <typename T>
     26 class TestType {
     27  public:
     28   TestType(const T& value) : value_(value) {}
     29   TestType(T&& value) : value_(std::move(value)) {}
     30   TestType(const TestType&) = default;
     31   TestType(TestType&&) = default;
     32 
     33   TestType& operator=(const TestType&) = default;
     34   TestType& operator=(TestType&&) = default;
     35 
     36   const T& get() const { return value_; }
     37   T&& take() { return std::move(value_); }
     38 
     39  private:
     40   T value_;
     41 };
     42 
     43 template <typename T>
     44 class InstrumentType {
     45  public:
     46   InstrumentType(const T& value) : value_(value) { constructor_count_++; }
     47   InstrumentType(T&& value) : value_(std::move(value)) { constructor_count_++; }
     48   InstrumentType(const InstrumentType& other) : value_(other.value_) {
     49     constructor_count_++;
     50   }
     51   InstrumentType(InstrumentType&& other) : value_(std::move(other.value_)) {
     52     constructor_count_++;
     53   }
     54   InstrumentType(const TestType<T>& other) : value_(other.get()) {
     55     constructor_count_++;
     56   }
     57   InstrumentType(TestType<T>&& other) : value_(other.take()) {
     58     constructor_count_++;
     59   }
     60   ~InstrumentType() { destructor_count_++; }
     61 
     62   InstrumentType& operator=(const InstrumentType& other) {
     63     copy_assignment_count_++;
     64     value_ = other.value_;
     65     return *this;
     66   }
     67   InstrumentType& operator=(InstrumentType&& other) {
     68     move_assignment_count_++;
     69     value_ = std::move(other.value_);
     70     return *this;
     71   }
     72 
     73   InstrumentType& operator=(const TestType<T>& other) {
     74     copy_assignment_count_++;
     75     value_ = other.get();
     76     return *this;
     77   }
     78   InstrumentType& operator=(TestType<T>&& other) {
     79     move_assignment_count_++;
     80     value_ = other.take();
     81     return *this;
     82   }
     83 
     84   static std::size_t constructor_count() { return constructor_count_; }
     85   static std::size_t destructor_count() { return destructor_count_; }
     86   static std::size_t move_assignment_count() { return move_assignment_count_; }
     87   static std::size_t copy_assignment_count() { return copy_assignment_count_; }
     88 
     89   const T& get() const { return value_; }
     90   T&& take() { return std::move(value_); }
     91 
     92   static void clear() {
     93     constructor_count_ = 0;
     94     destructor_count_ = 0;
     95     move_assignment_count_ = 0;
     96     copy_assignment_count_ = 0;
     97   }
     98 
     99  private:
    100   T value_;
    101 
    102   static std::size_t constructor_count_;
    103   static std::size_t destructor_count_;
    104   static std::size_t move_assignment_count_;
    105   static std::size_t copy_assignment_count_;
    106 };
    107 
    108 template <typename T>
    109 std::size_t InstrumentType<T>::constructor_count_ = 0;
    110 template <typename T>
    111 std::size_t InstrumentType<T>::destructor_count_ = 0;
    112 template <typename T>
    113 std::size_t InstrumentType<T>::move_assignment_count_ = 0;
    114 template <typename T>
    115 std::size_t InstrumentType<T>::copy_assignment_count_ = 0;
    116 
    117 }  // anonymous namespace
    118 
    119 TEST(Variant, Assignment) {
    120   // Assert basic type properties.
    121   {
    122     Variant<int, bool, float> v;
    123     ASSERT_EQ(-1, v.index());
    124     ASSERT_FALSE(v.is<int>());
    125     ASSERT_FALSE(v.is<bool>());
    126     ASSERT_FALSE(v.is<float>());
    127   }
    128 
    129   {
    130     Variant<int, bool, float> v;
    131     v = 10;
    132     ASSERT_EQ(0, v.index());
    133     ASSERT_TRUE(v.is<int>());
    134     ASSERT_FALSE(v.is<bool>());
    135     ASSERT_FALSE(v.is<float>());
    136     EXPECT_EQ(10, std::get<int>(v));
    137   }
    138 
    139   {
    140     Variant<int, bool, float> v;
    141     v = false;
    142     ASSERT_EQ(1, v.index());
    143     ASSERT_FALSE(v.is<int>());
    144     ASSERT_TRUE(v.is<bool>());
    145     ASSERT_FALSE(v.is<float>());
    146     EXPECT_EQ(false, std::get<bool>(v));
    147   }
    148 
    149   {
    150     Variant<int, bool, float> v;
    151     v = 1.0f;
    152     ASSERT_EQ(2, v.index());
    153     ASSERT_FALSE(v.is<int>());
    154     ASSERT_FALSE(v.is<bool>());
    155     ASSERT_TRUE(v.is<float>());
    156     EXPECT_FLOAT_EQ(1.0f, std::get<float>(v));
    157   }
    158 
    159   {
    160     Variant<int, bool, float> v;
    161     // ERROR: More than one type is implicitly convertible from double.
    162     // v = 1.0;
    163     v = static_cast<float>(1.0);
    164   }
    165 
    166   {
    167     Variant<int, bool, float> v;
    168 
    169     double x = 1.1;
    170     v = static_cast<float>(x);
    171     ASSERT_EQ(2, v.index());
    172     ASSERT_FALSE(v.is<int>());
    173     ASSERT_FALSE(v.is<bool>());
    174     ASSERT_TRUE(v.is<float>());
    175     EXPECT_FLOAT_EQ(1.1, std::get<float>(v));
    176   }
    177 
    178   {
    179     Variant<int, std::string> v;
    180     ASSERT_EQ(-1, v.index());
    181     ASSERT_FALSE(v.is<int>());
    182     ASSERT_FALSE(v.is<std::string>());
    183   }
    184 
    185   {
    186     Variant<int, std::string> v;
    187     v = 20;
    188     ASSERT_EQ(0, v.index());
    189     ASSERT_TRUE(v.is<int>());
    190     ASSERT_FALSE(v.is<std::string>());
    191     EXPECT_EQ(20, std::get<int>(v));
    192   }
    193 
    194   {
    195     Variant<int, std::string> v;
    196     v = std::string("test");
    197     ASSERT_EQ(1, v.index());
    198     ASSERT_FALSE(v.is<int>());
    199     ASSERT_TRUE(v.is<std::string>());
    200     EXPECT_EQ("test", std::get<std::string>(v));
    201   }
    202 
    203   {
    204     Variant<int, std::string> v;
    205     v = "test";
    206     ASSERT_EQ(1, v.index());
    207     ASSERT_FALSE(v.is<int>());
    208     ASSERT_TRUE(v.is<std::string>());
    209     EXPECT_EQ("test", std::get<std::string>(v));
    210   }
    211 
    212   {
    213     Variant<const char*> v1;
    214     Variant<std::string> v2;
    215 
    216     v1 = "test";
    217     ASSERT_TRUE(v1.is<const char*>());
    218     v2 = v1;
    219     ASSERT_TRUE(v2.is<std::string>());
    220     EXPECT_EQ("test", std::get<std::string>(v2));
    221   }
    222 
    223   {
    224     Variant<int> a(1);
    225     Variant<int> b;
    226     ASSERT_TRUE(!a.empty());
    227     ASSERT_TRUE(b.empty());
    228 
    229     a = b;
    230     ASSERT_TRUE(a.empty());
    231     ASSERT_TRUE(b.empty());
    232   }
    233 
    234   {
    235     Variant<int*, char*> v;
    236 
    237     // ERROR: More than one type is implicitly convertible from nullptr.
    238     // v = nullptr;
    239 
    240     v = static_cast<int*>(nullptr);
    241     EXPECT_TRUE(v.is<int*>());
    242 
    243     v = static_cast<char*>(nullptr);
    244     EXPECT_TRUE(v.is<char*>());
    245   }
    246 
    247   {
    248     Variant<int*, char*> v;
    249     int a = 10;
    250     char b = 20;
    251 
    252     v = &b;
    253     ASSERT_TRUE(v.is<char*>());
    254     EXPECT_EQ(&b, std::get<char*>(v));
    255     EXPECT_EQ(b, *std::get<char*>(v));
    256 
    257     v = &a;
    258     ASSERT_TRUE(v.is<int*>());
    259     EXPECT_EQ(&a, std::get<int*>(v));
    260     EXPECT_EQ(a, *std::get<int*>(v));
    261   }
    262 
    263   {
    264     using IntRef = std::reference_wrapper<int>;
    265     Variant<IntRef> v;
    266     int a = 10;
    267 
    268     v = a;
    269     ASSERT_TRUE(v.is<IntRef>());
    270     EXPECT_EQ(a, std::get<IntRef>(v));
    271 
    272     a = 20;
    273     EXPECT_EQ(a, std::get<IntRef>(v));
    274   }
    275 }
    276 
    277 TEST(Variant, MoveAssignment) {
    278   {
    279     Variant<std::string> v;
    280     std::string s = "test";
    281     v = std::move(s);
    282 
    283     EXPECT_TRUE(s.empty());
    284     ASSERT_TRUE(v.is<std::string>());
    285     EXPECT_EQ("test", std::get<std::string>(v));
    286   }
    287 
    288   {
    289     Variant<std::string> v("test");
    290     std::string s = "fizz";
    291     s = std::move(std::get<std::string>(v));
    292 
    293     ASSERT_TRUE(v.is<std::string>());
    294     EXPECT_TRUE(std::get<std::string>(v).empty());
    295     EXPECT_EQ("test", s);
    296   }
    297 
    298   {
    299     Variant<std::string> a("test");
    300     Variant<std::string> b;
    301 
    302     b = std::move(a);
    303     ASSERT_TRUE(a.is<std::string>());
    304     ASSERT_TRUE(b.is<std::string>());
    305     EXPECT_TRUE(std::get<std::string>(a).empty());
    306     EXPECT_EQ("test", std::get<std::string>(b));
    307   }
    308 
    309   {
    310     Variant<std::string> a("test");
    311     Variant<std::string> b("fizz");
    312 
    313     b = std::move(a);
    314     ASSERT_TRUE(a.is<std::string>());
    315     ASSERT_TRUE(b.is<std::string>());
    316     EXPECT_TRUE(std::get<std::string>(a).empty());
    317     EXPECT_EQ("test", std::get<std::string>(b));
    318   }
    319 
    320   {
    321     Variant<int, std::string> a("test");
    322     Variant<int, std::string> b(10);
    323 
    324     b = std::move(a);
    325     ASSERT_TRUE(a.is<std::string>());
    326     ASSERT_TRUE(b.is<std::string>());
    327     EXPECT_TRUE(std::get<std::string>(a).empty());
    328     EXPECT_EQ("test", std::get<std::string>(b));
    329   }
    330 
    331   {
    332     Variant<int, std::string> a(10);
    333     Variant<int, std::string> b("test");
    334 
    335     b = std::move(a);
    336     ASSERT_TRUE(a.is<int>());
    337     ASSERT_TRUE(b.is<int>());
    338     EXPECT_EQ(10, std::get<int>(a));
    339     EXPECT_EQ(10, std::get<int>(b));
    340   }
    341 }
    342 
    343 TEST(Variant, Constructor) {
    344   {
    345     Variant<int, bool, float> v(true);
    346     EXPECT_TRUE(v.is<bool>());
    347   }
    348 
    349   {
    350     Variant<int, bool, float> v(10);
    351     EXPECT_TRUE(v.is<int>());
    352   }
    353 
    354   {
    355     Variant<int, bool, float> v(10.1f);
    356     EXPECT_TRUE(v.is<float>());
    357   }
    358 
    359   {
    360     Variant<float, std::string> v(10.);
    361     EXPECT_TRUE(v.is<float>());
    362   }
    363 
    364   {
    365     TestType<int> i(1);
    366     Variant<int, bool, float> v(i.take());
    367     ASSERT_TRUE(v.is<int>());
    368     EXPECT_EQ(1, std::get<int>(v));
    369   }
    370 
    371   {
    372     TestType<int> i(1);
    373     Variant<int, bool, float> v(i.get());
    374     ASSERT_TRUE(v.is<int>());
    375     EXPECT_EQ(1, std::get<int>(v));
    376   }
    377 
    378   {
    379     TestType<bool> b(true);
    380     Variant<int, bool, float> v(b.take());
    381     ASSERT_TRUE(v.is<bool>());
    382     EXPECT_EQ(true, std::get<bool>(v));
    383   }
    384 
    385   {
    386     TestType<bool> b(true);
    387     Variant<int, bool, float> v(b.get());
    388     ASSERT_TRUE(v.is<bool>());
    389     EXPECT_EQ(true, std::get<bool>(v));
    390   }
    391 
    392   {
    393     Variant<const char*> c("test");
    394     Variant<std::string> s(c);
    395     ASSERT_TRUE(s.is<std::string>());
    396     EXPECT_EQ("test", std::get<std::string>(s));
    397   }
    398 
    399   {
    400     Variant<int, bool, float> a(true);
    401     Variant<int, bool, float> b(a);
    402 
    403     ASSERT_TRUE(b.is<bool>());
    404   }
    405 
    406   {
    407     using IntRef = std::reference_wrapper<int>;
    408     int a = 10;
    409     Variant<IntRef> v(a);
    410     TestType<IntRef> t(a);
    411 
    412     ASSERT_TRUE(v.is<IntRef>());
    413     EXPECT_EQ(a, std::get<IntRef>(v));
    414     EXPECT_EQ(a, t.get());
    415 
    416     a = 20;
    417     EXPECT_EQ(a, std::get<IntRef>(v));
    418     EXPECT_EQ(a, t.get());
    419   }
    420 }
    421 
    422 // Verify correct ctor/dtor and assignment behavior used an instrumented type.
    423 TEST(Variant, CopyMoveConstructAssign) {
    424   {
    425     InstrumentType<int>::clear();
    426 
    427     // Default construct to empty, no InstrumentType activity.
    428     Variant<int, InstrumentType<int>> v;
    429     ASSERT_EQ(0u, InstrumentType<int>::constructor_count());
    430     ASSERT_EQ(0u, InstrumentType<int>::destructor_count());
    431     ASSERT_EQ(0u, InstrumentType<int>::move_assignment_count());
    432     ASSERT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    433   }
    434 
    435   {
    436     InstrumentType<int>::clear();
    437 
    438     // Construct from int type, no InstrumentType activity.
    439     Variant<int, InstrumentType<int>> v;
    440     v = 10;
    441     EXPECT_EQ(0u, InstrumentType<int>::constructor_count());
    442     EXPECT_EQ(0u, InstrumentType<int>::destructor_count());
    443     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    444     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    445   }
    446 
    447   {
    448     InstrumentType<int>::clear();
    449 
    450     // Construct from int type, no InstrumentType activity.
    451     Variant<int, InstrumentType<int>> v(10);
    452     EXPECT_EQ(0u, InstrumentType<int>::constructor_count());
    453     EXPECT_EQ(0u, InstrumentType<int>::destructor_count());
    454     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    455     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    456   }
    457 
    458   {
    459     InstrumentType<int>::clear();
    460 
    461     // Construct from temporary, temporary ctor/dtor.
    462     Variant<int, InstrumentType<int>> v;
    463     v = InstrumentType<int>(25);
    464     EXPECT_EQ(2u, InstrumentType<int>::constructor_count());
    465     EXPECT_EQ(1u, InstrumentType<int>::destructor_count());
    466     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    467     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    468   }
    469 
    470   {
    471     InstrumentType<int>::clear();
    472 
    473     // Construct from temporary, temporary ctor/dtor.
    474     Variant<int, InstrumentType<int>> v(InstrumentType<int>(25));
    475     EXPECT_EQ(2u, InstrumentType<int>::constructor_count());
    476     EXPECT_EQ(1u, InstrumentType<int>::destructor_count());
    477     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    478     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    479   }
    480 
    481   {
    482     InstrumentType<int>::clear();
    483 
    484     // Construct from temporary, temporary ctor/dtor.
    485     Variant<int, InstrumentType<int>> v(InstrumentType<int>(25));
    486 
    487     // Assign from temporary, temporary ctor/dtor.
    488     v = InstrumentType<int>(35);
    489     EXPECT_EQ(3u, InstrumentType<int>::constructor_count());
    490     EXPECT_EQ(2u, InstrumentType<int>::destructor_count());
    491     EXPECT_EQ(1u, InstrumentType<int>::move_assignment_count());
    492     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    493   }
    494 
    495   {
    496     InstrumentType<int>::clear();
    497 
    498     // Construct from temporary, temporary ctor/dtor.
    499     Variant<int, InstrumentType<int>> v(InstrumentType<int>(25));
    500 
    501     // dtor.
    502     v = 10;
    503     EXPECT_EQ(2u, InstrumentType<int>::constructor_count());
    504     EXPECT_EQ(2u, InstrumentType<int>::destructor_count());
    505     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    506     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    507   }
    508 
    509   {
    510     InstrumentType<int>::clear();
    511 
    512     // Construct from temporary, temporary ctor/dtor.
    513     Variant<int, InstrumentType<int>> v(InstrumentType<int>(25));
    514 
    515     EXPECT_EQ(2u, InstrumentType<int>::constructor_count());
    516     EXPECT_EQ(1u, InstrumentType<int>::destructor_count());
    517     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    518     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    519   }
    520   EXPECT_EQ(2u, InstrumentType<int>::constructor_count());
    521   EXPECT_EQ(2u, InstrumentType<int>::destructor_count());
    522   EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    523   EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    524 
    525   {
    526     InstrumentType<int>::clear();
    527 
    528     // Construct from other temporary.
    529     Variant<int, InstrumentType<int>> v(TestType<int>(10));
    530     EXPECT_EQ(1u, InstrumentType<int>::constructor_count());
    531     EXPECT_EQ(0u, InstrumentType<int>::destructor_count());
    532     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    533     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    534   }
    535 
    536   {
    537     InstrumentType<int>::clear();
    538 
    539     // Construct from other temporary.
    540     Variant<int, InstrumentType<int>> v(TestType<int>(10));
    541     // Assign from other temporary.
    542     v = TestType<int>(11);
    543     EXPECT_EQ(1u, InstrumentType<int>::constructor_count());
    544     EXPECT_EQ(0u, InstrumentType<int>::destructor_count());
    545     EXPECT_EQ(1u, InstrumentType<int>::move_assignment_count());
    546     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    547   }
    548 
    549   {
    550     InstrumentType<int>::clear();
    551 
    552     // Construct from other temporary.
    553     Variant<int, InstrumentType<int>> v(TestType<int>(10));
    554     // Assign from empty Variant.
    555     v = Variant<int, InstrumentType<int>>();
    556     EXPECT_EQ(1u, InstrumentType<int>::constructor_count());
    557     EXPECT_EQ(1u, InstrumentType<int>::destructor_count());
    558     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    559     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    560   }
    561 
    562   {
    563     InstrumentType<int>::clear();
    564 
    565     TestType<int> other(10);
    566     // Construct from other.
    567     Variant<int, InstrumentType<int>> v(other);
    568 
    569     EXPECT_EQ(1u, InstrumentType<int>::constructor_count());
    570     EXPECT_EQ(0u, InstrumentType<int>::destructor_count());
    571     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    572     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    573   }
    574 
    575   {
    576     InstrumentType<int>::clear();
    577 
    578     // Construct from other temporary.
    579     Variant<int, InstrumentType<int>> v(TestType<int>(0));
    580     TestType<int> other(10);
    581     // Assign from other.
    582     v = other;
    583     EXPECT_EQ(1u, InstrumentType<int>::constructor_count());
    584     EXPECT_EQ(0u, InstrumentType<int>::destructor_count());
    585     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    586     EXPECT_EQ(1u, InstrumentType<int>::copy_assignment_count());
    587   }
    588 
    589   {
    590     InstrumentType<int>::clear();
    591 
    592     // Construct from temporary, temporary ctor/dtor.
    593     Variant<int, InstrumentType<int>> v(InstrumentType<int>(25));
    594 
    595     // Assign EmptyVariant.
    596     v = EmptyVariant{};
    597 
    598     EXPECT_EQ(2u, InstrumentType<int>::constructor_count());
    599     EXPECT_EQ(2u, InstrumentType<int>::destructor_count());
    600     EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    601     EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    602   }
    603   EXPECT_EQ(2u, InstrumentType<int>::constructor_count());
    604   EXPECT_EQ(2u, InstrumentType<int>::destructor_count());
    605   EXPECT_EQ(0u, InstrumentType<int>::move_assignment_count());
    606   EXPECT_EQ(0u, InstrumentType<int>::copy_assignment_count());
    607 }
    608 
    609 TEST(Variant, MoveConstructor) {
    610   {
    611     std::unique_ptr<int> pointer = std::make_unique<int>(10);
    612     Variant<std::unique_ptr<int>> v(std::move(pointer));
    613     ASSERT_TRUE(v.is<std::unique_ptr<int>>());
    614     EXPECT_TRUE(std::get<std::unique_ptr<int>>(v) != nullptr);
    615     EXPECT_TRUE(pointer == nullptr);
    616   }
    617 
    618   {
    619     Variant<std::unique_ptr<int>> a(std::make_unique<int>(10));
    620     Variant<std::unique_ptr<int>> b(std::move(a));
    621 
    622     ASSERT_TRUE(a.is<std::unique_ptr<int>>());
    623     ASSERT_TRUE(b.is<std::unique_ptr<int>>());
    624     EXPECT_TRUE(std::get<std::unique_ptr<int>>(a) == nullptr);
    625     EXPECT_TRUE(std::get<std::unique_ptr<int>>(b) != nullptr);
    626   }
    627 }
    628 
    629 TEST(Variant, IndexOf) {
    630   Variant<int, bool, float> v1;
    631 
    632   EXPECT_EQ(0, v1.index_of<int>());
    633   EXPECT_EQ(1, v1.index_of<bool>());
    634   EXPECT_EQ(2, v1.index_of<float>());
    635 
    636   Variant<int, bool, float, int> v2;
    637 
    638   EXPECT_EQ(0, v2.index_of<int>());
    639   EXPECT_EQ(1, v2.index_of<bool>());
    640   EXPECT_EQ(2, v2.index_of<float>());
    641 }
    642 
    643 struct Visitor {
    644   int int_value = 0;
    645   bool bool_value = false;
    646   float float_value = 0.0;
    647   bool empty_value = false;
    648 
    649   void Visit(int value) { int_value = value; }
    650   void Visit(bool value) { bool_value = value; }
    651   void Visit(float value) { float_value = value; }
    652   void Visit(EmptyVariant) { empty_value = true; }
    653 };
    654 
    655 TEST(Variant, Visit) {
    656   {
    657     Variant<int, bool, float> v(10);
    658     EXPECT_TRUE(v.is<int>());
    659 
    660     Visitor visitor;
    661     v.Visit([&visitor](const auto& value) { visitor.Visit(value); });
    662     EXPECT_EQ(10, visitor.int_value);
    663 
    664     visitor = {};
    665     v = true;
    666     v.Visit([&visitor](const auto& value) { visitor.Visit(value); });
    667     EXPECT_EQ(true, visitor.bool_value);
    668   }
    669 
    670   {
    671     Variant<int, bool, float> v;
    672     EXPECT_EQ(-1, v.index());
    673 
    674     Visitor visitor;
    675     v.Visit([&visitor](const auto& value) { visitor.Visit(value); });
    676     EXPECT_TRUE(visitor.empty_value);
    677   }
    678 
    679   {
    680     Variant<std::string> v("test");
    681     ASSERT_TRUE(v.is<std::string>());
    682     EXPECT_FALSE(std::get<std::string>(v).empty());
    683 
    684     v.Visit([](auto&& value) {
    685       std::remove_reference_t<decltype(value)> empty;
    686       std::swap(empty, value);
    687     });
    688     ASSERT_TRUE(v.is<std::string>());
    689     EXPECT_TRUE(std::get<std::string>(v).empty());
    690   }
    691 }
    692 
    693 TEST(Variant, Become) {
    694   {
    695     Variant<int, bool, float> v;
    696 
    697     v.Become(0);
    698     EXPECT_TRUE(v.is<int>());
    699 
    700     v.Become(1);
    701     EXPECT_TRUE(v.is<bool>());
    702 
    703     v.Become(2);
    704     EXPECT_TRUE(v.is<float>());
    705 
    706     v.Become(3);
    707     EXPECT_TRUE(v.empty());
    708 
    709     v.Become(-1);
    710     EXPECT_TRUE(v.empty());
    711 
    712     v.Become(-2);
    713     EXPECT_TRUE(v.empty());
    714   }
    715 
    716   {
    717     Variant<int, bool, float> v;
    718 
    719     v.Become(0, 10);
    720     ASSERT_TRUE(v.is<int>());
    721     EXPECT_EQ(10, std::get<int>(v));
    722 
    723     v.Become(1, true);
    724     ASSERT_TRUE(v.is<bool>());
    725     EXPECT_EQ(true, std::get<bool>(v));
    726 
    727     v.Become(2, 2.0f);
    728     ASSERT_TRUE(v.is<float>());
    729     EXPECT_FLOAT_EQ(2.0f, std::get<float>(v));
    730 
    731     v.Become(3, 10);
    732     EXPECT_TRUE(v.empty());
    733 
    734     v.Become(-1, 10);
    735     EXPECT_TRUE(v.empty());
    736 
    737     v.Become(-2, 20);
    738     EXPECT_TRUE(v.empty());
    739   }
    740 
    741   {
    742     Variant<std::string> v;
    743 
    744     v.Become(0);
    745     ASSERT_TRUE(v.is<std::string>());
    746     EXPECT_TRUE(std::get<std::string>(v).empty());
    747   }
    748 
    749   {
    750     Variant<std::string> v;
    751 
    752     v.Become(0, "test");
    753     ASSERT_TRUE(v.is<std::string>());
    754     EXPECT_EQ("test", std::get<std::string>(v));
    755   }
    756 
    757   {
    758     Variant<std::string> v("foo");
    759 
    760     v.Become(0, "bar");
    761     ASSERT_TRUE(v.is<std::string>());
    762     EXPECT_EQ("foo", std::get<std::string>(v));
    763   }
    764 }
    765 
    766 TEST(Variant, Swap) {
    767   {
    768     Variant<std::string> a;
    769     Variant<std::string> b;
    770 
    771     std::swap(a, b);
    772     EXPECT_TRUE(a.empty());
    773     EXPECT_TRUE(b.empty());
    774   }
    775 
    776   {
    777     Variant<std::string> a("1");
    778     Variant<std::string> b;
    779 
    780     std::swap(a, b);
    781     EXPECT_TRUE(a.empty());
    782     EXPECT_TRUE(!b.empty());
    783     ASSERT_TRUE(b.is<std::string>());
    784     EXPECT_EQ("1", std::get<std::string>(b));
    785   }
    786 
    787   {
    788     Variant<std::string> a;
    789     Variant<std::string> b("1");
    790 
    791     std::swap(a, b);
    792     EXPECT_TRUE(!a.empty());
    793     EXPECT_TRUE(b.empty());
    794     ASSERT_TRUE(a.is<std::string>());
    795     EXPECT_EQ("1", std::get<std::string>(a));
    796   }
    797 
    798   {
    799     Variant<std::string> a("1");
    800     Variant<std::string> b("2");
    801 
    802     std::swap(a, b);
    803     ASSERT_TRUE(a.is<std::string>());
    804     ASSERT_TRUE(b.is<std::string>());
    805     EXPECT_EQ("2", std::get<std::string>(a));
    806     EXPECT_EQ("1", std::get<std::string>(b));
    807   }
    808 
    809   {
    810     Variant<int, std::string> a(10);
    811     Variant<int, std::string> b("1");
    812 
    813     std::swap(a, b);
    814     ASSERT_TRUE(a.is<std::string>());
    815     ASSERT_TRUE(b.is<int>());
    816     EXPECT_EQ("1", std::get<std::string>(a));
    817     EXPECT_EQ(10, std::get<int>(b));
    818   }
    819 
    820   {
    821     Variant<int, std::string> a("1");
    822     Variant<int, std::string> b(10);
    823 
    824     std::swap(a, b);
    825     ASSERT_TRUE(a.is<int>());
    826     ASSERT_TRUE(b.is<std::string>());
    827     EXPECT_EQ(10, std::get<int>(a));
    828     EXPECT_EQ("1", std::get<std::string>(b));
    829   }
    830 }
    831 
    832 TEST(Variant, Get) {
    833   {
    834     Variant<int, bool, float, int> v;
    835 
    836     EXPECT_EQ(nullptr, &std::get<int>(v));
    837     EXPECT_EQ(nullptr, &std::get<bool>(v));
    838     EXPECT_EQ(nullptr, &std::get<float>(v));
    839     EXPECT_EQ(nullptr, &std::get<0>(v));
    840     EXPECT_EQ(nullptr, &std::get<1>(v));
    841     EXPECT_EQ(nullptr, &std::get<2>(v));
    842     EXPECT_EQ(nullptr, &std::get<3>(v));
    843   }
    844 
    845   {
    846     Variant<int, bool, float, int> v;
    847     v = 9;
    848     ASSERT_TRUE(v.is<int>())
    849         << "Expected type " << v.index_of<int>() << " got type " << v.index();
    850     EXPECT_EQ(9, std::get<int>(v));
    851     EXPECT_EQ(9, std::get<0>(v));
    852 
    853     std::get<int>(v) = 10;
    854     EXPECT_EQ(10, std::get<int>(v));
    855     EXPECT_EQ(10, std::get<0>(v));
    856 
    857     std::get<0>(v) = 11;
    858     EXPECT_EQ(11, std::get<int>(v));
    859     EXPECT_EQ(11, std::get<0>(v));
    860 
    861     std::get<3>(v) = 12;
    862     EXPECT_EQ(12, std::get<int>(v));
    863     EXPECT_EQ(12, std::get<3>(v));
    864   }
    865 
    866   {
    867     Variant<int, bool, float, int> v;
    868     v = false;
    869     ASSERT_TRUE(v.is<bool>())
    870         << "Expected type " << v.index_of<bool>() << " got type " << v.index();
    871     EXPECT_EQ(false, std::get<bool>(v));
    872     EXPECT_EQ(false, std::get<1>(v));
    873 
    874     std::get<bool>(v) = true;
    875     EXPECT_EQ(true, std::get<bool>(v));
    876     EXPECT_EQ(true, std::get<1>(v));
    877 
    878     std::get<bool>(v) = false;
    879     EXPECT_EQ(false, std::get<bool>(v));
    880     EXPECT_EQ(false, std::get<1>(v));
    881 
    882     std::get<1>(v) = true;
    883     EXPECT_EQ(true, std::get<bool>(v));
    884     EXPECT_EQ(true, std::get<1>(v));
    885 
    886     std::get<1>(v) = false;
    887     EXPECT_EQ(false, std::get<bool>(v));
    888     EXPECT_EQ(false, std::get<1>(v));
    889   }
    890 
    891   {
    892     Variant<int, bool, float, int> v;
    893     v = 1.0f;
    894     ASSERT_TRUE(v.is<float>())
    895         << "Expected type " << v.index_of<float>() << " got type " << v.index();
    896     EXPECT_EQ(2, v.index());
    897     EXPECT_FLOAT_EQ(1.0, std::get<float>(v));
    898     EXPECT_FLOAT_EQ(1.0, std::get<2>(v));
    899 
    900     std::get<float>(v) = 1.1;
    901     EXPECT_FLOAT_EQ(1.1, std::get<float>(v));
    902     EXPECT_FLOAT_EQ(1.1, std::get<2>(v));
    903 
    904     std::get<float>(v) = -3.0;
    905     EXPECT_FLOAT_EQ(-3.0, std::get<float>(v));
    906     EXPECT_FLOAT_EQ(-3.0, std::get<2>(v));
    907 
    908     std::get<2>(v) = 1.1;
    909     EXPECT_FLOAT_EQ(1.1, std::get<float>(v));
    910     EXPECT_FLOAT_EQ(1.1, std::get<2>(v));
    911 
    912     std::get<2>(v) = -3.0;
    913     EXPECT_FLOAT_EQ(-3.0, std::get<float>(v));
    914     EXPECT_FLOAT_EQ(-3.0, std::get<2>(v));
    915   }
    916 
    917   {
    918     Variant<std::unique_ptr<int>> v(std::make_unique<int>(10));
    919     std::unique_ptr<int> pointer = std::move(std::get<std::unique_ptr<int>>(v));
    920     ASSERT_FALSE(v.empty());
    921     EXPECT_TRUE(pointer != nullptr);
    922     EXPECT_TRUE(std::get<std::unique_ptr<int>>(v) == nullptr);
    923   }
    924 
    925   {
    926     Variant<std::string> v("test");
    927     std::string s = std::get<std::string>(std::move(v));
    928     EXPECT_EQ("test", s);
    929   }
    930 }
    931 
    932 TEST(Variant, IfAnyOf) {
    933   {
    934     Variant<int, float> v(10);
    935     ASSERT_TRUE(v.is<int>());
    936 
    937     bool b = false;
    938     EXPECT_TRUE(IfAnyOf<int>::Get(&v, &b));
    939     EXPECT_TRUE(b);
    940 
    941     float f = 0.0f;
    942     EXPECT_TRUE((IfAnyOf<int, float>::Get(&v, &f)));
    943     EXPECT_FLOAT_EQ(10.f, f);
    944   }
    945 
    946   {
    947     const Variant<int, float> v(10);
    948     ASSERT_TRUE(v.is<int>());
    949 
    950     bool b = false;
    951     EXPECT_TRUE(IfAnyOf<int>::Get(&v, &b));
    952     EXPECT_TRUE(b);
    953 
    954     float f = 0.0f;
    955     EXPECT_TRUE((IfAnyOf<int, float>::Get(&v, &f)));
    956     EXPECT_FLOAT_EQ(10.f, f);
    957   }
    958 
    959   {
    960     Variant<int, float> v(10);
    961     ASSERT_TRUE(v.is<int>());
    962 
    963     bool b = false;
    964     EXPECT_TRUE(IfAnyOf<int>::Call(&v, [&b](const auto& value) { b = value; }));
    965     EXPECT_TRUE(b);
    966 
    967     float f = 0.0f;
    968     EXPECT_TRUE((
    969         IfAnyOf<int, float>::Call(&v, [&f](const auto& value) { f = value; })));
    970     EXPECT_FLOAT_EQ(10.f, f);
    971   }
    972 
    973   {
    974     Variant<std::unique_ptr<int>, int> v(std::make_unique<int>(10));
    975     ASSERT_TRUE(v.is<std::unique_ptr<int>>());
    976     const int* original_v = std::get<std::unique_ptr<int>>(v).get();
    977 
    978     std::unique_ptr<int> u(std::make_unique<int>(20));
    979 
    980     EXPECT_TRUE(IfAnyOf<std::unique_ptr<int>>::Take(&v, &u));
    981     ASSERT_TRUE(v.is<std::unique_ptr<int>>());
    982     EXPECT_TRUE(std::get<std::unique_ptr<int>>(v) == nullptr);
    983     EXPECT_EQ(u.get(), original_v);
    984   }
    985 
    986   {
    987     Variant<std::unique_ptr<DerivedType>, int> v(
    988         std::make_unique<DerivedType>(10));
    989     ASSERT_TRUE(v.is<std::unique_ptr<DerivedType>>());
    990     const DerivedType* original_v =
    991         std::get<std::unique_ptr<DerivedType>>(v).get();
    992 
    993     std::unique_ptr<BaseType> u(std::make_unique<BaseType>(20));
    994 
    995     EXPECT_TRUE(IfAnyOf<std::unique_ptr<DerivedType>>::Take(&v, &u));
    996     ASSERT_TRUE(v.is<std::unique_ptr<DerivedType>>());
    997     EXPECT_TRUE(std::get<std::unique_ptr<DerivedType>>(v) == nullptr);
    998     EXPECT_EQ(u.get(), original_v);
    999   }
   1000 
   1001   {
   1002     Variant<std::unique_ptr<int>, int> v(std::make_unique<int>(10));
   1003     ASSERT_TRUE(v.is<std::unique_ptr<int>>());
   1004     const int* original_v = std::get<std::unique_ptr<int>>(v).get();
   1005 
   1006     std::unique_ptr<int> u(std::make_unique<int>(20));
   1007 
   1008     EXPECT_TRUE(IfAnyOf<std::unique_ptr<int>>::Call(
   1009         &v, [&u](auto&& value) { u = std::move(value); }));
   1010     ASSERT_TRUE(v.is<std::unique_ptr<int>>());
   1011     EXPECT_TRUE(std::get<std::unique_ptr<int>>(v) == nullptr);
   1012     EXPECT_EQ(u.get(), original_v);
   1013   }
   1014 
   1015   {
   1016     Variant<int, bool, float> v(true);
   1017     ASSERT_TRUE(v.is<bool>());
   1018 
   1019     float f = 0.f;
   1020     EXPECT_FALSE((IfAnyOf<int, float>::Get(&v, &f)));
   1021     EXPECT_FLOAT_EQ(0.f, f);
   1022   }
   1023 
   1024   {
   1025     Variant<std::string, int> v("foo");
   1026     ASSERT_TRUE(v.is<std::string>());
   1027 
   1028     std::string s = "bar";
   1029     EXPECT_TRUE(IfAnyOf<std::string>::Swap(&v, &s));
   1030     ASSERT_TRUE(v.is<std::string>());
   1031     EXPECT_EQ("bar", std::get<std::string>(v));
   1032     EXPECT_EQ("foo", s);
   1033   }
   1034 
   1035   {
   1036     Variant<std::string, const char*> v(static_cast<const char*>("foo"));
   1037     ASSERT_TRUE(v.is<const char*>());
   1038 
   1039     std::string s = "bar";
   1040     EXPECT_TRUE((IfAnyOf<std::string, const char*>::Take(&v, &s)));
   1041     ASSERT_TRUE(v.is<const char*>());
   1042     EXPECT_EQ("foo", std::get<const char*>(v));
   1043     EXPECT_EQ("foo", s);
   1044 
   1045     v = std::string("bar");
   1046     ASSERT_TRUE(v.is<std::string>());
   1047 
   1048     EXPECT_TRUE((IfAnyOf<std::string, const char*>::Take(&v, &s)));
   1049     ASSERT_TRUE(v.is<std::string>());
   1050     EXPECT_EQ("bar", s);
   1051   }
   1052 
   1053   {
   1054     Variant<std::string, const char*> v;
   1055     ASSERT_TRUE(v.empty());
   1056 
   1057     std::string s = "bar";
   1058     EXPECT_FALSE((IfAnyOf<std::string, const char*>::Take(&v, &s)));
   1059     EXPECT_EQ("bar", s);
   1060   }
   1061 
   1062   {
   1063     Variant<std::string, const char*> v(static_cast<const char*>("test"));
   1064     ASSERT_TRUE(v.is<const char*>());
   1065 
   1066     std::string s;
   1067     EXPECT_FALSE(IfAnyOf<>::Take(&v, &s));
   1068     EXPECT_TRUE(s.empty());
   1069   }
   1070 }
   1071 
   1072 TEST(Variant, ConstVolatile) {
   1073   {
   1074     Variant<const int> v(10);
   1075     ASSERT_TRUE(v.is<const int>());
   1076     EXPECT_EQ(10, std::get<const int>(v));
   1077   }
   1078 
   1079   {
   1080     Variant<const std::string> v("test");
   1081     ASSERT_TRUE(v.is<const std::string>());
   1082     EXPECT_EQ("test", std::get<const std::string>(v));
   1083   }
   1084 
   1085   {
   1086     Variant<volatile int, std::string> v(10);
   1087     ASSERT_TRUE(v.is<volatile int>());
   1088     EXPECT_EQ(10, std::get<volatile int>(v));
   1089   }
   1090 }
   1091 
   1092 TEST(Variant, HasType) {
   1093   EXPECT_TRUE((detail::HasType<int, int, float, bool>::value));
   1094   EXPECT_FALSE((detail::HasType<char, int, float, bool>::value));
   1095   EXPECT_FALSE(detail::HasType<>::value);
   1096 
   1097   EXPECT_TRUE((detail::HasType<int&, int, float, bool>::value));
   1098   EXPECT_FALSE((detail::HasType<char&, int, float, bool>::value));
   1099 }
   1100 
   1101 TEST(Variant, IsConstructible) {
   1102   using ArrayType = const float[3];
   1103   struct ImplicitBool {
   1104     operator bool() const { return true; }
   1105   };
   1106   struct ExplicitBool {
   1107     explicit operator bool() const { return true; }
   1108   };
   1109   struct NonBool {};
   1110   struct TwoArgs {
   1111     TwoArgs(int, bool) {}
   1112   };
   1113 
   1114   EXPECT_FALSE((detail::IsConstructible<bool, ArrayType>::value));
   1115   EXPECT_TRUE((detail::IsConstructible<bool, int>::value));
   1116   EXPECT_TRUE((detail::IsConstructible<bool, ImplicitBool>::value));
   1117   EXPECT_TRUE((detail::IsConstructible<bool, ExplicitBool>::value));
   1118   EXPECT_FALSE((detail::IsConstructible<bool, NonBool>::value));
   1119   EXPECT_TRUE((detail::IsConstructible<TwoArgs, int, bool>::value));
   1120   EXPECT_FALSE((detail::IsConstructible<TwoArgs, int, std::string>::value));
   1121   EXPECT_FALSE((detail::IsConstructible<TwoArgs, int>::value));
   1122 }
   1123 
   1124 TEST(Variant, Set) {
   1125   EXPECT_TRUE((detail::Set<int, bool, float>::template IsSubset<int, bool,
   1126                                                                 float>::value));
   1127   EXPECT_TRUE(
   1128       (detail::Set<int, bool, float>::template IsSubset<bool, float>::value));
   1129   EXPECT_TRUE((detail::Set<int, bool, float>::template IsSubset<float>::value));
   1130   EXPECT_TRUE((detail::Set<int, bool, float>::template IsSubset<>::value));
   1131 
   1132   EXPECT_FALSE(
   1133       (detail::Set<int, bool, float>::template IsSubset<int, bool, float,
   1134                                                         char>::value));
   1135   EXPECT_FALSE((detail::Set<int, bool, float>::template IsSubset<bool, float,
   1136                                                                  char>::value));
   1137   EXPECT_FALSE(
   1138       (detail::Set<int, bool, float>::template IsSubset<float, char>::value));
   1139   EXPECT_FALSE((detail::Set<int, bool, float>::template IsSubset<char>::value));
   1140 
   1141   EXPECT_TRUE(detail::Set<>::template IsSubset<>::value);
   1142   EXPECT_FALSE(detail::Set<>::template IsSubset<int>::value);
   1143   EXPECT_FALSE((detail::Set<>::template IsSubset<int, float>::value));
   1144 }
   1145