//===- llvm/unittest/ADT/PointerSumTypeTest.cpp ---------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #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