153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2016 Arun Raghavan <mail@arunraghavan.net> 553a5a1b3Sopenharmony_ci 653a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 753a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 853a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 953a5a1b3Sopenharmony_ci or (at your option) any later version. 1053a5a1b3Sopenharmony_ci 1153a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1253a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1353a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1453a5a1b3Sopenharmony_ci General Public License for more details. 1553a5a1b3Sopenharmony_ci 1653a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1753a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1853a5a1b3Sopenharmony_ci***/ 1953a5a1b3Sopenharmony_ci 2053a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2153a5a1b3Sopenharmony_ci#include <config.h> 2253a5a1b3Sopenharmony_ci#endif 2353a5a1b3Sopenharmony_ci 2453a5a1b3Sopenharmony_ci#include <check.h> 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <pulse/xmalloc.h> 2753a5a1b3Sopenharmony_ci#include <pulsecore/core-util.h> 2853a5a1b3Sopenharmony_ci#include <pulsecore/json.h> 2953a5a1b3Sopenharmony_ci 3053a5a1b3Sopenharmony_ciSTART_TEST (string_test) { 3153a5a1b3Sopenharmony_ci pa_json_object *o; 3253a5a1b3Sopenharmony_ci unsigned int i; 3353a5a1b3Sopenharmony_ci const char *strings_parse[] = { 3453a5a1b3Sopenharmony_ci "\"\"", "\"test\"", "\"test123\"", "\"123\"", "\"newline\\n\"", "\" spaces \"", 3553a5a1b3Sopenharmony_ci " \"lots of spaces\" ", "\"esc\\nape\"", "\"escape a \\\" quote\"", 3653a5a1b3Sopenharmony_ci }; 3753a5a1b3Sopenharmony_ci const char *strings_compare[] = { 3853a5a1b3Sopenharmony_ci "", "test", "test123", "123", "newline\n", " spaces ", 3953a5a1b3Sopenharmony_ci "lots of spaces", "esc\nape", "escape a \" quote", 4053a5a1b3Sopenharmony_ci }; 4153a5a1b3Sopenharmony_ci 4253a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(strings_parse); i++) { 4353a5a1b3Sopenharmony_ci o = pa_json_parse(strings_parse[i]); 4453a5a1b3Sopenharmony_ci 4553a5a1b3Sopenharmony_ci fail_unless(o != NULL); 4653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_STRING); 4753a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(o), strings_compare[i])); 4853a5a1b3Sopenharmony_ci 4953a5a1b3Sopenharmony_ci pa_json_object_free(o); 5053a5a1b3Sopenharmony_ci } 5153a5a1b3Sopenharmony_ci} 5253a5a1b3Sopenharmony_ciEND_TEST 5353a5a1b3Sopenharmony_ci 5453a5a1b3Sopenharmony_ciSTART_TEST (encoder_string_test) { 5553a5a1b3Sopenharmony_ci const char *test_strings[] = { 5653a5a1b3Sopenharmony_ci "", "test", "test123", "123", "newline\n", " spaces ", 5753a5a1b3Sopenharmony_ci "lots of spaces", "esc\nape", "escape a \" quote", 5853a5a1b3Sopenharmony_ci }; 5953a5a1b3Sopenharmony_ci 6053a5a1b3Sopenharmony_ci pa_json_object *o; 6153a5a1b3Sopenharmony_ci unsigned int i; 6253a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 6353a5a1b3Sopenharmony_ci const pa_json_object *v; 6453a5a1b3Sopenharmony_ci char *received; 6553a5a1b3Sopenharmony_ci 6653a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 6753a5a1b3Sopenharmony_ci 6853a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_array(encoder); 6953a5a1b3Sopenharmony_ci 7053a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_strings); i++) { 7153a5a1b3Sopenharmony_ci pa_json_encoder_add_element_string(encoder, test_strings[i]); 7253a5a1b3Sopenharmony_ci } 7353a5a1b3Sopenharmony_ci 7453a5a1b3Sopenharmony_ci pa_json_encoder_end_array(encoder); 7553a5a1b3Sopenharmony_ci 7653a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 7753a5a1b3Sopenharmony_ci o = pa_json_parse(received); 7853a5a1b3Sopenharmony_ci pa_xfree(received); 7953a5a1b3Sopenharmony_ci 8053a5a1b3Sopenharmony_ci fail_unless(o != NULL); 8153a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 8253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == PA_ELEMENTSOF(test_strings)); 8353a5a1b3Sopenharmony_ci 8453a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_strings); i++) { 8553a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, i); 8653a5a1b3Sopenharmony_ci 8753a5a1b3Sopenharmony_ci fail_unless(v != NULL); 8853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_STRING); 8953a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(v), test_strings[i])); 9053a5a1b3Sopenharmony_ci } 9153a5a1b3Sopenharmony_ci 9253a5a1b3Sopenharmony_ci pa_json_object_free(o); 9353a5a1b3Sopenharmony_ci} 9453a5a1b3Sopenharmony_ciEND_TEST 9553a5a1b3Sopenharmony_ci 9653a5a1b3Sopenharmony_ciSTART_TEST(int_test) { 9753a5a1b3Sopenharmony_ci pa_json_object *o; 9853a5a1b3Sopenharmony_ci unsigned int i; 9953a5a1b3Sopenharmony_ci const char *ints_parse[] = { "1", "-1", "1234", "0" }; 10053a5a1b3Sopenharmony_ci const int64_t ints_compare[] = { 1, -1, 1234, 0 }; 10153a5a1b3Sopenharmony_ci char *uint64_max_str; 10253a5a1b3Sopenharmony_ci 10353a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(ints_parse); i++) { 10453a5a1b3Sopenharmony_ci o = pa_json_parse(ints_parse[i]); 10553a5a1b3Sopenharmony_ci 10653a5a1b3Sopenharmony_ci fail_unless(o != NULL); 10753a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_INT); 10853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_int(o) == ints_compare[i]); 10953a5a1b3Sopenharmony_ci 11053a5a1b3Sopenharmony_ci pa_json_object_free(o); 11153a5a1b3Sopenharmony_ci } 11253a5a1b3Sopenharmony_ci 11353a5a1b3Sopenharmony_ci /* test that parser would fail on integer overflow */ 11453a5a1b3Sopenharmony_ci uint64_max_str = pa_sprintf_malloc("%"PRIu64, UINT64_MAX); 11553a5a1b3Sopenharmony_ci o = pa_json_parse(uint64_max_str); 11653a5a1b3Sopenharmony_ci fail_unless(o == NULL); 11753a5a1b3Sopenharmony_ci pa_xfree(uint64_max_str); 11853a5a1b3Sopenharmony_ci} 11953a5a1b3Sopenharmony_ciEND_TEST 12053a5a1b3Sopenharmony_ci 12153a5a1b3Sopenharmony_ciSTART_TEST(encoder_int_test) { 12253a5a1b3Sopenharmony_ci const int64_t test_ints[] = { 1, -1, 1234, 0, LONG_MIN, LONG_MAX }; 12353a5a1b3Sopenharmony_ci 12453a5a1b3Sopenharmony_ci pa_json_object *o; 12553a5a1b3Sopenharmony_ci unsigned int i; 12653a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 12753a5a1b3Sopenharmony_ci const pa_json_object *v; 12853a5a1b3Sopenharmony_ci char *received; 12953a5a1b3Sopenharmony_ci 13053a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 13153a5a1b3Sopenharmony_ci 13253a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_array(encoder); 13353a5a1b3Sopenharmony_ci 13453a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_ints); i++) { 13553a5a1b3Sopenharmony_ci pa_json_encoder_add_element_int(encoder, test_ints[i]); 13653a5a1b3Sopenharmony_ci } 13753a5a1b3Sopenharmony_ci 13853a5a1b3Sopenharmony_ci pa_json_encoder_end_array(encoder); 13953a5a1b3Sopenharmony_ci 14053a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 14153a5a1b3Sopenharmony_ci o = pa_json_parse(received); 14253a5a1b3Sopenharmony_ci pa_xfree(received); 14353a5a1b3Sopenharmony_ci 14453a5a1b3Sopenharmony_ci fail_unless(o != NULL); 14553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 14653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == PA_ELEMENTSOF(test_ints)); 14753a5a1b3Sopenharmony_ci 14853a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_ints); i++) { 14953a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, i); 15053a5a1b3Sopenharmony_ci 15153a5a1b3Sopenharmony_ci fail_unless(v != NULL); 15253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_INT); 15353a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_int(v) == test_ints[i]); 15453a5a1b3Sopenharmony_ci } 15553a5a1b3Sopenharmony_ci 15653a5a1b3Sopenharmony_ci pa_json_object_free(o); 15753a5a1b3Sopenharmony_ci} 15853a5a1b3Sopenharmony_ciEND_TEST 15953a5a1b3Sopenharmony_ci 16053a5a1b3Sopenharmony_ciSTART_TEST(double_test) { 16153a5a1b3Sopenharmony_ci pa_json_object *o; 16253a5a1b3Sopenharmony_ci unsigned int i; 16353a5a1b3Sopenharmony_ci char *very_large_double_str; 16453a5a1b3Sopenharmony_ci const char *doubles_parse[] = { 16553a5a1b3Sopenharmony_ci "1.0", "-1.1", "1234e2", "1234e0", "0.1234", "-0.1234", "1234e-1", "1234.5e-1", "1234.5e+2", 16653a5a1b3Sopenharmony_ci }; 16753a5a1b3Sopenharmony_ci const double doubles_compare[] = { 16853a5a1b3Sopenharmony_ci 1.0, -1.1, 123400.0, 1234.0, 0.1234, -0.1234, 123.4, 123.45, 123450.0, 16953a5a1b3Sopenharmony_ci }; 17053a5a1b3Sopenharmony_ci 17153a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(doubles_parse); i++) { 17253a5a1b3Sopenharmony_ci o = pa_json_parse(doubles_parse[i]); 17353a5a1b3Sopenharmony_ci 17453a5a1b3Sopenharmony_ci fail_unless(o != NULL); 17553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_DOUBLE); 17653a5a1b3Sopenharmony_ci fail_unless(PA_DOUBLE_IS_EQUAL(pa_json_object_get_double(o), doubles_compare[i])); 17753a5a1b3Sopenharmony_ci 17853a5a1b3Sopenharmony_ci pa_json_object_free(o); 17953a5a1b3Sopenharmony_ci } 18053a5a1b3Sopenharmony_ci 18153a5a1b3Sopenharmony_ci /* test that parser would fail on double exponent overflow */ 18253a5a1b3Sopenharmony_ci very_large_double_str = pa_sprintf_malloc("%"PRIu64"e%"PRIu64, UINT64_MAX, UINT64_MAX); 18353a5a1b3Sopenharmony_ci o = pa_json_parse(very_large_double_str); 18453a5a1b3Sopenharmony_ci fail_unless(o == NULL); 18553a5a1b3Sopenharmony_ci pa_xfree(very_large_double_str); 18653a5a1b3Sopenharmony_ci} 18753a5a1b3Sopenharmony_ciEND_TEST 18853a5a1b3Sopenharmony_ci 18953a5a1b3Sopenharmony_ciSTART_TEST(encoder_double_test) { 19053a5a1b3Sopenharmony_ci const double test_doubles[] = { 19153a5a1b3Sopenharmony_ci 1.0, -1.1, 123400.0, 1234.0, 0.1234, -0.1234, 123.4, 123.45, 123450.0, 19253a5a1b3Sopenharmony_ci }; 19353a5a1b3Sopenharmony_ci pa_json_object *o; 19453a5a1b3Sopenharmony_ci unsigned int i; 19553a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 19653a5a1b3Sopenharmony_ci const pa_json_object *v; 19753a5a1b3Sopenharmony_ci char *received; 19853a5a1b3Sopenharmony_ci 19953a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 20053a5a1b3Sopenharmony_ci 20153a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_array(encoder); 20253a5a1b3Sopenharmony_ci 20353a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_doubles); i++) { 20453a5a1b3Sopenharmony_ci pa_json_encoder_add_element_double(encoder, test_doubles[i], 6); 20553a5a1b3Sopenharmony_ci } 20653a5a1b3Sopenharmony_ci 20753a5a1b3Sopenharmony_ci pa_json_encoder_end_array(encoder); 20853a5a1b3Sopenharmony_ci 20953a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 21053a5a1b3Sopenharmony_ci o = pa_json_parse(received); 21153a5a1b3Sopenharmony_ci pa_xfree(received); 21253a5a1b3Sopenharmony_ci 21353a5a1b3Sopenharmony_ci fail_unless(o != NULL); 21453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 21553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == PA_ELEMENTSOF(test_doubles)); 21653a5a1b3Sopenharmony_ci 21753a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_doubles); i++) { 21853a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, i); 21953a5a1b3Sopenharmony_ci 22053a5a1b3Sopenharmony_ci fail_unless(v != NULL); 22153a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_DOUBLE); 22253a5a1b3Sopenharmony_ci fail_unless(PA_DOUBLE_IS_EQUAL(pa_json_object_get_double(v), test_doubles[i])); 22353a5a1b3Sopenharmony_ci } 22453a5a1b3Sopenharmony_ci 22553a5a1b3Sopenharmony_ci pa_json_object_free(o); 22653a5a1b3Sopenharmony_ci} 22753a5a1b3Sopenharmony_ciEND_TEST 22853a5a1b3Sopenharmony_ci 22953a5a1b3Sopenharmony_ciSTART_TEST(null_test) { 23053a5a1b3Sopenharmony_ci pa_json_object *o; 23153a5a1b3Sopenharmony_ci 23253a5a1b3Sopenharmony_ci o = pa_json_parse("null"); 23353a5a1b3Sopenharmony_ci 23453a5a1b3Sopenharmony_ci fail_unless(o != NULL); 23553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_NULL); 23653a5a1b3Sopenharmony_ci 23753a5a1b3Sopenharmony_ci pa_json_object_free(o); 23853a5a1b3Sopenharmony_ci} 23953a5a1b3Sopenharmony_ciEND_TEST 24053a5a1b3Sopenharmony_ci 24153a5a1b3Sopenharmony_ciSTART_TEST(encoder_null_test) { 24253a5a1b3Sopenharmony_ci pa_json_object *o; 24353a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 24453a5a1b3Sopenharmony_ci char *received; 24553a5a1b3Sopenharmony_ci 24653a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 24753a5a1b3Sopenharmony_ci pa_json_encoder_add_element_null(encoder); 24853a5a1b3Sopenharmony_ci 24953a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 25053a5a1b3Sopenharmony_ci o = pa_json_parse(received); 25153a5a1b3Sopenharmony_ci pa_xfree(received); 25253a5a1b3Sopenharmony_ci 25353a5a1b3Sopenharmony_ci fail_unless(o != NULL); 25453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_NULL); 25553a5a1b3Sopenharmony_ci 25653a5a1b3Sopenharmony_ci pa_json_object_free(o); 25753a5a1b3Sopenharmony_ci} 25853a5a1b3Sopenharmony_ciEND_TEST 25953a5a1b3Sopenharmony_ci 26053a5a1b3Sopenharmony_ciSTART_TEST(bool_test) { 26153a5a1b3Sopenharmony_ci pa_json_object *o; 26253a5a1b3Sopenharmony_ci 26353a5a1b3Sopenharmony_ci o = pa_json_parse("true"); 26453a5a1b3Sopenharmony_ci 26553a5a1b3Sopenharmony_ci fail_unless(o != NULL); 26653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_BOOL); 26753a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(o) == true); 26853a5a1b3Sopenharmony_ci 26953a5a1b3Sopenharmony_ci pa_json_object_free(o); 27053a5a1b3Sopenharmony_ci 27153a5a1b3Sopenharmony_ci o = pa_json_parse("false"); 27253a5a1b3Sopenharmony_ci 27353a5a1b3Sopenharmony_ci fail_unless(o != NULL); 27453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_BOOL); 27553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(o) == false); 27653a5a1b3Sopenharmony_ci 27753a5a1b3Sopenharmony_ci pa_json_object_free(o); 27853a5a1b3Sopenharmony_ci} 27953a5a1b3Sopenharmony_ciEND_TEST 28053a5a1b3Sopenharmony_ci 28153a5a1b3Sopenharmony_ciSTART_TEST(encoder_bool_test) { 28253a5a1b3Sopenharmony_ci const bool test_bools[] = { 28353a5a1b3Sopenharmony_ci true, false 28453a5a1b3Sopenharmony_ci }; 28553a5a1b3Sopenharmony_ci pa_json_object *o; 28653a5a1b3Sopenharmony_ci unsigned int i; 28753a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 28853a5a1b3Sopenharmony_ci const pa_json_object *v; 28953a5a1b3Sopenharmony_ci char *received; 29053a5a1b3Sopenharmony_ci 29153a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 29253a5a1b3Sopenharmony_ci 29353a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_array(encoder); 29453a5a1b3Sopenharmony_ci 29553a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_bools); i++) { 29653a5a1b3Sopenharmony_ci pa_json_encoder_add_element_bool(encoder, test_bools[i]); 29753a5a1b3Sopenharmony_ci } 29853a5a1b3Sopenharmony_ci 29953a5a1b3Sopenharmony_ci pa_json_encoder_end_array(encoder); 30053a5a1b3Sopenharmony_ci 30153a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 30253a5a1b3Sopenharmony_ci o = pa_json_parse(received); 30353a5a1b3Sopenharmony_ci pa_xfree(received); 30453a5a1b3Sopenharmony_ci 30553a5a1b3Sopenharmony_ci fail_unless(o != NULL); 30653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 30753a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == PA_ELEMENTSOF(test_bools)); 30853a5a1b3Sopenharmony_ci 30953a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_bools); i++) { 31053a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, i); 31153a5a1b3Sopenharmony_ci 31253a5a1b3Sopenharmony_ci fail_unless(v != NULL); 31353a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_BOOL); 31453a5a1b3Sopenharmony_ci fail_unless(PA_DOUBLE_IS_EQUAL(pa_json_object_get_bool(v), test_bools[i])); 31553a5a1b3Sopenharmony_ci } 31653a5a1b3Sopenharmony_ci 31753a5a1b3Sopenharmony_ci pa_json_object_free(o); 31853a5a1b3Sopenharmony_ci} 31953a5a1b3Sopenharmony_ciEND_TEST 32053a5a1b3Sopenharmony_ci 32153a5a1b3Sopenharmony_ciSTART_TEST(object_test) { 32253a5a1b3Sopenharmony_ci pa_json_object *o; 32353a5a1b3Sopenharmony_ci const pa_json_object *v; 32453a5a1b3Sopenharmony_ci 32553a5a1b3Sopenharmony_ci o = pa_json_parse(" { \"name\" : \"A Person\" } "); 32653a5a1b3Sopenharmony_ci 32753a5a1b3Sopenharmony_ci fail_unless(o != NULL); 32853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 32953a5a1b3Sopenharmony_ci 33053a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "name"); 33153a5a1b3Sopenharmony_ci fail_unless(v != NULL); 33253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_STRING); 33353a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(v), "A Person")); 33453a5a1b3Sopenharmony_ci 33553a5a1b3Sopenharmony_ci pa_json_object_free(o); 33653a5a1b3Sopenharmony_ci 33753a5a1b3Sopenharmony_ci o = pa_json_parse(" { \"age\" : -45.3e-0 } "); 33853a5a1b3Sopenharmony_ci 33953a5a1b3Sopenharmony_ci fail_unless(o != NULL); 34053a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 34153a5a1b3Sopenharmony_ci 34253a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "age"); 34353a5a1b3Sopenharmony_ci fail_unless(v != NULL); 34453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_DOUBLE); 34553a5a1b3Sopenharmony_ci fail_unless(PA_DOUBLE_IS_EQUAL(pa_json_object_get_double(v), -45.3)); 34653a5a1b3Sopenharmony_ci 34753a5a1b3Sopenharmony_ci pa_json_object_free(o); 34853a5a1b3Sopenharmony_ci 34953a5a1b3Sopenharmony_ci o = pa_json_parse("{\"person\":true}"); 35053a5a1b3Sopenharmony_ci 35153a5a1b3Sopenharmony_ci fail_unless(o != NULL); 35253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 35353a5a1b3Sopenharmony_ci 35453a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "person"); 35553a5a1b3Sopenharmony_ci fail_unless(v != NULL); 35653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_BOOL); 35753a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(v) == true); 35853a5a1b3Sopenharmony_ci 35953a5a1b3Sopenharmony_ci pa_json_object_free(o); 36053a5a1b3Sopenharmony_ci 36153a5a1b3Sopenharmony_ci o = pa_json_parse("{ \"parent\": { \"child\": false } }"); 36253a5a1b3Sopenharmony_ci fail_unless(o != NULL); 36353a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 36453a5a1b3Sopenharmony_ci 36553a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "parent"); 36653a5a1b3Sopenharmony_ci fail_unless(v != NULL); 36753a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_OBJECT); 36853a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(v, "child"); 36953a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_BOOL); 37053a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(v) == false); 37153a5a1b3Sopenharmony_ci 37253a5a1b3Sopenharmony_ci pa_json_object_free(o); 37353a5a1b3Sopenharmony_ci} 37453a5a1b3Sopenharmony_ciEND_TEST 37553a5a1b3Sopenharmony_ci 37653a5a1b3Sopenharmony_ciSTART_TEST(object_member_iterator_test) { 37753a5a1b3Sopenharmony_ci pa_json_object *o; 37853a5a1b3Sopenharmony_ci const pa_json_object *v; 37953a5a1b3Sopenharmony_ci const char *k; 38053a5a1b3Sopenharmony_ci void *state; 38153a5a1b3Sopenharmony_ci size_t i; 38253a5a1b3Sopenharmony_ci 38353a5a1b3Sopenharmony_ci struct { 38453a5a1b3Sopenharmony_ci bool visited; 38553a5a1b3Sopenharmony_ci const char *key; 38653a5a1b3Sopenharmony_ci pa_json_type type; 38753a5a1b3Sopenharmony_ci union { 38853a5a1b3Sopenharmony_ci const char *str; 38953a5a1b3Sopenharmony_ci int64_t n; 39053a5a1b3Sopenharmony_ci } value; 39153a5a1b3Sopenharmony_ci } expected_entries[] = { 39253a5a1b3Sopenharmony_ci { .key = "name", .type = PA_JSON_TYPE_STRING, .value.str = "sample 1" }, 39353a5a1b3Sopenharmony_ci { .key = "number", .type = PA_JSON_TYPE_INT, .value.n = 42 }, 39453a5a1b3Sopenharmony_ci }; 39553a5a1b3Sopenharmony_ci 39653a5a1b3Sopenharmony_ci o = pa_json_parse(" { \"name\" : \"sample 1\", \"number\": 42 } "); 39753a5a1b3Sopenharmony_ci 39853a5a1b3Sopenharmony_ci fail_unless(o != NULL); 39953a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 40053a5a1b3Sopenharmony_ci 40153a5a1b3Sopenharmony_ci PA_HASHMAP_FOREACH_KV(k, v, pa_json_object_get_object_member_hashmap(o), state) { 40253a5a1b3Sopenharmony_ci fail_unless(k != NULL); 40353a5a1b3Sopenharmony_ci fail_unless(v != NULL); 40453a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(expected_entries); ++i) { 40553a5a1b3Sopenharmony_ci if (pa_streq(expected_entries[i].key, k)) { 40653a5a1b3Sopenharmony_ci fail_unless(!expected_entries[i].visited); 40753a5a1b3Sopenharmony_ci fail_unless(expected_entries[i].type == pa_json_object_get_type(v)); 40853a5a1b3Sopenharmony_ci switch (expected_entries[i].type) { 40953a5a1b3Sopenharmony_ci case PA_JSON_TYPE_STRING: 41053a5a1b3Sopenharmony_ci fail_unless(pa_streq(expected_entries[i].value.str, pa_json_object_get_string(v))); 41153a5a1b3Sopenharmony_ci break; 41253a5a1b3Sopenharmony_ci case PA_JSON_TYPE_INT: 41353a5a1b3Sopenharmony_ci fail_unless(expected_entries[i].value.n == pa_json_object_get_int(v)); 41453a5a1b3Sopenharmony_ci break; 41553a5a1b3Sopenharmony_ci default: 41653a5a1b3Sopenharmony_ci /* unreachable */ 41753a5a1b3Sopenharmony_ci fail_unless(false); 41853a5a1b3Sopenharmony_ci break; 41953a5a1b3Sopenharmony_ci } 42053a5a1b3Sopenharmony_ci expected_entries[i].visited = true; 42153a5a1b3Sopenharmony_ci } 42253a5a1b3Sopenharmony_ci } 42353a5a1b3Sopenharmony_ci } 42453a5a1b3Sopenharmony_ci 42553a5a1b3Sopenharmony_ci pa_json_object_free(o); 42653a5a1b3Sopenharmony_ci} 42753a5a1b3Sopenharmony_ciEND_TEST 42853a5a1b3Sopenharmony_ci 42953a5a1b3Sopenharmony_ciSTART_TEST(encoder_object_test) { 43053a5a1b3Sopenharmony_ci pa_json_object *o; 43153a5a1b3Sopenharmony_ci const pa_json_object *v; 43253a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 43353a5a1b3Sopenharmony_ci char *received; 43453a5a1b3Sopenharmony_ci 43553a5a1b3Sopenharmony_ci /* { "name" : "A Person" } */ 43653a5a1b3Sopenharmony_ci 43753a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 43853a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(encoder); 43953a5a1b3Sopenharmony_ci pa_json_encoder_add_member_string(encoder, "name", "A Person"); 44053a5a1b3Sopenharmony_ci pa_json_encoder_end_object(encoder); 44153a5a1b3Sopenharmony_ci 44253a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 44353a5a1b3Sopenharmony_ci o = pa_json_parse(received); 44453a5a1b3Sopenharmony_ci pa_xfree(received); 44553a5a1b3Sopenharmony_ci 44653a5a1b3Sopenharmony_ci fail_unless(o != NULL); 44753a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 44853a5a1b3Sopenharmony_ci 44953a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "name"); 45053a5a1b3Sopenharmony_ci fail_unless(v != NULL); 45153a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_STRING); 45253a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(v), "A Person")); 45353a5a1b3Sopenharmony_ci 45453a5a1b3Sopenharmony_ci pa_json_object_free(o); 45553a5a1b3Sopenharmony_ci 45653a5a1b3Sopenharmony_ci /* { "age" : -45.3e-0 } */ 45753a5a1b3Sopenharmony_ci 45853a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 45953a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(encoder); 46053a5a1b3Sopenharmony_ci pa_json_encoder_add_member_double(encoder, "age", -45.3e-0, 2); 46153a5a1b3Sopenharmony_ci pa_json_encoder_end_object(encoder); 46253a5a1b3Sopenharmony_ci 46353a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 46453a5a1b3Sopenharmony_ci o = pa_json_parse(received); 46553a5a1b3Sopenharmony_ci pa_xfree(received); 46653a5a1b3Sopenharmony_ci 46753a5a1b3Sopenharmony_ci fail_unless(o != NULL); 46853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 46953a5a1b3Sopenharmony_ci 47053a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "age"); 47153a5a1b3Sopenharmony_ci fail_unless(v != NULL); 47253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_DOUBLE); 47353a5a1b3Sopenharmony_ci fail_unless(PA_DOUBLE_IS_EQUAL(pa_json_object_get_double(v), -45.3)); 47453a5a1b3Sopenharmony_ci 47553a5a1b3Sopenharmony_ci pa_json_object_free(o); 47653a5a1b3Sopenharmony_ci 47753a5a1b3Sopenharmony_ci /* {"person":true} */ 47853a5a1b3Sopenharmony_ci 47953a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 48053a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(encoder); 48153a5a1b3Sopenharmony_ci pa_json_encoder_add_member_bool(encoder, "person", true); 48253a5a1b3Sopenharmony_ci pa_json_encoder_end_object(encoder); 48353a5a1b3Sopenharmony_ci 48453a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 48553a5a1b3Sopenharmony_ci o = pa_json_parse(received); 48653a5a1b3Sopenharmony_ci pa_xfree(received); 48753a5a1b3Sopenharmony_ci 48853a5a1b3Sopenharmony_ci fail_unless(o != NULL); 48953a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 49053a5a1b3Sopenharmony_ci 49153a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "person"); 49253a5a1b3Sopenharmony_ci fail_unless(v != NULL); 49353a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_BOOL); 49453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(v) == true); 49553a5a1b3Sopenharmony_ci 49653a5a1b3Sopenharmony_ci pa_json_object_free(o); 49753a5a1b3Sopenharmony_ci} 49853a5a1b3Sopenharmony_ciEND_TEST 49953a5a1b3Sopenharmony_ci 50053a5a1b3Sopenharmony_ciSTART_TEST(encoder_member_object_test) { 50153a5a1b3Sopenharmony_ci pa_json_object *o; 50253a5a1b3Sopenharmony_ci const pa_json_object *v; 50353a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 50453a5a1b3Sopenharmony_ci char *received; 50553a5a1b3Sopenharmony_ci 50653a5a1b3Sopenharmony_ci /* { "parent": { "child": false } } */ 50753a5a1b3Sopenharmony_ci 50853a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 50953a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(encoder); 51053a5a1b3Sopenharmony_ci 51153a5a1b3Sopenharmony_ci pa_json_encoder_begin_member_object(encoder, "parent"); 51253a5a1b3Sopenharmony_ci pa_json_encoder_add_member_bool(encoder, "child", false); 51353a5a1b3Sopenharmony_ci pa_json_encoder_end_object(encoder); 51453a5a1b3Sopenharmony_ci 51553a5a1b3Sopenharmony_ci pa_json_encoder_end_object(encoder); 51653a5a1b3Sopenharmony_ci 51753a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 51853a5a1b3Sopenharmony_ci o = pa_json_parse(received); 51953a5a1b3Sopenharmony_ci pa_xfree(received); 52053a5a1b3Sopenharmony_ci 52153a5a1b3Sopenharmony_ci fail_unless(o != NULL); 52253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 52353a5a1b3Sopenharmony_ci 52453a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "parent"); 52553a5a1b3Sopenharmony_ci fail_unless(v != NULL); 52653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_OBJECT); 52753a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(v, "child"); 52853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_BOOL); 52953a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(v) == false); 53053a5a1b3Sopenharmony_ci 53153a5a1b3Sopenharmony_ci pa_json_object_free(o); 53253a5a1b3Sopenharmony_ci} 53353a5a1b3Sopenharmony_ciEND_TEST 53453a5a1b3Sopenharmony_ci 53553a5a1b3Sopenharmony_ciSTART_TEST(array_test) { 53653a5a1b3Sopenharmony_ci pa_json_object *o; 53753a5a1b3Sopenharmony_ci const pa_json_object *v, *v2; 53853a5a1b3Sopenharmony_ci 53953a5a1b3Sopenharmony_ci o = pa_json_parse(" [ ] "); 54053a5a1b3Sopenharmony_ci 54153a5a1b3Sopenharmony_ci fail_unless(o != NULL); 54253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 54353a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == 0); 54453a5a1b3Sopenharmony_ci 54553a5a1b3Sopenharmony_ci pa_json_object_free(o); 54653a5a1b3Sopenharmony_ci 54753a5a1b3Sopenharmony_ci o = pa_json_parse("[\"a member\"]"); 54853a5a1b3Sopenharmony_ci 54953a5a1b3Sopenharmony_ci fail_unless(o != NULL); 55053a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 55153a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == 1); 55253a5a1b3Sopenharmony_ci 55353a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, 0); 55453a5a1b3Sopenharmony_ci fail_unless(v != NULL); 55553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_STRING); 55653a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(v), "a member")); 55753a5a1b3Sopenharmony_ci 55853a5a1b3Sopenharmony_ci pa_json_object_free(o); 55953a5a1b3Sopenharmony_ci 56053a5a1b3Sopenharmony_ci o = pa_json_parse("[\"a member\", 1234.5, { \"another\": true } ]"); 56153a5a1b3Sopenharmony_ci 56253a5a1b3Sopenharmony_ci fail_unless(o != NULL); 56353a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 56453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == 3); 56553a5a1b3Sopenharmony_ci 56653a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, 0); 56753a5a1b3Sopenharmony_ci fail_unless(v != NULL); 56853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_STRING); 56953a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(v), "a member")); 57053a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, 1); 57153a5a1b3Sopenharmony_ci fail_unless(v != NULL); 57253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_DOUBLE); 57353a5a1b3Sopenharmony_ci fail_unless(PA_DOUBLE_IS_EQUAL(pa_json_object_get_double(v), 1234.5)); 57453a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, 2); 57553a5a1b3Sopenharmony_ci fail_unless(v != NULL); 57653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_OBJECT); 57753a5a1b3Sopenharmony_ci v2 =pa_json_object_get_object_member(v, "another"); 57853a5a1b3Sopenharmony_ci fail_unless(v2 != NULL); 57953a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v2) == PA_JSON_TYPE_BOOL); 58053a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(v2) == true); 58153a5a1b3Sopenharmony_ci 58253a5a1b3Sopenharmony_ci pa_json_object_free(o); 58353a5a1b3Sopenharmony_ci} 58453a5a1b3Sopenharmony_ciEND_TEST 58553a5a1b3Sopenharmony_ci 58653a5a1b3Sopenharmony_ciSTART_TEST(encoder_element_array_test) { 58753a5a1b3Sopenharmony_ci pa_json_object *o; 58853a5a1b3Sopenharmony_ci const pa_json_object *v, *v2; 58953a5a1b3Sopenharmony_ci 59053a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 59153a5a1b3Sopenharmony_ci char *received; 59253a5a1b3Sopenharmony_ci pa_json_encoder *subobject; 59353a5a1b3Sopenharmony_ci char *subobject_string; 59453a5a1b3Sopenharmony_ci 59553a5a1b3Sopenharmony_ci /* [ ] */ 59653a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 59753a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_array(encoder); 59853a5a1b3Sopenharmony_ci pa_json_encoder_end_array(encoder); 59953a5a1b3Sopenharmony_ci 60053a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 60153a5a1b3Sopenharmony_ci o = pa_json_parse(received); 60253a5a1b3Sopenharmony_ci pa_xfree(received); 60353a5a1b3Sopenharmony_ci 60453a5a1b3Sopenharmony_ci fail_unless(o != NULL); 60553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 60653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == 0); 60753a5a1b3Sopenharmony_ci 60853a5a1b3Sopenharmony_ci pa_json_object_free(o); 60953a5a1b3Sopenharmony_ci 61053a5a1b3Sopenharmony_ci /* ["a member"] */ 61153a5a1b3Sopenharmony_ci 61253a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 61353a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_array(encoder); 61453a5a1b3Sopenharmony_ci pa_json_encoder_add_element_string(encoder, "a member"); 61553a5a1b3Sopenharmony_ci pa_json_encoder_end_array(encoder); 61653a5a1b3Sopenharmony_ci 61753a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 61853a5a1b3Sopenharmony_ci o = pa_json_parse(received); 61953a5a1b3Sopenharmony_ci pa_xfree(received); 62053a5a1b3Sopenharmony_ci 62153a5a1b3Sopenharmony_ci fail_unless(o != NULL); 62253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 62353a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == 1); 62453a5a1b3Sopenharmony_ci 62553a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, 0); 62653a5a1b3Sopenharmony_ci fail_unless(v != NULL); 62753a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_STRING); 62853a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(v), "a member")); 62953a5a1b3Sopenharmony_ci 63053a5a1b3Sopenharmony_ci pa_json_object_free(o); 63153a5a1b3Sopenharmony_ci 63253a5a1b3Sopenharmony_ci /* [\"a member\", 1234.5, { \"another\": true } ] */ 63353a5a1b3Sopenharmony_ci 63453a5a1b3Sopenharmony_ci subobject = pa_json_encoder_new(); 63553a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(subobject); 63653a5a1b3Sopenharmony_ci pa_json_encoder_add_member_bool(subobject, "another", true); 63753a5a1b3Sopenharmony_ci pa_json_encoder_end_object(subobject); 63853a5a1b3Sopenharmony_ci subobject_string = pa_json_encoder_to_string_free(subobject); 63953a5a1b3Sopenharmony_ci 64053a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 64153a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_array(encoder); 64253a5a1b3Sopenharmony_ci pa_json_encoder_add_element_string(encoder, "a member"); 64353a5a1b3Sopenharmony_ci pa_json_encoder_add_element_double(encoder, 1234.5, 1); 64453a5a1b3Sopenharmony_ci pa_json_encoder_add_element_raw_json(encoder, subobject_string); 64553a5a1b3Sopenharmony_ci pa_xfree(subobject_string); 64653a5a1b3Sopenharmony_ci pa_json_encoder_end_array(encoder); 64753a5a1b3Sopenharmony_ci 64853a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 64953a5a1b3Sopenharmony_ci o = pa_json_parse(received); 65053a5a1b3Sopenharmony_ci pa_xfree(received); 65153a5a1b3Sopenharmony_ci 65253a5a1b3Sopenharmony_ci fail_unless(o != NULL); 65353a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_ARRAY); 65453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(o) == 3); 65553a5a1b3Sopenharmony_ci 65653a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, 0); 65753a5a1b3Sopenharmony_ci fail_unless(v != NULL); 65853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_STRING); 65953a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(v), "a member")); 66053a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, 1); 66153a5a1b3Sopenharmony_ci fail_unless(v != NULL); 66253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_DOUBLE); 66353a5a1b3Sopenharmony_ci fail_unless(PA_DOUBLE_IS_EQUAL(pa_json_object_get_double(v), 1234.5)); 66453a5a1b3Sopenharmony_ci v = pa_json_object_get_array_member(o, 2); 66553a5a1b3Sopenharmony_ci fail_unless(v != NULL); 66653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_OBJECT); 66753a5a1b3Sopenharmony_ci v2 =pa_json_object_get_object_member(v, "another"); 66853a5a1b3Sopenharmony_ci fail_unless(v2 != NULL); 66953a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v2) == PA_JSON_TYPE_BOOL); 67053a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(v2) == true); 67153a5a1b3Sopenharmony_ci 67253a5a1b3Sopenharmony_ci pa_json_object_free(o); 67353a5a1b3Sopenharmony_ci} 67453a5a1b3Sopenharmony_ciEND_TEST 67553a5a1b3Sopenharmony_ci 67653a5a1b3Sopenharmony_ciSTART_TEST(encoder_member_array_test) { 67753a5a1b3Sopenharmony_ci pa_json_object *o; 67853a5a1b3Sopenharmony_ci unsigned int i; 67953a5a1b3Sopenharmony_ci const pa_json_object *v; 68053a5a1b3Sopenharmony_ci const pa_json_object *e; 68153a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 68253a5a1b3Sopenharmony_ci char *received; 68353a5a1b3Sopenharmony_ci 68453a5a1b3Sopenharmony_ci const int64_t test_ints[] = { 1, -1, 1234, 0, LONG_MIN, LONG_MAX }; 68553a5a1b3Sopenharmony_ci 68653a5a1b3Sopenharmony_ci /* { "parameters": [ 1, -1, 1234, 0, -9223372036854775808, 9223372036854775807 ] } */ 68753a5a1b3Sopenharmony_ci 68853a5a1b3Sopenharmony_ci 68953a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 69053a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(encoder); 69153a5a1b3Sopenharmony_ci 69253a5a1b3Sopenharmony_ci pa_json_encoder_begin_member_array(encoder, "parameters"); 69353a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_ints); i++) { 69453a5a1b3Sopenharmony_ci pa_json_encoder_add_element_int(encoder, test_ints[i]); 69553a5a1b3Sopenharmony_ci } 69653a5a1b3Sopenharmony_ci pa_json_encoder_end_array(encoder); 69753a5a1b3Sopenharmony_ci 69853a5a1b3Sopenharmony_ci pa_json_encoder_end_object(encoder); 69953a5a1b3Sopenharmony_ci 70053a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 70153a5a1b3Sopenharmony_ci o = pa_json_parse(received); 70253a5a1b3Sopenharmony_ci pa_xfree(received); 70353a5a1b3Sopenharmony_ci 70453a5a1b3Sopenharmony_ci fail_unless(o != NULL); 70553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 70653a5a1b3Sopenharmony_ci 70753a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "parameters"); 70853a5a1b3Sopenharmony_ci fail_unless(v != NULL); 70953a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_ARRAY); 71053a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(v) == PA_ELEMENTSOF(test_ints)); 71153a5a1b3Sopenharmony_ci 71253a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(test_ints); i++) { 71353a5a1b3Sopenharmony_ci e = pa_json_object_get_array_member(v, i); 71453a5a1b3Sopenharmony_ci 71553a5a1b3Sopenharmony_ci fail_unless(e != NULL); 71653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(e) == PA_JSON_TYPE_INT); 71753a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_int(e) == test_ints[i]); 71853a5a1b3Sopenharmony_ci } 71953a5a1b3Sopenharmony_ci 72053a5a1b3Sopenharmony_ci pa_json_object_free(o); 72153a5a1b3Sopenharmony_ci} 72253a5a1b3Sopenharmony_ciEND_TEST 72353a5a1b3Sopenharmony_ci 72453a5a1b3Sopenharmony_ciSTART_TEST(encoder_member_raw_json_test) { 72553a5a1b3Sopenharmony_ci pa_json_object *o; 72653a5a1b3Sopenharmony_ci const pa_json_object *v; 72753a5a1b3Sopenharmony_ci const pa_json_object *e; 72853a5a1b3Sopenharmony_ci pa_json_encoder *encoder; 72953a5a1b3Sopenharmony_ci char *received; 73053a5a1b3Sopenharmony_ci pa_json_encoder *subobject; 73153a5a1b3Sopenharmony_ci char *subobject_string; 73253a5a1b3Sopenharmony_ci 73353a5a1b3Sopenharmony_ci /* { "parameters": [1, "a", 2.0] } */ 73453a5a1b3Sopenharmony_ci 73553a5a1b3Sopenharmony_ci subobject = pa_json_encoder_new(); 73653a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_array(subobject); 73753a5a1b3Sopenharmony_ci pa_json_encoder_add_element_int(subobject, 1); 73853a5a1b3Sopenharmony_ci pa_json_encoder_add_element_string(subobject, "a"); 73953a5a1b3Sopenharmony_ci pa_json_encoder_add_element_double(subobject, 2.0, 6); 74053a5a1b3Sopenharmony_ci pa_json_encoder_end_array(subobject); 74153a5a1b3Sopenharmony_ci subobject_string = pa_json_encoder_to_string_free(subobject); 74253a5a1b3Sopenharmony_ci 74353a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 74453a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(encoder); 74553a5a1b3Sopenharmony_ci 74653a5a1b3Sopenharmony_ci pa_json_encoder_add_member_raw_json(encoder, "parameters", subobject_string); 74753a5a1b3Sopenharmony_ci pa_xfree(subobject_string); 74853a5a1b3Sopenharmony_ci 74953a5a1b3Sopenharmony_ci pa_json_encoder_end_object(encoder); 75053a5a1b3Sopenharmony_ci 75153a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 75253a5a1b3Sopenharmony_ci o = pa_json_parse(received); 75353a5a1b3Sopenharmony_ci pa_xfree(received); 75453a5a1b3Sopenharmony_ci 75553a5a1b3Sopenharmony_ci fail_unless(o != NULL); 75653a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 75753a5a1b3Sopenharmony_ci 75853a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "parameters"); 75953a5a1b3Sopenharmony_ci fail_unless(v != NULL); 76053a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_ARRAY); 76153a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_array_length(v) == 3); 76253a5a1b3Sopenharmony_ci e = pa_json_object_get_array_member(v, 0); 76353a5a1b3Sopenharmony_ci fail_unless(e != NULL); 76453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(e) == PA_JSON_TYPE_INT); 76553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_int(e) == 1); 76653a5a1b3Sopenharmony_ci e = pa_json_object_get_array_member(v, 1); 76753a5a1b3Sopenharmony_ci fail_unless(e != NULL); 76853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(e) == PA_JSON_TYPE_STRING); 76953a5a1b3Sopenharmony_ci fail_unless(pa_streq(pa_json_object_get_string(e), "a")); 77053a5a1b3Sopenharmony_ci e = pa_json_object_get_array_member(v, 2); 77153a5a1b3Sopenharmony_ci fail_unless(e != NULL); 77253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(e) == PA_JSON_TYPE_DOUBLE); 77353a5a1b3Sopenharmony_ci fail_unless(PA_DOUBLE_IS_EQUAL(pa_json_object_get_double(e), 2.0)); 77453a5a1b3Sopenharmony_ci 77553a5a1b3Sopenharmony_ci pa_json_object_free(o); 77653a5a1b3Sopenharmony_ci 77753a5a1b3Sopenharmony_ci /* { "parent": { "child": false } } */ 77853a5a1b3Sopenharmony_ci 77953a5a1b3Sopenharmony_ci subobject = pa_json_encoder_new(); 78053a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(subobject); 78153a5a1b3Sopenharmony_ci pa_json_encoder_add_member_bool(subobject, "child", false); 78253a5a1b3Sopenharmony_ci pa_json_encoder_end_object(subobject); 78353a5a1b3Sopenharmony_ci subobject_string = pa_json_encoder_to_string_free(subobject); 78453a5a1b3Sopenharmony_ci 78553a5a1b3Sopenharmony_ci encoder = pa_json_encoder_new(); 78653a5a1b3Sopenharmony_ci pa_json_encoder_begin_element_object(encoder); 78753a5a1b3Sopenharmony_ci 78853a5a1b3Sopenharmony_ci pa_json_encoder_add_member_raw_json(encoder, "parent", subobject_string); 78953a5a1b3Sopenharmony_ci pa_xfree(subobject_string); 79053a5a1b3Sopenharmony_ci 79153a5a1b3Sopenharmony_ci pa_json_encoder_end_object(encoder); 79253a5a1b3Sopenharmony_ci 79353a5a1b3Sopenharmony_ci received = pa_json_encoder_to_string_free(encoder); 79453a5a1b3Sopenharmony_ci o = pa_json_parse(received); 79553a5a1b3Sopenharmony_ci pa_xfree(received); 79653a5a1b3Sopenharmony_ci 79753a5a1b3Sopenharmony_ci fail_unless(o != NULL); 79853a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(o) == PA_JSON_TYPE_OBJECT); 79953a5a1b3Sopenharmony_ci 80053a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(o, "parent"); 80153a5a1b3Sopenharmony_ci fail_unless(v != NULL); 80253a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_OBJECT); 80353a5a1b3Sopenharmony_ci v = pa_json_object_get_object_member(v, "child"); 80453a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_type(v) == PA_JSON_TYPE_BOOL); 80553a5a1b3Sopenharmony_ci fail_unless(pa_json_object_get_bool(v) == false); 80653a5a1b3Sopenharmony_ci 80753a5a1b3Sopenharmony_ci pa_json_object_free(o); 80853a5a1b3Sopenharmony_ci} 80953a5a1b3Sopenharmony_ciEND_TEST 81053a5a1b3Sopenharmony_ci 81153a5a1b3Sopenharmony_ciSTART_TEST(bad_test) { 81253a5a1b3Sopenharmony_ci unsigned int i; 81353a5a1b3Sopenharmony_ci const char *bad_parse[] = { 81453a5a1b3Sopenharmony_ci "\"" /* Quote not closed */, 81553a5a1b3Sopenharmony_ci "123456789012345678901234567890" /* Overflow */, 81653a5a1b3Sopenharmony_ci#if 0 /* TODO: check rounding the value is OK */ 81753a5a1b3Sopenharmony_ci "0.123456789012345678901234567890" /* Overflow */, 81853a5a1b3Sopenharmony_ci#endif 81953a5a1b3Sopenharmony_ci "1e123456789012345678901234567890" /* Overflow */, 82053a5a1b3Sopenharmony_ci "1e-10000" /* Underflow */, 82153a5a1b3Sopenharmony_ci "1e" /* Bad number string */, 82253a5a1b3Sopenharmony_ci "1." /* Bad number string */, 82353a5a1b3Sopenharmony_ci "1.e3" /* Bad number string */, 82453a5a1b3Sopenharmony_ci "-" /* Bad number string */, 82553a5a1b3Sopenharmony_ci "{ \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { \"a\": { } } } } } } } } } } } } } } } } } } } } } }" /* Nested too deep */, 82653a5a1b3Sopenharmony_ci "[ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ { \"a\": \"b\" } ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]" /* Nested too deep */, 82753a5a1b3Sopenharmony_ci "asdf" /* Unquoted string */, 82853a5a1b3Sopenharmony_ci "{ a: true }" /* Unquoted key in object */, 82953a5a1b3Sopenharmony_ci "\" \a\"" /* Alarm is not a valid character */ 83053a5a1b3Sopenharmony_ci }; 83153a5a1b3Sopenharmony_ci 83253a5a1b3Sopenharmony_ci for (i = 0; i < PA_ELEMENTSOF(bad_parse); i++) { 83353a5a1b3Sopenharmony_ci pa_json_object *obj; 83453a5a1b3Sopenharmony_ci 83553a5a1b3Sopenharmony_ci fail_unless((obj = pa_json_parse(bad_parse[i])) == NULL); 83653a5a1b3Sopenharmony_ci if (obj) 83753a5a1b3Sopenharmony_ci pa_json_object_free(obj); 83853a5a1b3Sopenharmony_ci } 83953a5a1b3Sopenharmony_ci} 84053a5a1b3Sopenharmony_ciEND_TEST 84153a5a1b3Sopenharmony_ci 84253a5a1b3Sopenharmony_ciint main(int argc, char *argv[]) { 84353a5a1b3Sopenharmony_ci int failed = 0; 84453a5a1b3Sopenharmony_ci Suite *s; 84553a5a1b3Sopenharmony_ci TCase *tc; 84653a5a1b3Sopenharmony_ci SRunner *sr; 84753a5a1b3Sopenharmony_ci 84853a5a1b3Sopenharmony_ci s = suite_create("JSON"); 84953a5a1b3Sopenharmony_ci tc = tcase_create("json"); 85053a5a1b3Sopenharmony_ci tcase_add_test(tc, string_test); 85153a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_string_test); 85253a5a1b3Sopenharmony_ci tcase_add_test(tc, int_test); 85353a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_int_test); 85453a5a1b3Sopenharmony_ci tcase_add_test(tc, double_test); 85553a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_double_test); 85653a5a1b3Sopenharmony_ci tcase_add_test(tc, null_test); 85753a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_null_test); 85853a5a1b3Sopenharmony_ci tcase_add_test(tc, bool_test); 85953a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_bool_test); 86053a5a1b3Sopenharmony_ci tcase_add_test(tc, object_test); 86153a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_member_object_test); 86253a5a1b3Sopenharmony_ci tcase_add_test(tc, object_member_iterator_test); 86353a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_object_test); 86453a5a1b3Sopenharmony_ci tcase_add_test(tc, array_test); 86553a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_element_array_test); 86653a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_member_array_test); 86753a5a1b3Sopenharmony_ci tcase_add_test(tc, encoder_member_raw_json_test); 86853a5a1b3Sopenharmony_ci tcase_add_test(tc, bad_test); 86953a5a1b3Sopenharmony_ci suite_add_tcase(s, tc); 87053a5a1b3Sopenharmony_ci 87153a5a1b3Sopenharmony_ci sr = srunner_create(s); 87253a5a1b3Sopenharmony_ci srunner_run_all(sr, CK_NORMAL); 87353a5a1b3Sopenharmony_ci failed = srunner_ntests_failed(sr); 87453a5a1b3Sopenharmony_ci srunner_free(sr); 87553a5a1b3Sopenharmony_ci 87653a5a1b3Sopenharmony_ci return (failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; 87753a5a1b3Sopenharmony_ci} 878