374 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
374 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
375 CX_TEST_ASSERT(cxJsonIsNumber(v)); |
375 CX_TEST_ASSERT(cxJsonIsNumber(v)); |
376 CX_TEST_ASSERT(cxJsonAsInteger(v) == 12300); |
376 CX_TEST_ASSERT(cxJsonAsInteger(v) == 12300); |
377 CX_TEST_ASSERT(cxJsonAsDouble(v) == 12300.0); |
377 CX_TEST_ASSERT(cxJsonAsDouble(v) == 12300.0); |
378 cxJsonValueFree(v); |
378 cxJsonValueFree(v); |
|
379 |
|
380 cxJsonFill(&json, "18446744073709551615.0123456789 "); |
|
381 result = cxJsonNext(&json, &v); |
|
382 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
|
383 CX_TEST_ASSERT(cxJsonIsNumber(v)); |
|
384 // be as precise as possible |
|
385 CX_TEST_ASSERT(cxJsonAsDouble(v) == 1.8446744073709552e+19); |
|
386 cxJsonValueFree(v); |
379 } |
387 } |
380 cxJsonDestroy(&json); |
388 cxJsonDestroy(&json); |
381 } |
389 } |
382 |
390 |
383 CX_TEST(test_json_number_format_errors) { |
391 CX_TEST(test_json_number_format_errors) { |
392 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, |
400 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, |
393 "leading plus is not RFC-8259 compliant"); |
401 "leading plus is not RFC-8259 compliant"); |
394 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); |
402 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); |
395 cxJsonReset(&json); |
403 cxJsonReset(&json); |
396 |
404 |
397 #if 0 // TODO: discuss if it is intended that this produces -47 as valid value |
|
398 cxJsonFill(&json, "-47,11e2 "); |
|
399 result = cxJsonNext(&json, &v); |
|
400 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN, |
|
401 "decimal separator cannot be a comma"); |
|
402 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); |
|
403 cxJsonReset(&json); |
|
404 #endif |
|
405 |
|
406 cxJsonFill(&json, "0.815e-3.0 "); |
405 cxJsonFill(&json, "0.815e-3.0 "); |
407 result = cxJsonNext(&json, &v); |
406 result = cxJsonNext(&json, &v); |
408 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, |
407 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, |
409 "exponent must be an integer"); |
408 "exponent must be an integer"); |
410 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); |
409 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); |
447 |
446 |
448 cxJsonFill(&json, "184467440737095516150123456789 "); |
447 cxJsonFill(&json, "184467440737095516150123456789 "); |
449 result = cxJsonNext(&json, &v); |
448 result = cxJsonNext(&json, &v); |
450 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, |
449 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, |
451 "30 digit int does not fit into 64-bit int"); |
450 "30 digit int does not fit into 64-bit int"); |
452 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); |
|
453 cxJsonReset(&json); |
|
454 |
|
455 cxJsonFill(&json, "18446744073709551615.0123456789 "); |
|
456 result = cxJsonNext(&json, &v); |
|
457 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, |
|
458 "numbers with more than 30 characters are unsupported in general"); |
|
459 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); |
451 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); |
460 cxJsonReset(&json); |
452 cxJsonReset(&json); |
461 } |
453 } |
462 cxJsonDestroy(&json); |
454 cxJsonDestroy(&json); |
463 } |
455 } |