xref: /aosp_15_r20/external/federated-compute/fcp/base/result_test.cc (revision 14675a029014e728ec732f129a32e299b2da0601)
1*14675a02SAndroid Build Coastguard Worker /*
2*14675a02SAndroid Build Coastguard Worker  * Copyright 2019 Google LLC
3*14675a02SAndroid Build Coastguard Worker  *
4*14675a02SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*14675a02SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*14675a02SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*14675a02SAndroid Build Coastguard Worker  *
8*14675a02SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*14675a02SAndroid Build Coastguard Worker  *
10*14675a02SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*14675a02SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*14675a02SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*14675a02SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*14675a02SAndroid Build Coastguard Worker  * limitations under the License.
15*14675a02SAndroid Build Coastguard Worker  */
16*14675a02SAndroid Build Coastguard Worker 
17*14675a02SAndroid Build Coastguard Worker #include "fcp/base/result.h"
18*14675a02SAndroid Build Coastguard Worker 
19*14675a02SAndroid Build Coastguard Worker #include <memory>
20*14675a02SAndroid Build Coastguard Worker #include <utility>
21*14675a02SAndroid Build Coastguard Worker #include <variant>
22*14675a02SAndroid Build Coastguard Worker 
23*14675a02SAndroid Build Coastguard Worker #include "gmock/gmock.h"
24*14675a02SAndroid Build Coastguard Worker #include "gtest/gtest.h"
25*14675a02SAndroid Build Coastguard Worker #include "fcp/base/tracing_schema.h"
26*14675a02SAndroid Build Coastguard Worker #include "fcp/base/unique_value.h"
27*14675a02SAndroid Build Coastguard Worker #include "fcp/testing/result_matchers.h"
28*14675a02SAndroid Build Coastguard Worker #include "fcp/testing/testing.h"
29*14675a02SAndroid Build Coastguard Worker #include "fcp/tracing/test_tracing_recorder.h"
30*14675a02SAndroid Build Coastguard Worker 
31*14675a02SAndroid Build Coastguard Worker namespace fcp {
32*14675a02SAndroid Build Coastguard Worker 
33*14675a02SAndroid Build Coastguard Worker using ::testing::Eq;
34*14675a02SAndroid Build Coastguard Worker using ::testing::VariantWith;
35*14675a02SAndroid Build Coastguard Worker 
36*14675a02SAndroid Build Coastguard Worker template <typename T>
HasValue(Result<T> r,T v)37*14675a02SAndroid Build Coastguard Worker constexpr bool HasValue(Result<T> r, T v) {
38*14675a02SAndroid Build Coastguard Worker   return !r.is_error() && r.GetValueOrDie() == v;
39*14675a02SAndroid Build Coastguard Worker }
40*14675a02SAndroid Build Coastguard Worker 
41*14675a02SAndroid Build Coastguard Worker template <typename T>
IsError(Result<T> r)42*14675a02SAndroid Build Coastguard Worker constexpr bool IsError(Result<T> r) {
43*14675a02SAndroid Build Coastguard Worker   return r.is_error();
44*14675a02SAndroid Build Coastguard Worker }
45*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,Constructor)46*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, Constructor) {
47*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(Result<int>(TraceTestError()), IsError());
48*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(Result(123), HasValue(123));
49*14675a02SAndroid Build Coastguard Worker }
50*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,CombinatorsToValue)51*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, CombinatorsToValue) {
52*14675a02SAndroid Build Coastguard Worker   Result<bool> r = Result(123)
53*14675a02SAndroid Build Coastguard Worker                        .Then([](int i) -> Result<bool> { return i != 123; })
54*14675a02SAndroid Build Coastguard Worker                        .Map([](bool b) -> bool { return !b; });
55*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(r, HasValue(true));
56*14675a02SAndroid Build Coastguard Worker }
57*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,CombinatorsToValue_MoveOnly)58*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, CombinatorsToValue_MoveOnly) {
59*14675a02SAndroid Build Coastguard Worker   Result<bool> r =
60*14675a02SAndroid Build Coastguard Worker       Result(UniqueValue(123))
61*14675a02SAndroid Build Coastguard Worker           .Then([](UniqueValue<int> i) -> Result<UniqueValue<bool>> {
62*14675a02SAndroid Build Coastguard Worker             return UniqueValue(std::move(i).Take() != 123);
63*14675a02SAndroid Build Coastguard Worker           })
64*14675a02SAndroid Build Coastguard Worker           .Map([](UniqueValue<bool> b) -> UniqueValue<bool> {
65*14675a02SAndroid Build Coastguard Worker             return UniqueValue(!std::move(b).Take());
66*14675a02SAndroid Build Coastguard Worker           })
67*14675a02SAndroid Build Coastguard Worker           .Map([](UniqueValue<bool> b) -> bool { return std::move(b).Take(); });
68*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(r, HasValue(true));
69*14675a02SAndroid Build Coastguard Worker }
70*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,MapToValue_MoveOnly_Const)71*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, MapToValue_MoveOnly_Const) {
72*14675a02SAndroid Build Coastguard Worker   Result<UniqueValue<int>> r1 = Result(UniqueValue(21));
73*14675a02SAndroid Build Coastguard Worker   Result<int> r2 = r1.Map([](UniqueValue<int> const& v) { return (*v) * 2; });
74*14675a02SAndroid Build Coastguard Worker   Result<bool> r1_still_valid =
75*14675a02SAndroid Build Coastguard Worker       r1.Map([](UniqueValue<int> const& v) { return v.has_value(); });
76*14675a02SAndroid Build Coastguard Worker 
77*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(r2, HasValue(42));
78*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(r1_still_valid, HasValue(true));
79*14675a02SAndroid Build Coastguard Worker }
80*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ThenToValue_MoveOnly_Const)81*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ThenToValue_MoveOnly_Const) {
82*14675a02SAndroid Build Coastguard Worker   Result<UniqueValue<int>> r1 = Result(UniqueValue(21));
83*14675a02SAndroid Build Coastguard Worker   Result<int> r2 =
84*14675a02SAndroid Build Coastguard Worker       r1.Then([](UniqueValue<int> const& v) { return Result((*v) * 2); });
85*14675a02SAndroid Build Coastguard Worker   Result<bool> r1_still_valid =
86*14675a02SAndroid Build Coastguard Worker       r1.Then([](UniqueValue<int> const& v) { return Result(v.has_value()); });
87*14675a02SAndroid Build Coastguard Worker 
88*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(r2, HasValue(42));
89*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(r1_still_valid, HasValue(true));
90*14675a02SAndroid Build Coastguard Worker }
91*14675a02SAndroid Build Coastguard Worker 
ExpectUnreachable()92*14675a02SAndroid Build Coastguard Worker void ExpectUnreachable() { FAIL(); }
93*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,CombinatorsToError)94*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, CombinatorsToError) {
95*14675a02SAndroid Build Coastguard Worker   Result<Unit> r = Result(123)
96*14675a02SAndroid Build Coastguard Worker                        .Then([](int i) -> Result<int> {
97*14675a02SAndroid Build Coastguard Worker                          if (i > 0) {
98*14675a02SAndroid Build Coastguard Worker                            return TraceTestError();
99*14675a02SAndroid Build Coastguard Worker                          } else {
100*14675a02SAndroid Build Coastguard Worker                            return i;
101*14675a02SAndroid Build Coastguard Worker                          }
102*14675a02SAndroid Build Coastguard Worker                        })
103*14675a02SAndroid Build Coastguard Worker                        .Map([](int i) -> Unit {
104*14675a02SAndroid Build Coastguard Worker                          ExpectUnreachable();
105*14675a02SAndroid Build Coastguard Worker                          return Unit{};
106*14675a02SAndroid Build Coastguard Worker                        });
107*14675a02SAndroid Build Coastguard Worker   ASSERT_THAT(r, IsError());
108*14675a02SAndroid Build Coastguard Worker }
109*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ResultFrom)110*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ResultFrom) {
111*14675a02SAndroid Build Coastguard Worker   static_assert(std::is_same_v<ResultFrom<Result<int>>, Result<int>>);
112*14675a02SAndroid Build Coastguard Worker   static_assert(std::is_same_v<ResultFrom<int>, Result<int>>);
113*14675a02SAndroid Build Coastguard Worker }
114*14675a02SAndroid Build Coastguard Worker 
115*14675a02SAndroid Build Coastguard Worker template <typename Expect, typename Fn, typename... Args>
ExpectResultOf(Fn fn,Args...args)116*14675a02SAndroid Build Coastguard Worker constexpr Unit ExpectResultOf(Fn fn, Args... args) {
117*14675a02SAndroid Build Coastguard Worker   using R = ResultOf<Fn, Args...>;
118*14675a02SAndroid Build Coastguard Worker   static_assert(std::is_same_v<R, Expect>);
119*14675a02SAndroid Build Coastguard Worker   return {};
120*14675a02SAndroid Build Coastguard Worker }
121*14675a02SAndroid Build Coastguard Worker 
122*14675a02SAndroid Build Coastguard Worker namespace result_of_example {
123*14675a02SAndroid Build Coastguard Worker 
Result0()124*14675a02SAndroid Build Coastguard Worker Result<Unit> Result0() { return Unit{}; }
Result1(int)125*14675a02SAndroid Build Coastguard Worker Result<Unit> Result1(int) { return Unit{}; }
Value1(int i)126*14675a02SAndroid Build Coastguard Worker Unit Value1(int i) { return Unit{}; }
__anond40ed5680c02(auto t) 127*14675a02SAndroid Build Coastguard Worker constexpr auto Generic = [](auto t) { return Result(t); };
128*14675a02SAndroid Build Coastguard Worker 
129*14675a02SAndroid Build Coastguard Worker }  // namespace result_of_example
130*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ResultOf)131*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ResultOf) {
132*14675a02SAndroid Build Coastguard Worker   static_assert(
133*14675a02SAndroid Build Coastguard Worker       ExpectResultOf<Result<Unit>>(result_of_example::Result0).True());
134*14675a02SAndroid Build Coastguard Worker   static_assert(
135*14675a02SAndroid Build Coastguard Worker       ExpectResultOf<Result<Unit>>(result_of_example::Result1, 123).True());
136*14675a02SAndroid Build Coastguard Worker   static_assert(
137*14675a02SAndroid Build Coastguard Worker       ExpectResultOf<Result<Unit>>(result_of_example::Value1, 123).True());
138*14675a02SAndroid Build Coastguard Worker   static_assert(
139*14675a02SAndroid Build Coastguard Worker       ExpectResultOf<Result<bool>>(result_of_example::Generic, true).True());
140*14675a02SAndroid Build Coastguard Worker }
141*14675a02SAndroid Build Coastguard Worker 
Example_OneTryExpression(Result<int> r)142*14675a02SAndroid Build Coastguard Worker Result<bool> Example_OneTryExpression(Result<int> r) {
143*14675a02SAndroid Build Coastguard Worker   int i = FCP_TRY(r);
144*14675a02SAndroid Build Coastguard Worker   if (i < 0) {
145*14675a02SAndroid Build Coastguard Worker     return TraceTestError();
146*14675a02SAndroid Build Coastguard Worker   }
147*14675a02SAndroid Build Coastguard Worker 
148*14675a02SAndroid Build Coastguard Worker   return i % 2 == 0;
149*14675a02SAndroid Build Coastguard Worker }
150*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TryExpressionWithError)151*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TryExpressionWithError) {
152*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression(TraceTestError()), IsError());
153*14675a02SAndroid Build Coastguard Worker }
154*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TryExpressionWithValue)155*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TryExpressionWithValue) {
156*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression(-1), IsError());
157*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression(1), HasValue(false));
158*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression(2), HasValue(true));
159*14675a02SAndroid Build Coastguard Worker }
160*14675a02SAndroid Build Coastguard Worker 
Example_OneTryExpression_UnparenthesizedCommas(Result<std::variant<int,bool,Unit>> r)161*14675a02SAndroid Build Coastguard Worker Result<bool> Example_OneTryExpression_UnparenthesizedCommas(
162*14675a02SAndroid Build Coastguard Worker     Result<std::variant<int, bool, Unit>> r) {
163*14675a02SAndroid Build Coastguard Worker   std::variant<int, bool> v = FCP_TRY(r.Then(ExpectOneOf<int, bool>()));
164*14675a02SAndroid Build Coastguard Worker   if (std::holds_alternative<int>(v)) {
165*14675a02SAndroid Build Coastguard Worker     return absl::get<int>(v) > 0;
166*14675a02SAndroid Build Coastguard Worker   } else {
167*14675a02SAndroid Build Coastguard Worker     return absl::get<bool>(v);
168*14675a02SAndroid Build Coastguard Worker   }
169*14675a02SAndroid Build Coastguard Worker }
170*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TryExpressionWithValue_UnparenthesizedCommas)171*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TryExpressionWithValue_UnparenthesizedCommas) {
172*14675a02SAndroid Build Coastguard Worker   using V = std::variant<int, bool, Unit>;
173*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression_UnparenthesizedCommas(V(-1)),
174*14675a02SAndroid Build Coastguard Worker               HasValue(false));
175*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression_UnparenthesizedCommas(V(1)),
176*14675a02SAndroid Build Coastguard Worker               HasValue(true));
177*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression_UnparenthesizedCommas(V(false)),
178*14675a02SAndroid Build Coastguard Worker               HasValue(false));
179*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression_UnparenthesizedCommas(V(true)),
180*14675a02SAndroid Build Coastguard Worker               HasValue(true));
181*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_OneTryExpression_UnparenthesizedCommas(V(Unit{})),
182*14675a02SAndroid Build Coastguard Worker               IsError());
183*14675a02SAndroid Build Coastguard Worker }
184*14675a02SAndroid Build Coastguard Worker 
Example_SumWithTryExpressions(Result<int> a,Result<int> b)185*14675a02SAndroid Build Coastguard Worker Result<int> Example_SumWithTryExpressions(Result<int> a, Result<int> b) {
186*14675a02SAndroid Build Coastguard Worker   return FCP_TRY(a) + FCP_TRY(b);
187*14675a02SAndroid Build Coastguard Worker }
188*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TwoTryExpressionsWithError)189*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TwoTryExpressionsWithError) {
190*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_SumWithTryExpressions(TraceTestError(), 1), IsError());
191*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_SumWithTryExpressions(41, TraceTestError()), IsError());
192*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_SumWithTryExpressions(TraceTestError(), TraceTestError()),
193*14675a02SAndroid Build Coastguard Worker               IsError());
194*14675a02SAndroid Build Coastguard Worker }
195*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TwoTryExpressionsWithValues)196*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TwoTryExpressionsWithValues) {
197*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_SumWithTryExpressions(1, 41), HasValue(42));
198*14675a02SAndroid Build Coastguard Worker }
199*14675a02SAndroid Build Coastguard Worker 
Example_TryExpression_MoveOnly(Result<std::unique_ptr<int>> r)200*14675a02SAndroid Build Coastguard Worker Result<int> Example_TryExpression_MoveOnly(Result<std::unique_ptr<int>> r) {
201*14675a02SAndroid Build Coastguard Worker   std::unique_ptr<int> p = FCP_TRY(std::move(r));
202*14675a02SAndroid Build Coastguard Worker   return *p;
203*14675a02SAndroid Build Coastguard Worker }
204*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TryExpressionWithError_MoveOnly)205*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TryExpressionWithError_MoveOnly) {
206*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_TryExpression_MoveOnly(TraceTestError()), IsError());
207*14675a02SAndroid Build Coastguard Worker }
208*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TryExpressionWithValue_MoveOnly)209*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TryExpressionWithValue_MoveOnly) {
210*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_TryExpression_MoveOnly(std::make_unique<int>(123)),
211*14675a02SAndroid Build Coastguard Worker               HasValue(123));
212*14675a02SAndroid Build Coastguard Worker }
213*14675a02SAndroid Build Coastguard Worker 
Example_TryStatement(Result<Unit> r)214*14675a02SAndroid Build Coastguard Worker Result<bool> Example_TryStatement(Result<Unit> r) {
215*14675a02SAndroid Build Coastguard Worker   FCP_TRY(r);
216*14675a02SAndroid Build Coastguard Worker   return true;
217*14675a02SAndroid Build Coastguard Worker }
218*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TryStatementWithError)219*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TryStatementWithError) {
220*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_TryStatement(TraceTestError()), IsError());
221*14675a02SAndroid Build Coastguard Worker }
222*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TryStatementWithValue)223*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TryStatementWithValue) {
224*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Example_TryStatement(Unit{}), HasValue(true));
225*14675a02SAndroid Build Coastguard Worker }
226*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectTrue)227*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectTrue) {
228*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result(true).Then(ExpectTrue()), HasValue(Unit{}));
229*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result(false).Then(ExpectTrue()), IsError());
230*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<bool>(TraceTestError()).Then(ExpectTrue()), IsError());
231*14675a02SAndroid Build Coastguard Worker }
232*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectFalse)233*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectFalse) {
234*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result(false).Then(ExpectFalse()), HasValue(Unit{}));
235*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result(true).Then(ExpectFalse()), IsError());
236*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<bool>(TraceTestError()).Then(ExpectFalse()), IsError());
237*14675a02SAndroid Build Coastguard Worker }
238*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectHasValue)239*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectHasValue) {
240*14675a02SAndroid Build Coastguard Worker   using V = std::optional<int>;
241*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(123).Then(ExpectHasValue()), HasValue(123));
242*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(V{}).Then(ExpectHasValue()), IsError());
243*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(TraceTestError()).Then(ExpectHasValue()), IsError());
244*14675a02SAndroid Build Coastguard Worker }
245*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectIsEmpty)246*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectIsEmpty) {
247*14675a02SAndroid Build Coastguard Worker   using V = std::optional<int>;
248*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(123).Then(ExpectIsEmpty()), IsError());
249*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(V{}).Then(ExpectIsEmpty()), HasValue(Unit{}));
250*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(TraceTestError()).Then(ExpectIsEmpty()), IsError());
251*14675a02SAndroid Build Coastguard Worker }
252*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectIs)253*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectIs) {
254*14675a02SAndroid Build Coastguard Worker   using V = std::variant<int, char>;
255*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(123).Then(ExpectIs<int>()), HasValue(123));
256*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>('a').Then(ExpectIs<char>()), HasValue('a'));
257*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>('b').Then(ExpectIs<int>()), IsError());
258*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(TraceTestError()).Then(ExpectIs<int>()), IsError());
259*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(TraceTestError()).Then(ExpectIs<char>()), IsError());
260*14675a02SAndroid Build Coastguard Worker }
261*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectOneOf)262*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectOneOf) {
263*14675a02SAndroid Build Coastguard Worker   using V = std::variant<int, char, bool>;
264*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(123).Then(ExpectOneOf<int>()),
265*14675a02SAndroid Build Coastguard Worker               HasValue(VariantWith<int>(123)));
266*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<V>(123).Then(ExpectOneOf<bool>()), IsError());
267*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT((Result<V>(123).Then(ExpectOneOf<int, bool>())),
268*14675a02SAndroid Build Coastguard Worker               HasValue(VariantWith<int>(123)));
269*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT((Result<V>(123).Then(ExpectOneOf<char, bool>())), IsError());
270*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT((Result<V>(TraceTestError()).Then(ExpectOneOf<int, bool>())),
271*14675a02SAndroid Build Coastguard Worker               IsError());
272*14675a02SAndroid Build Coastguard Worker }
273*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectOk)274*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectOk) {
275*14675a02SAndroid Build Coastguard Worker   TestTracingRecorder recorder;
276*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<Status>(FCP_STATUS(OK)).Then(ExpectOk()),
277*14675a02SAndroid Build Coastguard Worker               HasValue(Unit{}));
278*14675a02SAndroid Build Coastguard Worker }
279*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectOkReturnsError)280*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectOkReturnsError) {
281*14675a02SAndroid Build Coastguard Worker   TestTracingRecorder recorder;
282*14675a02SAndroid Build Coastguard Worker   recorder.ExpectError<ResultExpectStatusError>();
283*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<Status>(FCP_STATUS(INVALID_ARGUMENT)).Then(ExpectOk()),
284*14675a02SAndroid Build Coastguard Worker               IsError());
285*14675a02SAndroid Build Coastguard Worker }
286*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectOkStatusOr)287*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectOkStatusOr) {
288*14675a02SAndroid Build Coastguard Worker   TestTracingRecorder recorder;
289*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(Result<StatusOr<Unit>>(StatusOr<Unit>(Unit{})).Then(ExpectOk()),
290*14675a02SAndroid Build Coastguard Worker               HasValue(Unit{}));
291*14675a02SAndroid Build Coastguard Worker }
292*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,ExpectOkStatusOrReturnsError)293*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, ExpectOkStatusOrReturnsError) {
294*14675a02SAndroid Build Coastguard Worker   TestTracingRecorder recorder;
295*14675a02SAndroid Build Coastguard Worker   recorder.ExpectError<ResultExpectStatusError>();
296*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(
297*14675a02SAndroid Build Coastguard Worker       Result<StatusOr<Unit>>(FCP_STATUS(INVALID_ARGUMENT)).Then(ExpectOk()),
298*14675a02SAndroid Build Coastguard Worker       IsError());
299*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(
300*14675a02SAndroid Build Coastguard Worker       recorder.FindAllEvents<ResultExpectStatusError>(),
301*14675a02SAndroid Build Coastguard Worker       ElementsAre(IsEvent<ResultExpectStatusError>(
302*14675a02SAndroid Build Coastguard Worker           Eq(TracingStatusCode_Ok), Eq(TracingStatusCode_InvalidArgument))));
303*14675a02SAndroid Build Coastguard Worker }
304*14675a02SAndroid Build Coastguard Worker 
TEST(ResultTest,TraceFailedPrecondition)305*14675a02SAndroid Build Coastguard Worker TEST(ResultTest, TraceFailedPrecondition) {
306*14675a02SAndroid Build Coastguard Worker   TestTracingRecorder recorder;
307*14675a02SAndroid Build Coastguard Worker   recorder.ExpectError<ResultExpectStatusError>();
308*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(
309*14675a02SAndroid Build Coastguard Worker       Result<StatusOr<Unit>>(FCP_STATUS(FAILED_PRECONDITION)).Then(ExpectOk()),
310*14675a02SAndroid Build Coastguard Worker       IsError());
311*14675a02SAndroid Build Coastguard Worker   EXPECT_THAT(
312*14675a02SAndroid Build Coastguard Worker       recorder.FindAllEvents<ResultExpectStatusError>(),
313*14675a02SAndroid Build Coastguard Worker       ElementsAre(IsEvent<ResultExpectStatusError>(
314*14675a02SAndroid Build Coastguard Worker           Eq(TracingStatusCode_Ok), Eq(TracingStatusCode_FailedPrecondition))));
315*14675a02SAndroid Build Coastguard Worker }
316*14675a02SAndroid Build Coastguard Worker 
317*14675a02SAndroid Build Coastguard Worker }  // namespace fcp
318