19750e409Sopenharmony_ci/*
29750e409Sopenharmony_ci  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
39750e409Sopenharmony_ci
49750e409Sopenharmony_ci  Permission is hereby granted, free of charge, to any person obtaining a copy
59750e409Sopenharmony_ci  of this software and associated documentation files (the "Software"), to deal
69750e409Sopenharmony_ci  in the Software without restriction, including without limitation the rights
79750e409Sopenharmony_ci  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
89750e409Sopenharmony_ci  copies of the Software, and to permit persons to whom the Software is
99750e409Sopenharmony_ci  furnished to do so, subject to the following conditions:
109750e409Sopenharmony_ci
119750e409Sopenharmony_ci  The above copyright notice and this permission notice shall be included in
129750e409Sopenharmony_ci  all copies or substantial portions of the Software.
139750e409Sopenharmony_ci
149750e409Sopenharmony_ci  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
159750e409Sopenharmony_ci  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
169750e409Sopenharmony_ci  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
179750e409Sopenharmony_ci  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
189750e409Sopenharmony_ci  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
199750e409Sopenharmony_ci  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
209750e409Sopenharmony_ci  THE SOFTWARE.
219750e409Sopenharmony_ci*/
229750e409Sopenharmony_ci
239750e409Sopenharmony_ci#include <stdio.h>
249750e409Sopenharmony_ci#include <stdlib.h>
259750e409Sopenharmony_ci#include <string.h>
269750e409Sopenharmony_ci
279750e409Sopenharmony_ci#include "unity/examples/unity_config.h"
289750e409Sopenharmony_ci#include "unity/src/unity.h"
299750e409Sopenharmony_ci#include "common.h"
309750e409Sopenharmony_ci
319750e409Sopenharmony_cistatic cJSON item[1];
329750e409Sopenharmony_ci
339750e409Sopenharmony_cistatic void assert_is_number(cJSON *number_item)
349750e409Sopenharmony_ci{
359750e409Sopenharmony_ci    TEST_ASSERT_NOT_NULL_MESSAGE(number_item, "Item is NULL.");
369750e409Sopenharmony_ci
379750e409Sopenharmony_ci    assert_not_in_list(number_item);
389750e409Sopenharmony_ci    assert_has_no_child(number_item);
399750e409Sopenharmony_ci    assert_has_type(number_item, cJSON_Number);
409750e409Sopenharmony_ci    assert_has_no_reference(number_item);
419750e409Sopenharmony_ci    assert_has_no_const_string(number_item);
429750e409Sopenharmony_ci    assert_has_no_valuestring(number_item);
439750e409Sopenharmony_ci    assert_has_no_string(number_item);
449750e409Sopenharmony_ci}
459750e409Sopenharmony_ci
469750e409Sopenharmony_cistatic void assert_parse_number(const char *string, int integer, double real)
479750e409Sopenharmony_ci{
489750e409Sopenharmony_ci    parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
499750e409Sopenharmony_ci    buffer.content = (const unsigned char*)string;
509750e409Sopenharmony_ci    buffer.length = strlen(string) + sizeof("");
519750e409Sopenharmony_ci
529750e409Sopenharmony_ci    TEST_ASSERT_TRUE(parse_number(item, &buffer));
539750e409Sopenharmony_ci    assert_is_number(item);
549750e409Sopenharmony_ci    TEST_ASSERT_EQUAL_INT(integer, item->valueint);
559750e409Sopenharmony_ci    TEST_ASSERT_EQUAL_DOUBLE(real, item->valuedouble);
569750e409Sopenharmony_ci}
579750e409Sopenharmony_ci
589750e409Sopenharmony_ci#ifdef __CJSON_USE_INT64
599750e409Sopenharmony_cistatic void assert_is_int64(cJSON *int64_number_item)
609750e409Sopenharmony_ci{
619750e409Sopenharmony_ci    assert_is_number(int64_number_item);
629750e409Sopenharmony_ci    TEST_ASSERT_BITS_MESSAGE(cJSON_IsInt64, cJSON_IsInt64, int64_number_item->type, "Item should be a int64 integer");
639750e409Sopenharmony_ci}
649750e409Sopenharmony_ci
659750e409Sopenharmony_cistatic void assert_parse_int64_number(const char *string, long long integer, double real)
669750e409Sopenharmony_ci{
679750e409Sopenharmony_ci    parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
689750e409Sopenharmony_ci    buffer.content = (const unsigned char*)string;
699750e409Sopenharmony_ci    buffer.length = strlen(string) + sizeof("");
709750e409Sopenharmony_ci
719750e409Sopenharmony_ci    TEST_ASSERT_TRUE(parse_number(item, &buffer));
729750e409Sopenharmony_ci    TEST_ASSERT_EQUAL_INT64(integer, item->valueint);
739750e409Sopenharmony_ci    TEST_ASSERT_EQUAL_DOUBLE(real, item->valuedouble);
749750e409Sopenharmony_ci}
759750e409Sopenharmony_ci
769750e409Sopenharmony_cistatic void assert_parse_int64_number_with_type(const char *string, long long integer, double real)
779750e409Sopenharmony_ci{
789750e409Sopenharmony_ci    assert_parse_int64_number(string, integer, real);
799750e409Sopenharmony_ci    assert_is_int64(item);
809750e409Sopenharmony_ci}
819750e409Sopenharmony_ci#endif /* __CJSON_USE_INT64 */
829750e409Sopenharmony_ci
839750e409Sopenharmony_cistatic void parse_number_should_parse_zero(void)
849750e409Sopenharmony_ci{
859750e409Sopenharmony_ci    assert_parse_number("0", 0, 0);
869750e409Sopenharmony_ci    assert_parse_number("0.0", 0, 0.0);
879750e409Sopenharmony_ci    assert_parse_number("-0", 0, -0.0);
889750e409Sopenharmony_ci}
899750e409Sopenharmony_ci
909750e409Sopenharmony_cistatic void parse_number_should_parse_negative_integers(void)
919750e409Sopenharmony_ci{
929750e409Sopenharmony_ci    assert_parse_number("-1", -1, -1);
939750e409Sopenharmony_ci    assert_parse_number("-32768", -32768, -32768.0);
949750e409Sopenharmony_ci    assert_parse_number("-2147483648", (int)-2147483648.0, -2147483648.0);
959750e409Sopenharmony_ci}
969750e409Sopenharmony_ci
979750e409Sopenharmony_cistatic void parse_number_should_parse_positive_integers(void)
989750e409Sopenharmony_ci{
999750e409Sopenharmony_ci    assert_parse_number("1", 1, 1);
1009750e409Sopenharmony_ci    assert_parse_number("32767", 32767, 32767.0);
1019750e409Sopenharmony_ci    assert_parse_number("2147483647", (int)2147483647.0, 2147483647.0);
1029750e409Sopenharmony_ci}
1039750e409Sopenharmony_ci
1049750e409Sopenharmony_cistatic void parse_number_should_parse_positive_reals(void)
1059750e409Sopenharmony_ci{
1069750e409Sopenharmony_ci    assert_parse_number("0.001", 0, 0.001);
1079750e409Sopenharmony_ci    assert_parse_number("10e-10", 0, 10e-10);
1089750e409Sopenharmony_ci    assert_parse_number("10E-10", 0, 10e-10);
1099750e409Sopenharmony_ci#ifdef __CJSON_USE_INT64
1109750e409Sopenharmony_ci    assert_parse_int64_number("10e10", 100000000000LL, 10e10);
1119750e409Sopenharmony_ci    assert_parse_int64_number("123e+127", LLONG_MAX, 123e127);
1129750e409Sopenharmony_ci#else
1139750e409Sopenharmony_ci    assert_parse_number("10e10", INT_MAX, 10e10);
1149750e409Sopenharmony_ci    assert_parse_number("123e+127", INT_MAX, 123e127);
1159750e409Sopenharmony_ci#endif /* __CJSON_USE_INT64 */
1169750e409Sopenharmony_ci    assert_parse_number("123e-128", 0, 123e-128);
1179750e409Sopenharmony_ci}
1189750e409Sopenharmony_ci
1199750e409Sopenharmony_cistatic void parse_number_should_parse_negative_reals(void)
1209750e409Sopenharmony_ci{
1219750e409Sopenharmony_ci    assert_parse_number("-0.001", 0, -0.001);
1229750e409Sopenharmony_ci    assert_parse_number("-10e-10", 0, -10e-10);
1239750e409Sopenharmony_ci    assert_parse_number("-10E-10", 0, -10e-10);
1249750e409Sopenharmony_ci#ifdef __CJSON_USE_INT64
1259750e409Sopenharmony_ci    assert_parse_int64_number("-10e20", LLONG_MIN, -10e20);
1269750e409Sopenharmony_ci    assert_parse_int64_number("-123e+127", LLONG_MIN, -123e127);
1279750e409Sopenharmony_ci#else
1289750e409Sopenharmony_ci    assert_parse_number("-10e20", INT_MIN, -10e20);
1299750e409Sopenharmony_ci    assert_parse_number("-123e+127", INT_MIN, -123e127);
1309750e409Sopenharmony_ci#endif /* __CJSON_USE_INT64 */
1319750e409Sopenharmony_ci    assert_parse_number("-123e-128", 0, -123e-128);
1329750e409Sopenharmony_ci}
1339750e409Sopenharmony_ci
1349750e409Sopenharmony_ci#ifdef __CJSON_USE_INT64
1359750e409Sopenharmony_cistatic void parse_number_should_parse_int64_numbers(void)
1369750e409Sopenharmony_ci{
1379750e409Sopenharmony_ci    assert_parse_int64_number_with_type("0", 0LL, 0);
1389750e409Sopenharmony_ci    assert_parse_int64_number_with_type("-1", -1LL, -1);
1399750e409Sopenharmony_ci    assert_parse_int64_number_with_type("-32768", -32768LL, -32768.0);
1409750e409Sopenharmony_ci    assert_parse_int64_number_with_type("-2147483648", -2147483648LL, -2147483648.0);
1419750e409Sopenharmony_ci    assert_parse_int64_number_with_type("2147483648", (long long)INT_MAX + 1, 2147483648.0);
1429750e409Sopenharmony_ci    assert_parse_int64_number_with_type("-2147483649", -2147483649LL, -2147483649.0);
1439750e409Sopenharmony_ci    assert_parse_int64_number_with_type("9223372036854775807", LLONG_MAX, 9223372036854775807.0);
1449750e409Sopenharmony_ci    assert_parse_int64_number_with_type("-9223372036854775808", LLONG_MIN, -9223372036854775808.0);
1459750e409Sopenharmony_ci}
1469750e409Sopenharmony_ci#endif /* __CJSON_USE_INT64 */
1479750e409Sopenharmony_ci
1489750e409Sopenharmony_ciint CJSON_CDECL main(void)
1499750e409Sopenharmony_ci{
1509750e409Sopenharmony_ci    /* initialize cJSON item */
1519750e409Sopenharmony_ci    memset(item, 0, sizeof(cJSON));
1529750e409Sopenharmony_ci    UNITY_BEGIN();
1539750e409Sopenharmony_ci    RUN_TEST(parse_number_should_parse_zero);
1549750e409Sopenharmony_ci    RUN_TEST(parse_number_should_parse_negative_integers);
1559750e409Sopenharmony_ci    RUN_TEST(parse_number_should_parse_positive_integers);
1569750e409Sopenharmony_ci    RUN_TEST(parse_number_should_parse_positive_reals);
1579750e409Sopenharmony_ci    RUN_TEST(parse_number_should_parse_negative_reals);
1589750e409Sopenharmony_ci#ifdef __CJSON_USE_INT64
1599750e409Sopenharmony_ci    RUN_TEST(parse_number_should_parse_int64_numbers);
1609750e409Sopenharmony_ci#endif
1619750e409Sopenharmony_ci    return UNITY_END();
1629750e409Sopenharmony_ci}
163