|
3 | 3 | #include <gtest/gtest.h> |
4 | 4 | #include <type_traits> |
5 | 5 |
|
6 | | -import mcpplibs.primitives.underlying; |
| 6 | +import mcpplibs.primitives.underlying.literals; |
7 | 7 |
|
8 | 8 | using namespace mcpplibs::primitives::literals; |
9 | 9 |
|
| 10 | +namespace { |
| 11 | + |
| 12 | +template <auto Value> struct literal_value_tag; |
| 13 | + |
| 14 | +template <typename Probe> |
| 15 | +concept literal_available = requires { typename literal_value_tag<Probe::value()>; }; |
| 16 | + |
| 17 | +struct U8OverflowProbe { |
| 18 | + static consteval auto value() { return 256_u8; } |
| 19 | +}; |
| 20 | + |
| 21 | +struct I8OverflowProbe { |
| 22 | + static consteval auto value() { return 128_i8; } |
| 23 | +}; |
| 24 | + |
| 25 | +struct F32PrecisionLossProbe { |
| 26 | + static consteval auto value() { return 16777217_f32; } |
| 27 | +}; |
| 28 | + |
| 29 | +struct F64PrecisionLossProbe { |
| 30 | + static consteval auto value() { return 9007199254740993_f64; } |
| 31 | +}; |
| 32 | + |
| 33 | +struct F32OverflowProbe { |
| 34 | + static consteval auto value() { return 1.0e39_f32; } |
| 35 | +}; |
| 36 | + |
| 37 | +struct F32UnderflowProbe { |
| 38 | + static consteval auto value() { return 1.0e-50_f32; } |
| 39 | +}; |
| 40 | + |
| 41 | +static_assert(!literal_available<U8OverflowProbe>); |
| 42 | +static_assert(!literal_available<I8OverflowProbe>); |
| 43 | +static_assert(!literal_available<F32PrecisionLossProbe>); |
| 44 | +static_assert(!literal_available<F64PrecisionLossProbe>); |
| 45 | +static_assert(!literal_available<F32OverflowProbe>); |
| 46 | +static_assert(!literal_available<F32UnderflowProbe>); |
| 47 | + |
| 48 | +} // namespace |
| 49 | + |
10 | 50 | TEST(UnderlyingLiteralsTest, IntegerLiteralsReturnExpectedUnderlyingTypes) { |
11 | 51 | static_assert(std::same_as<decltype(42_u8), std::uint8_t>); |
12 | 52 | static_assert(std::same_as<decltype(42_u16), std::uint16_t>); |
@@ -35,10 +75,14 @@ TEST(UnderlyingLiteralsTest, FloatingLiteralsReturnExpectedUnderlyingTypes) { |
35 | 75 | static_assert(std::same_as<decltype(1.25_f32), float>); |
36 | 76 | static_assert(std::same_as<decltype(1.25_f64), double>); |
37 | 77 | static_assert(std::same_as<decltype(1.25_f80), long double>); |
| 78 | + static_assert(std::same_as<decltype(16777216_f32), float>); |
| 79 | + static_assert(std::same_as<decltype(9007199254740992_f64), double>); |
38 | 80 |
|
39 | 81 | EXPECT_FLOAT_EQ(1.25_f32, 1.25f); |
40 | 82 | EXPECT_DOUBLE_EQ(1.25_f64, 1.25); |
41 | 83 | EXPECT_EQ(1.25_f80, static_cast<long double>(1.25)); |
| 84 | + EXPECT_FLOAT_EQ(16777216_f32, 16777216.0f); |
| 85 | + EXPECT_DOUBLE_EQ(9007199254740992_f64, 9007199254740992.0); |
42 | 86 | EXPECT_FLOAT_EQ(2_f32, 2.0f); |
43 | 87 | EXPECT_DOUBLE_EQ(2_f64, 2.0); |
44 | 88 | EXPECT_EQ(2_f80, static_cast<long double>(2.0)); |
|
0 commit comments