1 // Copyright 2022 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 // https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14
15 // pw::Result is derived from absl::StatusOr, but has some small differences.
16 // This test covers basic pw::Result functionality and as well as the features
17 // supported by pw::Result that are not supported by absl::StatusOr (constexpr
18 // use in particular).
19 //
20 // The complete, thorough pw::Result tests are in statusor_test.cc, which is
21 // derived from Abseil's tests for absl::StatusOr.
22
23 #include "pw_result/result.h"
24
25 #include <type_traits>
26
27 #include "pw_status/status.h"
28 #include "pw_status/try.h"
29 #include "pw_unit_test/framework.h"
30
31 namespace pw {
32 namespace {
33
TEST(Result,CreateOk)34 TEST(Result, CreateOk) {
35 Result<const char*> res("hello");
36 EXPECT_TRUE(res.ok());
37 EXPECT_EQ(res.status(), OkStatus());
38 EXPECT_EQ(res.value(), "hello");
39 }
40
TEST(Result,CreateOkTypeDeduction)41 TEST(Result, CreateOkTypeDeduction) {
42 auto res = Result("hello");
43 static_assert(std::is_same_v<decltype(res), Result<const char*>>);
44 EXPECT_TRUE(res.ok());
45 EXPECT_EQ(res.status(), OkStatus());
46 EXPECT_STREQ(res.value(), "hello");
47 }
48
TEST(Result,CreateNotOk)49 TEST(Result, CreateNotOk) {
50 Result<int> res(Status::DataLoss());
51 EXPECT_FALSE(res.ok());
52 EXPECT_EQ(res.status(), Status::DataLoss());
53 }
54
TEST(Result,ValueOr)55 TEST(Result, ValueOr) {
56 Result<int> good(3);
57 Result<int> bad(Status::DataLoss());
58 EXPECT_EQ(good.value_or(42), 3);
59 EXPECT_EQ(bad.value_or(42), 42);
60 }
61
TEST(Result,Deref)62 TEST(Result, Deref) {
63 struct Tester {
64 constexpr bool True() { return true; }
65 constexpr bool False() { return false; }
66 };
67
68 auto tester = Result<Tester>(Tester());
69 EXPECT_TRUE(tester.ok());
70 EXPECT_TRUE(tester->True());
71 EXPECT_FALSE(tester->False());
72 EXPECT_TRUE((*tester).True());
73 EXPECT_FALSE((*tester).False());
74 EXPECT_EQ(tester.value().True(), tester->True());
75 EXPECT_EQ(tester.value().False(), tester->False());
76 }
77
TEST(Result,ConstDeref)78 TEST(Result, ConstDeref) {
79 struct Tester {
80 constexpr bool True() const { return true; }
81 constexpr bool False() const { return false; }
82 };
83
84 const auto tester = Result<Tester>(Tester());
85 EXPECT_TRUE(tester.ok());
86 EXPECT_TRUE(tester->True());
87 EXPECT_FALSE(tester->False());
88 EXPECT_TRUE((*tester).True());
89 EXPECT_FALSE((*tester).False());
90 EXPECT_EQ(tester.value().True(), tester->True());
91 EXPECT_EQ(tester.value().False(), tester->False());
92 }
93
TEST(Result,ConstructType)94 TEST(Result, ConstructType) {
95 struct Point {
96 Point(int a, int b) : x(a), y(b) {}
97
98 int x;
99 int y;
100 };
101
102 Result<Point> origin{std::in_place, 0, 0};
103 ASSERT_TRUE(origin.ok());
104 ASSERT_EQ(origin.value().x, 0);
105 ASSERT_EQ(origin.value().y, 0);
106 }
107
Divide(float a,float b)108 Result<float> Divide(float a, float b) {
109 if (b == 0) {
110 return Status::InvalidArgument();
111 }
112 return a / b;
113 }
114
TEST(Divide,ReturnOk)115 TEST(Divide, ReturnOk) {
116 Result<float> res = Divide(10, 5);
117 ASSERT_TRUE(res.ok());
118 EXPECT_EQ(res.value(), 2.0f);
119 }
120
TEST(Divide,ReturnNotOk)121 TEST(Divide, ReturnNotOk) {
122 Result<float> res = Divide(10, 0);
123 EXPECT_FALSE(res.ok());
124 EXPECT_EQ(res.status(), Status::InvalidArgument());
125 }
126
ReturnResult(Result<bool> result)127 Result<bool> ReturnResult(Result<bool> result) { return result; }
128
TryResultAssign(Result<bool> result)129 Status TryResultAssign(Result<bool> result) {
130 PW_TRY_ASSIGN(const bool value, ReturnResult(result));
131
132 // Any status other than OK should have already returned.
133 EXPECT_EQ(result.status(), OkStatus());
134 EXPECT_EQ(value, result.value());
135 return result.status();
136 }
137
TEST(Result,TryAssign)138 TEST(Result, TryAssign) {
139 EXPECT_EQ(TryResultAssign(Status::Cancelled()), Status::Cancelled());
140 EXPECT_EQ(TryResultAssign(Status::DataLoss()), Status::DataLoss());
141 EXPECT_EQ(TryResultAssign(Status::Unimplemented()), Status::Unimplemented());
142 EXPECT_EQ(TryResultAssign(false), OkStatus());
143 EXPECT_EQ(TryResultAssign(true), OkStatus());
144 }
145
146 struct Value {
147 int number;
148 };
149
TEST(Result,ConstexprOk)150 TEST(Result, ConstexprOk) {
151 static constexpr pw::Result<Value> kResult(Value{123});
152
153 static_assert(kResult.status() == pw::OkStatus());
154 static_assert(kResult.ok());
155
156 static_assert((*kResult).number == 123);
157 static_assert((*std::move(kResult)).number == 123);
158
159 static_assert(kResult->number == 123);
160 static_assert(std::move(kResult)->number == 123);
161
162 static_assert(kResult.value().number == 123);
163 static_assert(std::move(kResult).value().number == 123);
164
165 static_assert(kResult.value_or(Value{99}).number == 123);
166 static_assert(std::move(kResult).value_or(Value{99}).number == 123);
167 }
168
TEST(Result,ConstexprNotOk)169 TEST(Result, ConstexprNotOk) {
170 static constexpr pw::Result<Value> kResult(pw::Status::NotFound());
171
172 static_assert(kResult.status() == pw::Status::NotFound());
173 static_assert(!kResult.ok());
174
175 static_assert(kResult.value_or(Value{99}).number == 99);
176 static_assert(std::move(kResult).value_or(Value{99}).number == 99);
177 }
178
TEST(Result,ConstexprNotOkCopy)179 TEST(Result, ConstexprNotOkCopy) {
180 static constexpr pw::Result<Value> kResult(pw::Status::NotFound());
181 constexpr pw::Result<Value> kResultCopy(kResult);
182
183 static_assert(kResultCopy.status() == pw::Status::NotFound());
184 static_assert(!kResultCopy.ok());
185
186 static_assert(kResultCopy.value_or(Value{99}).number == 99);
187 static_assert(std::move(kResultCopy).value_or(Value{99}).number == 99);
188 }
189
__anon492b545f0202(int x) 190 auto multiply = [](int x) -> Result<int> { return x * 2; };
__anon492b545f0302(int x) 191 auto add_two = [](int x) -> Result<int> { return x + 2; };
__anon492b545f0402(int) 192 auto fail_unknown = [](int) -> Result<int> { return Status::Unknown(); };
193
TEST(Result,AndThenNonConstLValueRefInvokeSuccess)194 TEST(Result, AndThenNonConstLValueRefInvokeSuccess) {
195 Result<int> r = 32;
196 auto ret = r.and_then(multiply);
197 ASSERT_TRUE(ret.ok());
198 EXPECT_EQ(*ret, 64);
199 }
200
TEST(Result,AndThenNonConstLValueRefInvokeFail)201 TEST(Result, AndThenNonConstLValueRefInvokeFail) {
202 Result<int> r = 32;
203 auto ret = r.and_then(fail_unknown);
204 ASSERT_FALSE(ret.ok());
205 EXPECT_EQ(ret.status(), Status::Unknown());
206 }
207
TEST(Result,AndThenNonConstLValueRefSkips)208 TEST(Result, AndThenNonConstLValueRefSkips) {
209 Result<int> r = Status::NotFound();
210 auto ret = r.and_then(multiply);
211 ASSERT_FALSE(ret.ok());
212 EXPECT_EQ(ret.status(), Status::NotFound());
213 }
214
TEST(Result,AndThenNonConstRvalueRefInvokeSuccess)215 TEST(Result, AndThenNonConstRvalueRefInvokeSuccess) {
216 Result<int> r = 32;
217 auto ret = std::move(r).and_then(multiply);
218 ASSERT_TRUE(ret.ok());
219 EXPECT_EQ(*ret, 64);
220 }
221
TEST(Result,AndThenNonConstRvalueRefInvokeFails)222 TEST(Result, AndThenNonConstRvalueRefInvokeFails) {
223 Result<int> r = 64;
224 auto ret = std::move(r).and_then(fail_unknown);
225 ASSERT_FALSE(ret.ok());
226 EXPECT_EQ(ret.status(), Status::Unknown());
227 }
228
TEST(Result,AndThenNonConstRvalueRefSkips)229 TEST(Result, AndThenNonConstRvalueRefSkips) {
230 Result<int> r = Status::NotFound();
231 auto ret = std::move(r).and_then(multiply);
232 ASSERT_FALSE(ret.ok());
233 EXPECT_EQ(ret.status(), Status::NotFound());
234 }
235
TEST(Result,AndThenConstLValueRefInvokeSuccess)236 TEST(Result, AndThenConstLValueRefInvokeSuccess) {
237 const Result<int> r = 32;
238 auto ret = r.and_then(multiply);
239 ASSERT_TRUE(ret.ok());
240 EXPECT_EQ(*ret, 64);
241 }
242
TEST(Result,AndThenConstLValueRefInvokeFail)243 TEST(Result, AndThenConstLValueRefInvokeFail) {
244 const Result<int> r = 32;
245 auto ret = r.and_then(fail_unknown);
246 ASSERT_FALSE(ret.ok());
247 EXPECT_EQ(ret.status(), Status::Unknown());
248 }
249
TEST(Result,AndThenConstLValueRefSkips)250 TEST(Result, AndThenConstLValueRefSkips) {
251 const Result<int> r = Status::NotFound();
252 auto ret = r.and_then(multiply);
253 ASSERT_FALSE(ret.ok());
254 EXPECT_EQ(ret.status(), Status::NotFound());
255 }
256
TEST(Result,AndThenConstRValueRefInvokeSuccess)257 TEST(Result, AndThenConstRValueRefInvokeSuccess) {
258 const Result<int> r = 32;
259 auto ret = std::move(r).and_then(multiply);
260 ASSERT_TRUE(ret.ok());
261 EXPECT_EQ(*ret, 64);
262 }
263
TEST(Result,AndThenConstRValueRefInvokeFail)264 TEST(Result, AndThenConstRValueRefInvokeFail) {
265 const Result<int> r = 32;
266 auto ret = std::move(r).and_then(fail_unknown);
267 ASSERT_FALSE(ret.ok());
268 EXPECT_EQ(ret.status(), Status::Unknown());
269 }
270
TEST(Result,AndThenConstRValueRefSkips)271 TEST(Result, AndThenConstRValueRefSkips) {
272 const Result<int> r = Status::NotFound();
273 auto ret = std::move(r).and_then(multiply);
274 ASSERT_FALSE(ret.ok());
275 EXPECT_EQ(ret.status(), Status::NotFound());
276 }
277
TEST(Result,AndThenMultipleChained)278 TEST(Result, AndThenMultipleChained) {
279 Result<int> r = 32;
280 auto ret = r.and_then(multiply).and_then(add_two).and_then(multiply);
281 ASSERT_TRUE(ret.ok());
282 EXPECT_EQ(*ret, 132);
283 }
284
__anon492b545f0502(Status) 285 auto return_status = [](Status) { return Status::Unknown(); };
__anon492b545f0602(Status) 286 auto return_result = [](Status) { return Result<int>(Status::Internal()); };
287
TEST(Result,OrElseNonConstLValueRefSkips)288 TEST(Result, OrElseNonConstLValueRefSkips) {
289 Result<int> r = 32;
290 auto ret = r.or_else(return_status);
291 ASSERT_TRUE(ret.ok());
292 EXPECT_EQ(*ret, 32);
293 }
294
TEST(Result,OrElseNonConstLValueRefStatusInvokes)295 TEST(Result, OrElseNonConstLValueRefStatusInvokes) {
296 Result<int> r = Status::NotFound();
297 auto ret = r.or_else(return_status);
298 ASSERT_FALSE(ret.ok());
299 EXPECT_EQ(ret.status(), Status::Unknown());
300 }
301
TEST(Result,OrElseNonConstLValueRefResultInvokes)302 TEST(Result, OrElseNonConstLValueRefResultInvokes) {
303 Result<int> r = Status::NotFound();
304 auto ret = r.or_else(return_result);
305 ASSERT_FALSE(ret.ok());
306 EXPECT_EQ(ret.status(), Status::Internal());
307 }
308
TEST(Result,OrElseNonConstLValueRefVoidSkips)309 TEST(Result, OrElseNonConstLValueRefVoidSkips) {
310 Result<int> r = 32;
311 bool invoked = false;
312 auto ret = r.or_else([&invoked](Status) { invoked = true; });
313 EXPECT_FALSE(invoked);
314 ASSERT_TRUE(ret.ok());
315 EXPECT_EQ(*ret, 32);
316 }
317
TEST(Result,OrElseNonConstLValueRefVoidInvokes)318 TEST(Result, OrElseNonConstLValueRefVoidInvokes) {
319 Result<int> r = Status::NotFound();
320 bool invoked = false;
321 auto ret = r.or_else([&invoked](Status) { invoked = true; });
322 EXPECT_TRUE(invoked);
323 ASSERT_FALSE(ret.ok());
324 EXPECT_EQ(ret.status(), Status::NotFound());
325 }
326
TEST(Result,OrElseNonConstRValueRefSkips)327 TEST(Result, OrElseNonConstRValueRefSkips) {
328 Result<int> r = 32;
329 auto ret = std::move(r).or_else(return_status);
330 ASSERT_TRUE(ret.ok());
331 EXPECT_EQ(*ret, 32);
332 }
333
TEST(Result,OrElseNonConstRValueRefStatusInvokes)334 TEST(Result, OrElseNonConstRValueRefStatusInvokes) {
335 Result<int> r = Status::NotFound();
336 auto ret = std::move(r).or_else(return_status);
337 ASSERT_FALSE(ret.ok());
338 EXPECT_EQ(ret.status(), Status::Unknown());
339 }
340
TEST(Result,OrElseNonConstRValueRefResultInvokes)341 TEST(Result, OrElseNonConstRValueRefResultInvokes) {
342 Result<int> r = Status::NotFound();
343 auto ret = std::move(r).or_else(return_result);
344 ASSERT_FALSE(ret.ok());
345 EXPECT_EQ(ret.status(), Status::Internal());
346 }
347
TEST(Result,OrElseNonConstRValueRefVoidSkips)348 TEST(Result, OrElseNonConstRValueRefVoidSkips) {
349 Result<int> r = 32;
350 bool invoked = false;
351 auto ret = std::move(r).or_else([&invoked](Status) { invoked = true; });
352 EXPECT_FALSE(invoked);
353 ASSERT_TRUE(ret.ok());
354 EXPECT_EQ(*ret, 32);
355 }
356
TEST(Result,OrElseNonConstRValueRefVoidInvokes)357 TEST(Result, OrElseNonConstRValueRefVoidInvokes) {
358 Result<int> r = Status::NotFound();
359 bool invoked = false;
360 auto ret = std::move(r).or_else([&invoked](Status) { invoked = true; });
361 EXPECT_TRUE(invoked);
362 ASSERT_FALSE(ret.ok());
363 EXPECT_EQ(ret.status(), Status::NotFound());
364 }
365
TEST(Result,OrElseConstLValueRefSkips)366 TEST(Result, OrElseConstLValueRefSkips) {
367 const Result<int> r = 32;
368 auto ret = r.or_else(return_status);
369 ASSERT_TRUE(ret.ok());
370 EXPECT_EQ(*ret, 32);
371 }
372
TEST(Result,OrElseConstLValueRefStatusInvokes)373 TEST(Result, OrElseConstLValueRefStatusInvokes) {
374 const Result<int> r = Status::NotFound();
375 auto ret = r.or_else(return_status);
376 ASSERT_FALSE(ret.ok());
377 EXPECT_EQ(ret.status(), Status::Unknown());
378 }
379
TEST(Result,OrElseConstLValueRefResultInvokes)380 TEST(Result, OrElseConstLValueRefResultInvokes) {
381 const Result<int> r = Status::NotFound();
382 auto ret = r.or_else(return_result);
383 ASSERT_FALSE(ret.ok());
384 EXPECT_EQ(ret.status(), Status::Internal());
385 }
386
TEST(Result,OrElseConstLValueRefVoidSkips)387 TEST(Result, OrElseConstLValueRefVoidSkips) {
388 const Result<int> r = 32;
389 bool invoked = false;
390 auto ret = r.or_else([&invoked](Status) { invoked = true; });
391 EXPECT_FALSE(invoked);
392 ASSERT_TRUE(ret.ok());
393 EXPECT_EQ(*ret, 32);
394 }
395
TEST(Result,OrElseConstLValueRefVoidInvokes)396 TEST(Result, OrElseConstLValueRefVoidInvokes) {
397 const Result<int> r = Status::NotFound();
398 bool invoked = false;
399 auto ret = r.or_else([&invoked](Status) { invoked = true; });
400 EXPECT_TRUE(invoked);
401 ASSERT_FALSE(ret.ok());
402 EXPECT_EQ(ret.status(), Status::NotFound());
403 }
404
TEST(Result,OrElseConstRValueRefSkips)405 TEST(Result, OrElseConstRValueRefSkips) {
406 const Result<int> r = 32;
407 auto ret = std::move(r).or_else(return_status);
408 ASSERT_TRUE(ret.ok());
409 EXPECT_EQ(*ret, 32);
410 }
411
TEST(Result,OrElseConstRValueRefStatusInvokes)412 TEST(Result, OrElseConstRValueRefStatusInvokes) {
413 const Result<int> r = Status::NotFound();
414 auto ret = std::move(r).or_else(return_status);
415 ASSERT_FALSE(ret.ok());
416 EXPECT_EQ(ret.status(), Status::Unknown());
417 }
418
TEST(Result,OrElseConstRValueRefResultInvokes)419 TEST(Result, OrElseConstRValueRefResultInvokes) {
420 const Result<int> r = Status::NotFound();
421 auto ret = std::move(r).or_else(return_result);
422 ASSERT_FALSE(ret.ok());
423 EXPECT_EQ(ret.status(), Status::Internal());
424 }
425
TEST(Result,OrElseConstRValueRefVoidSkips)426 TEST(Result, OrElseConstRValueRefVoidSkips) {
427 const Result<int> r = 32;
428 bool invoked = false;
429 auto ret = std::move(r).or_else([&invoked](Status) { invoked = true; });
430 EXPECT_FALSE(invoked);
431 ASSERT_TRUE(ret.ok());
432 EXPECT_EQ(*ret, 32);
433 }
434
TEST(Result,OrElseConstRValueRefVoidInvokes)435 TEST(Result, OrElseConstRValueRefVoidInvokes) {
436 const Result<int> r = Status::NotFound();
437 bool invoked = false;
438 auto ret = std::move(r).or_else([&invoked](Status) { invoked = true; });
439 EXPECT_TRUE(invoked);
440 ASSERT_FALSE(ret.ok());
441 EXPECT_EQ(ret.status(), Status::NotFound());
442 }
443
TEST(Result,OrElseMultipleChained)444 TEST(Result, OrElseMultipleChained) {
445 Result<int> r = Status::NotFound();
446 bool invoked = false;
447 auto ret =
448 r.or_else(return_result).or_else([&invoked](Status) { invoked = true; });
449 EXPECT_TRUE(invoked);
450 ASSERT_FALSE(ret.ok());
451 EXPECT_EQ(ret.status(), Status::Internal());
452 }
453
__anon492b545f1002(int x) 454 auto multiply_int = [](int x) { return x * 2; };
__anon492b545f1102(int x) 455 auto add_two_int = [](int x) { return x + 2; };
__anon492b545f1202(int x) 456 auto make_value = [](int x) { return Value{.number = x}; };
457
TEST(Result,TransformNonConstLValueRefInvokeSuccess)458 TEST(Result, TransformNonConstLValueRefInvokeSuccess) {
459 Result<int> r = 32;
460 auto ret = r.transform(multiply_int);
461 ASSERT_TRUE(ret.ok());
462 EXPECT_EQ(*ret, 64);
463 }
464
TEST(Result,TransformNonConstLValueRefInvokeDifferentType)465 TEST(Result, TransformNonConstLValueRefInvokeDifferentType) {
466 Result<int> r = 32;
467 auto ret = r.transform(make_value);
468 ASSERT_TRUE(ret.ok());
469 EXPECT_EQ(ret->number, 32);
470 }
471
TEST(Result,TransformNonConstLValueRefSkips)472 TEST(Result, TransformNonConstLValueRefSkips) {
473 Result<int> r = Status::NotFound();
474 auto ret = r.transform(multiply_int);
475 ASSERT_FALSE(ret.ok());
476 EXPECT_EQ(ret.status(), Status::NotFound());
477 }
478
TEST(Result,TransformNonConstRValueRefInvokeSuccess)479 TEST(Result, TransformNonConstRValueRefInvokeSuccess) {
480 Result<int> r = 32;
481 auto ret = std::move(r).transform(multiply_int);
482 ASSERT_TRUE(ret.ok());
483 EXPECT_EQ(*ret, 64);
484 }
485
TEST(Result,TransformNonConstRValueRefInvokeDifferentType)486 TEST(Result, TransformNonConstRValueRefInvokeDifferentType) {
487 Result<int> r = 32;
488 auto ret = std::move(r).transform(make_value);
489 ASSERT_TRUE(ret.ok());
490 EXPECT_EQ(ret->number, 32);
491 }
492
TEST(Result,TransformNonConstRValueRefSkips)493 TEST(Result, TransformNonConstRValueRefSkips) {
494 Result<int> r = Status::NotFound();
495 auto ret = std::move(r).transform(multiply_int);
496 ASSERT_FALSE(ret.ok());
497 EXPECT_EQ(ret.status(), Status::NotFound());
498 }
499
TEST(Result,TransformConstLValueRefInvokeSuccess)500 TEST(Result, TransformConstLValueRefInvokeSuccess) {
501 const Result<int> r = 32;
502 auto ret = r.transform(multiply_int);
503 ASSERT_TRUE(ret.ok());
504 EXPECT_EQ(*ret, 64);
505 }
506
TEST(Result,TransformConstLValueRefInvokeDifferentType)507 TEST(Result, TransformConstLValueRefInvokeDifferentType) {
508 const Result<int> r = 32;
509 auto ret = r.transform(make_value);
510 ASSERT_TRUE(ret.ok());
511 EXPECT_EQ(ret->number, 32);
512 }
513
TEST(Result,TransformConstLValueRefSkips)514 TEST(Result, TransformConstLValueRefSkips) {
515 const Result<int> r = Status::NotFound();
516 auto ret = r.transform(multiply_int);
517 ASSERT_FALSE(ret.ok());
518 EXPECT_EQ(ret.status(), Status::NotFound());
519 }
520
TEST(Result,TransformConstRValueRefInvokeSuccess)521 TEST(Result, TransformConstRValueRefInvokeSuccess) {
522 const Result<int> r = 32;
523 auto ret = std::move(r).transform(multiply_int);
524 ASSERT_TRUE(ret.ok());
525 EXPECT_EQ(*ret, 64);
526 }
527
TEST(Result,TransformConstRValueRefInvokeDifferentType)528 TEST(Result, TransformConstRValueRefInvokeDifferentType) {
529 const Result<int> r = 32;
530 auto ret = std::move(r).transform(make_value);
531 ASSERT_TRUE(ret.ok());
532 EXPECT_EQ(ret->number, 32);
533 }
534
TEST(Result,TransformConstRValueRefSkips)535 TEST(Result, TransformConstRValueRefSkips) {
536 const Result<int> r = Status::NotFound();
537 auto ret = std::move(r).transform(multiply_int);
538 ASSERT_FALSE(ret.ok());
539 EXPECT_EQ(ret.status(), Status::NotFound());
540 }
541
TEST(Result,TransformMultipleChained)542 TEST(Result, TransformMultipleChained) {
543 Result<int> r = 32;
544 auto ret = r.transform(multiply_int)
545 .transform(add_two_int)
546 .transform(multiply_int)
547 .transform(make_value);
548 ASSERT_TRUE(ret.ok());
549 EXPECT_EQ(ret->number, 132);
550 }
551
552 } // namespace
553 } // namespace pw
554