10190d073SChandler Carruth //===- llvm/unittest/ADT/PointerSumTypeTest.cpp ---------------------------===//
20190d073SChandler Carruth //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60190d073SChandler Carruth //
70190d073SChandler Carruth //===----------------------------------------------------------------------===//
80190d073SChandler Carruth 
90190d073SChandler Carruth #include "llvm/ADT/PointerSumType.h"
109a67b073SChandler Carruth #include "gtest/gtest.h"
110190d073SChandler Carruth using namespace llvm;
120190d073SChandler Carruth 
130190d073SChandler Carruth namespace {
140190d073SChandler Carruth 
150190d073SChandler Carruth struct PointerSumTypeTest : public testing::Test {
160190d073SChandler Carruth   enum Kinds { Float, Int1, Int2 };
170190d073SChandler Carruth   float f;
180190d073SChandler Carruth   int i1, i2;
190190d073SChandler Carruth 
200190d073SChandler Carruth   typedef PointerSumType<Kinds, PointerSumTypeMember<Float, float *>,
210190d073SChandler Carruth                          PointerSumTypeMember<Int1, int *>,
220190d073SChandler Carruth                          PointerSumTypeMember<Int2, int *>>
230190d073SChandler Carruth       SumType;
240190d073SChandler Carruth   SumType a, b, c, n;
250190d073SChandler Carruth 
PointerSumTypeTest__anon91ff807c0111::PointerSumTypeTest260190d073SChandler Carruth   PointerSumTypeTest()
270190d073SChandler Carruth       : f(3.14f), i1(42), i2(-1), a(SumType::create<Float>(&f)),
280190d073SChandler Carruth         b(SumType::create<Int1>(&i1)), c(SumType::create<Int2>(&i2)), n() {}
290190d073SChandler Carruth };
300190d073SChandler Carruth 
TEST_F(PointerSumTypeTest,NullTest)310190d073SChandler Carruth TEST_F(PointerSumTypeTest, NullTest) {
320190d073SChandler Carruth   EXPECT_TRUE(a);
330190d073SChandler Carruth   EXPECT_TRUE(b);
340190d073SChandler Carruth   EXPECT_TRUE(c);
350190d073SChandler Carruth   EXPECT_FALSE(n);
360190d073SChandler Carruth }
370190d073SChandler Carruth 
TEST_F(PointerSumTypeTest,GetTag)380190d073SChandler Carruth TEST_F(PointerSumTypeTest, GetTag) {
390190d073SChandler Carruth   EXPECT_EQ(Float, a.getTag());
400190d073SChandler Carruth   EXPECT_EQ(Int1, b.getTag());
410190d073SChandler Carruth   EXPECT_EQ(Int2, c.getTag());
420190d073SChandler Carruth   EXPECT_EQ((Kinds)0, n.getTag());
430190d073SChandler Carruth }
440190d073SChandler Carruth 
TEST_F(PointerSumTypeTest,Is)450190d073SChandler Carruth TEST_F(PointerSumTypeTest, Is) {
460190d073SChandler Carruth   EXPECT_TRUE(a.is<Float>());
470190d073SChandler Carruth   EXPECT_FALSE(a.is<Int1>());
480190d073SChandler Carruth   EXPECT_FALSE(a.is<Int2>());
490190d073SChandler Carruth   EXPECT_FALSE(b.is<Float>());
500190d073SChandler Carruth   EXPECT_TRUE(b.is<Int1>());
510190d073SChandler Carruth   EXPECT_FALSE(b.is<Int2>());
520190d073SChandler Carruth   EXPECT_FALSE(c.is<Float>());
530190d073SChandler Carruth   EXPECT_FALSE(c.is<Int1>());
540190d073SChandler Carruth   EXPECT_TRUE(c.is<Int2>());
550190d073SChandler Carruth }
560190d073SChandler Carruth 
TEST_F(PointerSumTypeTest,Get)570190d073SChandler Carruth TEST_F(PointerSumTypeTest, Get) {
580190d073SChandler Carruth   EXPECT_EQ(&f, a.get<Float>());
590190d073SChandler Carruth   EXPECT_EQ(nullptr, a.get<Int1>());
600190d073SChandler Carruth   EXPECT_EQ(nullptr, a.get<Int2>());
610190d073SChandler Carruth   EXPECT_EQ(nullptr, b.get<Float>());
620190d073SChandler Carruth   EXPECT_EQ(&i1, b.get<Int1>());
630190d073SChandler Carruth   EXPECT_EQ(nullptr, b.get<Int2>());
640190d073SChandler Carruth   EXPECT_EQ(nullptr, c.get<Float>());
650190d073SChandler Carruth   EXPECT_EQ(nullptr, c.get<Int1>());
660190d073SChandler Carruth   EXPECT_EQ(&i2, c.get<Int2>());
670190d073SChandler Carruth 
680190d073SChandler Carruth   // Note that we can use .get even on a null sum type. It just always produces
690190d073SChandler Carruth   // a null pointer, even if one of the discriminants is null.
700190d073SChandler Carruth   EXPECT_EQ(nullptr, n.get<Float>());
710190d073SChandler Carruth   EXPECT_EQ(nullptr, n.get<Int1>());
720190d073SChandler Carruth   EXPECT_EQ(nullptr, n.get<Int2>());
730190d073SChandler Carruth }
740190d073SChandler Carruth 
TEST_F(PointerSumTypeTest,Cast)750190d073SChandler Carruth TEST_F(PointerSumTypeTest, Cast) {
760190d073SChandler Carruth   EXPECT_EQ(&f, a.cast<Float>());
770190d073SChandler Carruth   EXPECT_EQ(&i1, b.cast<Int1>());
780190d073SChandler Carruth   EXPECT_EQ(&i2, c.cast<Int2>());
790190d073SChandler Carruth }
800190d073SChandler Carruth 
TEST_F(PointerSumTypeTest,Assignment)810190d073SChandler Carruth TEST_F(PointerSumTypeTest, Assignment) {
820190d073SChandler Carruth   b = SumType::create<Int2>(&i2);
830190d073SChandler Carruth   EXPECT_EQ(nullptr, b.get<Float>());
840190d073SChandler Carruth   EXPECT_EQ(nullptr, b.get<Int1>());
850190d073SChandler Carruth   EXPECT_EQ(&i2, b.get<Int2>());
860190d073SChandler Carruth 
870190d073SChandler Carruth   b = SumType::create<Int2>(&i1);
880190d073SChandler Carruth   EXPECT_EQ(nullptr, b.get<Float>());
890190d073SChandler Carruth   EXPECT_EQ(nullptr, b.get<Int1>());
900190d073SChandler Carruth   EXPECT_EQ(&i1, b.get<Int2>());
910190d073SChandler Carruth 
920190d073SChandler Carruth   float Local = 1.616f;
930190d073SChandler Carruth   b = SumType::create<Float>(&Local);
940190d073SChandler Carruth   EXPECT_EQ(&Local, b.get<Float>());
950190d073SChandler Carruth   EXPECT_EQ(nullptr, b.get<Int1>());
960190d073SChandler Carruth   EXPECT_EQ(nullptr, b.get<Int2>());
970190d073SChandler Carruth 
980190d073SChandler Carruth   n = SumType::create<Int1>(&i2);
990190d073SChandler Carruth   EXPECT_TRUE(n);
1000190d073SChandler Carruth   EXPECT_EQ(nullptr, n.get<Float>());
1010190d073SChandler Carruth   EXPECT_EQ(&i2, n.get<Int1>());
1020190d073SChandler Carruth   EXPECT_EQ(nullptr, n.get<Int2>());
1030190d073SChandler Carruth 
1040190d073SChandler Carruth   n = SumType::create<Float>(nullptr);
1050190d073SChandler Carruth   EXPECT_FALSE(n);
1060190d073SChandler Carruth   EXPECT_EQ(nullptr, n.get<Float>());
1070190d073SChandler Carruth   EXPECT_EQ(nullptr, n.get<Int1>());
1080190d073SChandler Carruth   EXPECT_EQ(nullptr, n.get<Int2>());
1090190d073SChandler Carruth }
1100190d073SChandler Carruth 
1110190d073SChandler Carruth 
1120190d073SChandler Carruth } // end anonymous namespace
113