#include #include #include #include "utils/result.h" namespace rk3588 { namespace { TEST(ResultTest, VoidResultOk) { Status s = Status::Ok(); EXPECT_TRUE(s.IsOk()); EXPECT_FALSE(s.Failed()); EXPECT_TRUE(static_cast(s)); EXPECT_TRUE(s.ErrMessage().empty()); } TEST(ResultTest, VoidResultFail) { Status s = Status::Fail("something went wrong"); EXPECT_FALSE(s.IsOk()); EXPECT_TRUE(s.Failed()); EXPECT_FALSE(static_cast(s)); EXPECT_EQ(s.ErrMessage(), "something went wrong"); } TEST(ResultTest, VoidResultFailWithCode) { Status s = Status::Fail("error", 42); EXPECT_FALSE(s.IsOk()); EXPECT_EQ(s.Err().Code(), 42); EXPECT_EQ(s.ErrMessage(), "error"); } TEST(ResultTest, ValueResultOk) { Result r = 42; EXPECT_TRUE(r.Ok()); EXPECT_FALSE(r.Failed()); EXPECT_TRUE(static_cast(r)); EXPECT_EQ(r.Value(), 42); } TEST(ResultTest, ValueResultFail) { Result r = Error("failed to compute"); EXPECT_FALSE(r.Ok()); EXPECT_TRUE(r.Failed()); EXPECT_FALSE(static_cast(r)); EXPECT_EQ(r.ErrMessage(), "failed to compute"); } TEST(ResultTest, ValueResultValueOr) { Result ok = 100; Result fail = Error("oops"); EXPECT_EQ(ok.ValueOr(0), 100); EXPECT_EQ(fail.ValueOr(0), 0); } TEST(ResultTest, ValueResultTake) { Result r = std::string("hello"); EXPECT_TRUE(r.Ok()); std::string s = std::move(r).Take(); EXPECT_EQ(s, "hello"); } TEST(ResultTest, StringResult) { Result ok = std::string("success"); Result fail = Error("failure"); EXPECT_TRUE(ok.Ok()); EXPECT_EQ(ok.Value(), "success"); EXPECT_TRUE(fail.Failed()); EXPECT_EQ(fail.ErrMessage(), "failure"); } TEST(ResultTest, MakeResultHelper) { auto r = MakeResult(123); EXPECT_TRUE(r.Ok()); EXPECT_EQ(r.Value(), 123); } TEST(ResultTest, MakeErrorHelper) { auto r = MakeError("test error"); EXPECT_TRUE(r.Failed()); EXPECT_EQ(r.ErrMessage(), "test error"); } TEST(ErrorTest, Basic) { Error e1; EXPECT_TRUE(e1.Empty()); EXPECT_FALSE(static_cast(e1)); Error e2("message", 100); EXPECT_FALSE(e2.Empty()); EXPECT_TRUE(static_cast(e2)); EXPECT_EQ(e2.Message(), "message"); EXPECT_EQ(e2.Code(), 100); } TEST(ResultTest, OkStatusHelper) { Status s = OkStatus(); EXPECT_TRUE(s.IsOk()); } TEST(ResultTest, FailStatusHelper) { Status s = FailStatus("test"); EXPECT_TRUE(s.Failed()); EXPECT_EQ(s.ErrMessage(), "test"); } // Test with complex types struct ComplexType { int x; std::string s; bool operator==(const ComplexType& o) const { return x == o.x && s == o.s; } }; TEST(ResultTest, ComplexType) { Result ok = ComplexType{42, "test"}; EXPECT_TRUE(ok.Ok()); EXPECT_EQ(ok.Value().x, 42); EXPECT_EQ(ok.Value().s, "test"); Result fail = Error("complex error"); EXPECT_TRUE(fail.Failed()); } // Test move semantics TEST(ResultTest, MoveSemantics) { Result> r = std::make_unique(42); EXPECT_TRUE(r.Ok()); auto ptr = std::move(r).Take(); EXPECT_EQ(*ptr, 42); } } // namespace } // namespace rk3588