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