40#include <gtest/gtest.h>
58TEST(AhCppCompat, DetectionMacrosAreDefined)
67TEST(AhCppCompat, HoldsValue)
71 ASSERT_TRUE(
static_cast<bool>(e));
72 EXPECT_EQ(e.
value(), 41);
77TEST(AhCppCompat, HoldsError)
81 ASSERT_FALSE(
static_cast<bool>(e));
82 EXPECT_EQ(e.
error(),
"boom");
86TEST(AhCppCompat, ValueOnErrorThrows)
92TEST(AhCppCompat, ParseLikeRoundTrip)
94 auto ok = parse_positive(10);
95 ASSERT_TRUE(ok.has_value());
98 auto bad = parse_positive(-3);
99 ASSERT_FALSE(bad.has_value());
100 EXPECT_EQ(bad.error(),
"must be positive");
106 auto doubled = e.
transform([](
int v) {
return v * 2; });
107 ASSERT_TRUE(doubled.has_value());
108 EXPECT_EQ(*doubled, 42);
111 auto still_err = err.
transform([](
int v) {
return v * 2; });
112 ASSERT_FALSE(still_err.has_value());
113 EXPECT_EQ(still_err.error(),
"e");
121 ASSERT_TRUE(chained.has_value());
122 EXPECT_EQ(*chained, 105);
127 ASSERT_FALSE(skipped.has_value());
128 EXPECT_EQ(skipped.error(),
"x");
136 ASSERT_TRUE(recovered.has_value());
137 EXPECT_EQ(*recovered, 7);
140TEST(AhCppCompat, CopyAndMovePreserveState)
144 ASSERT_TRUE(copy.has_value());
145 EXPECT_EQ(*copy,
"hello");
148 auto moved = std::move(e);
149 ASSERT_FALSE(moved.has_value());
150 EXPECT_EQ(moved.error(), 404);
154 ASSERT_FALSE(copy.has_value());
155 EXPECT_EQ(copy.error(), 500);
158TEST(AhCppCompat, VoidExpectedBasic)
162 ASSERT_TRUE(
static_cast<bool>(ok));
163 EXPECT_NO_THROW(ok.
value());
167 ASSERT_FALSE(
static_cast<bool>(err));
168 EXPECT_EQ(err.
error(),
"fail");
169 EXPECT_ANY_THROW(err.
value());
172TEST(AhCppCompat, VoidExpectedMonadic)
176 ASSERT_TRUE(chained.has_value());
177 EXPECT_EQ(*chained, 42);
182 ASSERT_TRUE(recovered.has_value());
191 ThrowOnCopy(
const ThrowOnCopy &) {
throw std::runtime_error(
"copy threw"); }
193 ThrowOnCopy &operator=(const ThrowOnCopy &) = delete;
194 ThrowOnCopy &operator=(ThrowOnCopy &&) noexcept = default;
198TEST(AhCppCompat, AssignmentExceptionSafety)
206 EXPECT_THROW(original = other, std::runtime_error);
208 EXPECT_EQ(*original, 100);
C++20/23 compatibility layer: feature detection + Aleph:: polyfills.
#define ALEPH_HAS_STD_FLAT_MAP
#define ALEPH_HAS_STD_EXPECTED
#define ALEPH_HAS_STD_GENERATOR
#define ALEPH_HAS_STD_MDSPAN
Exception thrown by expected::value() when no value is held.
Minimal std::expected-style result type for C++20.
auto or_else(F &&f) const &
Monadic error recovery: handle the error.
constexpr T value_or(U &&default_value) const &
Get the value or a default.
constexpr bool has_value() const noexcept
Check if a value is held.
auto and_then(F &&f) const &
Monadic bind: chain another fallible operation.
constexpr const E & error() const &noexcept
Access the error (const lvalue).
auto transform(F &&f) const &
Monadic map: transform the value.
constexpr const T & value() const &
Access the value with exception on error (const lvalue).
Wrapper for the error value used to initialize an expected.