// MPark.Variant // // Copyright Michael Park, 2015-2017 // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #include #include #include "util.hpp" namespace lib = mpark::lib; TEST(Get, HoldsAlternative) { mpark::variant v(42); EXPECT_TRUE(mpark::holds_alternative<0>(v)); EXPECT_FALSE(mpark::holds_alternative<1>(v)); EXPECT_TRUE(mpark::holds_alternative(v)); EXPECT_FALSE(mpark::holds_alternative(v)); /* constexpr */ { constexpr mpark::variant cv(42); static_assert(mpark::holds_alternative<0>(cv), ""); static_assert(!mpark::holds_alternative<1>(cv), ""); static_assert(mpark::holds_alternative(cv), ""); static_assert(!mpark::holds_alternative(cv), ""); } } TEST(Get, MutVarMutType) { mpark::variant v(42); EXPECT_EQ(42, mpark::get(v)); // Check qualifier. EXPECT_EQ(LRef, get_qual(mpark::get(v))); EXPECT_EQ(RRef, get_qual(mpark::get(lib::move(v)))); } TEST(Get, MutVarConstType) { mpark::variant v(42); EXPECT_EQ(42, mpark::get(v)); // Check qualifier. EXPECT_EQ(ConstLRef, get_qual(mpark::get(v))); EXPECT_EQ(ConstRRef, get_qual(mpark::get(lib::move(v)))); } TEST(Get, ConstVarMutType) { const mpark::variant v(42); EXPECT_EQ(42, mpark::get(v)); // Check qualifier. EXPECT_EQ(ConstLRef, get_qual(mpark::get(v))); EXPECT_EQ(ConstRRef, get_qual(mpark::get(lib::move(v)))); /* constexpr */ { constexpr mpark::variant cv(42); static_assert(42 == mpark::get(cv), ""); // Check qualifier. static_assert(ConstLRef == get_qual(mpark::get(cv)), ""); static_assert(ConstRRef == get_qual(mpark::get(lib::move(cv))), ""); } } TEST(Get, ConstVarConstType) { const mpark::variant v(42); EXPECT_EQ(42, mpark::get(v)); // Check qualifier. EXPECT_EQ(ConstLRef, get_qual(mpark::get(v))); EXPECT_EQ(ConstRRef, get_qual(mpark::get(lib::move(v)))); /* constexpr */ { constexpr mpark::variant cv(42); static_assert(42 == mpark::get(cv), ""); // Check qualifier. static_assert(ConstLRef == get_qual(mpark::get(cv)), ""); static_assert(ConstRRef == get_qual(mpark::get(lib::move(cv))), ""); } } #ifdef MPARK_EXCEPTIONS TEST(Get, ValuelessByException) { mpark::variant v(42); EXPECT_THROW(v = move_thrower_t{}, MoveConstruction); EXPECT_TRUE(v.valueless_by_exception()); EXPECT_THROW(mpark::get(v), mpark::bad_variant_access); EXPECT_THROW(mpark::get(v), mpark::bad_variant_access); } #endif TEST(GetIf, MutVarMutType) { mpark::variant v(42); EXPECT_EQ(42, *mpark::get_if(&v)); // Check qualifier. EXPECT_EQ(Ptr, get_qual(mpark::get_if(&v))); } TEST(GetIf, MutVarConstType) { mpark::variant v(42); EXPECT_EQ(42, *mpark::get_if(&v)); // Check qualifier. EXPECT_EQ(ConstPtr, get_qual(mpark::get_if(&v))); } TEST(GetIf, ConstVarMutType) { const mpark::variant v(42); EXPECT_EQ(42, *mpark::get_if(&v)); // Check qualifier. EXPECT_EQ(ConstPtr, get_qual(mpark::get_if(&v))); /* constexpr */ { static constexpr mpark::variant cv(42); static_assert(42 == *mpark::get_if(&cv), ""); // Check qualifier. static_assert(ConstPtr == get_qual(mpark::get_if(&cv)), ""); } } TEST(GetIf, ConstVarConstType) { const mpark::variant v(42); EXPECT_EQ(42, *mpark::get_if(&v)); // Check qualifier. EXPECT_EQ(ConstPtr, get_qual(mpark::get_if(&v))); /* constexpr */ { static constexpr mpark::variant cv(42); static_assert(42 == *mpark::get_if(&cv), ""); // Check qualifier. static_assert(ConstPtr == get_qual(mpark::get_if(&cv)), ""); } } #ifdef MPARK_EXCEPTONS TEST(GetIf, ValuelessByException) { mpark::variant v(42); EXPECT_THROW(v = move_thrower_t{}, MoveConstruction); EXPECT_TRUE(v.valueless_by_exception()); EXPECT_EQ(nullptr, mpark::get_if(&v)); EXPECT_EQ(nullptr, mpark::get_if(&v)); } #endif