blob: 056e9113df30c2d394ddfdb2a6bc0cf0b30f7e0a [file] [log] [blame]
Karl Wiberg6e587202015-10-21 12:43:56 +02001/*
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
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
jbauch555604a2016-04-26 03:13:22 -070011#include <memory>
Karl Wiberg6e587202015-10-21 12:43:56 +020012#include <sstream>
13#include <string>
14#include <utility>
15#include <vector>
16
17#include "webrtc/base/gunit.h"
Karl Wibergbe579832015-11-10 22:34:18 +010018#include "webrtc/base/optional.h"
Karl Wiberg6e587202015-10-21 12:43:56 +020019
20namespace rtc {
21
22namespace {
23
24// Class whose instances logs various method calls (constructor, destructor,
25// etc.). Each instance has a unique ID (a simple global sequence number) and
26// an origin ID. When a copy is made, the new object gets a fresh ID but copies
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).
30class Logger {
31 public:
kwibergb2137952016-03-17 08:38:12 -070032 Logger() : id_(g_next_id++), origin_(id_) { Log("default constructor"); }
33 explicit Logger(int origin) : id_(g_next_id++), origin_(origin) {
Karl Wiberg6e587202015-10-21 12:43:56 +020034 Log("explicit constructor");
35 }
kwibergb2137952016-03-17 08:38:12 -070036 Logger(const Logger& other) : id_(g_next_id++), origin_(other.origin_) {
Karl Wiberg6e587202015-10-21 12:43:56 +020037 LogFrom("copy constructor", other);
38 }
kwibergb2137952016-03-17 08:38:12 -070039 Logger(Logger&& other) : id_(g_next_id++), origin_(other.origin_) {
Karl Wiberg6e587202015-10-21 12:43:56 +020040 LogFrom("move constructor", other);
41 }
42 ~Logger() { Log("destructor"); }
43 Logger& operator=(const Logger& other) {
44 origin_ = other.origin_;
45 LogFrom("operator= copy", other);
46 return *this;
47 }
48 Logger& operator=(Logger&& other) {
49 origin_ = other.origin_;
50 LogFrom("operator= move", other);
51 return *this;
52 }
53 friend void swap(Logger& a, Logger& b) {
54 using std::swap;
55 swap(a.origin_, b.origin_);
56 Log2("swap", a, b);
57 }
58 friend bool operator==(const Logger& a, const Logger& b) {
59 Log2("operator==", a, b);
60 return a.origin_ == b.origin_;
61 }
62 friend bool operator!=(const Logger& a, const Logger& b) {
63 Log2("operator!=", a, b);
64 return a.origin_ != b.origin_;
65 }
66 void Foo() { Log("Foo()"); }
67 void Foo() const { Log("Foo() const"); }
jbauch555604a2016-04-26 03:13:22 -070068 static std::unique_ptr<std::vector<std::string>> Setup() {
69 std::unique_ptr<std::vector<std::string>> s(new std::vector<std::string>);
kwibergb2137952016-03-17 08:38:12 -070070 g_log = s.get();
71 g_next_id = 0;
Karl Wiberg6e587202015-10-21 12:43:56 +020072 return s;
73 }
74
75 private:
76 int id_;
77 int origin_;
kwibergb2137952016-03-17 08:38:12 -070078 static std::vector<std::string>* g_log;
79 static int g_next_id;
Karl Wiberg6e587202015-10-21 12:43:56 +020080 void Log(const char* msg) const {
81 std::ostringstream oss;
82 oss << id_ << ':' << origin_ << ". " << msg;
kwibergb2137952016-03-17 08:38:12 -070083 g_log->push_back(oss.str());
Karl Wiberg6e587202015-10-21 12:43:56 +020084 }
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_ << ")";
kwibergb2137952016-03-17 08:38:12 -070089 g_log->push_back(oss.str());
Karl Wiberg6e587202015-10-21 12:43:56 +020090 }
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_;
kwibergb2137952016-03-17 08:38:12 -070095 g_log->push_back(oss.str());
Karl Wiberg6e587202015-10-21 12:43:56 +020096 }
97};
98
kwibergb2137952016-03-17 08:38:12 -070099std::vector<std::string>* Logger::g_log = nullptr;
100int Logger::g_next_id = 0;
Karl Wiberg6e587202015-10-21 12:43:56 +0200101
102// Append all the other args to the vector pointed to by the first arg.
103template <typename T>
104void VectorAppend(std::vector<T>* v) {}
105template <typename T, typename... Ts>
106void VectorAppend(std::vector<T>* v, const T& e, Ts... es) {
107 v->push_back(e);
108 VectorAppend(v, es...);
109}
110
111// Create a vector of strings. Because we're not allowed to use
112// std::initializer_list.
113template <typename... Ts>
114std::vector<std::string> V(Ts... es) {
115 std::vector<std::string> strings;
116 VectorAppend(&strings, static_cast<std::string>(es)...);
117 return strings;
118}
119
120} // namespace
121
Karl Wibergbe579832015-11-10 22:34:18 +0100122TEST(OptionalTest, TestConstructDefault) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200123 auto log = Logger::Setup();
124 {
Karl Wibergbe579832015-11-10 22:34:18 +0100125 Optional<Logger> x;
Karl Wiberg6e587202015-10-21 12:43:56 +0200126 EXPECT_FALSE(x);
127 }
kwibergd0404802016-05-09 06:06:05 -0700128 EXPECT_EQ(V(), *log);
Karl Wiberg6e587202015-10-21 12:43:56 +0200129}
130
Karl Wibergbe579832015-11-10 22:34:18 +0100131TEST(OptionalTest, TestConstructCopyEmpty) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200132 auto log = Logger::Setup();
133 {
Karl Wibergbe579832015-11-10 22:34:18 +0100134 Optional<Logger> x;
Karl Wiberg6e587202015-10-21 12:43:56 +0200135 EXPECT_FALSE(x);
136 auto y = x;
137 EXPECT_FALSE(y);
138 }
kwibergd0404802016-05-09 06:06:05 -0700139 EXPECT_EQ(V(), *log);
Karl Wiberg6e587202015-10-21 12:43:56 +0200140}
141
Karl Wibergbe579832015-11-10 22:34:18 +0100142TEST(OptionalTest, TestConstructCopyFull) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200143 auto log = Logger::Setup();
144 {
145 Logger a;
Karl Wibergbe579832015-11-10 22:34:18 +0100146 Optional<Logger> x(a);
Karl Wiberg6e587202015-10-21 12:43:56 +0200147 EXPECT_TRUE(x);
148 log->push_back("---");
149 auto y = x;
150 EXPECT_TRUE(y);
151 log->push_back("---");
152 }
153 EXPECT_EQ(V("0:0. default constructor", "1:0. copy constructor (from 0:0)",
154 "---", "2:0. copy constructor (from 1:0)", "---",
155 "2:0. destructor", "1:0. destructor", "0:0. destructor"),
156 *log);
157}
158
Karl Wibergbe579832015-11-10 22:34:18 +0100159TEST(OptionalTest, TestConstructMoveEmpty) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200160 auto log = Logger::Setup();
161 {
Karl Wibergbe579832015-11-10 22:34:18 +0100162 Optional<Logger> x;
Karl Wiberg6e587202015-10-21 12:43:56 +0200163 EXPECT_FALSE(x);
kwibergcea7c2f2016-01-07 05:52:04 -0800164 auto y = std::move(x);
Karl Wiberg6e587202015-10-21 12:43:56 +0200165 EXPECT_FALSE(y);
166 }
kwibergd0404802016-05-09 06:06:05 -0700167 EXPECT_EQ(V(), *log);
Karl Wiberg6e587202015-10-21 12:43:56 +0200168}
169
Karl Wibergbe579832015-11-10 22:34:18 +0100170TEST(OptionalTest, TestConstructMoveFull) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200171 auto log = Logger::Setup();
172 {
Karl Wibergbe579832015-11-10 22:34:18 +0100173 Optional<Logger> x(Logger(17));
Karl Wiberg6e587202015-10-21 12:43:56 +0200174 EXPECT_TRUE(x);
175 log->push_back("---");
kwibergcea7c2f2016-01-07 05:52:04 -0800176 auto y = std::move(x);
Karl Wiberg6e587202015-10-21 12:43:56 +0200177 EXPECT_TRUE(x);
178 EXPECT_TRUE(y);
179 log->push_back("---");
180 }
181 EXPECT_EQ(
182 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
183 "0:17. destructor", "---", "2:17. move constructor (from 1:17)", "---",
184 "2:17. destructor", "1:17. destructor"),
185 *log);
186}
187
Karl Wibergbe579832015-11-10 22:34:18 +0100188TEST(OptionalTest, TestCopyAssignToEmptyFromEmpty) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200189 auto log = Logger::Setup();
190 {
Karl Wibergbe579832015-11-10 22:34:18 +0100191 Optional<Logger> x, y;
Karl Wiberg6e587202015-10-21 12:43:56 +0200192 x = y;
193 }
kwibergd0404802016-05-09 06:06:05 -0700194 EXPECT_EQ(V(), *log);
Karl Wiberg6e587202015-10-21 12:43:56 +0200195}
196
Karl Wibergbe579832015-11-10 22:34:18 +0100197TEST(OptionalTest, TestCopyAssignToFullFromEmpty) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200198 auto log = Logger::Setup();
199 {
Karl Wibergbe579832015-11-10 22:34:18 +0100200 Optional<Logger> x(Logger(17));
201 Optional<Logger> y;
Karl Wiberg6e587202015-10-21 12:43:56 +0200202 log->push_back("---");
203 x = y;
204 log->push_back("---");
205 }
206 EXPECT_EQ(
207 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
kwibergd0404802016-05-09 06:06:05 -0700208 "0:17. destructor", "---", "1:17. destructor", "---"),
Karl Wiberg6e587202015-10-21 12:43:56 +0200209 *log);
210}
211
Karl Wibergbe579832015-11-10 22:34:18 +0100212TEST(OptionalTest, TestCopyAssignToEmptyFromFull) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200213 auto log = Logger::Setup();
214 {
Karl Wibergbe579832015-11-10 22:34:18 +0100215 Optional<Logger> x;
216 Optional<Logger> y(Logger(17));
Karl Wiberg6e587202015-10-21 12:43:56 +0200217 log->push_back("---");
218 x = y;
219 log->push_back("---");
220 }
kwibergd0404802016-05-09 06:06:05 -0700221 EXPECT_EQ(
222 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
223 "0:17. destructor", "---", "2:17. copy constructor (from 1:17)", "---",
224 "1:17. destructor", "2:17. destructor"),
225 *log);
Karl Wiberg6e587202015-10-21 12:43:56 +0200226}
227
Karl Wibergbe579832015-11-10 22:34:18 +0100228TEST(OptionalTest, TestCopyAssignToFullFromFull) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200229 auto log = Logger::Setup();
230 {
Karl Wibergbe579832015-11-10 22:34:18 +0100231 Optional<Logger> x(Logger(17));
232 Optional<Logger> y(Logger(42));
Karl Wiberg6e587202015-10-21 12:43:56 +0200233 log->push_back("---");
234 x = y;
235 log->push_back("---");
236 }
237 EXPECT_EQ(
238 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
239 "0:17. destructor", "2:42. explicit constructor",
240 "3:42. move constructor (from 2:42)", "2:42. destructor", "---",
241 "1:42. operator= copy (from 3:42)", "---", "3:42. destructor",
242 "1:42. destructor"),
243 *log);
244}
245
Karl Wibergbe579832015-11-10 22:34:18 +0100246TEST(OptionalTest, TestCopyAssignToEmptyFromT) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200247 auto log = Logger::Setup();
248 {
Karl Wibergbe579832015-11-10 22:34:18 +0100249 Optional<Logger> x;
Karl Wiberg6e587202015-10-21 12:43:56 +0200250 Logger y(17);
251 log->push_back("---");
Karl Wibergbe579832015-11-10 22:34:18 +0100252 x = Optional<Logger>(y);
Karl Wiberg6e587202015-10-21 12:43:56 +0200253 log->push_back("---");
254 }
kwibergd0404802016-05-09 06:06:05 -0700255 EXPECT_EQ(V("0:17. explicit constructor", "---",
256 "1:17. copy constructor (from 0:17)",
257 "2:17. move constructor (from 1:17)", "1:17. destructor", "---",
258 "0:17. destructor", "2:17. destructor"),
Karl Wiberg6e587202015-10-21 12:43:56 +0200259 *log);
260}
261
Karl Wibergbe579832015-11-10 22:34:18 +0100262TEST(OptionalTest, TestCopyAssignToFullFromT) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200263 auto log = Logger::Setup();
264 {
Karl Wibergbe579832015-11-10 22:34:18 +0100265 Optional<Logger> x(Logger(17));
Karl Wiberg6e587202015-10-21 12:43:56 +0200266 Logger y(42);
267 log->push_back("---");
Karl Wibergbe579832015-11-10 22:34:18 +0100268 x = Optional<Logger>(y);
Karl Wiberg6e587202015-10-21 12:43:56 +0200269 log->push_back("---");
270 }
271 EXPECT_EQ(
272 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
273 "0:17. destructor", "2:42. explicit constructor", "---",
kwiberg102c6a62015-10-30 02:47:38 -0700274 "3:42. copy constructor (from 2:42)",
275 "1:42. operator= move (from 3:42)", "3:42. destructor", "---",
276 "2:42. destructor", "1:42. destructor"),
Karl Wiberg6e587202015-10-21 12:43:56 +0200277 *log);
278}
279
Karl Wibergbe579832015-11-10 22:34:18 +0100280TEST(OptionalTest, TestMoveAssignToEmptyFromEmpty) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200281 auto log = Logger::Setup();
282 {
Karl Wibergbe579832015-11-10 22:34:18 +0100283 Optional<Logger> x, y;
kwibergcea7c2f2016-01-07 05:52:04 -0800284 x = std::move(y);
Karl Wiberg6e587202015-10-21 12:43:56 +0200285 }
kwibergd0404802016-05-09 06:06:05 -0700286 EXPECT_EQ(V(), *log);
Karl Wiberg6e587202015-10-21 12:43:56 +0200287}
288
Karl Wibergbe579832015-11-10 22:34:18 +0100289TEST(OptionalTest, TestMoveAssignToFullFromEmpty) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200290 auto log = Logger::Setup();
291 {
Karl Wibergbe579832015-11-10 22:34:18 +0100292 Optional<Logger> x(Logger(17));
293 Optional<Logger> y;
Karl Wiberg6e587202015-10-21 12:43:56 +0200294 log->push_back("---");
kwibergcea7c2f2016-01-07 05:52:04 -0800295 x = std::move(y);
Karl Wiberg6e587202015-10-21 12:43:56 +0200296 log->push_back("---");
297 }
298 EXPECT_EQ(
299 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
kwibergd0404802016-05-09 06:06:05 -0700300 "0:17. destructor", "---", "1:17. destructor", "---"),
Karl Wiberg6e587202015-10-21 12:43:56 +0200301 *log);
302}
303
Karl Wibergbe579832015-11-10 22:34:18 +0100304TEST(OptionalTest, TestMoveAssignToEmptyFromFull) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200305 auto log = Logger::Setup();
306 {
Karl Wibergbe579832015-11-10 22:34:18 +0100307 Optional<Logger> x;
308 Optional<Logger> y(Logger(17));
Karl Wiberg6e587202015-10-21 12:43:56 +0200309 log->push_back("---");
kwibergcea7c2f2016-01-07 05:52:04 -0800310 x = std::move(y);
Karl Wiberg6e587202015-10-21 12:43:56 +0200311 log->push_back("---");
312 }
kwibergd0404802016-05-09 06:06:05 -0700313 EXPECT_EQ(
314 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
315 "0:17. destructor", "---", "2:17. move constructor (from 1:17)", "---",
316 "1:17. destructor", "2:17. destructor"),
317 *log);
Karl Wiberg6e587202015-10-21 12:43:56 +0200318}
319
Karl Wibergbe579832015-11-10 22:34:18 +0100320TEST(OptionalTest, TestMoveAssignToFullFromFull) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200321 auto log = Logger::Setup();
322 {
Karl Wibergbe579832015-11-10 22:34:18 +0100323 Optional<Logger> x(Logger(17));
324 Optional<Logger> y(Logger(42));
Karl Wiberg6e587202015-10-21 12:43:56 +0200325 log->push_back("---");
kwibergcea7c2f2016-01-07 05:52:04 -0800326 x = std::move(y);
Karl Wiberg6e587202015-10-21 12:43:56 +0200327 log->push_back("---");
328 }
329 EXPECT_EQ(
330 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
331 "0:17. destructor", "2:42. explicit constructor",
332 "3:42. move constructor (from 2:42)", "2:42. destructor", "---",
333 "1:42. operator= move (from 3:42)", "---", "3:42. destructor",
334 "1:42. destructor"),
335 *log);
336}
337
Karl Wibergbe579832015-11-10 22:34:18 +0100338TEST(OptionalTest, TestMoveAssignToEmptyFromT) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200339 auto log = Logger::Setup();
340 {
Karl Wibergbe579832015-11-10 22:34:18 +0100341 Optional<Logger> x;
Karl Wiberg6e587202015-10-21 12:43:56 +0200342 Logger y(17);
343 log->push_back("---");
kwibergcea7c2f2016-01-07 05:52:04 -0800344 x = Optional<Logger>(std::move(y));
Karl Wiberg6e587202015-10-21 12:43:56 +0200345 log->push_back("---");
346 }
kwibergd0404802016-05-09 06:06:05 -0700347 EXPECT_EQ(V("0:17. explicit constructor", "---",
348 "1:17. move constructor (from 0:17)",
349 "2:17. move constructor (from 1:17)", "1:17. destructor", "---",
350 "0:17. destructor", "2:17. destructor"),
Karl Wiberg6e587202015-10-21 12:43:56 +0200351 *log);
352}
353
Karl Wibergbe579832015-11-10 22:34:18 +0100354TEST(OptionalTest, TestMoveAssignToFullFromT) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200355 auto log = Logger::Setup();
356 {
Karl Wibergbe579832015-11-10 22:34:18 +0100357 Optional<Logger> x(Logger(17));
Karl Wiberg6e587202015-10-21 12:43:56 +0200358 Logger y(42);
359 log->push_back("---");
kwibergcea7c2f2016-01-07 05:52:04 -0800360 x = Optional<Logger>(std::move(y));
Karl Wiberg6e587202015-10-21 12:43:56 +0200361 log->push_back("---");
362 }
363 EXPECT_EQ(
364 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
365 "0:17. destructor", "2:42. explicit constructor", "---",
kwiberg102c6a62015-10-30 02:47:38 -0700366 "3:42. move constructor (from 2:42)",
367 "1:42. operator= move (from 3:42)", "3:42. destructor", "---",
368 "2:42. destructor", "1:42. destructor"),
Karl Wiberg6e587202015-10-21 12:43:56 +0200369 *log);
370}
371
danilchapc4fd23c2016-10-17 07:16:54 -0700372TEST(OptionalTest, TestResetEmpty) {
373 auto log = Logger::Setup();
374 {
375 Optional<Logger> x;
376 x.reset();
377 }
378 EXPECT_EQ(V(), *log);
379}
380
381TEST(OptionalTest, TestResetFull) {
382 auto log = Logger::Setup();
383 {
384 Optional<Logger> x(Logger(17));
385 log->push_back("---");
386 x.reset();
387 log->push_back("---");
388 }
389 EXPECT_EQ(
390 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
391 "0:17. destructor", "---", "1:17. destructor", "---"),
392 *log);
393}
394
Karl Wibergbe579832015-11-10 22:34:18 +0100395TEST(OptionalTest, TestDereference) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200396 auto log = Logger::Setup();
397 {
Karl Wibergbe579832015-11-10 22:34:18 +0100398 Optional<Logger> x(Logger(42));
Karl Wiberg6e587202015-10-21 12:43:56 +0200399 const auto& y = x;
400 log->push_back("---");
401 x->Foo();
402 y->Foo();
kwibergcea7c2f2016-01-07 05:52:04 -0800403 std::move(x)->Foo();
404 std::move(y)->Foo();
Karl Wiberg6e587202015-10-21 12:43:56 +0200405 log->push_back("---");
406 (*x).Foo();
407 (*y).Foo();
kwibergcea7c2f2016-01-07 05:52:04 -0800408 (*std::move(x)).Foo();
409 (*std::move(y)).Foo();
Karl Wiberg6e587202015-10-21 12:43:56 +0200410 log->push_back("---");
411 }
412 EXPECT_EQ(V("0:42. explicit constructor",
413 "1:42. move constructor (from 0:42)", "0:42. destructor", "---",
414 "1:42. Foo()", "1:42. Foo() const", "1:42. Foo()",
415 "1:42. Foo() const", "---", "1:42. Foo()", "1:42. Foo() const",
416 "1:42. Foo()", "1:42. Foo() const", "---", "1:42. destructor"),
417 *log);
418}
419
Karl Wibergbe579832015-11-10 22:34:18 +0100420TEST(OptionalTest, TestDereferenceWithDefault) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200421 auto log = Logger::Setup();
422 {
423 const Logger a(17), b(42);
Karl Wibergbe579832015-11-10 22:34:18 +0100424 Optional<Logger> x(a);
425 Optional<Logger> y;
Karl Wiberg6e587202015-10-21 12:43:56 +0200426 log->push_back("-1-");
427 EXPECT_EQ(a, x.value_or(Logger(42)));
428 log->push_back("-2-");
429 EXPECT_EQ(b, y.value_or(Logger(42)));
430 log->push_back("-3-");
Karl Wibergbe579832015-11-10 22:34:18 +0100431 EXPECT_EQ(a, Optional<Logger>(Logger(17)).value_or(b));
Karl Wiberg6e587202015-10-21 12:43:56 +0200432 log->push_back("-4-");
Karl Wibergbe579832015-11-10 22:34:18 +0100433 EXPECT_EQ(b, Optional<Logger>().value_or(b));
Karl Wiberg6e587202015-10-21 12:43:56 +0200434 log->push_back("-5-");
435 }
436 EXPECT_EQ(
437 V("0:17. explicit constructor", "1:42. explicit constructor",
kwibergd0404802016-05-09 06:06:05 -0700438 "2:17. copy constructor (from 0:17)", "-1-",
439 "3:42. explicit constructor", "operator== 0:17, 2:17",
440 "3:42. destructor", "-2-", "4:42. explicit constructor",
441 "operator== 1:42, 4:42", "4:42. destructor", "-3-",
442 "5:17. explicit constructor", "6:17. move constructor (from 5:17)",
443 "operator== 0:17, 6:17", "6:17. destructor", "5:17. destructor", "-4-",
444 "operator== 1:42, 1:42", "-5-", "2:17. destructor", "1:42. destructor",
Karl Wiberg6e587202015-10-21 12:43:56 +0200445 "0:17. destructor"),
446 *log);
447}
448
Karl Wibergbe579832015-11-10 22:34:18 +0100449TEST(OptionalTest, TestEquality) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200450 auto log = Logger::Setup();
451 {
452 Logger a(17), b(42);
Karl Wibergbe579832015-11-10 22:34:18 +0100453 Optional<Logger> ma1(a), ma2(a), mb(b), me1, me2;
Karl Wiberg6e587202015-10-21 12:43:56 +0200454 log->push_back("---");
455 EXPECT_EQ(ma1, ma1);
456 EXPECT_EQ(ma1, ma2);
457 EXPECT_NE(ma1, mb);
458 EXPECT_NE(ma1, me1);
459 EXPECT_EQ(me1, me1);
460 EXPECT_EQ(me1, me2);
461 log->push_back("---");
462 }
kwibergd0404802016-05-09 06:06:05 -0700463 EXPECT_EQ(
464 V("0:17. explicit constructor", "1:42. explicit constructor",
465 "2:17. copy constructor (from 0:17)",
466 "3:17. copy constructor (from 0:17)",
467 "4:42. copy constructor (from 1:42)", "---", "operator== 2:17, 2:17",
468 "operator== 2:17, 3:17", "operator!= 2:17, 4:42", "---",
469 "4:42. destructor", "3:17. destructor", "2:17. destructor",
470 "1:42. destructor", "0:17. destructor"),
471 *log);
Karl Wiberg6e587202015-10-21 12:43:56 +0200472}
473
Karl Wibergbe579832015-11-10 22:34:18 +0100474TEST(OptionalTest, TestSwap) {
Karl Wiberg6e587202015-10-21 12:43:56 +0200475 auto log = Logger::Setup();
476 {
477 Logger a(17), b(42);
Karl Wibergbe579832015-11-10 22:34:18 +0100478 Optional<Logger> x1(a), x2(b), y1(a), y2, z1, z2;
Karl Wiberg6e587202015-10-21 12:43:56 +0200479 log->push_back("---");
480 swap(x1, x2); // Swap full <-> full.
481 swap(y1, y2); // Swap full <-> empty.
482 swap(z1, z2); // Swap empty <-> empty.
483 log->push_back("---");
484 }
485 EXPECT_EQ(V("0:17. explicit constructor", "1:42. explicit constructor",
486 "2:17. copy constructor (from 0:17)",
487 "3:42. copy constructor (from 1:42)",
kwibergd0404802016-05-09 06:06:05 -0700488 "4:17. copy constructor (from 0:17)", "---", "swap 2:42, 3:17",
489 "5:17. move constructor (from 4:17)", "4:17. destructor", "---",
490 "5:17. destructor", "3:17. destructor", "2:42. destructor",
Karl Wiberg6e587202015-10-21 12:43:56 +0200491 "1:42. destructor", "0:17. destructor"),
492 *log);
493}
494
495} // namespace rtc