968 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(str), CX_STR("AN,ARBITRARILY;||SEPARATED;STRING"))); |
971 CX_TEST_ASSERT(0 == cx_strcmp(cx_strcast(str), CX_STR("AN,ARBITRARILY;||SEPARATED;STRING"))); |
969 } |
972 } |
970 cx_strfree(&str); |
973 cx_strfree(&str); |
971 } |
974 } |
972 |
975 |
|
976 #define test_strtoint_impl(suffix, num, base, var, min, max) \ |
|
977 do { \ |
|
978 errno = 0; \ |
|
979 int r = cx_strto##var(cx_str( #num), &var, base); \ |
|
980 if ((min) <= (num##suffix) && (num##suffix) <= (max)) { \ |
|
981 CX_TEST_ASSERTM(0 == r, "failed for "#num); \ |
|
982 CX_TEST_ASSERT(0 == errno); \ |
|
983 CX_TEST_ASSERT((num##suffix) == (0##suffix)+(var)); \ |
|
984 } else { \ |
|
985 CX_TEST_ASSERTM(0 != r, "out-of-range not detected for "#num " in variant "#var); \ |
|
986 CX_TEST_ASSERT(ERANGE == errno); \ |
|
987 } \ |
|
988 } while (0) |
|
989 |
|
990 #define test_strtoint_rollout_signed_impl(num, base) \ |
|
991 test_strtoint_impl(LL, num, base, s, SHRT_MIN, SHRT_MAX); \ |
|
992 test_strtoint_impl(LL, num, base, i, INT_MIN, INT_MAX); \ |
|
993 test_strtoint_impl(LL, num, base, l, LONG_MIN, LONG_MAX); \ |
|
994 test_strtoint_impl(LL, num, base, ll, LLONG_MIN, LLONG_MAX); \ |
|
995 test_strtoint_impl(LL, num, base, i8, INT8_MIN, INT8_MAX); \ |
|
996 test_strtoint_impl(LL, num, base, i16, INT16_MIN, INT16_MAX); \ |
|
997 test_strtoint_impl(LL, num, base, i32, INT32_MIN, INT32_MAX); \ |
|
998 test_strtoint_impl(LL, num, base, i64, INT64_MIN, INT64_MAX); \ |
|
999 test_strtoint_impl(LL, num, base, z, -SSIZE_MAX-1, SSIZE_MAX) |
|
1000 |
|
1001 #define test_strtoint_rollout_signed(num, base) \ |
|
1002 test_strtoint_rollout_signed_impl(num, base); \ |
|
1003 test_strtoint_rollout_signed_impl(-num, base) |
|
1004 |
|
1005 #define test_strtoint_rollout(num, base) \ |
|
1006 test_strtoint_impl(ULL, num, base, us, 0, USHRT_MAX); \ |
|
1007 test_strtoint_impl(ULL, num, base, u, 0, UINT_MAX); \ |
|
1008 test_strtoint_impl(ULL, num, base, ul, 0, ULONG_MAX); \ |
|
1009 test_strtoint_impl(ULL, num, base, ull, 0, ULLONG_MAX); \ |
|
1010 test_strtoint_impl(ULL, num, base, u8, 0, UINT8_MAX); \ |
|
1011 test_strtoint_impl(ULL, num, base, u16, 0, UINT16_MAX); \ |
|
1012 test_strtoint_impl(ULL, num, base, u32, 0, UINT32_MAX); \ |
|
1013 test_strtoint_impl(ULL, num, base, u64, 0, UINT64_MAX); \ |
|
1014 test_strtoint_impl(ULL, num, base, uz, 0, SIZE_MAX) |
|
1015 |
|
1016 CX_TEST(test_string_to_signed_integer) { |
|
1017 short s; |
|
1018 int i; |
|
1019 long l; |
|
1020 long long ll; |
|
1021 int8_t i8; |
|
1022 int16_t i16; |
|
1023 int32_t i32; |
|
1024 int64_t i64; |
|
1025 ssize_t z; |
|
1026 CX_TEST_DO { |
|
1027 // do some brute force tests with all ranges |
|
1028 test_strtoint_rollout_signed(47, 10); |
|
1029 test_strtoint_rollout_signed(210, 10); |
|
1030 test_strtoint_rollout_signed(5678, 10); |
|
1031 test_strtoint_rollout_signed(40678, 10); |
|
1032 test_strtoint_rollout_signed(1350266537, 10); |
|
1033 test_strtoint_rollout_signed(3350266537, 10); |
|
1034 test_strtoint_rollout_signed(473350266537, 10); |
|
1035 test_strtoint_rollout_signed(057, 8); |
|
1036 test_strtoint_rollout_signed(0322, 8); |
|
1037 test_strtoint_rollout_signed(013056, 8); |
|
1038 test_strtoint_rollout_signed(0117346, 8); |
|
1039 test_strtoint_rollout_signed(012036667251, 8); |
|
1040 test_strtoint_rollout_signed(030754201251, 8); |
|
1041 test_strtoint_rollout_signed(06706567757251, 8); |
|
1042 test_strtoint_rollout_signed(0767716340165362204025, 8); |
|
1043 test_strtoint_rollout_signed(0x65, 16); |
|
1044 test_strtoint_rollout_signed(0xf5, 16); |
|
1045 test_strtoint_rollout_signed(0xABC5, 16); |
|
1046 test_strtoint_rollout_signed(0xFBC5, 16); |
|
1047 test_strtoint_rollout_signed(0x6df9CE03, 16); |
|
1048 test_strtoint_rollout_signed(0xFdf9CE03, 16); |
|
1049 test_strtoint_rollout_signed(0x6df9CE03AbC90815, 16); |
|
1050 // TODO: roll out base 2 tests, but that needs C23 |
|
1051 |
|
1052 // do some special case tests |
|
1053 |
|
1054 // can fit only in unsigned long long |
|
1055 errno = 0; |
|
1056 CX_TEST_ASSERT(0 != cx_strtoll(cx_str("0x8df9CE03AbC90815"), &ll, 16)); |
|
1057 CX_TEST_ASSERT(errno == ERANGE); |
|
1058 |
|
1059 // TODO: implement more special cases |
|
1060 } |
|
1061 } |
|
1062 |
|
1063 CX_TEST(test_string_to_unsigned_integer) { |
|
1064 unsigned short us; |
|
1065 unsigned int u; |
|
1066 unsigned long ul; |
|
1067 unsigned long long ull; |
|
1068 uint8_t u8; |
|
1069 uint16_t u16; |
|
1070 uint32_t u32; |
|
1071 uint64_t u64; |
|
1072 size_t uz; |
|
1073 CX_TEST_DO { |
|
1074 // do some brute force tests with all ranges |
|
1075 test_strtoint_rollout(47, 10); |
|
1076 test_strtoint_rollout(210, 10); |
|
1077 test_strtoint_rollout(5678, 10); |
|
1078 test_strtoint_rollout(40678, 10); |
|
1079 test_strtoint_rollout(1350266537, 10); |
|
1080 test_strtoint_rollout(3350266537, 10); |
|
1081 test_strtoint_rollout(473350266537, 10); |
|
1082 test_strtoint_rollout(057, 8); |
|
1083 test_strtoint_rollout(0322, 8); |
|
1084 test_strtoint_rollout(013056, 8); |
|
1085 test_strtoint_rollout(0117346, 8); |
|
1086 test_strtoint_rollout(012036667251, 8); |
|
1087 test_strtoint_rollout(030754201251, 8); |
|
1088 test_strtoint_rollout(06706567757251, 8); |
|
1089 test_strtoint_rollout(01767716340165362204025, 8); |
|
1090 test_strtoint_rollout(0x65, 16); |
|
1091 test_strtoint_rollout(0xf5, 16); |
|
1092 test_strtoint_rollout(0xABC5, 16); |
|
1093 test_strtoint_rollout(0xFBC5, 16); |
|
1094 test_strtoint_rollout(0x6df9CE03, 16); |
|
1095 test_strtoint_rollout(0xFdf9CE03, 16); |
|
1096 test_strtoint_rollout(0x6df9CE03AbC90815, 16); |
|
1097 test_strtoint_rollout(0xfdf9CE03AbC90815, 16); |
|
1098 // TODO: roll out base 2 tests, but that needs C23 |
|
1099 |
|
1100 // do some special case tests |
|
1101 |
|
1102 // TODO: implement tests |
|
1103 } |
|
1104 } |
|
1105 |
|
1106 CX_TEST(test_string_to_float) { |
|
1107 float f; |
|
1108 CX_TEST_DO { |
|
1109 CX_TEST_ASSERT(0 == cx_strtof(cx_str("11.3"), &f)); |
|
1110 CX_TEST_ASSERT(11.3f == f); |
|
1111 } |
|
1112 } |
|
1113 |
|
1114 CX_TEST(test_string_to_double) { |
|
1115 double d; |
|
1116 CX_TEST_DO { |
|
1117 CX_TEST_ASSERT(0 == cx_strtod(cx_str("11.3"), &d)); |
|
1118 CX_TEST_ASSERT(11.3 == d); |
|
1119 } |
|
1120 } |
|
1121 |
|
1122 CX_TEST(test_string_to_float_german) { |
|
1123 float f; |
|
1124 CX_TEST_DO { |
|
1125 // TODO: implement |
|
1126 (void)f; |
|
1127 } |
|
1128 } |
973 |
1129 |
974 CxTestSuite *cx_test_suite_string(void) { |
1130 CxTestSuite *cx_test_suite_string(void) { |
975 CxTestSuite *suite = cx_test_suite_new("string"); |
1131 CxTestSuite *suite = cx_test_suite_new("string"); |
976 |
1132 |
977 cx_test_register(suite, test_string_construct); |
1133 cx_test_register(suite, test_string_construct); |