1 //===- llvm/unittest/ADT/polymorphic_ptr.h - polymorphic_ptr<T> tests -----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "gtest/gtest.h"
11 #include "llvm/ADT/polymorphic_ptr.h"
12 #include "llvm/Support/raw_ostream.h"
20 S *clone() { return new S(*this); }
24 // A function that forces the return of a copy.
26 T dummy_copy(const T &arg) { return arg; }
28 TEST(polymorphic_ptr_test, Basic) {
29 polymorphic_ptr<S> null;
30 EXPECT_FALSE((bool)null);
32 EXPECT_EQ((S*)0, null.get());
35 polymorphic_ptr<S> p(s);
38 EXPECT_TRUE(p != null);
39 EXPECT_FALSE(p == null);
45 EXPECT_EQ(s, p.operator->());
46 EXPECT_EQ(s, p.get());
49 EXPECT_EQ(s, p.take());
50 EXPECT_FALSE((bool)p);
56 EXPECT_EQ(s, p.operator->());
57 EXPECT_EQ(s, p.get());
60 polymorphic_ptr<S> p2((llvm_move(p)));
61 #if !LLVM_HAS_RVALUE_REFERENCES
62 // 'p' may not have been moved from in C++98, fake it for the test.
65 EXPECT_FALSE((bool)p);
67 EXPECT_TRUE((bool)p2);
76 EXPECT_FALSE((bool)p2);
79 // Force copies and that everything survives.
80 polymorphic_ptr<S> p3 = dummy_copy(polymorphic_ptr<S>(p));
81 EXPECT_TRUE((bool)p3);
89 virtual Base *clone() = 0;
90 virtual StringRef name() { return "Base"; }
93 struct DerivedA : Base {
94 virtual DerivedA *clone() { return new DerivedA(); }
95 virtual StringRef name() { return "DerivedA"; }
97 struct DerivedB : Base {
98 virtual DerivedB *clone() { return new DerivedB(); }
99 virtual StringRef name() { return "DerivedB"; }
102 TEST(polymorphic_ptr_test, Polymorphism) {
103 polymorphic_ptr<Base> a(new DerivedA());
104 polymorphic_ptr<Base> b(new DerivedB());
106 EXPECT_EQ("DerivedA", a->name());
107 EXPECT_EQ("DerivedB", b->name());
109 polymorphic_ptr<Base> copy = dummy_copy(a);
111 EXPECT_EQ("DerivedA", copy->name());
113 copy = dummy_copy(b);
115 EXPECT_EQ("DerivedB", copy->name());
117 // Test creating a copy out of a temporary directly.
118 copy = dummy_copy<polymorphic_ptr<Base> >(new DerivedA());
120 EXPECT_EQ("DerivedA", copy->name());