| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <sstream> | 11 #include <sstream> |
| 12 #include <string> | 12 #include <string> |
| 13 #include <utility> | 13 #include <utility> |
| 14 #include <vector> | 14 #include <vector> |
| 15 #include <sstream> |
| 15 | 16 |
| 16 #include "webrtc/base/gunit.h" | 17 #include "webrtc/base/gunit.h" |
| 17 #include "webrtc/base/optional.h" | 18 #include "webrtc/base/optional.h" |
| 19 #include "webrtc/base/optional_ios.h" |
| 18 | 20 |
| 19 namespace rtc { | 21 namespace rtc { |
| 20 | 22 |
| 21 namespace { | 23 namespace { |
| 22 | 24 |
| 23 // Class whose instances logs various method calls (constructor, destructor, | 25 // Class whose instances logs various method calls (constructor, destructor, |
| 24 // etc.). Each instance has a unique ID (a simple global sequence number) and | 26 // etc.). Each instance has a unique ID (a simple global sequence number) and |
| 25 // an origin ID. When a copy is made, the new object gets a fresh ID but copies | 27 // an origin ID. When a copy is made, the new object gets a fresh ID but copies |
| 26 // the origin ID from the original. When a new Logger is created from scratch, | 28 // the origin ID from the original. When a new Logger is created from scratch, |
| 27 // it gets a fresh ID, and the origin ID is the same as the ID (default | 29 // it gets a fresh ID, and the origin ID is the same as the ID (default |
| (...skipping 27 matching lines...) Expand all Loading... |
| 55 Log2("swap", a, b); | 57 Log2("swap", a, b); |
| 56 } | 58 } |
| 57 friend bool operator==(const Logger& a, const Logger& b) { | 59 friend bool operator==(const Logger& a, const Logger& b) { |
| 58 Log2("operator==", a, b); | 60 Log2("operator==", a, b); |
| 59 return a.origin_ == b.origin_; | 61 return a.origin_ == b.origin_; |
| 60 } | 62 } |
| 61 friend bool operator!=(const Logger& a, const Logger& b) { | 63 friend bool operator!=(const Logger& a, const Logger& b) { |
| 62 Log2("operator!=", a, b); | 64 Log2("operator!=", a, b); |
| 63 return a.origin_ != b.origin_; | 65 return a.origin_ != b.origin_; |
| 64 } | 66 } |
| 67 friend std::ostream& operator<<(std::ostream& stream, const Logger& l); |
| 65 void Foo() { Log("Foo()"); } | 68 void Foo() { Log("Foo()"); } |
| 66 void Foo() const { Log("Foo() const"); } | 69 void Foo() const { Log("Foo() const"); } |
| 67 static rtc::scoped_ptr<std::vector<std::string>> Setup() { | 70 static rtc::scoped_ptr<std::vector<std::string>> Setup() { |
| 68 auto s = rtc_make_scoped_ptr(new std::vector<std::string>); | 71 auto s = rtc_make_scoped_ptr(new std::vector<std::string>); |
| 69 g_log = s.get(); | 72 g_log = s.get(); |
| 70 g_next_id = 0; | 73 g_next_id = 0; |
| 71 return s; | 74 return s; |
| 72 } | 75 } |
| 73 | 76 |
| 74 private: | 77 private: |
| (...skipping 16 matching lines...) Expand all Loading... |
| 91 std::ostringstream oss; | 94 std::ostringstream oss; |
| 92 oss << msg << ' ' << a.id_ << ':' << a.origin_ << ", " << b.id_ << ':' | 95 oss << msg << ' ' << a.id_ << ':' << a.origin_ << ", " << b.id_ << ':' |
| 93 << b.origin_; | 96 << b.origin_; |
| 94 g_log->push_back(oss.str()); | 97 g_log->push_back(oss.str()); |
| 95 } | 98 } |
| 96 }; | 99 }; |
| 97 | 100 |
| 98 std::vector<std::string>* Logger::g_log = nullptr; | 101 std::vector<std::string>* Logger::g_log = nullptr; |
| 99 int Logger::g_next_id = 0; | 102 int Logger::g_next_id = 0; |
| 100 | 103 |
| 104 // Operator<< for Logger. EXPECT_EQ internally uses operator<< to format the |
| 105 // error message, which uses operator<< for Optional<T> which in turn depends |
| 106 // on operator<< for T. |
| 107 std::ostream& operator<<(std::ostream& stream, const Logger& logger) { |
| 108 for (auto it = Logger::g_log->begin(); it != Logger::g_log->end(); ++it) { |
| 109 if (it != Logger::g_log->begin()) { |
| 110 stream << "; "; |
| 111 } |
| 112 stream << *it; |
| 113 } |
| 114 return stream; |
| 115 } |
| 116 |
| 101 // Append all the other args to the vector pointed to by the first arg. | 117 // Append all the other args to the vector pointed to by the first arg. |
| 102 template <typename T> | 118 template <typename T> |
| 103 void VectorAppend(std::vector<T>* v) {} | 119 void VectorAppend(std::vector<T>* v) {} |
| 104 template <typename T, typename... Ts> | 120 template <typename T, typename... Ts> |
| 105 void VectorAppend(std::vector<T>* v, const T& e, Ts... es) { | 121 void VectorAppend(std::vector<T>* v, const T& e, Ts... es) { |
| 106 v->push_back(e); | 122 v->push_back(e); |
| 107 VectorAppend(v, es...); | 123 VectorAppend(v, es...); |
| 108 } | 124 } |
| 109 | 125 |
| 110 // Create a vector of strings. Because we're not allowed to use | 126 // Create a vector of strings. Because we're not allowed to use |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 "3:42. copy constructor (from 1:42)", | 495 "3:42. copy constructor (from 1:42)", |
| 480 "4:17. copy constructor (from 0:17)", "5:5. default constructor", | 496 "4:17. copy constructor (from 0:17)", "5:5. default constructor", |
| 481 "6:6. default constructor", "7:7. default constructor", "---", | 497 "6:6. default constructor", "7:7. default constructor", "---", |
| 482 "swap 2:42, 3:17", "swap 4:5, 5:17", "swap 6:7, 7:6", "---", | 498 "swap 2:42, 3:17", "swap 4:5, 5:17", "swap 6:7, 7:6", "---", |
| 483 "7:6. destructor", "6:7. destructor", "5:17. destructor", | 499 "7:6. destructor", "6:7. destructor", "5:17. destructor", |
| 484 "4:5. destructor", "3:17. destructor", "2:42. destructor", | 500 "4:5. destructor", "3:17. destructor", "2:42. destructor", |
| 485 "1:42. destructor", "0:17. destructor"), | 501 "1:42. destructor", "0:17. destructor"), |
| 486 *log); | 502 *log); |
| 487 } | 503 } |
| 488 | 504 |
| 505 template <typename T> |
| 506 void ExpectWriteResult(const std::string& expected, rtc::Optional<T> value) { |
| 507 std::ostringstream stream; |
| 508 stream << value; |
| 509 EXPECT_EQ(expected, stream.str()); |
| 510 } |
| 511 |
| 512 TEST(OptionalTest, TestWriteToOstream) { |
| 513 ExpectWriteResult("1", rtc::Optional<int>(1)); |
| 514 ExpectWriteResult("<not set>", rtc::Optional<int>()); |
| 515 ExpectWriteResult("", rtc::Optional<std::string>(std::string())); |
| 516 ExpectWriteResult("<not set>", rtc::Optional<std::string>()); |
| 517 } |
| 518 |
| 489 } // namespace rtc | 519 } // namespace rtc |
| OLD | NEW |