OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/optional.h" | 5 #include "base/optional.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
10 | 10 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 91 |
92 static_assert(is_trivially_destructible<Optional<int>>::value, | 92 static_assert(is_trivially_destructible<Optional<int>>::value, |
93 "OptionalIsTriviallyDestructible"); | 93 "OptionalIsTriviallyDestructible"); |
94 | 94 |
95 static_assert( | 95 static_assert( |
96 !is_trivially_destructible<Optional<NonTriviallyDestructible>>::value, | 96 !is_trivially_destructible<Optional<NonTriviallyDestructible>>::value, |
97 "OptionalIsTriviallyDestructible"); | 97 "OptionalIsTriviallyDestructible"); |
98 | 98 |
99 TEST(OptionalTest, DefaultConstructor) { | 99 TEST(OptionalTest, DefaultConstructor) { |
100 { | 100 { |
101 Optional<float> o; | 101 constexpr Optional<float> o; |
102 EXPECT_FALSE(o); | 102 EXPECT_FALSE(o); |
103 } | 103 } |
104 | 104 |
105 { | 105 { |
106 Optional<std::string> o; | 106 Optional<std::string> o; |
107 EXPECT_FALSE(o); | 107 EXPECT_FALSE(o); |
108 } | 108 } |
109 | 109 |
110 { | 110 { |
111 Optional<TestObject> o; | 111 Optional<TestObject> o; |
(...skipping 25 matching lines...) Expand all Loading... |
137 Optional<TestObject> other(first); | 137 Optional<TestObject> other(first); |
138 | 138 |
139 EXPECT_TRUE(!!other); | 139 EXPECT_TRUE(!!other); |
140 EXPECT_TRUE(other.value() == TestObject(3, 0.1)); | 140 EXPECT_TRUE(other.value() == TestObject(3, 0.1)); |
141 EXPECT_TRUE(first == other); | 141 EXPECT_TRUE(first == other); |
142 } | 142 } |
143 } | 143 } |
144 | 144 |
145 TEST(OptionalTest, ValueConstructor) { | 145 TEST(OptionalTest, ValueConstructor) { |
146 { | 146 { |
147 Optional<float> o(0.1f); | 147 constexpr float value = 0.1f; |
| 148 constexpr Optional<float> o(value); |
| 149 |
148 EXPECT_TRUE(o); | 150 EXPECT_TRUE(o); |
149 EXPECT_EQ(o.value(), 0.1f); | 151 EXPECT_EQ(value, o.value()); |
150 } | 152 } |
151 | 153 |
152 { | 154 { |
153 Optional<std::string> o("foo"); | 155 std::string value("foo"); |
| 156 Optional<std::string> o(value); |
| 157 |
154 EXPECT_TRUE(o); | 158 EXPECT_TRUE(o); |
155 EXPECT_EQ(o.value(), "foo"); | 159 EXPECT_EQ(value, o.value()); |
156 } | 160 } |
157 | 161 |
158 { | 162 { |
159 Optional<TestObject> o(TestObject(3, 0.1)); | 163 TestObject value(3, 0.1); |
160 EXPECT_TRUE(!!o); | 164 Optional<TestObject> o(value); |
161 EXPECT_TRUE(o.value() == TestObject(3, 0.1)); | 165 |
| 166 EXPECT_TRUE(o); |
| 167 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state()); |
| 168 EXPECT_EQ(value, o.value()); |
162 } | 169 } |
163 } | 170 } |
164 | 171 |
165 TEST(OptionalTest, MoveConstructor) { | 172 TEST(OptionalTest, MoveConstructor) { |
166 { | 173 { |
167 Optional<float> first(0.1f); | 174 Optional<float> first(0.1f); |
168 Optional<float> second(std::move(first)); | 175 Optional<float> second(std::move(first)); |
169 | 176 |
170 EXPECT_TRUE(second); | 177 EXPECT_TRUE(second); |
171 EXPECT_EQ(second.value(), 0.1f); | 178 EXPECT_EQ(second.value(), 0.1f); |
(...skipping 19 matching lines...) Expand all Loading... |
191 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state()); | 198 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state()); |
192 EXPECT_TRUE(TestObject(3, 0.1) == second.value()); | 199 EXPECT_TRUE(TestObject(3, 0.1) == second.value()); |
193 | 200 |
194 EXPECT_TRUE(!!first); | 201 EXPECT_TRUE(!!first); |
195 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state()); | 202 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state()); |
196 } | 203 } |
197 } | 204 } |
198 | 205 |
199 TEST(OptionalTest, MoveValueConstructor) { | 206 TEST(OptionalTest, MoveValueConstructor) { |
200 { | 207 { |
201 Optional<float> first(0.1f); | 208 float value = 0.1f; |
202 Optional<float> second(std::move(first.value())); | 209 Optional<float> o(std::move(value)); |
203 | 210 |
204 EXPECT_TRUE(second); | 211 EXPECT_TRUE(o); |
205 EXPECT_EQ(second.value(), 0.1f); | 212 EXPECT_EQ(0.1f, o.value()); |
206 | |
207 EXPECT_TRUE(first); | |
208 } | 213 } |
209 | 214 |
210 { | 215 { |
211 Optional<std::string> first("foo"); | 216 std::string value("foo"); |
212 Optional<std::string> second(std::move(first.value())); | 217 Optional<std::string> o(std::move(value)); |
213 | 218 |
214 EXPECT_TRUE(second); | 219 EXPECT_TRUE(o); |
215 EXPECT_EQ("foo", second.value()); | 220 EXPECT_EQ("foo", o.value()); |
216 | |
217 EXPECT_TRUE(first); | |
218 } | 221 } |
219 | 222 |
220 { | 223 { |
221 Optional<TestObject> first(TestObject(3, 0.1)); | 224 TestObject value(3, 0.1); |
222 Optional<TestObject> second(std::move(first.value())); | 225 Optional<TestObject> o(std::move(value)); |
223 | 226 |
224 EXPECT_TRUE(!!second); | 227 EXPECT_TRUE(o); |
225 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state()); | 228 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state()); |
226 EXPECT_TRUE(TestObject(3, 0.1) == second.value()); | 229 EXPECT_EQ(TestObject(3, 0.1), o.value()); |
227 | |
228 EXPECT_TRUE(!!first); | |
229 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state()); | |
230 } | 230 } |
231 } | 231 } |
232 | 232 |
233 TEST(OptionalTest, ConstructorForwardArguments) { | 233 TEST(OptionalTest, ConstructorForwardArguments) { |
234 { | 234 { |
235 Optional<float> a(base::in_place, 0.1f); | 235 Optional<float> a(base::in_place, 0.1f); |
236 EXPECT_TRUE(a); | 236 EXPECT_TRUE(a); |
237 EXPECT_EQ(0.1f, a.value()); | 237 EXPECT_EQ(0.1f, a.value()); |
238 } | 238 } |
239 | 239 |
240 { | 240 { |
241 Optional<std::string> a(base::in_place, "foo"); | 241 Optional<std::string> a(base::in_place, "foo"); |
242 EXPECT_TRUE(a); | 242 EXPECT_TRUE(a); |
243 EXPECT_EQ("foo", a.value()); | 243 EXPECT_EQ("foo", a.value()); |
244 } | 244 } |
245 | 245 |
246 { | 246 { |
247 Optional<TestObject> a(base::in_place, 0, 0.1); | 247 Optional<TestObject> a(base::in_place, 0, 0.1); |
248 EXPECT_TRUE(!!a); | 248 EXPECT_TRUE(!!a); |
249 EXPECT_TRUE(TestObject(0, 0.1) == a.value()); | 249 EXPECT_TRUE(TestObject(0, 0.1) == a.value()); |
250 } | 250 } |
251 } | 251 } |
252 | 252 |
253 TEST(OptionalTest, NulloptConstructor) { | 253 TEST(OptionalTest, NulloptConstructor) { |
254 Optional<int> a = base::nullopt; | 254 constexpr Optional<int> a(base::nullopt); |
255 EXPECT_FALSE(a); | 255 EXPECT_FALSE(a); |
256 } | 256 } |
257 | 257 |
258 TEST(OptionalTest, AssignValue) { | 258 TEST(OptionalTest, AssignValue) { |
259 { | 259 { |
260 Optional<float> a; | 260 Optional<float> a; |
261 EXPECT_FALSE(a); | 261 EXPECT_FALSE(a); |
262 a = 0.1f; | 262 a = 0.1f; |
263 EXPECT_TRUE(a); | 263 EXPECT_TRUE(a); |
264 | 264 |
(...skipping 1072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1337 | 1337 |
1338 TEST(OptionalTest, Reset_NoOp) { | 1338 TEST(OptionalTest, Reset_NoOp) { |
1339 Optional<int> a; | 1339 Optional<int> a; |
1340 EXPECT_FALSE(a.has_value()); | 1340 EXPECT_FALSE(a.has_value()); |
1341 | 1341 |
1342 a.reset(); | 1342 a.reset(); |
1343 EXPECT_FALSE(a.has_value()); | 1343 EXPECT_FALSE(a.has_value()); |
1344 } | 1344 } |
1345 | 1345 |
1346 } // namespace base | 1346 } // namespace base |
OLD | NEW |