Merging r259346 (with adjustments for r258867):
[oota-llvm.git] / unittests / ADT / PointerSumTypeTest.cpp
1 //===- llvm/unittest/ADT/PointerSumTypeTest.cpp ---------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "gtest/gtest.h"
11 #include "llvm/ADT/PointerSumType.h"
12 using namespace llvm;
13
14 namespace {
15
16 struct PointerSumTypeTest : public testing::Test {
17   enum Kinds { Float, Int1, Int2 };
18   float f;
19   int i1, i2;
20
21   typedef PointerSumType<Kinds, PointerSumTypeMember<Float, float *>,
22                          PointerSumTypeMember<Int1, int *>,
23                          PointerSumTypeMember<Int2, int *>>
24       SumType;
25   SumType a, b, c, n;
26
27   PointerSumTypeTest()
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() {}
30 };
31
32 TEST_F(PointerSumTypeTest, NullTest) {
33   EXPECT_TRUE(a);
34   EXPECT_TRUE(b);
35   EXPECT_TRUE(c);
36   EXPECT_FALSE(n);
37 }
38
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());
44 }
45
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>());
56 }
57
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>());
68
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>());
74 }
75
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>());
80 }
81
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>());
87
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>());
92
93   float Local = 1.616f;
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>());
98
99   n = SumType::create<Int1>(&i2);
100   EXPECT_TRUE(n);
101   EXPECT_EQ(nullptr, n.get<Float>());
102   EXPECT_EQ(&i2, n.get<Int1>());
103   EXPECT_EQ(nullptr, n.get<Int2>());
104
105   n = SumType::create<Float>(nullptr);
106   EXPECT_FALSE(n);
107   EXPECT_EQ(nullptr, n.get<Float>());
108   EXPECT_EQ(nullptr, n.get<Int1>());
109   EXPECT_EQ(nullptr, n.get<Int2>());
110 }
111
112
113 } // end anonymous namespace