Skip to content

Commit 7b39fe4

Browse files
refactor: Clean up import statements and add new tests for primitive conversions
Signed-off-by: FrozenlemonTee <1115306170@qq.com>
1 parent a30b89b commit 7b39fe4

7 files changed

Lines changed: 90 additions & 5 deletions

File tree

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include <gtest/gtest.h>
2+
#include <limits>
3+
4+
import mcpplibs.primitives.underlying;
5+
6+
#include "../../support/conversion_box_types.hpp"
7+
8+
import mcpplibs.primitives.conversion;
9+
import mcpplibs.primitives.policy;
10+
import mcpplibs.primitives.primitive;
11+
12+
using namespace mcpplibs::primitives;
13+
using namespace mcpplibs::primitives::test_support::conversion;
14+
15+
TEST(ConversionPrimitiveTest, CheckedCastBetweenPrimitivesUsesRepBridge) {
16+
using src_t =
17+
primitive<SignedBox, policy::value::checked, policy::error::expected>;
18+
using dest_t =
19+
primitive<UnsignedBox, policy::value::checked, policy::error::expected>;
20+
21+
auto const ok = conversion::checked_cast<dest_t>(src_t{SignedBox{42}});
22+
ASSERT_TRUE(ok.has_value());
23+
EXPECT_EQ(ok->load().value, 42);
24+
25+
auto const bad = conversion::checked_cast<dest_t>(src_t{SignedBox{-1}});
26+
ASSERT_FALSE(bad.has_value());
27+
EXPECT_EQ(bad.error(), conversion::risk::kind::underflow);
28+
}
29+
30+
TEST(ConversionPrimitiveTest,
31+
TruncatingAndExactCastBetweenPrimitivesFollowUnderlyingRules) {
32+
using float_t =
33+
primitive<FloatBox, policy::value::checked, policy::error::expected>;
34+
using signed_t =
35+
primitive<SignedBox, policy::value::checked, policy::error::expected>;
36+
37+
auto const truncated = conversion::truncating_cast<signed_t>(
38+
float_t{FloatBox{12.75}});
39+
EXPECT_EQ(truncated.load().value, 12);
40+
41+
auto const exact = conversion::exact_cast<signed_t>(float_t{FloatBox{12.0}});
42+
ASSERT_TRUE(exact.has_value());
43+
EXPECT_EQ(exact->load().value, 12);
44+
45+
auto const bad_exact = conversion::exact_cast<signed_t>(
46+
float_t{FloatBox{std::numeric_limits<double>::quiet_NaN()}});
47+
ASSERT_FALSE(bad_exact.has_value());
48+
EXPECT_EQ(bad_exact.error(), conversion::risk::kind::domain_error);
49+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include <gtest/gtest.h>
2+
3+
import mcpplibs.primitives.underlying;
4+
5+
#include "../../support/conversion_box_types.hpp"
6+
7+
import mcpplibs.primitives.conversion;
8+
import mcpplibs.primitives.policy;
9+
import mcpplibs.primitives.primitive;
10+
11+
using namespace mcpplibs::primitives;
12+
using namespace mcpplibs::primitives::test_support::conversion;
13+
14+
TEST(ConversionPrimitiveUnderlyingTest,
15+
CheckedCastSupportsUnderlyingToPrimitiveBridge) {
16+
using value_t =
17+
primitive<UnsignedBox, policy::value::checked, policy::error::expected>;
18+
19+
auto const ok = conversion::checked_cast<value_t>(SignedBox{42});
20+
ASSERT_TRUE(ok.has_value());
21+
EXPECT_EQ(ok->load().value, 42);
22+
23+
auto const bad = conversion::checked_cast<value_t>(SignedBox{-1});
24+
ASSERT_FALSE(bad.has_value());
25+
EXPECT_EQ(bad.error(), conversion::risk::kind::underflow);
26+
}
27+
28+
TEST(ConversionPrimitiveUnderlyingTest,
29+
PrimitiveToUnderlyingCastsReuseUnderlyingConversion) {
30+
using value_t =
31+
primitive<SignedBox, policy::value::checked, policy::error::expected>;
32+
33+
auto const ok = conversion::checked_cast<UnsignedBox>(value_t{SignedBox{42}});
34+
ASSERT_TRUE(ok.has_value());
35+
EXPECT_EQ(ok->value, 42);
36+
37+
auto const truncated =
38+
conversion::truncating_cast<SignedBox>(primitive<FloatBox>{
39+
FloatBox{12.75}});
40+
EXPECT_EQ(truncated.value, 12);
41+
}

tests/basic/conversion/traits/test_numeric_risk.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import mcpplibs.primitives.conversion.underlying;
77
import mcpplibs.primitives.underlying;
88

99
#include "../../support/conversion_box_types.hpp"
10-
1110
using namespace mcpplibs::primitives;
1211
using namespace mcpplibs::primitives::test_support::conversion;
1312

tests/basic/conversion/underlying/test_underlying_casts.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import mcpplibs.primitives.conversion.traits;
66
import mcpplibs.primitives.conversion.underlying;
77

88
#include "../../support/conversion_box_types.hpp"
9-
109
using namespace mcpplibs::primitives;
1110
using namespace mcpplibs::primitives::test_support::conversion;
1211

tests/basic/primitive/traits/test_meta_traits.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import mcpplibs.primitives.primitive;
55
import mcpplibs.primitives.policy;
66

77
#include "../../support/underlying_custom_types.hpp"
8-
98
using namespace mcpplibs::primitives;
109

1110
TEST(PrimitiveTraitsTest, MetaTraitsExposeValueTypeAndPrimitiveMetadata) {

tests/basic/underlying/common_rep/test_common_rep_and_type_policy.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import mcpplibs.primitives.policy;
66
import mcpplibs.primitives.operations.impl;
77

88
#include "../../support/underlying_custom_types.hpp"
9-
109
using namespace mcpplibs::primitives;
1110
using namespace mcpplibs::primitives::test_support::underlying;
1211

tests/basic/underlying/traits/test_concepts_and_registration.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import mcpplibs.primitives.underlying;
44

55
#include "../../support/underlying_custom_types.hpp"
6-
76
using namespace mcpplibs::primitives;
87
using namespace mcpplibs::primitives::test_support::underlying;
98

0 commit comments

Comments
 (0)