Basic unit tests for PointerUnion
authorDavid Blaikie <dblaikie@gmail.com>
Wed, 21 Aug 2013 21:30:23 +0000 (21:30 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Wed, 21 Aug 2013 21:30:23 +0000 (21:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188933 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/PointerUnion.h
unittests/ADT/CMakeLists.txt
unittests/ADT/PointerUnionTest.cpp [new file with mode: 0644]

index 4eed121ed39fc16683d2732da8a73ced49d6bf85..05d362feab22b4d3d68e95f4ab1b90c112435cd9 100644 (file)
@@ -72,7 +72,7 @@ namespace llvm {
   ///    printf("%d %d", P.is<int*>(), P.is<float*>());  // prints "1 0"
   ///    X = P.get<int*>();     // ok.
   ///    Y = P.get<float*>();   // runtime assertion failure.
-  ///    Z = P.get<double*>();  // runtime assertion failure (regardless of tag)
+  ///    Z = P.get<double*>();  // compile time failure.
   ///    P = (float*)0;
   ///    Y = P.get<float*>();   // ok.
   ///    X = P.get<int*>();     // runtime assertion failure.
index 9aad793d8bc4d83e66ea783fff0b5c06aa4cd4d1..2125657433f31ade746dbd0b9dae99503cdd5166 100644 (file)
@@ -21,6 +21,7 @@ set(ADTSources
   MapVectorTest.cpp
   OptionalTest.cpp
   PackedVectorTest.cpp
+  PointerUnionTest.cpp
   SCCIteratorTest.cpp
   SmallPtrSetTest.cpp
   SmallStringTest.cpp
diff --git a/unittests/ADT/PointerUnionTest.cpp b/unittests/ADT/PointerUnionTest.cpp
new file mode 100644 (file)
index 0000000..7eb7181
--- /dev/null
@@ -0,0 +1,64 @@
+//===- llvm/unittest/ADT/PointerUnionTest.cpp - Optional unit tests -------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "gtest/gtest.h"
+#include "llvm/ADT/PointerUnion.h"
+using namespace llvm;
+
+namespace {
+
+typedef PointerUnion<int*, float*> PU;
+
+// Test fixture
+class PointerUnionTest : public testing::Test {
+};
+
+float f = 3.14f;
+int i = 42;
+
+const PU a(&f);
+const PU b(&i);
+const PU n;
+
+TEST_F(PointerUnionTest, Comparison) {
+  EXPECT_TRUE(a != b);
+  EXPECT_FALSE(a == b);
+  EXPECT_TRUE(b != n);
+  EXPECT_FALSE(b == n);
+}
+
+TEST_F(PointerUnionTest, Null) {
+  EXPECT_FALSE(a.isNull());
+  EXPECT_FALSE(b.isNull());
+  EXPECT_TRUE(n.isNull());
+  EXPECT_FALSE(!a);
+  EXPECT_FALSE(!b);
+  EXPECT_TRUE(!n);
+  // workaround an issue with EXPECT macros and explicit bool
+  EXPECT_TRUE((bool)a);
+  EXPECT_TRUE((bool)b);
+  EXPECT_FALSE(n);
+}
+
+TEST_F(PointerUnionTest, Is) {
+  EXPECT_FALSE(a.is<int*>());
+  EXPECT_TRUE(a.is<float*>());
+  EXPECT_TRUE(b.is<int*>());
+  EXPECT_FALSE(b.is<float*>());
+  EXPECT_TRUE(n.is<int*>());
+  EXPECT_FALSE(n.is<float*>());
+}
+
+TEST_F(PointerUnionTest, Get) {
+  EXPECT_EQ(a.get<float*>(), &f);
+  EXPECT_EQ(b.get<int*>(), &i);
+  EXPECT_EQ(n.get<int*>(), (int*)0);
+}
+
+} // end anonymous namespace