|
|
#include "../../unity/unity.h" |
|
|
#include <limits.h> |
|
|
#include <stdint.h> |
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
static void assert_ld_equal(long double expected, long double actual, const char* msg) |
|
|
{ |
|
|
if (!(expected == actual)) { |
|
|
char buf[256]; |
|
|
|
|
|
snprintf(buf, sizeof(buf), "%s: expected %.0Lf got %.0Lf", msg, expected, actual); |
|
|
TEST_FAIL_MESSAGE(buf); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static long double LDMAX(void) { |
|
|
return (long double)INTMAX_MAX; |
|
|
} |
|
|
|
|
|
|
|
|
void test_simple_round_ceiling_basic(void) { |
|
|
TEST_ASSERT_EQUAL_INT(2, (int)simple_round(1.1L, round_ceiling)); |
|
|
TEST_ASSERT_EQUAL_INT(1, (int)simple_round(1.0L, round_ceiling)); |
|
|
TEST_ASSERT_EQUAL_INT(-1, (int)simple_round(-1.1L, round_ceiling)); |
|
|
TEST_ASSERT_EQUAL_INT(-1, (int)simple_round(-1.0L, round_ceiling)); |
|
|
} |
|
|
|
|
|
void test_simple_round_floor_basic(void) { |
|
|
TEST_ASSERT_EQUAL_INT(1, (int)simple_round(1.9L, round_floor)); |
|
|
TEST_ASSERT_EQUAL_INT(1, (int)simple_round(1.0L, round_floor)); |
|
|
TEST_ASSERT_EQUAL_INT(-2, (int)simple_round(-1.1L, round_floor)); |
|
|
TEST_ASSERT_EQUAL_INT(-1, (int)simple_round(-1.0L, round_floor)); |
|
|
} |
|
|
|
|
|
void test_simple_round_from_zero_basic(void) { |
|
|
TEST_ASSERT_EQUAL_INT(2, (int)simple_round(1.1L, round_from_zero)); |
|
|
TEST_ASSERT_EQUAL_INT(-2, (int)simple_round(-1.1L, round_from_zero)); |
|
|
TEST_ASSERT_EQUAL_INT(1, (int)simple_round(1.0L, round_from_zero)); |
|
|
TEST_ASSERT_EQUAL_INT(-1, (int)simple_round(-1.0L, round_from_zero)); |
|
|
} |
|
|
|
|
|
void test_simple_round_to_zero_basic(void) { |
|
|
TEST_ASSERT_EQUAL_INT(1, (int)simple_round(1.9L, round_to_zero)); |
|
|
TEST_ASSERT_EQUAL_INT(-1, (int)simple_round(-1.9L, round_to_zero)); |
|
|
TEST_ASSERT_EQUAL_INT(1, (int)simple_round(1.0L, round_to_zero)); |
|
|
TEST_ASSERT_EQUAL_INT(-1, (int)simple_round(-1.0L, round_to_zero)); |
|
|
} |
|
|
|
|
|
void test_simple_round_nearest_basic(void) { |
|
|
TEST_ASSERT_EQUAL_INT(1, (int)simple_round(1.49L, round_nearest)); |
|
|
TEST_ASSERT_EQUAL_INT(2, (int)simple_round(1.5L, round_nearest)); |
|
|
TEST_ASSERT_EQUAL_INT(-1, (int)simple_round(-1.49L, round_nearest)); |
|
|
TEST_ASSERT_EQUAL_INT(-2, (int)simple_round(-1.5L, round_nearest)); |
|
|
} |
|
|
|
|
|
|
|
|
void test_simple_round_near_INTMAX_MAX_ceil_floor(void) { |
|
|
long double M = LDMAX(); |
|
|
|
|
|
|
|
|
long double v1 = M - 0.5L; |
|
|
long double ceil_v1 = simple_round(v1, round_ceiling); |
|
|
long double floor_v1 = simple_round(v1, round_floor); |
|
|
assert_ld_equal(M, ceil_v1, "ceil(M-0.5)"); |
|
|
assert_ld_equal(M - 1.0L, floor_v1, "floor(M-0.5)"); |
|
|
|
|
|
|
|
|
long double v2 = M + 0.5L; |
|
|
long double ceil_v2 = simple_round(v2, round_ceiling); |
|
|
long double floor_v2 = simple_round(v2, round_floor); |
|
|
assert_ld_equal(M + 1.0L, ceil_v2, "ceil(M+0.5)"); |
|
|
assert_ld_equal(M, floor_v2, "floor(M+0.5)"); |
|
|
} |
|
|
|
|
|
void test_simple_round_near_INTMAX_MAX_from_to_zero(void) { |
|
|
long double M = LDMAX(); |
|
|
|
|
|
|
|
|
long double vp = M + 0.5L; |
|
|
assert_ld_equal(M + 1.0L, simple_round(vp, round_from_zero), "from_zero(M+0.5)"); |
|
|
assert_ld_equal(M, simple_round(vp, round_to_zero), "to_zero(M+0.5)"); |
|
|
|
|
|
|
|
|
long double vn = -(M + 0.5L); |
|
|
assert_ld_equal(-(M + 1.0L), simple_round(vn, round_from_zero), "from_zero(-(M+0.5))"); |
|
|
assert_ld_equal(-M, simple_round(vn, round_to_zero), "to_zero(-(M+0.5))"); |
|
|
} |
|
|
|
|
|
void test_simple_round_near_INTMAX_MAX_nearest(void) { |
|
|
long double M = LDMAX(); |
|
|
|
|
|
|
|
|
assert_ld_equal(M + 1.0L, simple_round(M + 0.5L, round_nearest), "nearest(M+0.5)"); |
|
|
assert_ld_equal(- (M + 1.0L), simple_round(- (M + 0.5L), round_nearest), "nearest(-(M+0.5))"); |
|
|
|
|
|
|
|
|
assert_ld_equal(M, simple_round(M + 0.49L, round_nearest), "nearest(M+0.49)"); |
|
|
assert_ld_equal(-M, simple_round(- (M + 0.49L), round_nearest), "nearest(-(M+0.49))"); |
|
|
} |
|
|
|
|
|
|
|
|
void test_simple_round_large_exact_multiples(void) { |
|
|
long double M = LDMAX(); |
|
|
|
|
|
|
|
|
long double v = 2.0L * M; |
|
|
assert_ld_equal(2.0L * M, simple_round(v, round_ceiling), "ceil(2*M)"); |
|
|
assert_ld_equal(2.0L * M, simple_round(v, round_floor), "floor(2*M)"); |
|
|
assert_ld_equal(2.0L * M, simple_round(v, round_from_zero), "from_zero(2*M)"); |
|
|
assert_ld_equal(2.0L * M, simple_round(v, round_to_zero), "to_zero(2*M)"); |
|
|
assert_ld_equal(2.0L * M, simple_round(v, round_nearest), "nearest(2*M)"); |
|
|
|
|
|
|
|
|
long double v2 = 2.0L * M + 1.0L; |
|
|
assert_ld_equal(2.0L * M + 1.0L, simple_round(v2, round_ceiling), "ceil(2*M+1)"); |
|
|
assert_ld_equal(2.0L * M + 1.0L, simple_round(v2, round_floor), "floor(2*M+1)"); |
|
|
assert_ld_equal(2.0L * M + 1.0L, simple_round(v2, round_from_zero), "from_zero(2*M+1)"); |
|
|
assert_ld_equal(2.0L * M + 1.0L, simple_round(v2, round_to_zero), "to_zero(2*M+1)"); |
|
|
assert_ld_equal(2.0L * M + 1.0L, simple_round(v2, round_nearest), "nearest(2*M+1)"); |
|
|
|
|
|
|
|
|
long double vn = - (2.0L * M); |
|
|
assert_ld_equal(- (2.0L * M), simple_round(vn, round_ceiling), "ceil(-2*M)"); |
|
|
assert_ld_equal(- (2.0L * M), simple_round(vn, round_floor), "floor(-2*M)"); |
|
|
assert_ld_equal(- (2.0L * M), simple_round(vn, round_from_zero), "from_zero(-2*M)"); |
|
|
assert_ld_equal(- (2.0L * M), simple_round(vn, round_to_zero), "to_zero(-2*M)"); |
|
|
assert_ld_equal(- (2.0L * M), simple_round(vn, round_nearest), "nearest(-2*M)"); |
|
|
} |
|
|
|
|
|
|
|
|
void test_simple_round_zero_cases(void) { |
|
|
TEST_ASSERT_EQUAL_INT(0, (int)simple_round(0.0L, round_ceiling)); |
|
|
TEST_ASSERT_EQUAL_INT(0, (int)simple_round(0.0L, round_floor)); |
|
|
TEST_ASSERT_EQUAL_INT(0, (int)simple_round(0.0L, round_from_zero)); |
|
|
TEST_ASSERT_EQUAL_INT(0, (int)simple_round(0.0L, round_to_zero)); |
|
|
TEST_ASSERT_EQUAL_INT(0, (int)simple_round(0.0L, round_nearest)); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
|
|
|
RUN_TEST(test_simple_round_ceiling_basic); |
|
|
RUN_TEST(test_simple_round_floor_basic); |
|
|
RUN_TEST(test_simple_round_from_zero_basic); |
|
|
RUN_TEST(test_simple_round_to_zero_basic); |
|
|
RUN_TEST(test_simple_round_nearest_basic); |
|
|
|
|
|
RUN_TEST(test_simple_round_near_INTMAX_MAX_ceil_floor); |
|
|
RUN_TEST(test_simple_round_near_INTMAX_MAX_from_to_zero); |
|
|
RUN_TEST(test_simple_round_near_INTMAX_MAX_nearest); |
|
|
|
|
|
RUN_TEST(test_simple_round_large_exact_multiples); |
|
|
RUN_TEST(test_simple_round_zero_cases); |
|
|
|
|
|
return UNITY_END(); |
|
|
} |