OLD | NEW |
1 /* | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 // Use of this source code is governed by a BSD-style license that can be |
3 * | 3 // found in the LICENSE file. |
4 * Use of this source code is governed by a BSD-style license | 4 |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include <memory> | |
12 #include <sstream> | |
13 #include <string> | |
14 #include <utility> | |
15 #include <vector> | |
16 | |
17 #include "webrtc/base/gunit.h" | |
18 #include "webrtc/base/optional.h" | 5 #include "webrtc/base/optional.h" |
19 | 6 |
| 7 #include <set> |
| 8 |
| 9 #include "testing/gtest/include/gtest/gtest.h" |
| 10 |
20 namespace rtc { | 11 namespace rtc { |
21 | 12 |
22 namespace { | 13 namespace { |
23 | 14 |
24 // Class whose instances logs various method calls (constructor, destructor, | 15 // Object used to test complex object with Optional<T> in addition of the move |
25 // etc.). Each instance has a unique ID (a simple global sequence number) and | 16 // semantics. |
26 // an origin ID. When a copy is made, the new object gets a fresh ID but copies | 17 class TestObject { |
27 // the origin ID from the original. When a new Logger is created from scratch, | |
28 // it gets a fresh ID, and the origin ID is the same as the ID (default | |
29 // constructor) or given as an argument (explicit constructor). | |
30 class Logger { | |
31 public: | 18 public: |
32 Logger() : id_(g_next_id++), origin_(id_) { Log("default constructor"); } | 19 enum class State { |
33 explicit Logger(int origin) : id_(g_next_id++), origin_(origin) { | 20 DEFAULT_CONSTRUCTED, |
34 Log("explicit constructor"); | 21 VALUE_CONSTRUCTED, |
35 } | 22 COPY_CONSTRUCTED, |
36 Logger(const Logger& other) : id_(g_next_id++), origin_(other.origin_) { | 23 MOVE_CONSTRUCTED, |
37 LogFrom("copy constructor", other); | 24 MOVED_FROM, |
38 } | 25 COPY_ASSIGNED, |
39 Logger(Logger&& other) : id_(g_next_id++), origin_(other.origin_) { | 26 MOVE_ASSIGNED, |
40 LogFrom("move constructor", other); | 27 SWAPPED, |
41 } | 28 }; |
42 ~Logger() { Log("destructor"); } | 29 |
43 Logger& operator=(const Logger& other) { | 30 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {} |
44 origin_ = other.origin_; | 31 |
45 LogFrom("operator= copy", other); | 32 TestObject(int foo, double bar) |
| 33 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {} |
| 34 |
| 35 TestObject(const TestObject& other) |
| 36 : foo_(other.foo_), bar_(other.bar_), state_(State::COPY_CONSTRUCTED) {} |
| 37 |
| 38 TestObject(TestObject&& other) |
| 39 : foo_(std::move(other.foo_)), |
| 40 bar_(std::move(other.bar_)), |
| 41 state_(State::MOVE_CONSTRUCTED) { |
| 42 other.state_ = State::MOVED_FROM; |
| 43 } |
| 44 |
| 45 TestObject& operator=(const TestObject& other) { |
| 46 foo_ = other.foo_; |
| 47 bar_ = other.bar_; |
| 48 state_ = State::COPY_ASSIGNED; |
46 return *this; | 49 return *this; |
47 } | 50 } |
48 Logger& operator=(Logger&& other) { | 51 |
49 origin_ = other.origin_; | 52 TestObject& operator=(TestObject&& other) { |
50 LogFrom("operator= move", other); | 53 foo_ = other.foo_; |
| 54 bar_ = other.bar_; |
| 55 state_ = State::MOVE_ASSIGNED; |
| 56 other.state_ = State::MOVED_FROM; |
51 return *this; | 57 return *this; |
52 } | 58 } |
53 friend void swap(Logger& a, Logger& b) { | 59 |
| 60 void Swap(TestObject* other) { |
54 using std::swap; | 61 using std::swap; |
55 swap(a.origin_, b.origin_); | 62 swap(foo_, other->foo_); |
56 Log2("swap", a, b); | 63 swap(bar_, other->bar_); |
57 } | 64 state_ = State::SWAPPED; |
58 friend bool operator==(const Logger& a, const Logger& b) { | 65 other->state_ = State::SWAPPED; |
59 Log2("operator==", a, b); | 66 } |
60 return a.origin_ == b.origin_; | 67 |
61 } | 68 bool operator==(const TestObject& other) const { |
62 friend bool operator!=(const Logger& a, const Logger& b) { | 69 return foo_ == other.foo_ && bar_ == other.bar_; |
63 Log2("operator!=", a, b); | 70 } |
64 return a.origin_ != b.origin_; | 71 |
65 } | 72 int foo() const { return foo_; } |
66 void Foo() { Log("Foo()"); } | 73 State state() const { return state_; } |
67 void Foo() const { Log("Foo() const"); } | |
68 static std::unique_ptr<std::vector<std::string>> Setup() { | |
69 std::unique_ptr<std::vector<std::string>> s(new std::vector<std::string>); | |
70 g_log = s.get(); | |
71 g_next_id = 0; | |
72 return s; | |
73 } | |
74 | 74 |
75 private: | 75 private: |
76 int id_; | 76 int foo_; |
77 int origin_; | 77 double bar_; |
78 static std::vector<std::string>* g_log; | 78 State state_; |
79 static int g_next_id; | |
80 void Log(const char* msg) const { | |
81 std::ostringstream oss; | |
82 oss << id_ << ':' << origin_ << ". " << msg; | |
83 g_log->push_back(oss.str()); | |
84 } | |
85 void LogFrom(const char* msg, const Logger& other) const { | |
86 std::ostringstream oss; | |
87 oss << id_ << ':' << origin_ << ". " << msg << " (from " << other.id_ << ':' | |
88 << other.origin_ << ")"; | |
89 g_log->push_back(oss.str()); | |
90 } | |
91 static void Log2(const char* msg, const Logger& a, const Logger& b) { | |
92 std::ostringstream oss; | |
93 oss << msg << ' ' << a.id_ << ':' << a.origin_ << ", " << b.id_ << ':' | |
94 << b.origin_; | |
95 g_log->push_back(oss.str()); | |
96 } | |
97 }; | 79 }; |
98 | 80 |
99 std::vector<std::string>* Logger::g_log = nullptr; | 81 // Implementing Swappable concept. |
100 int Logger::g_next_id = 0; | 82 void swap(TestObject& lhs, TestObject& rhs) { |
101 | 83 lhs.Swap(&rhs); |
102 // Append all the other args to the vector pointed to by the first arg. | 84 } |
103 template <typename T> | 85 |
104 void VectorAppend(std::vector<T>* v) {} | 86 class NonTriviallyDestructible { |
105 template <typename T, typename... Ts> | 87 ~NonTriviallyDestructible() {} |
106 void VectorAppend(std::vector<T>* v, const T& e, Ts... es) { | 88 }; |
107 v->push_back(e); | 89 |
108 VectorAppend(v, es...); | 90 } // anonymous namespace |
109 } | 91 |
110 | 92 static_assert(is_trivially_destructible<Optional<int>>::value, |
111 // Create a vector of strings. Because we're not allowed to use | 93 "OptionalIsTriviallyDestructible"); |
112 // std::initializer_list. | 94 |
113 template <typename... Ts> | 95 static_assert( |
114 std::vector<std::string> V(Ts... es) { | 96 !is_trivially_destructible<Optional<NonTriviallyDestructible>>::value, |
115 std::vector<std::string> strings; | 97 "OptionalIsTriviallyDestructible"); |
116 VectorAppend(&strings, static_cast<std::string>(es)...); | 98 |
117 return strings; | 99 TEST(OptionalTest, DefaultConstructor) { |
118 } | 100 { |
119 | 101 Optional<float> o; |
120 } // namespace | 102 EXPECT_FALSE(o); |
121 | 103 } |
122 TEST(OptionalTest, TestConstructDefault) { | 104 |
123 auto log = Logger::Setup(); | 105 { |
124 { | 106 Optional<std::string> o; |
125 Optional<Logger> x; | 107 EXPECT_FALSE(o); |
126 EXPECT_FALSE(x); | 108 } |
127 } | 109 |
128 EXPECT_EQ(V(), *log); | 110 { |
129 } | 111 Optional<TestObject> o; |
130 | 112 EXPECT_FALSE(o); |
131 TEST(OptionalTest, TestConstructCopyEmpty) { | 113 } |
132 auto log = Logger::Setup(); | 114 } |
133 { | 115 |
134 Optional<Logger> x; | 116 TEST(OptionalTest, CopyConstructor) { |
135 EXPECT_FALSE(x); | 117 { |
136 auto y = x; | 118 Optional<float> first(0.1f); |
137 EXPECT_FALSE(y); | 119 Optional<float> other(first); |
138 } | 120 |
139 EXPECT_EQ(V(), *log); | 121 EXPECT_TRUE(other); |
140 } | 122 EXPECT_EQ(other.value(), 0.1f); |
141 | 123 EXPECT_EQ(first, other); |
142 TEST(OptionalTest, TestConstructCopyFull) { | 124 } |
143 auto log = Logger::Setup(); | 125 |
144 { | 126 { |
145 Logger a; | 127 Optional<std::string> first("foo"); |
146 Optional<Logger> x(a); | 128 Optional<std::string> other(first); |
147 EXPECT_TRUE(x); | 129 |
148 log->push_back("---"); | 130 EXPECT_TRUE(other); |
149 auto y = x; | 131 EXPECT_EQ(other.value(), "foo"); |
150 EXPECT_TRUE(y); | 132 EXPECT_EQ(first, other); |
151 log->push_back("---"); | 133 } |
152 } | 134 |
153 EXPECT_EQ(V("0:0. default constructor", "1:0. copy constructor (from 0:0)", | 135 { |
154 "---", "2:0. copy constructor (from 1:0)", "---", | 136 Optional<TestObject> first(TestObject(3, 0.1)); |
155 "2:0. destructor", "1:0. destructor", "0:0. destructor"), | 137 Optional<TestObject> other(first); |
156 *log); | 138 |
157 } | 139 EXPECT_TRUE(!!other); |
158 | 140 EXPECT_TRUE(other.value() == TestObject(3, 0.1)); |
159 TEST(OptionalTest, TestConstructMoveEmpty) { | 141 EXPECT_TRUE(first == other); |
160 auto log = Logger::Setup(); | 142 } |
161 { | 143 } |
162 Optional<Logger> x; | 144 |
163 EXPECT_FALSE(x); | 145 TEST(OptionalTest, ValueConstructor) { |
164 auto y = std::move(x); | 146 { |
165 EXPECT_FALSE(y); | 147 Optional<float> o(0.1f); |
166 } | 148 EXPECT_TRUE(o); |
167 EXPECT_EQ(V(), *log); | 149 EXPECT_EQ(o.value(), 0.1f); |
168 } | 150 } |
169 | 151 |
170 TEST(OptionalTest, TestConstructMoveFull) { | 152 { |
171 auto log = Logger::Setup(); | 153 Optional<std::string> o("foo"); |
172 { | 154 EXPECT_TRUE(o); |
173 Optional<Logger> x(Logger(17)); | 155 EXPECT_EQ(o.value(), "foo"); |
174 EXPECT_TRUE(x); | 156 } |
175 log->push_back("---"); | 157 |
176 auto y = std::move(x); | 158 { |
177 EXPECT_TRUE(x); | 159 Optional<TestObject> o(TestObject(3, 0.1)); |
178 EXPECT_TRUE(y); | 160 EXPECT_TRUE(!!o); |
179 log->push_back("---"); | 161 EXPECT_TRUE(o.value() == TestObject(3, 0.1)); |
180 } | 162 } |
181 EXPECT_EQ( | 163 } |
182 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 164 |
183 "0:17. destructor", "---", "2:17. move constructor (from 1:17)", "---", | 165 TEST(OptionalTest, MoveConstructor) { |
184 "2:17. destructor", "1:17. destructor"), | 166 { |
185 *log); | 167 Optional<float> first(0.1f); |
186 } | 168 Optional<float> second(std::move(first)); |
187 | 169 |
188 TEST(OptionalTest, TestCopyAssignToEmptyFromEmpty) { | 170 EXPECT_TRUE(second); |
189 auto log = Logger::Setup(); | 171 EXPECT_EQ(second.value(), 0.1f); |
190 { | 172 |
191 Optional<Logger> x, y; | 173 EXPECT_TRUE(first); |
192 x = y; | 174 } |
193 } | 175 |
194 EXPECT_EQ(V(), *log); | 176 { |
195 } | 177 Optional<std::string> first("foo"); |
196 | 178 Optional<std::string> second(std::move(first)); |
197 TEST(OptionalTest, TestCopyAssignToFullFromEmpty) { | 179 |
198 auto log = Logger::Setup(); | 180 EXPECT_TRUE(second); |
199 { | 181 EXPECT_EQ("foo", second.value()); |
200 Optional<Logger> x(Logger(17)); | 182 |
201 Optional<Logger> y; | 183 EXPECT_TRUE(first); |
202 log->push_back("---"); | 184 } |
203 x = y; | 185 |
204 log->push_back("---"); | 186 { |
205 } | 187 Optional<TestObject> first(TestObject(3, 0.1)); |
206 EXPECT_EQ( | 188 Optional<TestObject> second(std::move(first)); |
207 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 189 |
208 "0:17. destructor", "---", "1:17. destructor", "---"), | 190 EXPECT_TRUE(!!second); |
209 *log); | 191 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state()); |
210 } | 192 EXPECT_TRUE(TestObject(3, 0.1) == second.value()); |
211 | 193 |
212 TEST(OptionalTest, TestCopyAssignToEmptyFromFull) { | 194 EXPECT_TRUE(!!first); |
213 auto log = Logger::Setup(); | 195 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state()); |
214 { | 196 } |
215 Optional<Logger> x; | 197 } |
216 Optional<Logger> y(Logger(17)); | 198 |
217 log->push_back("---"); | 199 TEST(OptionalTest, MoveValueConstructor) { |
218 x = y; | 200 { |
219 log->push_back("---"); | 201 Optional<float> first(0.1f); |
220 } | 202 Optional<float> second(std::move(first.value())); |
221 EXPECT_EQ( | 203 |
222 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 204 EXPECT_TRUE(second); |
223 "0:17. destructor", "---", "2:17. copy constructor (from 1:17)", "---", | 205 EXPECT_EQ(second.value(), 0.1f); |
224 "1:17. destructor", "2:17. destructor"), | 206 |
225 *log); | 207 EXPECT_TRUE(first); |
226 } | 208 } |
227 | 209 |
228 TEST(OptionalTest, TestCopyAssignToFullFromFull) { | 210 { |
229 auto log = Logger::Setup(); | 211 Optional<std::string> first("foo"); |
230 { | 212 Optional<std::string> second(std::move(first.value())); |
231 Optional<Logger> x(Logger(17)); | 213 |
232 Optional<Logger> y(Logger(42)); | 214 EXPECT_TRUE(second); |
233 log->push_back("---"); | 215 EXPECT_EQ("foo", second.value()); |
234 x = y; | 216 |
235 log->push_back("---"); | 217 EXPECT_TRUE(first); |
236 } | 218 } |
237 EXPECT_EQ( | 219 |
238 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 220 { |
239 "0:17. destructor", "2:42. explicit constructor", | 221 Optional<TestObject> first(TestObject(3, 0.1)); |
240 "3:42. move constructor (from 2:42)", "2:42. destructor", "---", | 222 Optional<TestObject> second(std::move(first.value())); |
241 "1:42. operator= copy (from 3:42)", "---", "3:42. destructor", | 223 |
242 "1:42. destructor"), | 224 EXPECT_TRUE(!!second); |
243 *log); | 225 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state()); |
244 } | 226 EXPECT_TRUE(TestObject(3, 0.1) == second.value()); |
245 | 227 |
246 TEST(OptionalTest, TestCopyAssignToEmptyFromT) { | 228 EXPECT_TRUE(!!first); |
247 auto log = Logger::Setup(); | 229 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state()); |
248 { | 230 } |
249 Optional<Logger> x; | 231 } |
250 Logger y(17); | 232 |
251 log->push_back("---"); | 233 TEST(OptionalTest, ConstructorForwardArguments) { |
252 x = Optional<Logger>(y); | 234 { |
253 log->push_back("---"); | 235 Optional<float> a(rtc::in_place, 0.1f); |
254 } | 236 EXPECT_TRUE(a); |
255 EXPECT_EQ(V("0:17. explicit constructor", "---", | 237 EXPECT_EQ(0.1f, a.value()); |
256 "1:17. copy constructor (from 0:17)", | 238 } |
257 "2:17. move constructor (from 1:17)", "1:17. destructor", "---", | 239 |
258 "0:17. destructor", "2:17. destructor"), | 240 { |
259 *log); | 241 Optional<std::string> a(rtc::in_place, "foo"); |
260 } | 242 EXPECT_TRUE(a); |
261 | 243 EXPECT_EQ("foo", a.value()); |
262 TEST(OptionalTest, TestCopyAssignToFullFromT) { | 244 } |
263 auto log = Logger::Setup(); | 245 |
264 { | 246 { |
265 Optional<Logger> x(Logger(17)); | 247 Optional<TestObject> a(rtc::in_place, 0, 0.1); |
266 Logger y(42); | 248 EXPECT_TRUE(!!a); |
267 log->push_back("---"); | 249 EXPECT_TRUE(TestObject(0, 0.1) == a.value()); |
268 x = Optional<Logger>(y); | 250 } |
269 log->push_back("---"); | 251 } |
270 } | 252 |
271 EXPECT_EQ( | 253 TEST(OptionalTest, NulloptConstructor) { |
272 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 254 Optional<int> a = rtc::nullopt; |
273 "0:17. destructor", "2:42. explicit constructor", "---", | 255 EXPECT_FALSE(a); |
274 "3:42. copy constructor (from 2:42)", | 256 } |
275 "1:42. operator= move (from 3:42)", "3:42. destructor", "---", | 257 |
276 "2:42. destructor", "1:42. destructor"), | 258 TEST(OptionalTest, AssignValue) { |
277 *log); | 259 { |
278 } | 260 Optional<float> a; |
279 | 261 EXPECT_FALSE(a); |
280 TEST(OptionalTest, TestMoveAssignToEmptyFromEmpty) { | 262 a = 0.1f; |
281 auto log = Logger::Setup(); | 263 EXPECT_TRUE(a); |
282 { | 264 |
283 Optional<Logger> x, y; | 265 Optional<float> b(0.1f); |
284 x = std::move(y); | 266 EXPECT_TRUE(a == b); |
285 } | 267 } |
286 EXPECT_EQ(V(), *log); | 268 |
287 } | 269 { |
288 | 270 Optional<std::string> a; |
289 TEST(OptionalTest, TestMoveAssignToFullFromEmpty) { | 271 EXPECT_FALSE(a); |
290 auto log = Logger::Setup(); | 272 a = std::string("foo"); |
291 { | 273 EXPECT_TRUE(a); |
292 Optional<Logger> x(Logger(17)); | 274 |
293 Optional<Logger> y; | 275 Optional<std::string> b(std::string("foo")); |
294 log->push_back("---"); | 276 EXPECT_EQ(a, b); |
295 x = std::move(y); | 277 } |
296 log->push_back("---"); | 278 |
297 } | 279 { |
298 EXPECT_EQ( | 280 Optional<TestObject> a; |
299 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 281 EXPECT_FALSE(!!a); |
300 "0:17. destructor", "---", "1:17. destructor", "---"), | 282 a = TestObject(3, 0.1); |
301 *log); | 283 EXPECT_TRUE(!!a); |
302 } | 284 |
303 | 285 Optional<TestObject> b(TestObject(3, 0.1)); |
304 TEST(OptionalTest, TestMoveAssignToEmptyFromFull) { | 286 EXPECT_TRUE(a == b); |
305 auto log = Logger::Setup(); | 287 } |
306 { | 288 |
307 Optional<Logger> x; | 289 { |
308 Optional<Logger> y(Logger(17)); | 290 Optional<TestObject> a = TestObject(4, 1.0); |
309 log->push_back("---"); | 291 EXPECT_TRUE(!!a); |
310 x = std::move(y); | 292 a = TestObject(3, 0.1); |
311 log->push_back("---"); | 293 EXPECT_TRUE(!!a); |
312 } | 294 |
313 EXPECT_EQ( | 295 Optional<TestObject> b(TestObject(3, 0.1)); |
314 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 296 EXPECT_TRUE(a == b); |
315 "0:17. destructor", "---", "2:17. move constructor (from 1:17)", "---", | 297 } |
316 "1:17. destructor", "2:17. destructor"), | 298 } |
317 *log); | 299 |
318 } | 300 TEST(OptionalTest, AssignObject) { |
319 | 301 { |
320 TEST(OptionalTest, TestMoveAssignToFullFromFull) { | 302 Optional<float> a; |
321 auto log = Logger::Setup(); | 303 Optional<float> b(0.1f); |
322 { | 304 a = b; |
323 Optional<Logger> x(Logger(17)); | 305 |
324 Optional<Logger> y(Logger(42)); | 306 EXPECT_TRUE(a); |
325 log->push_back("---"); | 307 EXPECT_EQ(a.value(), 0.1f); |
326 x = std::move(y); | 308 EXPECT_EQ(a, b); |
327 log->push_back("---"); | 309 } |
328 } | 310 |
329 EXPECT_EQ( | 311 { |
330 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 312 Optional<std::string> a; |
331 "0:17. destructor", "2:42. explicit constructor", | 313 Optional<std::string> b("foo"); |
332 "3:42. move constructor (from 2:42)", "2:42. destructor", "---", | 314 a = b; |
333 "1:42. operator= move (from 3:42)", "---", "3:42. destructor", | 315 |
334 "1:42. destructor"), | 316 EXPECT_TRUE(a); |
335 *log); | 317 EXPECT_EQ(a.value(), "foo"); |
336 } | 318 EXPECT_EQ(a, b); |
337 | 319 } |
338 TEST(OptionalTest, TestMoveAssignToEmptyFromT) { | 320 |
339 auto log = Logger::Setup(); | 321 { |
340 { | 322 Optional<TestObject> a; |
341 Optional<Logger> x; | 323 Optional<TestObject> b(TestObject(3, 0.1)); |
342 Logger y(17); | 324 a = b; |
343 log->push_back("---"); | 325 |
344 x = Optional<Logger>(std::move(y)); | 326 EXPECT_TRUE(!!a); |
345 log->push_back("---"); | 327 EXPECT_TRUE(a.value() == TestObject(3, 0.1)); |
346 } | 328 EXPECT_TRUE(a == b); |
347 EXPECT_EQ(V("0:17. explicit constructor", "---", | 329 } |
348 "1:17. move constructor (from 0:17)", | 330 |
349 "2:17. move constructor (from 1:17)", "1:17. destructor", "---", | 331 { |
350 "0:17. destructor", "2:17. destructor"), | 332 Optional<TestObject> a(TestObject(4, 1.0)); |
351 *log); | 333 Optional<TestObject> b(TestObject(3, 0.1)); |
352 } | 334 a = b; |
353 | 335 |
354 TEST(OptionalTest, TestMoveAssignToFullFromT) { | 336 EXPECT_TRUE(!!a); |
355 auto log = Logger::Setup(); | 337 EXPECT_TRUE(a.value() == TestObject(3, 0.1)); |
356 { | 338 EXPECT_TRUE(a == b); |
357 Optional<Logger> x(Logger(17)); | 339 } |
358 Logger y(42); | 340 } |
359 log->push_back("---"); | 341 |
360 x = Optional<Logger>(std::move(y)); | 342 TEST(OptionalTest, AssignObject_rvalue) { |
361 log->push_back("---"); | 343 { |
362 } | 344 Optional<float> a; |
363 EXPECT_EQ( | 345 Optional<float> b(0.1f); |
364 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", | 346 a = std::move(b); |
365 "0:17. destructor", "2:42. explicit constructor", "---", | 347 |
366 "3:42. move constructor (from 2:42)", | 348 EXPECT_TRUE(a); |
367 "1:42. operator= move (from 3:42)", "3:42. destructor", "---", | 349 EXPECT_TRUE(b); |
368 "2:42. destructor", "1:42. destructor"), | 350 EXPECT_EQ(0.1f, a.value()); |
369 *log); | 351 } |
370 } | 352 |
371 | 353 { |
372 TEST(OptionalTest, TestDereference) { | 354 Optional<std::string> a; |
373 auto log = Logger::Setup(); | 355 Optional<std::string> b("foo"); |
374 { | 356 a = std::move(b); |
375 Optional<Logger> x(Logger(42)); | 357 |
376 const auto& y = x; | 358 EXPECT_TRUE(a); |
377 log->push_back("---"); | 359 EXPECT_TRUE(b); |
378 x->Foo(); | 360 EXPECT_EQ("foo", a.value()); |
379 y->Foo(); | 361 } |
380 std::move(x)->Foo(); | 362 |
381 std::move(y)->Foo(); | 363 { |
382 log->push_back("---"); | 364 Optional<TestObject> a; |
383 (*x).Foo(); | 365 Optional<TestObject> b(TestObject(3, 0.1)); |
384 (*y).Foo(); | 366 a = std::move(b); |
385 (*std::move(x)).Foo(); | 367 |
386 (*std::move(y)).Foo(); | 368 EXPECT_TRUE(!!a); |
387 log->push_back("---"); | 369 EXPECT_TRUE(!!b); |
388 } | 370 EXPECT_TRUE(TestObject(3, 0.1) == a.value()); |
389 EXPECT_EQ(V("0:42. explicit constructor", | 371 |
390 "1:42. move constructor (from 0:42)", "0:42. destructor", "---", | 372 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state()); |
391 "1:42. Foo()", "1:42. Foo() const", "1:42. Foo()", | 373 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state()); |
392 "1:42. Foo() const", "---", "1:42. Foo()", "1:42. Foo() const", | 374 } |
393 "1:42. Foo()", "1:42. Foo() const", "---", "1:42. destructor"), | 375 |
394 *log); | 376 { |
395 } | 377 Optional<TestObject> a(TestObject(4, 1.0)); |
396 | 378 Optional<TestObject> b(TestObject(3, 0.1)); |
397 TEST(OptionalTest, TestDereferenceWithDefault) { | 379 a = std::move(b); |
398 auto log = Logger::Setup(); | 380 |
399 { | 381 EXPECT_TRUE(!!a); |
400 const Logger a(17), b(42); | 382 EXPECT_TRUE(!!b); |
401 Optional<Logger> x(a); | 383 EXPECT_TRUE(TestObject(3, 0.1) == a.value()); |
402 Optional<Logger> y; | 384 |
403 log->push_back("-1-"); | 385 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state()); |
404 EXPECT_EQ(a, x.value_or(Logger(42))); | 386 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state()); |
405 log->push_back("-2-"); | 387 } |
406 EXPECT_EQ(b, y.value_or(Logger(42))); | 388 } |
407 log->push_back("-3-"); | 389 |
408 EXPECT_EQ(a, Optional<Logger>(Logger(17)).value_or(b)); | 390 TEST(OptionalTest, AssignNull) { |
409 log->push_back("-4-"); | 391 { |
410 EXPECT_EQ(b, Optional<Logger>().value_or(b)); | 392 Optional<float> a(0.1f); |
411 log->push_back("-5-"); | 393 Optional<float> b(0.2f); |
412 } | 394 a = rtc::nullopt; |
413 EXPECT_EQ( | 395 b = rtc::nullopt; |
414 V("0:17. explicit constructor", "1:42. explicit constructor", | 396 EXPECT_EQ(a, b); |
415 "2:17. copy constructor (from 0:17)", "-1-", | 397 } |
416 "3:42. explicit constructor", "operator== 0:17, 2:17", | 398 |
417 "3:42. destructor", "-2-", "4:42. explicit constructor", | 399 { |
418 "operator== 1:42, 4:42", "4:42. destructor", "-3-", | 400 Optional<std::string> a("foo"); |
419 "5:17. explicit constructor", "6:17. move constructor (from 5:17)", | 401 Optional<std::string> b("bar"); |
420 "operator== 0:17, 6:17", "6:17. destructor", "5:17. destructor", "-4-", | 402 a = rtc::nullopt; |
421 "operator== 1:42, 1:42", "-5-", "2:17. destructor", "1:42. destructor", | 403 b = rtc::nullopt; |
422 "0:17. destructor"), | 404 EXPECT_EQ(a, b); |
423 *log); | 405 } |
424 } | 406 |
425 | 407 { |
426 TEST(OptionalTest, TestEquality) { | 408 Optional<TestObject> a(TestObject(3, 0.1)); |
427 auto log = Logger::Setup(); | 409 Optional<TestObject> b(TestObject(4, 1.0)); |
428 { | 410 a = rtc::nullopt; |
429 Logger a(17), b(42); | 411 b = rtc::nullopt; |
430 Optional<Logger> ma1(a), ma2(a), mb(b), me1, me2; | 412 EXPECT_TRUE(a == b); |
431 log->push_back("---"); | 413 } |
432 EXPECT_EQ(ma1, ma1); | 414 } |
433 EXPECT_EQ(ma1, ma2); | 415 |
434 EXPECT_NE(ma1, mb); | 416 TEST(OptionalTest, OperatorStar) { |
435 EXPECT_NE(ma1, me1); | 417 { |
436 EXPECT_EQ(me1, me1); | 418 Optional<float> a(0.1f); |
437 EXPECT_EQ(me1, me2); | 419 EXPECT_EQ(a.value(), *a); |
438 log->push_back("---"); | 420 } |
439 } | 421 |
440 EXPECT_EQ( | 422 { |
441 V("0:17. explicit constructor", "1:42. explicit constructor", | 423 Optional<std::string> a("foo"); |
442 "2:17. copy constructor (from 0:17)", | 424 EXPECT_EQ(a.value(), *a); |
443 "3:17. copy constructor (from 0:17)", | 425 } |
444 "4:42. copy constructor (from 1:42)", "---", "operator== 2:17, 2:17", | 426 |
445 "operator== 2:17, 3:17", "operator!= 2:17, 4:42", "---", | 427 { |
446 "4:42. destructor", "3:17. destructor", "2:17. destructor", | 428 Optional<TestObject> a(TestObject(3, 0.1)); |
447 "1:42. destructor", "0:17. destructor"), | 429 EXPECT_EQ(a.value(), *a); |
448 *log); | 430 } |
449 } | 431 } |
450 | 432 |
451 TEST(OptionalTest, TestSwap) { | 433 TEST(OptionalTest, OperatorStar_rvalue) { |
452 auto log = Logger::Setup(); | 434 EXPECT_EQ(0.1f, *Optional<float>(0.1f)); |
453 { | 435 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo")); |
454 Logger a(17), b(42); | 436 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1))); |
455 Optional<Logger> x1(a), x2(b), y1(a), y2, z1, z2; | 437 } |
456 log->push_back("---"); | 438 |
457 swap(x1, x2); // Swap full <-> full. | 439 TEST(OptionalTest, OperatorArrow) { |
458 swap(y1, y2); // Swap full <-> empty. | 440 Optional<TestObject> a(TestObject(3, 0.1)); |
459 swap(z1, z2); // Swap empty <-> empty. | 441 EXPECT_EQ(a->foo(), 3); |
460 log->push_back("---"); | 442 } |
461 } | 443 |
462 EXPECT_EQ(V("0:17. explicit constructor", "1:42. explicit constructor", | 444 TEST(OptionalTest, Value_rvalue) { |
463 "2:17. copy constructor (from 0:17)", | 445 EXPECT_EQ(0.1f, Optional<float>(0.1f).value()); |
464 "3:42. copy constructor (from 1:42)", | 446 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value()); |
465 "4:17. copy constructor (from 0:17)", "---", "swap 2:42, 3:17", | 447 EXPECT_TRUE(TestObject(3, 0.1) == |
466 "5:17. move constructor (from 4:17)", "4:17. destructor", "---", | 448 Optional<TestObject>(TestObject(3, 0.1)).value()); |
467 "5:17. destructor", "3:17. destructor", "2:42. destructor", | 449 } |
468 "1:42. destructor", "0:17. destructor"), | 450 |
469 *log); | 451 TEST(OptionalTest, ValueOr) { |
| 452 { |
| 453 Optional<float> a; |
| 454 EXPECT_EQ(0.0f, a.value_or(0.0f)); |
| 455 |
| 456 a = 0.1f; |
| 457 EXPECT_EQ(0.1f, a.value_or(0.0f)); |
| 458 |
| 459 a = rtc::nullopt; |
| 460 EXPECT_EQ(0.0f, a.value_or(0.0f)); |
| 461 } |
| 462 |
| 463 { |
| 464 Optional<std::string> a; |
| 465 EXPECT_EQ("bar", a.value_or("bar")); |
| 466 |
| 467 a = std::string("foo"); |
| 468 EXPECT_EQ(std::string("foo"), a.value_or("bar")); |
| 469 |
| 470 a = rtc::nullopt; |
| 471 EXPECT_EQ(std::string("bar"), a.value_or("bar")); |
| 472 } |
| 473 |
| 474 { |
| 475 Optional<TestObject> a; |
| 476 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3)); |
| 477 |
| 478 a = TestObject(3, 0.1); |
| 479 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1)); |
| 480 |
| 481 a = rtc::nullopt; |
| 482 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3)); |
| 483 } |
| 484 } |
| 485 |
| 486 TEST(OptionalTest, Swap_bothNoValue) { |
| 487 Optional<TestObject> a, b; |
| 488 a.swap(b); |
| 489 |
| 490 EXPECT_FALSE(a); |
| 491 EXPECT_FALSE(b); |
| 492 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42))); |
| 493 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42))); |
| 494 } |
| 495 |
| 496 TEST(OptionalTest, Swap_inHasValue) { |
| 497 Optional<TestObject> a(TestObject(1, 0.3)); |
| 498 Optional<TestObject> b; |
| 499 a.swap(b); |
| 500 |
| 501 EXPECT_FALSE(a); |
| 502 |
| 503 EXPECT_TRUE(!!b); |
| 504 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42))); |
| 505 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42))); |
| 506 } |
| 507 |
| 508 TEST(OptionalTest, Swap_outHasValue) { |
| 509 Optional<TestObject> a; |
| 510 Optional<TestObject> b(TestObject(1, 0.3)); |
| 511 a.swap(b); |
| 512 |
| 513 EXPECT_TRUE(!!a); |
| 514 EXPECT_FALSE(!!b); |
| 515 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42))); |
| 516 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42))); |
| 517 } |
| 518 |
| 519 TEST(OptionalTest, Swap_bothValue) { |
| 520 Optional<TestObject> a(TestObject(0, 0.1)); |
| 521 Optional<TestObject> b(TestObject(1, 0.3)); |
| 522 a.swap(b); |
| 523 |
| 524 EXPECT_TRUE(!!a); |
| 525 EXPECT_TRUE(!!b); |
| 526 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42))); |
| 527 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42))); |
| 528 EXPECT_EQ(TestObject::State::SWAPPED, a->state()); |
| 529 EXPECT_EQ(TestObject::State::SWAPPED, b->state()); |
| 530 } |
| 531 |
| 532 TEST(OptionalTest, Emplace) { |
| 533 { |
| 534 Optional<float> a(0.1f); |
| 535 a.emplace(0.3f); |
| 536 |
| 537 EXPECT_TRUE(a); |
| 538 EXPECT_EQ(0.3f, a.value()); |
| 539 } |
| 540 |
| 541 { |
| 542 Optional<std::string> a("foo"); |
| 543 a.emplace("bar"); |
| 544 |
| 545 EXPECT_TRUE(a); |
| 546 EXPECT_EQ("bar", a.value()); |
| 547 } |
| 548 |
| 549 { |
| 550 Optional<TestObject> a(TestObject(0, 0.1)); |
| 551 a.emplace(TestObject(1, 0.2)); |
| 552 |
| 553 EXPECT_TRUE(!!a); |
| 554 EXPECT_TRUE(TestObject(1, 0.2) == a.value()); |
| 555 } |
| 556 } |
| 557 |
| 558 TEST(OptionalTest, Equals_TwoEmpty) { |
| 559 Optional<int> a; |
| 560 Optional<int> b; |
| 561 |
| 562 EXPECT_TRUE(a == b); |
| 563 } |
| 564 |
| 565 TEST(OptionalTest, Equals_TwoEquals) { |
| 566 Optional<int> a(1); |
| 567 Optional<int> b(1); |
| 568 |
| 569 EXPECT_TRUE(a == b); |
| 570 } |
| 571 |
| 572 TEST(OptionalTest, Equals_OneEmpty) { |
| 573 Optional<int> a; |
| 574 Optional<int> b(1); |
| 575 |
| 576 EXPECT_FALSE(a == b); |
| 577 } |
| 578 |
| 579 TEST(OptionalTest, Equals_TwoDifferent) { |
| 580 Optional<int> a(0); |
| 581 Optional<int> b(1); |
| 582 |
| 583 EXPECT_FALSE(a == b); |
| 584 } |
| 585 |
| 586 TEST(OptionalTest, NotEquals_TwoEmpty) { |
| 587 Optional<int> a; |
| 588 Optional<int> b; |
| 589 |
| 590 EXPECT_FALSE(a != b); |
| 591 } |
| 592 |
| 593 TEST(OptionalTest, NotEquals_TwoEquals) { |
| 594 Optional<int> a(1); |
| 595 Optional<int> b(1); |
| 596 |
| 597 EXPECT_FALSE(a != b); |
| 598 } |
| 599 |
| 600 TEST(OptionalTest, NotEquals_OneEmpty) { |
| 601 Optional<int> a; |
| 602 Optional<int> b(1); |
| 603 |
| 604 EXPECT_TRUE(a != b); |
| 605 } |
| 606 |
| 607 TEST(OptionalTest, NotEquals_TwoDifferent) { |
| 608 Optional<int> a(0); |
| 609 Optional<int> b(1); |
| 610 |
| 611 EXPECT_TRUE(a != b); |
| 612 } |
| 613 |
| 614 TEST(OptionalTest, Less_LeftEmpty) { |
| 615 Optional<int> l; |
| 616 Optional<int> r(1); |
| 617 |
| 618 EXPECT_TRUE(l < r); |
| 619 } |
| 620 |
| 621 TEST(OptionalTest, Less_RightEmpty) { |
| 622 Optional<int> l(1); |
| 623 Optional<int> r; |
| 624 |
| 625 EXPECT_FALSE(l < r); |
| 626 } |
| 627 |
| 628 TEST(OptionalTest, Less_BothEmpty) { |
| 629 Optional<int> l; |
| 630 Optional<int> r; |
| 631 |
| 632 EXPECT_FALSE(l < r); |
| 633 } |
| 634 |
| 635 TEST(OptionalTest, Less_BothValues) { |
| 636 { |
| 637 Optional<int> l(1); |
| 638 Optional<int> r(2); |
| 639 |
| 640 EXPECT_TRUE(l < r); |
| 641 } |
| 642 { |
| 643 Optional<int> l(2); |
| 644 Optional<int> r(1); |
| 645 |
| 646 EXPECT_FALSE(l < r); |
| 647 } |
| 648 { |
| 649 Optional<int> l(1); |
| 650 Optional<int> r(1); |
| 651 |
| 652 EXPECT_FALSE(l < r); |
| 653 } |
| 654 } |
| 655 |
| 656 TEST(OptionalTest, LessEq_LeftEmpty) { |
| 657 Optional<int> l; |
| 658 Optional<int> r(1); |
| 659 |
| 660 EXPECT_TRUE(l <= r); |
| 661 } |
| 662 |
| 663 TEST(OptionalTest, LessEq_RightEmpty) { |
| 664 Optional<int> l(1); |
| 665 Optional<int> r; |
| 666 |
| 667 EXPECT_FALSE(l <= r); |
| 668 } |
| 669 |
| 670 TEST(OptionalTest, LessEq_BothEmpty) { |
| 671 Optional<int> l; |
| 672 Optional<int> r; |
| 673 |
| 674 EXPECT_TRUE(l <= r); |
| 675 } |
| 676 |
| 677 TEST(OptionalTest, LessEq_BothValues) { |
| 678 { |
| 679 Optional<int> l(1); |
| 680 Optional<int> r(2); |
| 681 |
| 682 EXPECT_TRUE(l <= r); |
| 683 } |
| 684 { |
| 685 Optional<int> l(2); |
| 686 Optional<int> r(1); |
| 687 |
| 688 EXPECT_FALSE(l <= r); |
| 689 } |
| 690 { |
| 691 Optional<int> l(1); |
| 692 Optional<int> r(1); |
| 693 |
| 694 EXPECT_TRUE(l <= r); |
| 695 } |
| 696 } |
| 697 |
| 698 TEST(OptionalTest, Greater_BothEmpty) { |
| 699 Optional<int> l; |
| 700 Optional<int> r; |
| 701 |
| 702 EXPECT_FALSE(l > r); |
| 703 } |
| 704 |
| 705 TEST(OptionalTest, Greater_LeftEmpty) { |
| 706 Optional<int> l; |
| 707 Optional<int> r(1); |
| 708 |
| 709 EXPECT_FALSE(l > r); |
| 710 } |
| 711 |
| 712 TEST(OptionalTest, Greater_RightEmpty) { |
| 713 Optional<int> l(1); |
| 714 Optional<int> r; |
| 715 |
| 716 EXPECT_TRUE(l > r); |
| 717 } |
| 718 |
| 719 TEST(OptionalTest, Greater_BothValue) { |
| 720 { |
| 721 Optional<int> l(1); |
| 722 Optional<int> r(2); |
| 723 |
| 724 EXPECT_FALSE(l > r); |
| 725 } |
| 726 { |
| 727 Optional<int> l(2); |
| 728 Optional<int> r(1); |
| 729 |
| 730 EXPECT_TRUE(l > r); |
| 731 } |
| 732 { |
| 733 Optional<int> l(1); |
| 734 Optional<int> r(1); |
| 735 |
| 736 EXPECT_FALSE(l > r); |
| 737 } |
| 738 } |
| 739 |
| 740 TEST(OptionalTest, GreaterEq_BothEmpty) { |
| 741 Optional<int> l; |
| 742 Optional<int> r; |
| 743 |
| 744 EXPECT_TRUE(l >= r); |
| 745 } |
| 746 |
| 747 TEST(OptionalTest, GreaterEq_LeftEmpty) { |
| 748 Optional<int> l; |
| 749 Optional<int> r(1); |
| 750 |
| 751 EXPECT_FALSE(l >= r); |
| 752 } |
| 753 |
| 754 TEST(OptionalTest, GreaterEq_RightEmpty) { |
| 755 Optional<int> l(1); |
| 756 Optional<int> r; |
| 757 |
| 758 EXPECT_TRUE(l >= r); |
| 759 } |
| 760 |
| 761 TEST(OptionalTest, GreaterEq_BothValue) { |
| 762 { |
| 763 Optional<int> l(1); |
| 764 Optional<int> r(2); |
| 765 |
| 766 EXPECT_FALSE(l >= r); |
| 767 } |
| 768 { |
| 769 Optional<int> l(2); |
| 770 Optional<int> r(1); |
| 771 |
| 772 EXPECT_TRUE(l >= r); |
| 773 } |
| 774 { |
| 775 Optional<int> l(1); |
| 776 Optional<int> r(1); |
| 777 |
| 778 EXPECT_TRUE(l >= r); |
| 779 } |
| 780 } |
| 781 |
| 782 TEST(OptionalTest, OptNullEq) { |
| 783 { |
| 784 Optional<int> opt; |
| 785 EXPECT_TRUE(opt == rtc::nullopt); |
| 786 } |
| 787 { |
| 788 Optional<int> opt(1); |
| 789 EXPECT_FALSE(opt == rtc::nullopt); |
| 790 } |
| 791 } |
| 792 |
| 793 TEST(OptionalTest, NullOptEq) { |
| 794 { |
| 795 Optional<int> opt; |
| 796 EXPECT_TRUE(rtc::nullopt == opt); |
| 797 } |
| 798 { |
| 799 Optional<int> opt(1); |
| 800 EXPECT_FALSE(rtc::nullopt == opt); |
| 801 } |
| 802 } |
| 803 |
| 804 TEST(OptionalTest, OptNullNotEq) { |
| 805 { |
| 806 Optional<int> opt; |
| 807 EXPECT_FALSE(opt != rtc::nullopt); |
| 808 } |
| 809 { |
| 810 Optional<int> opt(1); |
| 811 EXPECT_TRUE(opt != rtc::nullopt); |
| 812 } |
| 813 } |
| 814 |
| 815 TEST(OptionalTest, NullOptNotEq) { |
| 816 { |
| 817 Optional<int> opt; |
| 818 EXPECT_FALSE(rtc::nullopt != opt); |
| 819 } |
| 820 { |
| 821 Optional<int> opt(1); |
| 822 EXPECT_TRUE(rtc::nullopt != opt); |
| 823 } |
| 824 } |
| 825 |
| 826 TEST(OptionalTest, OptNullLower) { |
| 827 { |
| 828 Optional<int> opt; |
| 829 EXPECT_FALSE(opt < rtc::nullopt); |
| 830 } |
| 831 { |
| 832 Optional<int> opt(1); |
| 833 EXPECT_FALSE(opt < rtc::nullopt); |
| 834 } |
| 835 } |
| 836 |
| 837 TEST(OptionalTest, NullOptLower) { |
| 838 { |
| 839 Optional<int> opt; |
| 840 EXPECT_FALSE(rtc::nullopt < opt); |
| 841 } |
| 842 { |
| 843 Optional<int> opt(1); |
| 844 EXPECT_TRUE(rtc::nullopt < opt); |
| 845 } |
| 846 } |
| 847 |
| 848 TEST(OptionalTest, OptNullLowerEq) { |
| 849 { |
| 850 Optional<int> opt; |
| 851 EXPECT_TRUE(opt <= rtc::nullopt); |
| 852 } |
| 853 { |
| 854 Optional<int> opt(1); |
| 855 EXPECT_FALSE(opt <= rtc::nullopt); |
| 856 } |
| 857 } |
| 858 |
| 859 TEST(OptionalTest, NullOptLowerEq) { |
| 860 { |
| 861 Optional<int> opt; |
| 862 EXPECT_TRUE(rtc::nullopt <= opt); |
| 863 } |
| 864 { |
| 865 Optional<int> opt(1); |
| 866 EXPECT_TRUE(rtc::nullopt <= opt); |
| 867 } |
| 868 } |
| 869 |
| 870 TEST(OptionalTest, OptNullGreater) { |
| 871 { |
| 872 Optional<int> opt; |
| 873 EXPECT_FALSE(opt > rtc::nullopt); |
| 874 } |
| 875 { |
| 876 Optional<int> opt(1); |
| 877 EXPECT_TRUE(opt > rtc::nullopt); |
| 878 } |
| 879 } |
| 880 |
| 881 TEST(OptionalTest, NullOptGreater) { |
| 882 { |
| 883 Optional<int> opt; |
| 884 EXPECT_FALSE(rtc::nullopt > opt); |
| 885 } |
| 886 { |
| 887 Optional<int> opt(1); |
| 888 EXPECT_FALSE(rtc::nullopt > opt); |
| 889 } |
| 890 } |
| 891 |
| 892 TEST(OptionalTest, OptNullGreaterEq) { |
| 893 { |
| 894 Optional<int> opt; |
| 895 EXPECT_TRUE(opt >= rtc::nullopt); |
| 896 } |
| 897 { |
| 898 Optional<int> opt(1); |
| 899 EXPECT_TRUE(opt >= rtc::nullopt); |
| 900 } |
| 901 } |
| 902 |
| 903 TEST(OptionalTest, NullOptGreaterEq) { |
| 904 { |
| 905 Optional<int> opt; |
| 906 EXPECT_TRUE(rtc::nullopt >= opt); |
| 907 } |
| 908 { |
| 909 Optional<int> opt(1); |
| 910 EXPECT_FALSE(rtc::nullopt >= opt); |
| 911 } |
| 912 } |
| 913 |
| 914 TEST(OptionalTest, ValueEq_Empty) { |
| 915 Optional<int> opt; |
| 916 EXPECT_FALSE(opt == 1); |
| 917 } |
| 918 |
| 919 TEST(OptionalTest, ValueEq_NotEmpty) { |
| 920 { |
| 921 Optional<int> opt(0); |
| 922 EXPECT_FALSE(opt == 1); |
| 923 } |
| 924 { |
| 925 Optional<int> opt(1); |
| 926 EXPECT_TRUE(opt == 1); |
| 927 } |
| 928 } |
| 929 |
| 930 TEST(OptionalTest, EqValue_Empty) { |
| 931 Optional<int> opt; |
| 932 EXPECT_FALSE(1 == opt); |
| 933 } |
| 934 |
| 935 TEST(OptionalTest, EqValue_NotEmpty) { |
| 936 { |
| 937 Optional<int> opt(0); |
| 938 EXPECT_FALSE(1 == opt); |
| 939 } |
| 940 { |
| 941 Optional<int> opt(1); |
| 942 EXPECT_TRUE(1 == opt); |
| 943 } |
| 944 } |
| 945 |
| 946 TEST(OptionalTest, ValueNotEq_Empty) { |
| 947 Optional<int> opt; |
| 948 EXPECT_TRUE(opt != 1); |
| 949 } |
| 950 |
| 951 TEST(OptionalTest, ValueNotEq_NotEmpty) { |
| 952 { |
| 953 Optional<int> opt(0); |
| 954 EXPECT_TRUE(opt != 1); |
| 955 } |
| 956 { |
| 957 Optional<int> opt(1); |
| 958 EXPECT_FALSE(opt != 1); |
| 959 } |
| 960 } |
| 961 |
| 962 TEST(OptionalTest, NotEqValue_Empty) { |
| 963 Optional<int> opt; |
| 964 EXPECT_TRUE(1 != opt); |
| 965 } |
| 966 |
| 967 TEST(OptionalTest, NotEqValue_NotEmpty) { |
| 968 { |
| 969 Optional<int> opt(0); |
| 970 EXPECT_TRUE(1 != opt); |
| 971 } |
| 972 { |
| 973 Optional<int> opt(1); |
| 974 EXPECT_FALSE(1 != opt); |
| 975 } |
| 976 } |
| 977 |
| 978 TEST(OptionalTest, ValueLess_Empty) { |
| 979 Optional<int> opt; |
| 980 EXPECT_TRUE(opt < 1); |
| 981 } |
| 982 |
| 983 TEST(OptionalTest, ValueLess_NotEmpty) { |
| 984 { |
| 985 Optional<int> opt(0); |
| 986 EXPECT_TRUE(opt < 1); |
| 987 } |
| 988 { |
| 989 Optional<int> opt(1); |
| 990 EXPECT_FALSE(opt < 1); |
| 991 } |
| 992 { |
| 993 Optional<int> opt(2); |
| 994 EXPECT_FALSE(opt < 1); |
| 995 } |
| 996 } |
| 997 |
| 998 TEST(OptionalTest, LessValue_Empty) { |
| 999 Optional<int> opt; |
| 1000 EXPECT_FALSE(1 < opt); |
| 1001 } |
| 1002 |
| 1003 TEST(OptionalTest, LessValue_NotEmpty) { |
| 1004 { |
| 1005 Optional<int> opt(0); |
| 1006 EXPECT_FALSE(1 < opt); |
| 1007 } |
| 1008 { |
| 1009 Optional<int> opt(1); |
| 1010 EXPECT_FALSE(1 < opt); |
| 1011 } |
| 1012 { |
| 1013 Optional<int> opt(2); |
| 1014 EXPECT_TRUE(1 < opt); |
| 1015 } |
| 1016 } |
| 1017 |
| 1018 TEST(OptionalTest, ValueLessEq_Empty) { |
| 1019 Optional<int> opt; |
| 1020 EXPECT_TRUE(opt <= 1); |
| 1021 } |
| 1022 |
| 1023 TEST(OptionalTest, ValueLessEq_NotEmpty) { |
| 1024 { |
| 1025 Optional<int> opt(0); |
| 1026 EXPECT_TRUE(opt <= 1); |
| 1027 } |
| 1028 { |
| 1029 Optional<int> opt(1); |
| 1030 EXPECT_TRUE(opt <= 1); |
| 1031 } |
| 1032 { |
| 1033 Optional<int> opt(2); |
| 1034 EXPECT_FALSE(opt <= 1); |
| 1035 } |
| 1036 } |
| 1037 |
| 1038 TEST(OptionalTest, LessEqValue_Empty) { |
| 1039 Optional<int> opt; |
| 1040 EXPECT_FALSE(1 <= opt); |
| 1041 } |
| 1042 |
| 1043 TEST(OptionalTest, LessEqValue_NotEmpty) { |
| 1044 { |
| 1045 Optional<int> opt(0); |
| 1046 EXPECT_FALSE(1 <= opt); |
| 1047 } |
| 1048 { |
| 1049 Optional<int> opt(1); |
| 1050 EXPECT_TRUE(1 <= opt); |
| 1051 } |
| 1052 { |
| 1053 Optional<int> opt(2); |
| 1054 EXPECT_TRUE(1 <= opt); |
| 1055 } |
| 1056 } |
| 1057 |
| 1058 TEST(OptionalTest, ValueGreater_Empty) { |
| 1059 Optional<int> opt; |
| 1060 EXPECT_FALSE(opt > 1); |
| 1061 } |
| 1062 |
| 1063 TEST(OptionalTest, ValueGreater_NotEmpty) { |
| 1064 { |
| 1065 Optional<int> opt(0); |
| 1066 EXPECT_FALSE(opt > 1); |
| 1067 } |
| 1068 { |
| 1069 Optional<int> opt(1); |
| 1070 EXPECT_FALSE(opt > 1); |
| 1071 } |
| 1072 { |
| 1073 Optional<int> opt(2); |
| 1074 EXPECT_TRUE(opt > 1); |
| 1075 } |
| 1076 } |
| 1077 |
| 1078 TEST(OptionalTest, GreaterValue_Empty) { |
| 1079 Optional<int> opt; |
| 1080 EXPECT_TRUE(1 > opt); |
| 1081 } |
| 1082 |
| 1083 TEST(OptionalTest, GreaterValue_NotEmpty) { |
| 1084 { |
| 1085 Optional<int> opt(0); |
| 1086 EXPECT_TRUE(1 > opt); |
| 1087 } |
| 1088 { |
| 1089 Optional<int> opt(1); |
| 1090 EXPECT_FALSE(1 > opt); |
| 1091 } |
| 1092 { |
| 1093 Optional<int> opt(2); |
| 1094 EXPECT_FALSE(1 > opt); |
| 1095 } |
| 1096 } |
| 1097 |
| 1098 TEST(OptionalTest, ValueGreaterEq_Empty) { |
| 1099 Optional<int> opt; |
| 1100 EXPECT_FALSE(opt >= 1); |
| 1101 } |
| 1102 |
| 1103 TEST(OptionalTest, ValueGreaterEq_NotEmpty) { |
| 1104 { |
| 1105 Optional<int> opt(0); |
| 1106 EXPECT_FALSE(opt >= 1); |
| 1107 } |
| 1108 { |
| 1109 Optional<int> opt(1); |
| 1110 EXPECT_TRUE(opt >= 1); |
| 1111 } |
| 1112 { |
| 1113 Optional<int> opt(2); |
| 1114 EXPECT_TRUE(opt >= 1); |
| 1115 } |
| 1116 } |
| 1117 |
| 1118 TEST(OptionalTest, GreaterEqValue_Empty) { |
| 1119 Optional<int> opt; |
| 1120 EXPECT_TRUE(1 >= opt); |
| 1121 } |
| 1122 |
| 1123 TEST(OptionalTest, GreaterEqValue_NotEmpty) { |
| 1124 { |
| 1125 Optional<int> opt(0); |
| 1126 EXPECT_TRUE(1 >= opt); |
| 1127 } |
| 1128 { |
| 1129 Optional<int> opt(1); |
| 1130 EXPECT_TRUE(1 >= opt); |
| 1131 } |
| 1132 { |
| 1133 Optional<int> opt(2); |
| 1134 EXPECT_FALSE(1 >= opt); |
| 1135 } |
| 1136 } |
| 1137 |
| 1138 TEST(OptionalTest, NotEquals) { |
| 1139 { |
| 1140 Optional<float> a(0.1f); |
| 1141 Optional<float> b(0.2f); |
| 1142 EXPECT_NE(a, b); |
| 1143 } |
| 1144 |
| 1145 { |
| 1146 Optional<std::string> a("foo"); |
| 1147 Optional<std::string> b("bar"); |
| 1148 EXPECT_NE(a, b); |
| 1149 } |
| 1150 |
| 1151 { |
| 1152 Optional<TestObject> a(TestObject(3, 0.1)); |
| 1153 Optional<TestObject> b(TestObject(4, 1.0)); |
| 1154 EXPECT_TRUE(a != b); |
| 1155 } |
| 1156 } |
| 1157 |
| 1158 TEST(OptionalTest, NotEqualsNull) { |
| 1159 { |
| 1160 Optional<float> a(0.1f); |
| 1161 Optional<float> b(0.1f); |
| 1162 b = rtc::nullopt; |
| 1163 EXPECT_NE(a, b); |
| 1164 } |
| 1165 |
| 1166 { |
| 1167 Optional<std::string> a("foo"); |
| 1168 Optional<std::string> b("foo"); |
| 1169 b = rtc::nullopt; |
| 1170 EXPECT_NE(a, b); |
| 1171 } |
| 1172 |
| 1173 { |
| 1174 Optional<TestObject> a(TestObject(3, 0.1)); |
| 1175 Optional<TestObject> b(TestObject(3, 0.1)); |
| 1176 b = rtc::nullopt; |
| 1177 EXPECT_TRUE(a != b); |
| 1178 } |
| 1179 } |
| 1180 |
| 1181 TEST(OptionalTest, MakeOptional) { |
| 1182 { |
| 1183 Optional<float> o = rtc::make_optional(32.f); |
| 1184 EXPECT_TRUE(o); |
| 1185 EXPECT_EQ(32.f, *o); |
| 1186 |
| 1187 float value = 3.f; |
| 1188 o = rtc::make_optional(std::move(value)); |
| 1189 EXPECT_TRUE(o); |
| 1190 EXPECT_EQ(3.f, *o); |
| 1191 } |
| 1192 |
| 1193 { |
| 1194 Optional<std::string> o = rtc::make_optional(std::string("foo")); |
| 1195 EXPECT_TRUE(o); |
| 1196 EXPECT_EQ("foo", *o); |
| 1197 |
| 1198 std::string value = "bar"; |
| 1199 o = rtc::make_optional(std::move(value)); |
| 1200 EXPECT_TRUE(o); |
| 1201 EXPECT_EQ(std::string("bar"), *o); |
| 1202 } |
| 1203 |
| 1204 { |
| 1205 Optional<TestObject> o = rtc::make_optional(TestObject(3, 0.1)); |
| 1206 EXPECT_TRUE(!!o); |
| 1207 EXPECT_TRUE(TestObject(3, 0.1) == *o); |
| 1208 |
| 1209 TestObject value = TestObject(0, 0.42); |
| 1210 o = rtc::make_optional(std::move(value)); |
| 1211 EXPECT_TRUE(!!o); |
| 1212 EXPECT_TRUE(TestObject(0, 0.42) == *o); |
| 1213 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state()); |
| 1214 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state()); |
| 1215 |
| 1216 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, |
| 1217 rtc::make_optional(std::move(value))->state()); |
| 1218 } |
| 1219 } |
| 1220 |
| 1221 TEST(OptionalTest, NonMemberSwap_bothNoValue) { |
| 1222 Optional<TestObject> a, b; |
| 1223 rtc::swap(a, b); |
| 1224 |
| 1225 EXPECT_FALSE(!!a); |
| 1226 EXPECT_FALSE(!!b); |
| 1227 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42))); |
| 1228 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42))); |
| 1229 } |
| 1230 |
| 1231 TEST(OptionalTest, NonMemberSwap_inHasValue) { |
| 1232 Optional<TestObject> a(TestObject(1, 0.3)); |
| 1233 Optional<TestObject> b; |
| 1234 rtc::swap(a, b); |
| 1235 |
| 1236 EXPECT_FALSE(!!a); |
| 1237 EXPECT_TRUE(!!b); |
| 1238 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42))); |
| 1239 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42))); |
| 1240 } |
| 1241 |
| 1242 TEST(OptionalTest, NonMemberSwap_outHasValue) { |
| 1243 Optional<TestObject> a; |
| 1244 Optional<TestObject> b(TestObject(1, 0.3)); |
| 1245 rtc::swap(a, b); |
| 1246 |
| 1247 EXPECT_TRUE(!!a); |
| 1248 EXPECT_FALSE(!!b); |
| 1249 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42))); |
| 1250 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42))); |
| 1251 } |
| 1252 |
| 1253 TEST(OptionalTest, NonMemberSwap_bothValue) { |
| 1254 Optional<TestObject> a(TestObject(0, 0.1)); |
| 1255 Optional<TestObject> b(TestObject(1, 0.3)); |
| 1256 rtc::swap(a, b); |
| 1257 |
| 1258 EXPECT_TRUE(!!a); |
| 1259 EXPECT_TRUE(!!b); |
| 1260 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42))); |
| 1261 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42))); |
| 1262 EXPECT_EQ(TestObject::State::SWAPPED, a->state()); |
| 1263 EXPECT_EQ(TestObject::State::SWAPPED, b->state()); |
| 1264 } |
| 1265 |
| 1266 TEST(OptionalTest, Hash_OptionalReflectsInternal) { |
| 1267 { |
| 1268 std::hash<int> int_hash; |
| 1269 std::hash<Optional<int>> opt_int_hash; |
| 1270 |
| 1271 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1))); |
| 1272 } |
| 1273 |
| 1274 { |
| 1275 std::hash<std::string> str_hash; |
| 1276 std::hash<Optional<std::string>> opt_str_hash; |
| 1277 |
| 1278 EXPECT_EQ(str_hash(std::string("foobar")), |
| 1279 opt_str_hash(Optional<std::string>(std::string("foobar")))); |
| 1280 } |
| 1281 } |
| 1282 |
| 1283 TEST(OptionalTest, Hash_NullOptEqualsNullOpt) { |
| 1284 std::hash<Optional<int>> opt_int_hash; |
| 1285 std::hash<Optional<std::string>> opt_str_hash; |
| 1286 |
| 1287 EXPECT_EQ(opt_str_hash(Optional<std::string>()), |
| 1288 opt_int_hash(Optional<int>())); |
| 1289 } |
| 1290 |
| 1291 TEST(OptionalTest, Hash_UseInSet) { |
| 1292 std::set<Optional<int>> setOptInt; |
| 1293 |
| 1294 EXPECT_EQ(setOptInt.end(), setOptInt.find(42)); |
| 1295 |
| 1296 setOptInt.insert(Optional<int>(3)); |
| 1297 EXPECT_EQ(setOptInt.end(), setOptInt.find(42)); |
| 1298 EXPECT_NE(setOptInt.end(), setOptInt.find(3)); |
470 } | 1299 } |
471 | 1300 |
472 } // namespace rtc | 1301 } // namespace rtc |
OLD | NEW |