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