//===- llvm/unittest/ADT/PointerSumTypeTest.cpp ---------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ADT/PointerSumType.h" #include "gtest/gtest.h" using namespace llvm; namespace { struct PointerSumTypeTest : public testing::Test { enum Kinds { Float, Int1, Int2 }; float f; int i1, i2; typedef PointerSumType, PointerSumTypeMember, PointerSumTypeMember> SumType; SumType a, b, c, n; PointerSumTypeTest() : f(3.14f), i1(42), i2(-1), a(SumType::create(&f)), b(SumType::create(&i1)), c(SumType::create(&i2)), n() {} }; TEST_F(PointerSumTypeTest, NullTest) { EXPECT_TRUE(a); EXPECT_TRUE(b); EXPECT_TRUE(c); EXPECT_FALSE(n); } TEST_F(PointerSumTypeTest, GetTag) { EXPECT_EQ(Float, a.getTag()); EXPECT_EQ(Int1, b.getTag()); EXPECT_EQ(Int2, c.getTag()); EXPECT_EQ((Kinds)0, n.getTag()); } TEST_F(PointerSumTypeTest, Is) { EXPECT_TRUE(a.is()); EXPECT_FALSE(a.is()); EXPECT_FALSE(a.is()); EXPECT_FALSE(b.is()); EXPECT_TRUE(b.is()); EXPECT_FALSE(b.is()); EXPECT_FALSE(c.is()); EXPECT_FALSE(c.is()); EXPECT_TRUE(c.is()); } TEST_F(PointerSumTypeTest, Get) { EXPECT_EQ(&f, a.get()); EXPECT_EQ(nullptr, a.get()); EXPECT_EQ(nullptr, a.get()); EXPECT_EQ(nullptr, b.get()); EXPECT_EQ(&i1, b.get()); EXPECT_EQ(nullptr, b.get()); EXPECT_EQ(nullptr, c.get()); EXPECT_EQ(nullptr, c.get()); EXPECT_EQ(&i2, c.get()); // Note that we can use .get even on a null sum type. It just always produces // a null pointer, even if one of the discriminants is null. EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(nullptr, n.get()); } TEST_F(PointerSumTypeTest, Cast) { EXPECT_EQ(&f, a.cast()); EXPECT_EQ(&i1, b.cast()); EXPECT_EQ(&i2, c.cast()); } TEST_F(PointerSumTypeTest, Assignment) { b = SumType::create(&i2); EXPECT_EQ(nullptr, b.get()); EXPECT_EQ(nullptr, b.get()); EXPECT_EQ(&i2, b.get()); b = SumType::create(&i1); EXPECT_EQ(nullptr, b.get()); EXPECT_EQ(nullptr, b.get()); EXPECT_EQ(&i1, b.get()); float Local = 1.616f; b = SumType::create(&Local); EXPECT_EQ(&Local, b.get()); EXPECT_EQ(nullptr, b.get()); EXPECT_EQ(nullptr, b.get()); n = SumType::create(&i2); EXPECT_TRUE(n); EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(&i2, n.get()); EXPECT_EQ(nullptr, n.get()); n = SumType::create(nullptr); EXPECT_FALSE(n); EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(nullptr, n.get()); EXPECT_EQ(nullptr, n.get()); } } // end anonymous namespace