Skip to content

Commit 434aac5

Browse files
test: Split basic tests trying to resolve issue#17
1 parent b548af0 commit 434aac5

24 files changed

Lines changed: 2220 additions & 2137 deletions
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <cstdint>
2+
#include <gtest/gtest.h>
3+
#include <limits>
4+
5+
import mcpplibs.primitives.conversion.traits;
6+
import mcpplibs.primitives.conversion.underlying;
7+
8+
using namespace mcpplibs::primitives;
9+
10+
TEST(ConversionRiskTest, NumericRiskDetectsOverflowAndUnderflow) {
11+
auto const overflow = conversion::numeric_risk<std::uint16_t>(70000);
12+
ASSERT_TRUE(overflow.has_value());
13+
EXPECT_EQ(*overflow, conversion::risk::kind::overflow);
14+
15+
auto const underflow = conversion::numeric_risk<std::uint16_t>(-1);
16+
ASSERT_TRUE(underflow.has_value());
17+
EXPECT_EQ(*underflow, conversion::risk::kind::underflow);
18+
}
19+
20+
TEST(ConversionRiskTest, NumericRiskDetectsDomainAndPrecisionLoss) {
21+
auto const domain =
22+
conversion::numeric_risk<int>(std::numeric_limits<double>::quiet_NaN());
23+
ASSERT_TRUE(domain.has_value());
24+
EXPECT_EQ(*domain, conversion::risk::kind::domain_error);
25+
26+
auto const precision =
27+
conversion::numeric_risk<float>(std::numeric_limits<std::int64_t>::max());
28+
ASSERT_TRUE(precision.has_value());
29+
EXPECT_EQ(*precision, conversion::risk::kind::precision_loss);
30+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include <expected>
2+
#include <gtest/gtest.h>
3+
4+
import mcpplibs.primitives.conversion.traits;
5+
6+
using namespace mcpplibs::primitives;
7+
8+
TEST(ConversionTypeTest, ResultTypesMatchContracts) {
9+
static_assert(std::same_as<conversion::cast_result<int>,
10+
std::expected<int, conversion::risk::kind>>);
11+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include <cstdint>
2+
#include <gtest/gtest.h>
3+
#include <limits>
4+
5+
import mcpplibs.primitives.conversion.traits;
6+
import mcpplibs.primitives.conversion.underlying;
7+
import mcpplibs.primitives.underlying;
8+
9+
using namespace mcpplibs::primitives;
10+
11+
#if defined(_MSC_VER)
12+
TEST(ConversionCastTest, CheckedCastSmokeOnMSVC) { SUCCEED(); }
13+
#else
14+
TEST(ConversionCastTest, CheckedCastReportsErrorForInvalidInput) {
15+
auto const ok = conversion::checked_cast<int>(42u);
16+
ASSERT_TRUE(ok.has_value());
17+
EXPECT_EQ(*ok, 42);
18+
19+
auto const bad = conversion::checked_cast<std::uint16_t>(-7);
20+
ASSERT_FALSE(bad.has_value());
21+
EXPECT_EQ(bad.error(), conversion::risk::kind::underflow);
22+
}
23+
#endif
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#include <cstdint>
2+
#include <gtest/gtest.h>
3+
#include <limits>
4+
5+
import mcpplibs.primitives.conversion.traits;
6+
import mcpplibs.primitives.conversion.underlying;
7+
import mcpplibs.primitives.underlying;
8+
9+
using namespace mcpplibs::primitives;
10+
11+
#if defined(_MSC_VER)
12+
TEST(ConversionCastTest, SaturatingCastSmokeOnMSVC) { SUCCEED(); }
13+
#else
14+
TEST(ConversionCastTest, SaturatingCastClampsAndHandlesNaN) {
15+
EXPECT_EQ(conversion::saturating_cast<std::int16_t>(100000),
16+
std::numeric_limits<std::int16_t>::max());
17+
EXPECT_EQ(conversion::saturating_cast<int>(
18+
std::numeric_limits<double>::quiet_NaN()),
19+
0);
20+
}
21+
#endif
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <gtest/gtest.h>
2+
#include <limits>
3+
4+
import mcpplibs.primitives.underlying;
5+
import mcpplibs.primitives.conversion.traits;
6+
import mcpplibs.primitives.conversion.underlying;
7+
8+
#include "../../support/conversion_box_types.hpp"
9+
10+
using namespace mcpplibs::primitives;
11+
using namespace mcpplibs::primitives::test_support::conversion;
12+
13+
TEST(ConversionUnderlyingTest, CheckedCastUsesRepBridge) {
14+
auto const ok = conversion::checked_cast<UnsignedBox>(SignedBox{42});
15+
ASSERT_TRUE(ok.has_value());
16+
EXPECT_EQ(ok->value, 42);
17+
18+
auto const bad = conversion::checked_cast<UnsignedBox>(SignedBox{-1});
19+
ASSERT_FALSE(bad.has_value());
20+
EXPECT_EQ(bad.error(), conversion::risk::kind::underflow);
21+
}
22+
23+
TEST(ConversionUnderlyingTest, SaturatingCastClampsByUnderlyingRep) {
24+
auto const saturated =
25+
conversion::saturating_cast<UnsignedBox>(SignedBox{
26+
std::numeric_limits<long long>::max()});
27+
EXPECT_EQ(saturated.value, std::numeric_limits<std::uint16_t>::max());
28+
}
29+
30+
TEST(ConversionUnderlyingTest, TruncatingAndExactCastSupportFloatingSources) {
31+
auto const truncated = conversion::truncating_cast<SignedBox>(FloatBox{12.75});
32+
EXPECT_EQ(truncated.value, 12);
33+
34+
auto const exact = conversion::exact_cast<SignedBox>(FloatBox{12.0});
35+
ASSERT_TRUE(exact.has_value());
36+
EXPECT_EQ(exact->value, 12);
37+
}

tests/basic/main.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include <gtest/gtest.h>
2+
3+
auto main(int argc, char **argv) -> int {
4+
::testing::InitGoogleTest(&argc, argv);
5+
return RUN_ALL_TESTS();
6+
}

0 commit comments

Comments
 (0)