Skip to content

Commit 3c9841d

Browse files
test: Add static assertions for literal overflow and precision loss probes
Signed-off-by: FrozenlemonTee <1115306170@qq.com>
1 parent faa87cd commit 3c9841d

1 file changed

Lines changed: 45 additions & 1 deletion

File tree

tests/basic/underlying/literals/test_literals.cpp

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,50 @@
33
#include <gtest/gtest.h>
44
#include <type_traits>
55

6-
import mcpplibs.primitives.underlying;
6+
import mcpplibs.primitives.underlying.literals;
77

88
using namespace mcpplibs::primitives::literals;
99

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+
1050
TEST(UnderlyingLiteralsTest, IntegerLiteralsReturnExpectedUnderlyingTypes) {
1151
static_assert(std::same_as<decltype(42_u8), std::uint8_t>);
1252
static_assert(std::same_as<decltype(42_u16), std::uint16_t>);
@@ -35,10 +75,14 @@ TEST(UnderlyingLiteralsTest, FloatingLiteralsReturnExpectedUnderlyingTypes) {
3575
static_assert(std::same_as<decltype(1.25_f32), float>);
3676
static_assert(std::same_as<decltype(1.25_f64), double>);
3777
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>);
3880

3981
EXPECT_FLOAT_EQ(1.25_f32, 1.25f);
4082
EXPECT_DOUBLE_EQ(1.25_f64, 1.25);
4183
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);
4286
EXPECT_FLOAT_EQ(2_f32, 2.0f);
4387
EXPECT_DOUBLE_EQ(2_f64, 2.0);
4488
EXPECT_EQ(2_f80, static_cast<long double>(2.0));

0 commit comments

Comments
 (0)