1 | //===- llvm/unittest/ADT/PointerSumTypeTest.cpp ---------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "llvm/ADT/PointerSumType.h" |
10 | #include "gtest/gtest.h" |
11 | using namespace llvm; |
12 | |
13 | namespace { |
14 | |
15 | struct PointerSumTypeTest : public testing::Test { |
16 | enum Kinds { Float, Int1, Int2 }; |
17 | float f; |
18 | int i1, i2; |
19 | |
20 | typedef PointerSumType<Kinds, PointerSumTypeMember<Float, float *>, |
21 | PointerSumTypeMember<Int1, int *>, |
22 | PointerSumTypeMember<Int2, int *>> |
23 | SumType; |
24 | SumType a, b, c, n; |
25 | |
26 | PointerSumTypeTest() |
27 | : f(3.14f), i1(42), i2(-1), a(SumType::create<Float>(Pointer: &f)), |
28 | b(SumType::create<Int1>(Pointer: &i1)), c(SumType::create<Int2>(Pointer: &i2)), n() {} |
29 | }; |
30 | |
31 | TEST_F(PointerSumTypeTest, NullTest) { |
32 | EXPECT_TRUE(a); |
33 | EXPECT_TRUE(b); |
34 | EXPECT_TRUE(c); |
35 | EXPECT_FALSE(n); |
36 | } |
37 | |
38 | TEST_F(PointerSumTypeTest, GetTag) { |
39 | EXPECT_EQ(Float, a.getTag()); |
40 | EXPECT_EQ(Int1, b.getTag()); |
41 | EXPECT_EQ(Int2, c.getTag()); |
42 | EXPECT_EQ((Kinds)0, n.getTag()); |
43 | } |
44 | |
45 | TEST_F(PointerSumTypeTest, Is) { |
46 | EXPECT_TRUE(a.is<Float>()); |
47 | EXPECT_FALSE(a.is<Int1>()); |
48 | EXPECT_FALSE(a.is<Int2>()); |
49 | EXPECT_FALSE(b.is<Float>()); |
50 | EXPECT_TRUE(b.is<Int1>()); |
51 | EXPECT_FALSE(b.is<Int2>()); |
52 | EXPECT_FALSE(c.is<Float>()); |
53 | EXPECT_FALSE(c.is<Int1>()); |
54 | EXPECT_TRUE(c.is<Int2>()); |
55 | } |
56 | |
57 | TEST_F(PointerSumTypeTest, Get) { |
58 | EXPECT_EQ(&f, a.get<Float>()); |
59 | EXPECT_EQ(nullptr, a.get<Int1>()); |
60 | EXPECT_EQ(nullptr, a.get<Int2>()); |
61 | EXPECT_EQ(nullptr, b.get<Float>()); |
62 | EXPECT_EQ(&i1, b.get<Int1>()); |
63 | EXPECT_EQ(nullptr, b.get<Int2>()); |
64 | EXPECT_EQ(nullptr, c.get<Float>()); |
65 | EXPECT_EQ(nullptr, c.get<Int1>()); |
66 | EXPECT_EQ(&i2, c.get<Int2>()); |
67 | |
68 | // Note that we can use .get even on a null sum type. It just always produces |
69 | // a null pointer, even if one of the discriminants is null. |
70 | EXPECT_EQ(nullptr, n.get<Float>()); |
71 | EXPECT_EQ(nullptr, n.get<Int1>()); |
72 | EXPECT_EQ(nullptr, n.get<Int2>()); |
73 | } |
74 | |
75 | TEST_F(PointerSumTypeTest, Cast) { |
76 | EXPECT_EQ(&f, a.cast<Float>()); |
77 | EXPECT_EQ(&i1, b.cast<Int1>()); |
78 | EXPECT_EQ(&i2, c.cast<Int2>()); |
79 | } |
80 | |
81 | TEST_F(PointerSumTypeTest, Assignment) { |
82 | b = SumType::create<Int2>(Pointer: &i2); |
83 | EXPECT_EQ(nullptr, b.get<Float>()); |
84 | EXPECT_EQ(nullptr, b.get<Int1>()); |
85 | EXPECT_EQ(&i2, b.get<Int2>()); |
86 | |
87 | b = SumType::create<Int2>(Pointer: &i1); |
88 | EXPECT_EQ(nullptr, b.get<Float>()); |
89 | EXPECT_EQ(nullptr, b.get<Int1>()); |
90 | EXPECT_EQ(&i1, b.get<Int2>()); |
91 | |
92 | float Local = 1.616f; |
93 | b = SumType::create<Float>(Pointer: &Local); |
94 | EXPECT_EQ(&Local, b.get<Float>()); |
95 | EXPECT_EQ(nullptr, b.get<Int1>()); |
96 | EXPECT_EQ(nullptr, b.get<Int2>()); |
97 | |
98 | n = SumType::create<Int1>(Pointer: &i2); |
99 | EXPECT_TRUE(n); |
100 | EXPECT_EQ(nullptr, n.get<Float>()); |
101 | EXPECT_EQ(&i2, n.get<Int1>()); |
102 | EXPECT_EQ(nullptr, n.get<Int2>()); |
103 | |
104 | n = SumType::create<Float>(Pointer: nullptr); |
105 | EXPECT_FALSE(n); |
106 | EXPECT_EQ(nullptr, n.get<Float>()); |
107 | EXPECT_EQ(nullptr, n.get<Int1>()); |
108 | EXPECT_EQ(nullptr, n.get<Int2>()); |
109 | } |
110 | |
111 | |
112 | } // end anonymous namespace |
113 | |