TestUniqueOrNonOwningPtr.cpp (2008B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "UniqueOrNonOwningPtr.h" 6 #include "gtest/gtest.h" 7 8 using mozilla::MakeUniqueOfUniqueOrNonOwning; 9 using mozilla::UniqueOrNonOwningPtr; 10 11 TEST(UniqueOrNonOwningPtrTest, Empty) 12 { 13 #ifdef HAVE_64BIT_BUILD 14 using T = uint64_t; 15 #else 16 using T = uint32_t; 17 #endif 18 using Ptr = UniqueOrNonOwningPtr<T>; 19 20 static_assert(sizeof(Ptr) == sizeof(T), "Unexpected size bloat"); 21 22 Ptr ptr; 23 EXPECT_FALSE(ptr); 24 EXPECT_EQ(ptr.get(), nullptr); 25 } 26 27 struct Foo { 28 uint64_t mA; 29 uint32_t mB; 30 31 Foo(uint64_t aA, uint32_t aB) : mA{aA}, mB{aB} {} 32 Foo(const Foo& aOther) = default; 33 34 bool operator==(const Foo& aOther) const { 35 return mA == aOther.mA && mB == aOther.mB; 36 } 37 }; 38 39 TEST(UniqueOrNonOwningPtrTest, NonOwningStruct) 40 { 41 using T = Foo; 42 using Ptr = UniqueOrNonOwningPtr<T>; 43 44 T val{12, 918}; 45 Ptr ptr = Ptr::NonOwning(&val); 46 EXPECT_TRUE(ptr); 47 EXPECT_EQ(ptr.get(), &val); 48 EXPECT_EQ(*ptr, val); 49 EXPECT_EQ(ptr->mA, val.mA); 50 EXPECT_EQ(ptr->mB, val.mB); 51 52 Ptr ptr2 = std::move(ptr); 53 EXPECT_FALSE(ptr); 54 EXPECT_EQ(ptr.get(), nullptr); 55 EXPECT_TRUE(ptr2); 56 EXPECT_EQ(ptr2.get(), &val); 57 EXPECT_EQ(*ptr2, val); 58 EXPECT_EQ(ptr2->mA, val.mA); 59 EXPECT_EQ(ptr2->mB, val.mB); 60 } 61 62 TEST(UniqueOrNonOwningPtrTest, OwnedStruct) 63 { 64 using T = Foo; 65 using Ptr = UniqueOrNonOwningPtr<T>; 66 67 T copy{12, 918}; 68 Ptr ptr = MakeUniqueOfUniqueOrNonOwning<T>(copy); 69 EXPECT_TRUE(ptr); 70 EXPECT_NE(ptr.get(), nullptr); 71 EXPECT_NE(ptr.get(), ©); 72 EXPECT_EQ(*ptr, copy); 73 EXPECT_EQ(ptr->mA, copy.mA); 74 EXPECT_EQ(ptr->mB, copy.mB); 75 76 Ptr ptr2 = std::move(ptr); 77 EXPECT_FALSE(ptr); 78 EXPECT_EQ(ptr.get(), nullptr); 79 EXPECT_TRUE(ptr2); 80 EXPECT_NE(ptr2.get(), nullptr); 81 EXPECT_NE(ptr2.get(), ©); 82 EXPECT_EQ(*ptr2, copy); 83 EXPECT_EQ(ptr2->mA, copy.mA); 84 EXPECT_EQ(ptr2->mB, copy.mB); 85 }