#include #include "ucore/saturating_math.h" START_TEST (test_sat_uc_addu8) { uint8_t a; uint8_t b; a = UINT8_MAX; b = 1; fail_if(uc_sat_addu8(a,b) != UINT8_MAX); a = 1; b = UINT8_MAX; fail_if(uc_sat_addu8(a,b) != UINT8_MAX); a = UINT8_MAX; b = UINT8_MAX; fail_if(uc_sat_addu8(a,b) != UINT8_MAX); a = UINT8_MAX - 2; b = 2; fail_if(uc_sat_addu8(a,b) != UINT8_MAX); a = 2; b = UINT8_MAX - 2; fail_if(uc_sat_addu8(a,b) != UINT8_MAX); a = UINT8_MAX - 3; b = 2; fail_if(uc_sat_addu8(a,b) != UINT8_MAX - 1); a = 2; b = UINT8_MAX - 3; fail_if(uc_sat_addu8(a,b) != UINT8_MAX - 1); a = 0; b = UINT8_MAX; fail_if(uc_sat_addu8(a,b) != UINT8_MAX); a = UINT8_MAX; b = 0; fail_if(uc_sat_addu8(a,b) != UINT8_MAX); a = 0; b = 0; fail_if(uc_sat_addu8(a,b) != 0); a = 100; b = 100; fail_if(uc_sat_addu8(a,b) != 200); } END_TEST START_TEST (test_sat_uc_subu8) { uint8_t a; uint8_t b; a = UINT8_MAX; b = 0; fail_if(uc_sat_subu8(a,b) != UINT8_MAX); a = 0; b = UINT8_MAX; fail_if(uc_sat_subu8(a,b) != 0); a = UINT8_MAX; b = UINT8_MAX; fail_if(uc_sat_subu8(a,b) != 0); a = 0; b = 1; fail_if(uc_sat_subu8(a,b) != 0); a = 1; b = UINT8_MAX - 1; fail_if(uc_sat_subu8(a,b) != 0); a = UINT8_MAX; b = 100; fail_if(uc_sat_subu8(a,b) != UINT8_MAX - 100); a = 100; b = 100; fail_if(uc_sat_subu8(a,b) != 0); } END_TEST START_TEST (test_sat_uc_multu8) { uint8_t a; uint8_t b; a = UINT8_MAX; b = 0; fail_if(uc_sat_multu8(a,b) != 0); a = 0; b = UINT8_MAX; fail_if(uc_sat_multu8(a,b) != 0); a = UINT8_MAX; b = UINT8_MAX; fail_if(uc_sat_multu8(a,b) != UINT8_MAX); a = UINT8_MAX; b = 2; fail_if(uc_sat_multu8(a,b) != UINT8_MAX); a = 2; b = UINT8_MAX; fail_if(uc_sat_multu8(a,b) != UINT8_MAX); a = UINT8_MAX; b = UINT8_MAX/2 - 1; fail_if(uc_sat_multu8(a,b) != UINT8_MAX); a = UINT8_MAX/2 - 1; b = UINT8_MAX; fail_if(uc_sat_multu8(a,b) != UINT8_MAX); a = 10; b = 10; fail_if(uc_sat_multu8(a,b) != 100); } END_TEST START_TEST (test_sat_uc_addu16) { uint16_t a; uint16_t b; a = UINT16_MAX; b = 1; fail_if(uc_sat_addu16(a,b) != UINT16_MAX); a = 1; b = UINT16_MAX; fail_if(uc_sat_addu16(a,b) != UINT16_MAX); a = UINT16_MAX; b = UINT16_MAX; fail_if(uc_sat_addu16(a,b) != UINT16_MAX); a = UINT16_MAX - 2; b = 2; fail_if(uc_sat_addu16(a,b) != UINT16_MAX); a = 2; b = UINT16_MAX - 2; fail_if(uc_sat_addu16(a,b) != UINT16_MAX); a = UINT16_MAX - 3; b = 2; fail_if(uc_sat_addu16(a,b) != UINT16_MAX - 1); a = 2; b = UINT16_MAX - 3; fail_if(uc_sat_addu16(a,b) != UINT16_MAX - 1); a = 0; b = UINT16_MAX; fail_if(uc_sat_addu16(a,b) != UINT16_MAX); a = UINT16_MAX; b = 0; fail_if(uc_sat_addu16(a,b) != UINT16_MAX); a = 0; b = 0; fail_if(uc_sat_addu16(a,b) != 0); a = 100; b = 100; fail_if(uc_sat_addu16(a,b) != 200); } END_TEST START_TEST (test_sat_uc_subu16) { uint16_t a; uint16_t b; a = UINT16_MAX; b = 0; fail_if(uc_sat_subu16(a,b) != UINT16_MAX); a = 0; b = UINT16_MAX; fail_if(uc_sat_subu16(a,b) != 0); a = UINT16_MAX; b = UINT16_MAX; fail_if(uc_sat_subu16(a,b) != 0); a = 0; b = 1; fail_if(uc_sat_subu16(a,b) != 0); a = 1; b = UINT16_MAX - 1; fail_if(uc_sat_subu16(a,b) != 0); a = UINT16_MAX; b = 100; fail_if(uc_sat_subu16(a,b) != UINT16_MAX - 100); a = 100; b = 100; fail_if(uc_sat_subu16(a,b) != 0); } END_TEST START_TEST (test_sat_uc_multu16) { uint16_t a; uint16_t b; a = UINT16_MAX; b = 0; fail_if(uc_sat_multu16(a,b) != 0); a = 0; b = UINT16_MAX; fail_if(uc_sat_multu16(a,b) != 0); a = UINT16_MAX; b = UINT16_MAX; fail_if(uc_sat_multu16(a,b) != UINT16_MAX); a = UINT16_MAX; b = 2; fail_if(uc_sat_multu16(a,b) != UINT16_MAX); a = 2; b = UINT16_MAX; fail_if(uc_sat_multu16(a,b) != UINT16_MAX); a = UINT16_MAX; b = UINT16_MAX/2 - 1; fail_if(uc_sat_multu16(a,b) != UINT16_MAX); a = UINT16_MAX/2 - 1; b = UINT16_MAX; fail_if(uc_sat_multu16(a,b) != UINT16_MAX); a = 10; b = 10; fail_if(uc_sat_multu16(a,b) != 100); } END_TEST START_TEST (test_sat_uc_addu32) { uint32_t a; uint32_t b; a = UINT32_MAX; b = 1; fail_if(uc_sat_addu32(a,b) != UINT32_MAX); a = 1; b = UINT32_MAX; fail_if(uc_sat_addu32(a,b) != UINT32_MAX); a = UINT32_MAX; b = UINT32_MAX; fail_if(uc_sat_addu32(a,b) != UINT32_MAX); a = UINT32_MAX - 2; b = 2; fail_if(uc_sat_addu32(a,b) != UINT32_MAX); a = 2; b = UINT32_MAX - 2; fail_if(uc_sat_addu32(a,b) != UINT32_MAX); a = UINT32_MAX - 3; b = 2; fail_if(uc_sat_addu32(a,b) != UINT32_MAX - 1); a = 2; b = UINT32_MAX - 3; fail_if(uc_sat_addu32(a,b) != UINT32_MAX - 1); a = 0; b = UINT32_MAX; fail_if(uc_sat_addu32(a,b) != UINT32_MAX); a = UINT32_MAX; b = 0; fail_if(uc_sat_addu32(a,b) != UINT32_MAX); a = 0; b = 0; fail_if(uc_sat_addu32(a,b) != 0); a = 0x1fffffff; b = 0x80000000; fail_if(uc_sat_addu32(a,b) != 0x9fffffff); } END_TEST START_TEST (test_sat_uc_subu32) { uint32_t a; uint32_t b; a = UINT32_MAX; b = 0; fail_if(uc_sat_subu32(a,b) != UINT32_MAX); a = 0; b = UINT32_MAX; fail_if(uc_sat_subu32(a,b) != 0); a = UINT32_MAX; b = UINT32_MAX; fail_if(uc_sat_subu32(a,b) != 0); a = 0; b = 1; fail_if(uc_sat_subu32(a,b) != 0); a = 1; b = UINT32_MAX - 1; fail_if(uc_sat_subu32(a,b) != 0); a = UINT32_MAX; b = 100; fail_if(uc_sat_subu32(a,b) != UINT32_MAX - 100); a = 100; b = 100; fail_if(uc_sat_subu32(a,b) != 0); } END_TEST START_TEST (test_sat_uc_multu32) { uint32_t a; uint32_t b; a = UINT32_MAX; b = 0; fail_if(uc_sat_multu32(a,b) != 0); a = 0; b = UINT32_MAX; fail_if(uc_sat_multu32(a,b) != 0); a = UINT32_MAX; b = UINT32_MAX; fail_if(uc_sat_multu32(a,b) != UINT32_MAX); a = UINT32_MAX; b = 2; fail_if(uc_sat_multu32(a,b) != UINT32_MAX); a = 2; b = UINT32_MAX; fail_if(uc_sat_multu32(a,b) != UINT32_MAX); a = UINT32_MAX; b = UINT32_MAX/2 - 1; fail_if(uc_sat_multu32(a,b) != UINT32_MAX); a = UINT32_MAX/2 - 1; b = UINT32_MAX; fail_if(uc_sat_multu32(a,b) != UINT32_MAX); a = 10; b = 10; fail_if(uc_sat_multu32(a,b) != 100); } END_TEST START_TEST (test_sat_uc_addu64) { uint64_t a; uint64_t b; a = UINT64_MAX; b = 1; fail_if(uc_sat_addu64(a,b) != UINT64_MAX); a = 1; b = UINT64_MAX; fail_if(uc_sat_addu64(a,b) != UINT64_MAX); a = UINT64_MAX; b = UINT64_MAX; fail_if(uc_sat_addu64(a,b) != UINT64_MAX); a = UINT64_MAX - 2; b = 2; fail_if(uc_sat_addu64(a,b) != UINT64_MAX); a = 2; b = UINT64_MAX - 2; fail_if(uc_sat_addu64(a,b) != UINT64_MAX); a = UINT64_MAX - 3; b = 2; fail_if(uc_sat_addu64(a,b) != UINT64_MAX - 1); a = 2; b = UINT64_MAX - 3; fail_if(uc_sat_addu64(a,b) != UINT64_MAX - 1); a = 0; b = UINT64_MAX; fail_if(uc_sat_addu64(a,b) != UINT64_MAX); a = UINT64_MAX; b = 0; fail_if(uc_sat_addu64(a,b) != UINT64_MAX); a = 0; b = 0; fail_if(uc_sat_addu64(a,b) != 0); a = 0x1fffffffffffffffULL; b = 0x8000000000000000ULL; fail_if(uc_sat_addu64(a,b) != 0x9fffffffffffffffULL); } END_TEST START_TEST (test_sat_uc_subu64) { uint64_t a; uint64_t b; a = UINT64_MAX; b = 0; fail_if(uc_sat_subu64(a,b) != UINT64_MAX); a = 0; b = UINT64_MAX; fail_if(uc_sat_subu64(a,b) != 0); a = UINT64_MAX; b = UINT64_MAX; fail_if(uc_sat_subu64(a,b) != 0); a = 0; b = 1; fail_if(uc_sat_subu64(a,b) != 0); a = 1; b = UINT64_MAX - 1; fail_if(uc_sat_subu64(a,b) != 0); a = UINT64_MAX; b = 100; fail_if(uc_sat_subu64(a,b) != UINT64_MAX - 100); a = 100; b = 100; fail_if(uc_sat_subu64(a,b) != 0); } END_TEST START_TEST (test_sat_uc_multu64) { uint64_t a; uint64_t b; a = UINT64_MAX; b = 0; fail_if(uc_sat_multu64(a,b) != 0); a = 0; b = UINT64_MAX; fail_if(uc_sat_multu64(a,b) != 0); a = UINT64_MAX; b = UINT64_MAX; fail_if(uc_sat_multu64(a,b) != UINT64_MAX); a = UINT64_MAX; b = 2; fail_if(uc_sat_multu64(a,b) != UINT64_MAX); a = 2; b = UINT64_MAX; fail_if(uc_sat_multu64(a,b) != UINT64_MAX); a = UINT64_MAX; b = UINT64_MAX/2 - 1; fail_if(uc_sat_multu64(a,b) != UINT64_MAX); a = UINT64_MAX/2 - 1; b = UINT64_MAX; fail_if(uc_sat_multu64(a,b) != UINT64_MAX); a = 10; b = 10; fail_if(uc_sat_multu64(a,b) != 100); } END_TEST Suite *sat_math_suite(void) { Suite *s = suite_create("saturating_math"); TCase *tc = tcase_create("saturating_math tests"); tcase_add_test(tc, test_sat_uc_addu8); tcase_add_test(tc, test_sat_uc_subu8); tcase_add_test(tc, test_sat_uc_multu8); tcase_add_test(tc, test_sat_uc_addu16); tcase_add_test(tc, test_sat_uc_subu16); tcase_add_test(tc, test_sat_uc_multu16); tcase_add_test(tc, test_sat_uc_addu32); tcase_add_test(tc, test_sat_uc_subu32); tcase_add_test(tc, test_sat_uc_multu32); tcase_add_test(tc, test_sat_uc_addu64); tcase_add_test(tc, test_sat_uc_subu64); tcase_add_test(tc, test_sat_uc_multu64); suite_add_tcase(s, tc); return s; }