1296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie//===- llvm/unittest/ADT/PointerUnionTest.cpp - Optional unit tests -------===//
2296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie//
3296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie//                     The LLVM Compiler Infrastructure
4296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie//
5296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie// This file is distributed under the University of Illinois Open Source
6296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie// License. See LICENSE.TXT for details.
7296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie//
8296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie//===----------------------------------------------------------------------===//
9296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
10296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie#include "gtest/gtest.h"
11296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie#include "llvm/ADT/PointerUnion.h"
12296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikieusing namespace llvm;
13296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
14296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikienamespace {
15296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestypedef PointerUnion<int *, float *> PU;
17296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct PointerUnionTest : public testing::Test {
19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  float f;
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  int i;
21296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PU a, b, c, n;
23296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PointerUnionTest() : f(3.14f), i(42), a(&f), b(&i), c(&i), n() {}
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines};
26296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
27296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David BlaikieTEST_F(PointerUnionTest, Comparison) {
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_TRUE(a == a);
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_FALSE(a != a);
30296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_TRUE(a != b);
31296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_FALSE(a == b);
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_TRUE(b == c);
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_FALSE(b != c);
34296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_TRUE(b != n);
35296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_FALSE(b == n);
36296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie}
37296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
38296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David BlaikieTEST_F(PointerUnionTest, Null) {
39296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_FALSE(a.isNull());
40296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_FALSE(b.isNull());
41296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_TRUE(n.isNull());
42296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_FALSE(!a);
43296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_FALSE(!b);
44296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_TRUE(!n);
45296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  // workaround an issue with EXPECT macros and explicit bool
46296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_TRUE((bool)a);
47296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_TRUE((bool)b);
48296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie  EXPECT_FALSE(n);
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(n, b);
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_EQ(b, c);
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  b = nullptr;
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_EQ(n, b);
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_NE(b, c);
55296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie}
56296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
57296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David BlaikieTEST_F(PointerUnionTest, Is) {
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_FALSE(a.is<int *>());
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_TRUE(a.is<float *>());
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_TRUE(b.is<int *>());
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_FALSE(b.is<float *>());
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_TRUE(n.is<int *>());
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_FALSE(n.is<float *>());
64296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie}
65296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
66296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David BlaikieTEST_F(PointerUnionTest, Get) {
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_EQ(a.get<float *>(), &f);
68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  EXPECT_EQ(b.get<int *>(), &i);
69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  EXPECT_EQ(n.get<int *>(), (int *)nullptr);
70296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie}
71296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie
72296ca41b2d305f4aaf1d0562c7da90dc20cd9e14David Blaikie} // end anonymous namespace
73