1 //===- llvm/unittest/ADT/PointerSumTypeTest.cpp ---------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "gtest/gtest.h"
11 #include "llvm/ADT/PointerSumType.h"
16 struct PointerSumTypeTest : public testing::Test {
17 enum Kinds { Float, Int1, Int2 };
21 typedef PointerSumType<Kinds, PointerSumTypeMember<Float, float *>,
22 PointerSumTypeMember<Int1, int *>,
23 PointerSumTypeMember<Int2, int *>>
28 : f(3.14f), i1(42), i2(-1), a(SumType::create<Float>(&f)),
29 b(SumType::create<Int1>(&i1)), c(SumType::create<Int2>(&i2)), n() {}
32 TEST_F(PointerSumTypeTest, NullTest) {
39 TEST_F(PointerSumTypeTest, GetTag) {
40 EXPECT_EQ(Float, a.getTag());
41 EXPECT_EQ(Int1, b.getTag());
42 EXPECT_EQ(Int2, c.getTag());
43 EXPECT_EQ((Kinds)0, n.getTag());
46 TEST_F(PointerSumTypeTest, Is) {
47 EXPECT_TRUE(a.is<Float>());
48 EXPECT_FALSE(a.is<Int1>());
49 EXPECT_FALSE(a.is<Int2>());
50 EXPECT_FALSE(b.is<Float>());
51 EXPECT_TRUE(b.is<Int1>());
52 EXPECT_FALSE(b.is<Int2>());
53 EXPECT_FALSE(c.is<Float>());
54 EXPECT_FALSE(c.is<Int1>());
55 EXPECT_TRUE(c.is<Int2>());
58 TEST_F(PointerSumTypeTest, Get) {
59 EXPECT_EQ(&f, a.get<Float>());
60 EXPECT_EQ(nullptr, a.get<Int1>());
61 EXPECT_EQ(nullptr, a.get<Int2>());
62 EXPECT_EQ(nullptr, b.get<Float>());
63 EXPECT_EQ(&i1, b.get<Int1>());
64 EXPECT_EQ(nullptr, b.get<Int2>());
65 EXPECT_EQ(nullptr, c.get<Float>());
66 EXPECT_EQ(nullptr, c.get<Int1>());
67 EXPECT_EQ(&i2, c.get<Int2>());
69 // Note that we can use .get even on a null sum type. It just always produces
70 // a null pointer, even if one of the discriminants is null.
71 EXPECT_EQ(nullptr, n.get<Float>());
72 EXPECT_EQ(nullptr, n.get<Int1>());
73 EXPECT_EQ(nullptr, n.get<Int2>());
76 TEST_F(PointerSumTypeTest, Cast) {
77 EXPECT_EQ(&f, a.cast<Float>());
78 EXPECT_EQ(&i1, b.cast<Int1>());
79 EXPECT_EQ(&i2, c.cast<Int2>());
82 TEST_F(PointerSumTypeTest, Assignment) {
83 b = SumType::create<Int2>(&i2);
84 EXPECT_EQ(nullptr, b.get<Float>());
85 EXPECT_EQ(nullptr, b.get<Int1>());
86 EXPECT_EQ(&i2, b.get<Int2>());
88 b = SumType::create<Int2>(&i1);
89 EXPECT_EQ(nullptr, b.get<Float>());
90 EXPECT_EQ(nullptr, b.get<Int1>());
91 EXPECT_EQ(&i1, b.get<Int2>());
94 b = SumType::create<Float>(&Local);
95 EXPECT_EQ(&Local, b.get<Float>());
96 EXPECT_EQ(nullptr, b.get<Int1>());
97 EXPECT_EQ(nullptr, b.get<Int2>());
99 n = SumType::create<Int1>(&i2);
101 EXPECT_EQ(nullptr, n.get<Float>());
102 EXPECT_EQ(&i2, n.get<Int1>());
103 EXPECT_EQ(nullptr, n.get<Int2>());
105 n = SumType::create<Float>(nullptr);
107 EXPECT_EQ(nullptr, n.get<Float>());
108 EXPECT_EQ(nullptr, n.get<Int1>());
109 EXPECT_EQ(nullptr, n.get<Int2>());
113 } // end anonymous namespace