OLD | NEW |
---|---|
1 /* | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
ossu
2016/06/17 14:51:48
Same with this copyright message.
| |
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 |