1165 |
1166 |
1166 CX_TEST(test_string_to_float) { |
1167 CX_TEST(test_string_to_float) { |
1167 float f; |
1168 float f; |
1168 CX_TEST_DO { |
1169 CX_TEST_DO { |
1169 CX_TEST_ASSERT(0 == cx_strtof(cx_str("11.3"), &f)); |
1170 CX_TEST_ASSERT(0 == cx_strtof(cx_str("11.3"), &f)); |
1170 CX_TEST_ASSERT(11.3f == f); |
1171 CX_TEST_ASSERT(0 == cx_vcmp_float(11.3f, f)); |
|
1172 |
|
1173 CX_TEST_ASSERT(0 == cx_strtof(cx_str("-4.711e+1"), &f)); |
|
1174 CX_TEST_ASSERT(0 == cx_vcmp_float(-47.11f, f)); |
1171 |
1175 |
1172 CX_TEST_ASSERT(0 == cx_strtof(cx_str("1.67262192595e-27"), &f)); |
1176 CX_TEST_ASSERT(0 == cx_strtof(cx_str("1.67262192595e-27"), &f)); |
1173 CX_TEST_ASSERT(1.67262192595e-27f == f); |
1177 CX_TEST_ASSERT(0 == cx_vcmp_float(1.67262192595e-27f, f)); |
1174 |
1178 |
1175 CX_TEST_ASSERT(0 == cx_strtof_lc(cx_str("138,339.4"), &f, '.', ",")); |
1179 CX_TEST_ASSERT(0 == cx_strtof_lc(cx_str("138,339.4"), &f, '.', ",")); |
1176 CX_TEST_ASSERT(138339.4f == f); |
1180 CX_TEST_ASSERT(0 == cx_vcmp_float(138339.4f, f)); |
1177 |
1181 |
1178 CX_TEST_ASSERT(0 == cx_strtof_lc(cx_str("138,339.4"), &f, ',', ".")); |
1182 CX_TEST_ASSERT(0 == cx_strtof_lc(cx_str("138,339.4"), &f, ',', ".")); |
1179 CX_TEST_ASSERT(138.3394f == f); |
1183 CX_TEST_ASSERT(0 == cx_vcmp_float(138.3394f, f)); |
|
1184 |
|
1185 errno = 0; |
|
1186 CX_TEST_ASSERT(0 != cx_strtof(cx_str("15e"), &f)); |
|
1187 CX_TEST_ASSERT(errno == EINVAL); |
|
1188 errno = 0; |
|
1189 CX_TEST_ASSERT(0 != cx_strtof(cx_str("15e+"), &f)); |
|
1190 CX_TEST_ASSERT(errno == EINVAL); |
|
1191 errno = 0; |
|
1192 CX_TEST_ASSERT(0 != cx_strtof(cx_str("15e-"), &f)); |
|
1193 CX_TEST_ASSERT(errno == EINVAL); |
|
1194 CX_TEST_ASSERT(0 == cx_strtof(cx_str("15e-0"), &f)); |
|
1195 CX_TEST_ASSERT(0 == cx_vcmp_float(15.f, f)); |
|
1196 |
|
1197 CX_TEST_ASSERT(0 == cx_strtof(cx_str("3e38"), &f)); |
|
1198 CX_TEST_ASSERT(0 == cx_vcmp_float(3e38f, f)); |
|
1199 errno = 0; |
|
1200 CX_TEST_ASSERT(0 != cx_strtof(cx_str("3e39"), &f)); |
|
1201 CX_TEST_ASSERT(errno == ERANGE); |
|
1202 CX_TEST_ASSERT(0 == cx_strtof(cx_str("-3e38"), &f)); |
|
1203 CX_TEST_ASSERT(0 == cx_vcmp_float(-3e38f, f)); |
|
1204 errno = 0; |
|
1205 CX_TEST_ASSERT(0 != cx_strtof(cx_str("-3e39"), &f)); |
|
1206 CX_TEST_ASSERT(errno == ERANGE); |
|
1207 CX_TEST_ASSERT(0 == cx_strtof(cx_str("1.18e-38"), &f)); |
|
1208 CX_TEST_ASSERT(0 == cx_vcmp_float(1.18e-38f, f)); |
|
1209 errno = 0; |
|
1210 CX_TEST_ASSERT(0 != cx_strtof(cx_str("1.17e-38"), &f)); |
|
1211 CX_TEST_ASSERT(errno == ERANGE); |
1180 } |
1212 } |
1181 } |
1213 } |
1182 |
1214 |
1183 CX_TEST(test_string_to_double) { |
1215 CX_TEST(test_string_to_double) { |
1184 double d; |
1216 double d; |
1185 CX_TEST_DO { |
1217 CX_TEST_DO { |
1186 CX_TEST_ASSERT(0 == cx_strtod(cx_str("11.3"), &d)); |
1218 CX_TEST_ASSERT(0 == cx_strtod(cx_str("11.3"), &d)); |
1187 CX_TEST_ASSERT(11.3 == d); |
1219 CX_TEST_ASSERT(0 == cx_vcmp_double(11.3, d)); |
|
1220 |
|
1221 CX_TEST_ASSERT(0 == cx_strtod(cx_str("-13.37"), &d)); |
|
1222 CX_TEST_ASSERT(0 == cx_vcmp_double(-13.37, d)); |
|
1223 |
|
1224 CX_TEST_ASSERT(0 == cx_strtod(cx_str("-4.711e+1"), &d)); |
|
1225 CX_TEST_ASSERT(0 == cx_vcmp_double(-47.11, d)); |
1188 |
1226 |
1189 CX_TEST_ASSERT(0 == cx_strtod(cx_str("1.67262192595e-27"), &d)); |
1227 CX_TEST_ASSERT(0 == cx_strtod(cx_str("1.67262192595e-27"), &d)); |
1190 CX_TEST_ASSERT(1.67262192595e-27 == d); |
1228 CX_TEST_ASSERT(0 == cx_vcmp_double(1.67262192595e-27, d)); |
1191 |
1229 |
1192 CX_TEST_ASSERT(0 == cx_strtod_lc(cx_str("138,339.4"), &d, '.', ",")); |
1230 CX_TEST_ASSERT(0 == cx_strtod_lc(cx_str("138,339.4"), &d, '.', ",")); |
1193 CX_TEST_ASSERT(138339.4 == d); |
1231 CX_TEST_ASSERT(0 == cx_vcmp_double(138339.4, d)); |
1194 |
1232 |
1195 CX_TEST_ASSERT(0 == cx_strtod_lc(cx_str("138,339.4"), &d, ',', ".")); |
1233 CX_TEST_ASSERT(0 == cx_strtod_lc(cx_str("138,339.4"), &d, ',', ".")); |
1196 CX_TEST_ASSERT(138.3394 == d); |
1234 CX_TEST_ASSERT(0 == cx_vcmp_double(138.3394, d)); |
1197 } |
1235 |
1198 } |
1236 // TODO: test and improve support for big numbers, precision, and out-of-range detection |
1199 |
|
1200 CX_TEST(test_string_to_float_german) { |
|
1201 float f; |
|
1202 CX_TEST_DO { |
|
1203 // TODO: implement |
|
1204 (void)f; |
|
1205 } |
1237 } |
1206 } |
1238 } |
1207 |
1239 |
1208 CxTestSuite *cx_test_suite_string(void) { |
1240 CxTestSuite *cx_test_suite_string(void) { |
1209 CxTestSuite *suite = cx_test_suite_new("string"); |
1241 CxTestSuite *suite = cx_test_suite_new("string"); |