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