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