• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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