Skip to content

Commit 7e21e4e

Browse files
feat: Add tests for algorithms module including hash and limits functionality
Signed-off-by: FrozenlemonTee <1115306170@qq.com>
1 parent 3e03ce8 commit 7e21e4e

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

tests/basic/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ function(add_basic_suite target_name suite_pattern)
2828
endfunction()
2929

3030
add_basic_suite(basic_conversion_tests "conversion/**/test_*.cpp")
31+
add_basic_suite(basic_algorithms_tests "algorithms/**/test_*.cpp")
3132
add_basic_suite(basic_operations_tests "operations/**/test_*.cpp")
3233
add_basic_suite(basic_policy_tests "policy/**/test_*.cpp")
3334
add_basic_suite(basic_primitive_tests "primitive/**/test_*.cpp")
@@ -36,6 +37,7 @@ add_basic_suite(basic_underlying_tests "underlying/**/test_*.cpp")
3637
add_custom_target(basic_tests)
3738
add_dependencies(basic_tests
3839
basic_conversion_tests
40+
basic_algorithms_tests
3941
basic_operations_tests
4042
basic_policy_tests
4143
basic_primitive_tests
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include <functional>
2+
#include <gtest/gtest.h>
3+
#include <type_traits>
4+
5+
import mcpplibs.primitives.algorithms;
6+
import mcpplibs.primitives.underlying;
7+
8+
#include "../../support/underlying_custom_types.hpp"
9+
10+
using namespace mcpplibs::primitives;
11+
using namespace mcpplibs::primitives::test_support::underlying;
12+
13+
TEST(AlgorithmHashTest, BuiltinHashDelegatesToStdHash) {
14+
static_assert(algorithms::hashable<int>);
15+
static_assert(std::same_as<algorithms::hash_result_t<int>, std::size_t>);
16+
17+
auto const value = 42;
18+
EXPECT_EQ(algorithms::hash<int>{}(value), std::hash<int>{}(value));
19+
EXPECT_EQ(algorithms::hash_value(value), std::hash<int>{}(value));
20+
}
21+
22+
TEST(AlgorithmHashTest, CustomUnderlyingHashesThroughRepType) {
23+
static_assert(algorithms::hashable<UserInteger>);
24+
25+
auto const value = UserInteger{42};
26+
auto const expected = std::hash<int>{}(42);
27+
28+
EXPECT_EQ(algorithms::hash<UserInteger>{}(value), expected);
29+
EXPECT_EQ(algorithms::hash_value(value), expected);
30+
}
31+
32+
TEST(AlgorithmHashTest, UnsupportedSelfRepresentedRepRemainsDisabled) {
33+
static_assert(!algorithms::hashable<BigIntLike>);
34+
SUCCEED();
35+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include <cmath>
2+
#include <concepts>
3+
#include <gtest/gtest.h>
4+
#include <limits>
5+
#include <type_traits>
6+
7+
import mcpplibs.primitives.algorithms;
8+
import mcpplibs.primitives.underlying;
9+
10+
#include "../../support/underlying_custom_types.hpp"
11+
12+
using namespace mcpplibs::primitives;
13+
using namespace mcpplibs::primitives::test_support::underlying;
14+
15+
TEST(AlgorithmLimitsTest, BuiltinIntegerLimitsFollowNumericLimitsShape) {
16+
using limits_t = algorithms::limits<int>;
17+
18+
static_assert(limits_t::enabled);
19+
static_assert(limits_t::is_specialized);
20+
static_assert(std::same_as<typename limits_t::rep_type, int>);
21+
static_assert(limits_t::kind == underlying::category::integer);
22+
static_assert(limits_t::digits == std::numeric_limits<int>::digits);
23+
static_assert(limits_t::radix == std::numeric_limits<int>::radix);
24+
static_assert(algorithms::limited_type<int>);
25+
26+
EXPECT_EQ(limits_t::lowest(), std::numeric_limits<int>::lowest());
27+
EXPECT_EQ(limits_t::max(), std::numeric_limits<int>::max());
28+
EXPECT_EQ(algorithms::min_value<int>(), std::numeric_limits<int>::min());
29+
}
30+
31+
TEST(AlgorithmLimitsTest, BuiltinFloatingLimitsExposeSpecialValues) {
32+
using limits_t = algorithms::limits<double>;
33+
34+
static_assert(limits_t::enabled);
35+
static_assert(limits_t::has_quiet_nan);
36+
static_assert(limits_t::has_infinity);
37+
static_assert(limits_t::kind == underlying::category::floating);
38+
static_assert(limits_t::is_iec559);
39+
40+
EXPECT_EQ(algorithms::epsilon_value<double>(),
41+
std::numeric_limits<double>::epsilon());
42+
EXPECT_EQ(algorithms::infinity_value<double>(),
43+
std::numeric_limits<double>::infinity());
44+
EXPECT_TRUE(std::isnan(algorithms::quiet_nan_value<double>()));
45+
}
46+
47+
TEST(AlgorithmLimitsTest, CustomUnderlyingUsesRepBackedLimits) {
48+
using limits_t = algorithms::limits<UserInteger>;
49+
50+
static_assert(limits_t::enabled);
51+
static_assert(std::same_as<typename limits_t::rep_type, int>);
52+
static_assert(limits_t::kind == underlying::category::integer);
53+
54+
EXPECT_EQ(underlying::traits<UserInteger>::to_rep(limits_t::lowest()),
55+
std::numeric_limits<int>::lowest());
56+
EXPECT_EQ(underlying::traits<UserInteger>::to_rep(limits_t::max()),
57+
std::numeric_limits<int>::max());
58+
}
59+
60+
TEST(AlgorithmLimitsTest, SelfRepresentedCustomRepNeedsExplicitLimitsSpecialization) {
61+
static_assert(!algorithms::limits<BigIntLike>::enabled);
62+
SUCCEED();
63+
}

0 commit comments

Comments
 (0)