1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
// Copyright 2016 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/fxcrt/cfx_observable.h"
#include <utility>
#include "testing/fx_string_testhelpers.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class PseudoObservable : public CFX_Observable<PseudoObservable> {
public:
PseudoObservable() {}
int SomeMethod() { return 42; }
size_t ActiveObservedPtrs() const { return ActiveObservedPtrsForTesting(); }
};
} // namespace
TEST(fxcrt, ObservePtrNull) {
PseudoObservable::ObservedPtr ptr;
EXPECT_EQ(nullptr, ptr.Get());
}
TEST(fxcrt, ObservePtrLivesLonger) {
PseudoObservable* pObs = new PseudoObservable;
PseudoObservable::ObservedPtr ptr(pObs);
EXPECT_NE(nullptr, ptr.Get());
EXPECT_EQ(1u, pObs->ActiveObservedPtrs());
delete pObs;
EXPECT_EQ(nullptr, ptr.Get());
}
TEST(fxcrt, ObservePtrLivesShorter) {
PseudoObservable obs;
{
PseudoObservable::ObservedPtr ptr(&obs);
EXPECT_NE(nullptr, ptr.Get());
EXPECT_EQ(1u, obs.ActiveObservedPtrs());
}
EXPECT_EQ(0u, obs.ActiveObservedPtrs());
}
TEST(fxcrt, ObservePtrResetNull) {
PseudoObservable obs;
PseudoObservable::ObservedPtr ptr(&obs);
EXPECT_EQ(1u, obs.ActiveObservedPtrs());
ptr.Reset();
EXPECT_EQ(0u, obs.ActiveObservedPtrs());
}
TEST(fxcrt, ObservePtrReset) {
PseudoObservable obs1;
PseudoObservable obs2;
PseudoObservable::ObservedPtr ptr(&obs1);
EXPECT_EQ(1u, obs1.ActiveObservedPtrs());
EXPECT_EQ(0u, obs2.ActiveObservedPtrs());
ptr.Reset(&obs2);
EXPECT_EQ(0u, obs1.ActiveObservedPtrs());
EXPECT_EQ(1u, obs2.ActiveObservedPtrs());
}
TEST(fxcrt, ObservePtrEquals) {
PseudoObservable obj1;
PseudoObservable obj2;
PseudoObservable::ObservedPtr null_ptr1;
PseudoObservable::ObservedPtr obj1_ptr1(&obj1);
PseudoObservable::ObservedPtr obj2_ptr1(&obj2);
{
PseudoObservable::ObservedPtr null_ptr2;
EXPECT_TRUE(null_ptr1 == null_ptr2);
PseudoObservable::ObservedPtr obj1_ptr2(&obj1);
EXPECT_TRUE(obj1_ptr1 == obj1_ptr2);
PseudoObservable::ObservedPtr obj2_ptr2(&obj2);
EXPECT_TRUE(obj2_ptr1 == obj2_ptr2);
}
EXPECT_FALSE(null_ptr1 == obj1_ptr1);
EXPECT_FALSE(null_ptr1 == obj2_ptr1);
EXPECT_FALSE(obj1_ptr1 == obj2_ptr1);
}
TEST(fxcrt, ObservePtrNotEquals) {
PseudoObservable obj1;
PseudoObservable obj2;
PseudoObservable::ObservedPtr null_ptr1;
PseudoObservable::ObservedPtr obj1_ptr1(&obj1);
PseudoObservable::ObservedPtr obj2_ptr1(&obj2);
{
PseudoObservable::ObservedPtr null_ptr2;
PseudoObservable::ObservedPtr obj1_ptr2(&obj1);
PseudoObservable::ObservedPtr obj2_ptr2(&obj2);
EXPECT_FALSE(null_ptr1 != null_ptr2);
EXPECT_FALSE(obj1_ptr1 != obj1_ptr2);
EXPECT_FALSE(obj2_ptr1 != obj2_ptr2);
}
EXPECT_TRUE(null_ptr1 != obj1_ptr1);
EXPECT_TRUE(null_ptr1 != obj2_ptr1);
EXPECT_TRUE(obj1_ptr1 != obj2_ptr1);
}
TEST(fxcrt, ObservePtrBool) {
PseudoObservable obj1;
PseudoObservable::ObservedPtr null_ptr;
PseudoObservable::ObservedPtr obj1_ptr(&obj1);
bool null_bool = !!null_ptr;
bool obj1_bool = !!obj1_ptr;
EXPECT_FALSE(null_bool);
EXPECT_TRUE(obj1_bool);
}
|