1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/protozero/copyable_ptr.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard Worker namespace protozero {
22*6dbdd20aSAndroid Build Coastguard Worker namespace {
23*6dbdd20aSAndroid Build Coastguard Worker
24*6dbdd20aSAndroid Build Coastguard Worker struct X {
25*6dbdd20aSAndroid Build Coastguard Worker X() = default;
26*6dbdd20aSAndroid Build Coastguard Worker X(const X&) = default;
27*6dbdd20aSAndroid Build Coastguard Worker X& operator=(const X&) = default;
~Xprotozero::__anon1866db700111::X28*6dbdd20aSAndroid Build Coastguard Worker ~X() { val = -1; }
29*6dbdd20aSAndroid Build Coastguard Worker
operator ==(const X & lhs,const X & rhs)30*6dbdd20aSAndroid Build Coastguard Worker friend bool operator==(const X& lhs, const X& rhs) {
31*6dbdd20aSAndroid Build Coastguard Worker return lhs.val == rhs.val;
32*6dbdd20aSAndroid Build Coastguard Worker }
33*6dbdd20aSAndroid Build Coastguard Worker
34*6dbdd20aSAndroid Build Coastguard Worker // Deliberately unusual implementation.
operator !=(const X & lhs,const X & rhs)35*6dbdd20aSAndroid Build Coastguard Worker friend bool operator!=(const X& lhs, const X& rhs) {
36*6dbdd20aSAndroid Build Coastguard Worker return lhs.val == rhs.val * -1;
37*6dbdd20aSAndroid Build Coastguard Worker }
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard Worker int val = 0;
40*6dbdd20aSAndroid Build Coastguard Worker };
41*6dbdd20aSAndroid Build Coastguard Worker
TEST(CopyablePtrTest,CopyOperators)42*6dbdd20aSAndroid Build Coastguard Worker TEST(CopyablePtrTest, CopyOperators) {
43*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p1;
44*6dbdd20aSAndroid Build Coastguard Worker p1->val = 1;
45*6dbdd20aSAndroid Build Coastguard Worker ASSERT_NE(p1.get(), nullptr);
46*6dbdd20aSAndroid Build Coastguard Worker ASSERT_EQ(&*p1, p1.get());
47*6dbdd20aSAndroid Build Coastguard Worker
48*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p2(p1);
49*6dbdd20aSAndroid Build Coastguard Worker EXPECT_NE(p1.get(), nullptr);
50*6dbdd20aSAndroid Build Coastguard Worker EXPECT_NE(p2.get(), nullptr);
51*6dbdd20aSAndroid Build Coastguard Worker EXPECT_NE(p1.get(), p2.get());
52*6dbdd20aSAndroid Build Coastguard Worker
53*6dbdd20aSAndroid Build Coastguard Worker p2->val = 2;
54*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p1->val, 1);
55*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p2->val, 2);
56*6dbdd20aSAndroid Build Coastguard Worker
57*6dbdd20aSAndroid Build Coastguard Worker {
58*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p3;
59*6dbdd20aSAndroid Build Coastguard Worker p3 = p1;
60*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p3->val, 1);
61*6dbdd20aSAndroid Build Coastguard Worker
62*6dbdd20aSAndroid Build Coastguard Worker p3 = p2;
63*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p3->val, 2);
64*6dbdd20aSAndroid Build Coastguard Worker
65*6dbdd20aSAndroid Build Coastguard Worker p3->val = 3;
66*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p3->val, 3);
67*6dbdd20aSAndroid Build Coastguard Worker }
68*6dbdd20aSAndroid Build Coastguard Worker
69*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p1->val, 1);
70*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p2->val, 2);
71*6dbdd20aSAndroid Build Coastguard Worker }
72*6dbdd20aSAndroid Build Coastguard Worker
TEST(CopyablePtrTest,MoveOperators)73*6dbdd20aSAndroid Build Coastguard Worker TEST(CopyablePtrTest, MoveOperators) {
74*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p1;
75*6dbdd20aSAndroid Build Coastguard Worker p1->val = 1;
76*6dbdd20aSAndroid Build Coastguard Worker
77*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p2(std::move(p1));
78*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p2->val, 1);
79*6dbdd20aSAndroid Build Coastguard Worker
80*6dbdd20aSAndroid Build Coastguard Worker // The moved-from object needs to stay valid and non-null.
81*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p1->val, 0);
82*6dbdd20aSAndroid Build Coastguard Worker {
83*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p3;
84*6dbdd20aSAndroid Build Coastguard Worker p3->val = 3;
85*6dbdd20aSAndroid Build Coastguard Worker p1 = std::move(p3);
86*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p1->val, 3);
87*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p3->val, 0);
88*6dbdd20aSAndroid Build Coastguard Worker }
89*6dbdd20aSAndroid Build Coastguard Worker EXPECT_EQ(p1->val, 3);
90*6dbdd20aSAndroid Build Coastguard Worker }
91*6dbdd20aSAndroid Build Coastguard Worker
TEST(CopyablePtrTest,DeepCompare)92*6dbdd20aSAndroid Build Coastguard Worker TEST(CopyablePtrTest, DeepCompare) {
93*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p1;
94*6dbdd20aSAndroid Build Coastguard Worker p1->val = 1;
95*6dbdd20aSAndroid Build Coastguard Worker
96*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p2;
97*6dbdd20aSAndroid Build Coastguard Worker p2->val = 2;
98*6dbdd20aSAndroid Build Coastguard Worker
99*6dbdd20aSAndroid Build Coastguard Worker CopyablePtr<X> p3;
100*6dbdd20aSAndroid Build Coastguard Worker p3->val = -2;
101*6dbdd20aSAndroid Build Coastguard Worker
102*6dbdd20aSAndroid Build Coastguard Worker EXPECT_NE(p1.get(), p2.get());
103*6dbdd20aSAndroid Build Coastguard Worker EXPECT_NE(p1.get(), p3.get());
104*6dbdd20aSAndroid Build Coastguard Worker
105*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p1 == p2);
106*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p1 == p3);
107*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p2 == p3);
108*6dbdd20aSAndroid Build Coastguard Worker
109*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p1 != p2); // The operator!= is special, see above.
110*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p2 != p3);
111*6dbdd20aSAndroid Build Coastguard Worker
112*6dbdd20aSAndroid Build Coastguard Worker p1->val = -2;
113*6dbdd20aSAndroid Build Coastguard Worker EXPECT_TRUE(p1 != p2);
114*6dbdd20aSAndroid Build Coastguard Worker EXPECT_FALSE(p1 == p2);
115*6dbdd20aSAndroid Build Coastguard Worker }
116*6dbdd20aSAndroid Build Coastguard Worker
117*6dbdd20aSAndroid Build Coastguard Worker } // namespace
118*6dbdd20aSAndroid Build Coastguard Worker } // namespace protozero
119