tests/test_json.c

Sun, 23 Nov 2025 13:15:19 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 23 Nov 2025 13:15:19 +0100
changeset 1508
dfc0ddd9571e
parent 1338
cc153bffea28
permissions
-rw-r--r--

optimize sorted insertion by using the infimum instead of the supremum

The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.

937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2024 Mike Becker, Olaf Wintermann All rights reserved.
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
29 #include "util_allocator.h"
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 #include "cx/test.h"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 #include "cx/json.h"
1063
e453e717876e implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents: 1060
diff changeset
33 #include "cx/compare.h"
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
35 CX_TEST(test_json_init_default) {
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
36 CxJson json;
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
37 CX_TEST_DO {
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
38 cxJsonInit(&json, NULL);
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
39 CX_TEST_ASSERT(json.states == json.states_internal);
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
40 CX_TEST_ASSERT(json.states_size == 1);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
41 CX_TEST_ASSERT(json.states_capacity >= 8);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
42 CX_TEST_ASSERT(json.vbuf == json.vbuf_internal);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
43 CX_TEST_ASSERT(json.vbuf_size == 0);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
44 CX_TEST_ASSERT(json.vbuf_capacity >= 8);
1032
aaad28e23dac fix memory leaks in json tests
Mike Becker <universe@uap-core.de>
parents: 1015
diff changeset
45 cxJsonDestroy(&json);
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
46 }
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
47 }
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
48
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 CX_TEST(test_json_simple_object) {
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 cxstring text = cx_str(
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 "{\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 "\t\"message\":\"success\",\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 "\t\"position\":{\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 "\t\t\"longitude\":-94.7099,\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 "\t\t\"latitude\":51.5539\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 "\t},\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 "\t\"timestamp\":1729348561,\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 "\t\"alive\":true\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 "}"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 );
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 CX_TEST_DO {
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
63 CxJsonStatus result;
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 CxJson json;
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
66 cxJsonInit(&json, NULL);
973
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
67 cxJsonFill(&json, text);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 // parse the big fat object
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 CxJsonValue *obj;
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 result = cxJsonNext(&json, &obj);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
72 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 // check the contents
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 CX_TEST_ASSERT(cxJsonIsObject(obj));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 CxJsonValue *message = cxJsonObjGet(obj, "message");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 CX_TEST_ASSERT(cxJsonIsString(message));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 CX_TEST_ASSERT(0 == cx_strcmp(
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
80 cxJsonAsCxString(message),
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 cx_str("success"))
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 );
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 CxJsonValue *position = cxJsonObjGet(obj, "position");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 CX_TEST_ASSERT(cxJsonIsObject(position));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
86 CxJsonValue *longitude = cxJsonObjGet(position, "longitude");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87 CX_TEST_ASSERT(cxJsonIsNumber(longitude));
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
88 CX_TEST_ASSERT(!cxJsonIsInteger(longitude));
1063
e453e717876e implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents: 1060
diff changeset
89 CX_TEST_ASSERT(0 == cx_vcmp_double(cxJsonAsDouble(longitude), -94.7099));
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
90 CX_TEST_ASSERT(cxJsonAsInteger(longitude) == -94);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91 CxJsonValue *latitude = cxJsonObjGet(position, "latitude");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 CX_TEST_ASSERT(cxJsonIsNumber(latitude));
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
93 CX_TEST_ASSERT(!cxJsonIsInteger(latitude));
1063
e453e717876e implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents: 1060
diff changeset
94 CX_TEST_ASSERT(0 == cx_vcmp_double(cxJsonAsDouble(latitude), 51.5539));
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
95 CX_TEST_ASSERT(cxJsonAsInteger(latitude) == 51);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 CxJsonValue *timestamp = cxJsonObjGet(obj, "timestamp");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 CX_TEST_ASSERT(cxJsonIsInteger(timestamp));
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
99 CX_TEST_ASSERT(cxJsonIsNumber(timestamp));
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 CX_TEST_ASSERT(cxJsonAsInteger(timestamp) == 1729348561);
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
101 CX_TEST_ASSERT(cxJsonAsDouble(timestamp) == 1729348561.0);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
103 CxJsonValue *alive = cxJsonObjGet(obj, "alive");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
104 CX_TEST_ASSERT(cxJsonIsBool(alive));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105 CX_TEST_ASSERT(cxJsonIsTrue(alive));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106 CX_TEST_ASSERT(!cxJsonIsFalse(alive));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 CX_TEST_ASSERT(cxJsonAsBool(alive));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 // this recursively frees everything else
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 cxJsonValueFree(obj);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 // we only have one object that already contained all the data
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 result = cxJsonNext(&json, &obj);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
114 CX_TEST_ASSERT(result == CX_JSON_NO_DATA);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 cxJsonDestroy(&json);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
117 }
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118 }
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
120 CX_TEST(test_json_escaped_strings) {
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
121 cxstring text = cx_str(
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
122 "{\n"
1154
afd12f31d28a add missing test coverage for escape sequences
Mike Becker <universe@uap-core.de>
parents: 1152
diff changeset
123 "\t\"object\":\"{\\n\\t\\\"object\\\":null\\n}\",\n"
afd12f31d28a add missing test coverage for escape sequences
Mike Becker <universe@uap-core.de>
parents: 1152
diff changeset
124 "\t\"ctrl-chars\":\"\\\\foo\\r\\nbar\\f*ring\\/ring*\\b\"\n"
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
125 "}"
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
126 );
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
127
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
128 CxJson json;
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
129 cxJsonInit(&json, NULL);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
130 CX_TEST_DO {
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
131 cxJsonFill(&json, text);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
132 CxJsonValue *obj;
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
133 CxJsonStatus result = cxJsonNext(&json, &obj);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
134 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
135 CX_TEST_ASSERT(cxJsonIsObject(obj));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
136 CxJsonValue *object = cxJsonObjGet(obj, "object");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
137 CX_TEST_ASSERT(cxJsonIsString(object));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
138 CX_TEST_ASSERT(0 == cx_strcmp(
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
139 cxJsonAsCxString(object),
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
140 CX_STR("{\n\t\"object\":null\n}"))
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
141 );
1154
afd12f31d28a add missing test coverage for escape sequences
Mike Becker <universe@uap-core.de>
parents: 1152
diff changeset
142 CxJsonValue *ctrl = cxJsonObjGet(obj, "ctrl-chars");
afd12f31d28a add missing test coverage for escape sequences
Mike Becker <universe@uap-core.de>
parents: 1152
diff changeset
143 CX_TEST_ASSERT(cxJsonIsString(ctrl));
afd12f31d28a add missing test coverage for escape sequences
Mike Becker <universe@uap-core.de>
parents: 1152
diff changeset
144 CX_TEST_ASSERT(0 == cx_strcmp(
afd12f31d28a add missing test coverage for escape sequences
Mike Becker <universe@uap-core.de>
parents: 1152
diff changeset
145 cxJsonAsCxString(ctrl),
afd12f31d28a add missing test coverage for escape sequences
Mike Becker <universe@uap-core.de>
parents: 1152
diff changeset
146 CX_STR("\\foo\r\nbar\f*ring/ring*\b"))
afd12f31d28a add missing test coverage for escape sequences
Mike Becker <universe@uap-core.de>
parents: 1152
diff changeset
147 );
1157
3565ae61a5a2 fix memory leaks
Mike Becker <universe@uap-core.de>
parents: 1156
diff changeset
148 cxJsonValueFree(obj);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
149 }
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
150 cxJsonDestroy(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
151 }
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
152
1149
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
153 CX_TEST(test_json_escaped_unicode_strings) {
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
154 cxstring text = cx_str(
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
155 "{\n"
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
156 "\"ascii\":\"\\u0041\\u0053\\u0043\\u0049\\u0049\",\n"
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
157 "\"unicode\":\"\\u00df\\u00DF\",\n"
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
158 "\"mixed\":\"mixed ä ö \\u00e4 \\u00f6\",\n"
1152
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
159 "\"wide\":\"\\u03a3\\u29b0\",\n"
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
160 "\"surrogatepair1\":\"\\ud83e\\udff5\",\n"
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
161 "\"surrogatepair2\":\"test\\ud83e\\udff1AA\"\n,"
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
162 "\"mixed2\":\"123\\u03a3\\ud83e\\udfc5\\u00df\""
1149
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
163 "}"
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
164 );
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
165
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
166 CxJson json;
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
167 cxJsonInit(&json, NULL);
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
168 CX_TEST_DO {
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
169 cxJsonFill(&json, text);
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
170 CxJsonValue *obj;
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
171 CxJsonStatus result = cxJsonNext(&json, &obj);
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
172 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
173 CX_TEST_ASSERT(cxJsonIsObject(obj));
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
174
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
175 CxJsonValue *ascii = cxJsonObjGet(obj, "ascii");
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
176 CX_TEST_ASSERT(cxJsonIsString(ascii));
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
177 CX_TEST_ASSERT(0 == cx_strcmp(
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
178 cxJsonAsCxString(ascii),
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
179 CX_STR("ASCII"))
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
180 );
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
181
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
182 CxJsonValue *unicode = cxJsonObjGet(obj, "unicode");
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
183 CX_TEST_ASSERT(cxJsonIsString(unicode));
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
184 CX_TEST_ASSERT(0 == cx_strcmp(
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
185 cxJsonAsCxString(unicode),
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
186 CX_STR("ßß"))
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
187 );
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
188
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
189 CxJsonValue *mixed = cxJsonObjGet(obj, "mixed");
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
190 CX_TEST_ASSERT(cxJsonIsString(mixed));
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
191 CX_TEST_ASSERT(0 == cx_strcmp(
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
192 cxJsonAsCxString(mixed),
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
193 CX_STR("mixed ä ö ä ö"))
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
194 );
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
195
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
196 CxJsonValue *wide = cxJsonObjGet(obj, "wide");
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
197 CX_TEST_ASSERT(cxJsonIsString(wide));
1247
e30d38e06559 fix warning in test case due to C23 multibyte strings not being compatible with const char*
Mike Becker <universe@uap-core.de>
parents: 1179
diff changeset
198 CX_TEST_ASSERT(0 == cx_strcmp(cxJsonAsCxString(wide), CX_STR("Σ⦰")));
1149
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
199
1152
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
200 CxJsonValue *surrogatepair1 = cxJsonObjGet(obj, "surrogatepair1");
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
201 CX_TEST_ASSERT(cxJsonIsString(surrogatepair1));
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
202 CX_TEST_ASSERT(0 == cx_strcmp(
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
203 cxJsonAsCxString(surrogatepair1),
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
204 CX_STR("\xf0\x9f\xaf\xb5"))
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
205 );
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
206
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
207 CxJsonValue *surrogatepair2 = cxJsonObjGet(obj, "surrogatepair2");
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
208 CX_TEST_ASSERT(cxJsonIsString(surrogatepair2));
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
209 CX_TEST_ASSERT(0 == cx_strcmp(
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
210 cxJsonAsCxString(surrogatepair2),
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
211 CX_STR("test\xf0\x9f\xaf\xb1" "AA"))
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
212 );
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
213
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
214 CxJsonValue *mixed2 = cxJsonObjGet(obj, "mixed2");
1177
04ede4de9cec fix unicode tests not working on all platforms
Mike Becker <universe@uap-core.de>
parents: 1157
diff changeset
215 char test[16];
04ede4de9cec fix unicode tests not working on all platforms
Mike Becker <universe@uap-core.de>
parents: 1157
diff changeset
216 strncpy(test, mixed2->value.string.ptr, 15);
04ede4de9cec fix unicode tests not working on all platforms
Mike Becker <universe@uap-core.de>
parents: 1157
diff changeset
217 CX_TEST_ASSERT(cxJsonIsString(mixed2));
1152
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
218 CX_TEST_ASSERT(0 == cx_strcmp(
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
219 cxJsonAsCxString(mixed2),
1177
04ede4de9cec fix unicode tests not working on all platforms
Mike Becker <universe@uap-core.de>
parents: 1157
diff changeset
220 CX_STR("123\xce\xa3\xf0\x9f\xaf\x85ß"))
1152
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
221 );
e4af44b488bc implement decoder for utf16 surrogate pairs in unescape_string
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1149
diff changeset
222
1149
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
223 cxJsonValueFree(obj);
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
224 }
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
225 cxJsonDestroy(&json);
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
226 }
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
227
1156
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
228 CX_TEST(test_json_escaped_unicode_malformed) {
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
229 CxJson json;
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
230 cxJsonInit(&json, NULL);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
231 CxJsonValue *obj;
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
232 CxJsonStatus result;
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
233 CX_TEST_DO {
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
234 cxJsonFill(&json, "\"too few \\u123 digits\"");
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
235 result = cxJsonNext(&json, &obj);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
236 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
237 CX_TEST_ASSERT(cxJsonIsString(obj));
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
238 CX_TEST_ASSERT(0 == cx_strcmp(
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
239 cxJsonAsCxString(obj),
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
240 CX_STR("too few \\u123 digits")
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
241 ));
1157
3565ae61a5a2 fix memory leaks
Mike Becker <universe@uap-core.de>
parents: 1156
diff changeset
242 cxJsonValueFree(obj);
1156
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
243 cxJsonFill(&json, "\"too many \\u00E456 digits\"");
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
244 result = cxJsonNext(&json, &obj);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
245 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
246 CX_TEST_ASSERT(cxJsonIsString(obj));
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
247 CX_TEST_ASSERT(0 == cx_strcmp(
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
248 cxJsonAsCxString(obj),
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
249 CX_STR("too many ä56 digits")
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
250 ));
1157
3565ae61a5a2 fix memory leaks
Mike Becker <universe@uap-core.de>
parents: 1156
diff changeset
251 cxJsonValueFree(obj);
1156
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
252 cxJsonFill(&json, "\"only high \\uD800 surrogate\"");
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
253 result = cxJsonNext(&json, &obj);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
254 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
255 CX_TEST_ASSERT(cxJsonIsString(obj));
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
256 CX_TEST_ASSERT(0 == cx_strcmp(
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
257 cxJsonAsCxString(obj),
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
258 CX_STR("only high \\uD800 surrogate")
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
259 ));
1157
3565ae61a5a2 fix memory leaks
Mike Becker <universe@uap-core.de>
parents: 1156
diff changeset
260 cxJsonValueFree(obj);
1156
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
261 cxJsonFill(&json, "\"only low \\uDC00 surrogate\"");
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
262 result = cxJsonNext(&json, &obj);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
263 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
264 CX_TEST_ASSERT(cxJsonIsString(obj));
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
265 CX_TEST_ASSERT(0 == cx_strcmp(
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
266 cxJsonAsCxString(obj),
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
267 CX_STR("only low \\uDC00 surrogate")
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
268 ));
1157
3565ae61a5a2 fix memory leaks
Mike Becker <universe@uap-core.de>
parents: 1156
diff changeset
269 cxJsonValueFree(obj);
1156
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
270 cxJsonFill(&json, "\"two high \\uD800\\uD800 surrogates\"");
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
271 result = cxJsonNext(&json, &obj);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
272 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
273 CX_TEST_ASSERT(cxJsonIsString(obj));
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
274 CX_TEST_ASSERT(0 == cx_strcmp(
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
275 cxJsonAsCxString(obj),
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
276 CX_STR("two high \\uD800\\uD800 surrogates")
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
277 ));
1157
3565ae61a5a2 fix memory leaks
Mike Becker <universe@uap-core.de>
parents: 1156
diff changeset
278 cxJsonValueFree(obj);
1156
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
279 cxJsonFill(&json, "\"high plus bullshit \\uD800\\u567 foo\"");
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
280 result = cxJsonNext(&json, &obj);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
281 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
282 CX_TEST_ASSERT(cxJsonIsString(obj));
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
283 CX_TEST_ASSERT(0 == cx_strcmp(
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
284 cxJsonAsCxString(obj),
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
285 CX_STR("high plus bullshit \\uD800\\u567 foo")
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
286 ));
1157
3565ae61a5a2 fix memory leaks
Mike Becker <universe@uap-core.de>
parents: 1156
diff changeset
287 cxJsonValueFree(obj);
1156
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
288 }
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
289 cxJsonDestroy(&json);
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
290 }
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
291
1139
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
292 CX_TEST(test_json_escaped_end_of_string) {
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
293 CxJson json;
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
294 cxJsonInit(&json, NULL);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
295 CX_TEST_DO {
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
296 // first test, normal scenario
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
297 cxJsonFill(&json, "\"a \\\"test\\\" string\"");
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
298 CxJsonValue *val;
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
299 CxJsonStatus result = cxJsonNext(&json, &val);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
300 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
301 CX_TEST_ASSERT(cxJsonIsString(val));
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
302 CX_TEST_ASSERT(0 == cx_strcmp(
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
303 cxJsonAsCxString(val),
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
304 cx_str("a \"test\" string"))
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
305 );
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
306 cxJsonValueFree(val);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
307
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
308 // second test - uncompleted token with hanging escape char
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
309 cxJsonFill(&json, "\"a \\\"test\\");
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
310 result = cxJsonNext(&json, &val);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
311 CX_TEST_ASSERT(result == CX_JSON_INCOMPLETE_DATA);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
312 cxJsonFill(&json, "\" string\"");
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
313 result = cxJsonNext(&json, &val);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
314 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
315 CX_TEST_ASSERT(cxJsonIsString(val));
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
316 CX_TEST_ASSERT(0 == cx_strcmp(
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
317 cxJsonAsCxString(val),
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
318 cx_str("a \"test\" string"))
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
319 );
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
320 cxJsonValueFree(val);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
321 }
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
322 cxJsonDestroy(&json);
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
323 }
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
324
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
325 CX_TEST(test_json_object_incomplete_token) {
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
326 cxstring text = cx_str(
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
327 "{\"message\":\"success\" , \"__timestamp\":1729348561}");
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
328 cxstring parts[16];
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
329 size_t nparts = 0; // split the json text into mulple parts
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
330 for(size_t i=0;i<text.length;i+=4) {
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
331 parts[nparts++] = cx_strsubsl(text, i, 4);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
332 }
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
333
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
334 CX_TEST_DO {
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
335 CxJsonStatus result;
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
336
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
337 CxJson json;
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
338 cxJsonInit(&json, NULL);
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
339 CxJsonValue *obj;
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
340
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
341 size_t part = 0;
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
342 while(part < nparts - 1) {
973
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
343 cxJsonFill(&json, parts[part]);
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
344 part++;
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
345 result = cxJsonNext(&json, &obj);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
346 CX_TEST_ASSERT(result == CX_JSON_INCOMPLETE_DATA);
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
347 }
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
348 cxJsonFill(&json, parts[nparts - 1]);
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
349 result = cxJsonNext(&json, &obj);
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
350 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
1007
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
351 CX_TEST_ASSERT(cxJsonIsObject(obj));
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
352
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
353 CxJsonValue *message = cxJsonObjGet(obj, "message");
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
354 CX_TEST_ASSERT(cxJsonIsString(message));
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
355 CX_TEST_ASSERT(0 == cx_strcmp(
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
356 cxJsonAsCxString(message),
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
357 cx_str("success"))
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
358 );
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
359 CxJsonValue *timestamp = cxJsonObjGet(obj, "__timestamp");
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
360 CX_TEST_ASSERT(message->type == CX_JSON_STRING);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
361 CX_TEST_ASSERT(cxJsonIsInteger(timestamp));
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
362 CX_TEST_ASSERT(cxJsonAsInteger(timestamp) == 1729348561);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
363
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
364 // this recursively frees everything else
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
365 cxJsonValueFree(obj);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
366
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
367 // now there is everything read
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
368 result = cxJsonNext(&json, &obj);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
369 CX_TEST_ASSERT(result == CX_JSON_NO_DATA);
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
370
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
371 cxJsonDestroy(&json);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
372 }
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
373 }
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
374
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
375 CX_TEST(test_json_token_wrongly_completed) {
1075
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
376 CxTestingAllocator talloc;
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
377 cx_testing_allocator_init(&talloc);
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
378 const CxAllocator *alloc = &talloc.base;
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
379
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
380 cxstring text = cx_str("{\"number\": 47110815!}");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
381 cxstring part1 = cx_strsubsl(text, 0, 16);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
382 cxstring part2 = cx_strsubs(text, 16);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
383
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
384 CX_TEST_DO {
1075
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
385 CxJson json;
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
386 cxJsonInit(&json, alloc);
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
387
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
388 CxJsonStatus result;
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
389 CxJsonValue *obj;
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
390
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
391 cxJsonFill(&json, part1);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
392 result = cxJsonNext(&json, &obj);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
393 CX_TEST_ASSERT(result == CX_JSON_INCOMPLETE_DATA);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
394 cxJsonFill(&json, part2);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
395 result = cxJsonNext(&json, &obj);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
396 CX_TEST_ASSERT(result == CX_JSON_FORMAT_ERROR_NUMBER);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
397 CX_TEST_ASSERT(obj->type == CX_JSON_NOTHING);
1075
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
398
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
399 cxJsonDestroy(&json);
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
400 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
401 }
1075
0cc4b63a0ae0 fix cxJsonDestroy() not freeing uncompleted object member names
Mike Becker <universe@uap-core.de>
parents: 1072
diff changeset
402 cx_testing_allocator_destroy(&talloc);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
403 }
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
404
1007
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
405 CX_TEST(test_json_subsequent_fill) {
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
406 cxstring text = cx_str(
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
407 "{\"message\":\"success\" , \"__timestamp\":1729348561}");
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
408
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
409 cxstring part1 = cx_strsubsl(text, 0, 25);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
410 cxstring part2 = cx_strsubs(text, 25);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
411
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
412 CX_TEST_DO {
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
413 CxJson json;
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
414 cxJsonInit(&json, NULL);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
415 CxJsonValue *obj;
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
416
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
417 cxJsonFill(&json, part1);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
418 cxJsonFill(&json, part2);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
419 CxJsonStatus result = cxJsonNext(&json, &obj);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
420 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
421 CX_TEST_ASSERT(cxJsonIsObject(obj));
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
422
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
423 CxJsonValue *message = cxJsonObjGet(obj, "message");
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
424 CX_TEST_ASSERT(cxJsonIsString(message));
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
425 CX_TEST_ASSERT(0 == cx_strcmp(
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
426 cxJsonAsCxString(message),
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
427 cx_str("success"))
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
428 );
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
429 CxJsonValue *timestamp = cxJsonObjGet(obj, "__timestamp");
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
430 CX_TEST_ASSERT(message->type == CX_JSON_STRING);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
431 CX_TEST_ASSERT(cxJsonIsInteger(timestamp));
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
432 CX_TEST_ASSERT(cxJsonAsInteger(timestamp) == 1729348561);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
433
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
434 cxJsonValueFree(obj);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
435 result = cxJsonNext(&json, &obj);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
436 CX_TEST_ASSERT(result == CX_JSON_NO_DATA);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
437
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
438 cxJsonDestroy(&json);
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
439 }
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
440 }
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
441
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
442 CX_TEST(test_json_object_error) {
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
443 cxstring text0 = cx_str(
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
444 "{\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
445 "\t\"message\":\"success\",\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
446 "\t\"data\":{\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
447 "\t\t\"obj\":{\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
448 "\t\t\t\"array\": [1, 2, 3, ?syntaxerror? ]\n"
1338
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
449 "\t\t}\n"
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
450 "\t},\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
451 "\t\"timestamp\":1729348561,\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
452 "}"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
453 );
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
454 cxstring text1 = cx_str("{ \"string\" }");
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
455 cxstring text2 = cx_str("{ \"a\" : }");
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
456 cxstring text3 = cx_str("{ \"a\" : \"b\" ]");
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
457 cxstring text4 = cx_str("{ \"name\": \"value\" ]");
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
458
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
459 cxstring tests[] = { text0, text1, text2, text3, text4 };
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
460 CxJsonStatus errors[] = {
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
461 CX_JSON_FORMAT_ERROR_NUMBER,
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
462 CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN,
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
463 CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN,
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
464 CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN,
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
465 CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
466 };
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
467
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
468 CX_TEST_DO {
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
469 CxJsonStatus result;
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
470 CxJson json;
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
471 CxJsonValue *obj = NULL;
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
472
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
473 for(int i=0;i<5;i++) {
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
474 cxJsonInit(&json, NULL);
973
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
475 cxJsonFill(&json, tests[i]);
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
476 result = cxJsonNext(&json, &obj);
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
477
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
478 CX_TEST_ASSERT(result == errors[i]);
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
479 CX_TEST_ASSERT(obj != NULL && obj->type == CX_JSON_NOTHING);
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
480 cxJsonDestroy(&json);
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
481 }
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
482 }
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
483 }
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
484
1338
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
485 CX_TEST(test_json_object_remove_member) {
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
486 CxTestingAllocator talloc;
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
487 cx_testing_allocator_init(&talloc);
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
488 const CxAllocator *alloc = &talloc.base;
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
489 CX_TEST_DO {
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
490 CxJson json;
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
491 cxJsonInit(&json, alloc);
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
492 cxJsonFill(&json, cx_str(
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
493 "{\n"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
494 "\t\"message\":\"success\",\n"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
495 "\t\"data\":{\n"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
496 "\t\t\"obj\":{\n"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
497 "\t\t\t\"array\": [1, 2, 3]\n"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
498 "\t\t}\n"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
499 "\t},\n"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
500 "\t\"timestamp\":1729348561\n"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
501 "}"
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
502 ));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
503 CxJsonValue *obj;
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
504 CX_TEST_ASSERT(CX_JSON_NO_ERROR == cxJsonNext(&json, &obj));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
505 cxJsonDestroy(&json);
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
506
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
507 CX_TEST_ASSERT(cxJsonIsObject(cxJsonObjGet(obj, "data")));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
508 CxJsonValue *data = cxJsonObjRemove(obj, "data");
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
509 CX_TEST_ASSERT(cxJsonIsObject(data));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
510 CX_TEST_ASSERT(!cxJsonIsObject(cxJsonObjGet(obj, "data")));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
511 CX_TEST_ASSERT(cxJsonIsObject(cxJsonObjGet(data, "obj")));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
512
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
513 CX_TEST_ASSERT(NULL == cxJsonObjRemove(obj, "data"));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
514
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
515 // does not verify, yet, because we extracted an object
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
516 cxJsonValueFree(obj);
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
517 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
518
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
519 cxJsonValueFree(data);
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
520 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
521 }
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
522 cx_testing_allocator_destroy(&talloc);
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
523 }
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
524
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
525 CX_TEST(test_json_large_nesting_depth) {
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
526 CxJson json;
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
527 CxJsonValue *d1;
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
528 cxstring text = cx_str("{\"test\": [{},{\"foo\": [[{\"bar\":[4, 2, [null, {\"key\": 47}]]}]]}]}");
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
529 CX_TEST_DO {
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
530 cxJsonInit(&json, NULL);
973
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
531 cxJsonFill(&json, text);
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
532 cxJsonNext(&json, &d1);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
533
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
534 CX_TEST_ASSERT(d1 != NULL);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
535 CX_TEST_ASSERT(cxJsonIsObject(d1));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
536 CxJsonValue *d2 = cxJsonObjGet(d1, "test");
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
537 CX_TEST_ASSERT(cxJsonIsArray(d2));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
538 CX_TEST_ASSERT(cxJsonArrSize(d2) == 2);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
539 CxJsonValue *d3 = cxJsonArrGet(d2, 1);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
540 CX_TEST_ASSERT(cxJsonIsObject(d3));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
541 CxJsonValue *d4 = cxJsonObjGet(d3, "foo");
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
542 CX_TEST_ASSERT(cxJsonIsArray(d4));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
543 CX_TEST_ASSERT(cxJsonArrSize(d4) == 1);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
544 CxJsonValue *d5 = cxJsonArrGet(d4, 0);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
545 CX_TEST_ASSERT(cxJsonIsArray(d5));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
546 CX_TEST_ASSERT(cxJsonArrSize(d5) == 1);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
547 CxJsonValue *d6 = cxJsonArrGet(d5, 0);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
548 CX_TEST_ASSERT(cxJsonIsObject(d6));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
549 CxJsonValue *d7 = cxJsonObjGet(d6, "bar");
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
550 CX_TEST_ASSERT(cxJsonIsArray(d7));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
551 CX_TEST_ASSERT(cxJsonArrSize(d7) == 3);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
552 CxJsonValue *d8 = cxJsonArrGet(d7, 2);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
553 CX_TEST_ASSERT(cxJsonIsArray(d8));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
554 CX_TEST_ASSERT(cxJsonArrSize(d8) == 2);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
555 CxJsonValue *d9a = cxJsonArrGet(d8, 0);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
556 CX_TEST_ASSERT(cxJsonIsNull(d9a));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
557 CxJsonValue *d9b = cxJsonArrGet(d8, 1);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
558 CX_TEST_ASSERT(cxJsonIsObject(d9b));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
559 CxJsonValue *d10 = cxJsonObjGet(d9b, "key");
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
560 CX_TEST_ASSERT(cxJsonIsInteger(d10));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
561 CX_TEST_ASSERT(cxJsonAsInteger(d10) == 47);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
562
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
563 CX_TEST_ASSERT(json.states != json.states_internal);
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
564 CX_TEST_ASSERT(json.states_capacity > cx_nmemb(json.states_internal));
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
565
978
1da52af18ac3 fix memory leaks in json tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 977
diff changeset
566 cxJsonValueFree(d1);
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
567 cxJsonDestroy(&json);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
568 }
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
569 }
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
570
973
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
571 CX_TEST(test_json_number) {
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
572 CxJson json;
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
573 cxJsonInit(&json, NULL);
973
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
574 CX_TEST_DO {
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
575 CxJsonValue *v;
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
576 CxJsonStatus result;
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
577
975
96bf02371aef adds test case for numbers - currently fails due to issue #482
Mike Becker <universe@uap-core.de>
parents: 973
diff changeset
578 cxJsonFill(&json, "3.1415 ");
96bf02371aef adds test case for numbers - currently fails due to issue #482
Mike Becker <universe@uap-core.de>
parents: 973
diff changeset
579 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
580 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
975
96bf02371aef adds test case for numbers - currently fails due to issue #482
Mike Becker <universe@uap-core.de>
parents: 973
diff changeset
581 CX_TEST_ASSERT(cxJsonIsNumber(v));
1063
e453e717876e implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents: 1060
diff changeset
582 CX_TEST_ASSERT(0 == cx_vcmp_double(cxJsonAsDouble(v), 3.1415));
978
1da52af18ac3 fix memory leaks in json tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 977
diff changeset
583 cxJsonValueFree(v);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
584
975
96bf02371aef adds test case for numbers - currently fails due to issue #482
Mike Becker <universe@uap-core.de>
parents: 973
diff changeset
585 cxJsonFill(&json, "-47.11e2 ");
96bf02371aef adds test case for numbers - currently fails due to issue #482
Mike Becker <universe@uap-core.de>
parents: 973
diff changeset
586 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
587 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
975
96bf02371aef adds test case for numbers - currently fails due to issue #482
Mike Becker <universe@uap-core.de>
parents: 973
diff changeset
588 CX_TEST_ASSERT(cxJsonIsNumber(v));
1063
e453e717876e implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents: 1060
diff changeset
589 CX_TEST_ASSERT(0 == cx_vcmp_double(cxJsonAsDouble(v), -4711.0));
978
1da52af18ac3 fix memory leaks in json tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 977
diff changeset
590 cxJsonValueFree(v);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
591
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
592 cxJsonFill(&json, "0.815e-3 ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
593 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
594 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
595 CX_TEST_ASSERT(cxJsonIsNumber(v));
1063
e453e717876e implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents: 1060
diff changeset
596 CX_TEST_ASSERT(0 == cx_vcmp_double(cxJsonAsDouble(v), 0.000815));
1032
aaad28e23dac fix memory leaks in json tests
Mike Becker <universe@uap-core.de>
parents: 1015
diff changeset
597 cxJsonValueFree(v);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
598
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
599 cxJsonFill(&json, "1.23E4 ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
600 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
601 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
602 CX_TEST_ASSERT(cxJsonIsNumber(v));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
603 CX_TEST_ASSERT(cxJsonAsInteger(v) == 12300);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
604 CX_TEST_ASSERT(cxJsonAsDouble(v) == 12300.0);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
605 cxJsonValueFree(v);
1060
0a7c1bb2372d avoid copying the filled data in the json parser when possible - fixes #530
Mike Becker <universe@uap-core.de>
parents: 1057
diff changeset
606
0a7c1bb2372d avoid copying the filled data in the json parser when possible - fixes #530
Mike Becker <universe@uap-core.de>
parents: 1057
diff changeset
607 cxJsonFill(&json, "18446744073709551615.0123456789 ");
0a7c1bb2372d avoid copying the filled data in the json parser when possible - fixes #530
Mike Becker <universe@uap-core.de>
parents: 1057
diff changeset
608 result = cxJsonNext(&json, &v);
0a7c1bb2372d avoid copying the filled data in the json parser when possible - fixes #530
Mike Becker <universe@uap-core.de>
parents: 1057
diff changeset
609 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
0a7c1bb2372d avoid copying the filled data in the json parser when possible - fixes #530
Mike Becker <universe@uap-core.de>
parents: 1057
diff changeset
610 CX_TEST_ASSERT(cxJsonIsNumber(v));
0a7c1bb2372d avoid copying the filled data in the json parser when possible - fixes #530
Mike Becker <universe@uap-core.de>
parents: 1057
diff changeset
611 // be as precise as possible
1063
e453e717876e implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents: 1060
diff changeset
612 // TODO: this might produce format error / out of range in future implementations
e453e717876e implement floating point string to number conversions
Mike Becker <universe@uap-core.de>
parents: 1060
diff changeset
613 CX_TEST_ASSERT(0 == cx_vcmp_double(cxJsonAsDouble(v), 1.8446744073709552e+19));
1060
0a7c1bb2372d avoid copying the filled data in the json parser when possible - fixes #530
Mike Becker <universe@uap-core.de>
parents: 1057
diff changeset
614 cxJsonValueFree(v);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
615 }
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
616 cxJsonDestroy(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
617 }
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
618
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
619 CX_TEST(test_json_number_format_errors) {
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
620 CxJson json;
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
621 cxJsonInit(&json, NULL);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
622 CX_TEST_DO {
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
623 CxJsonValue *v;
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
624 CxJsonStatus result;
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
625
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
626 cxJsonFill(&json, "+3.1415 ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
627 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
628 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER,
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
629 "leading plus is not RFC-8259 compliant");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
630 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
631 cxJsonReset(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
632
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
633 cxJsonFill(&json, "0.815e-3.0 ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
634 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
635 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER,
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
636 "exponent must be an integer");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
637 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
638 cxJsonReset(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
639
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
640 cxJsonFill(&json, "3.14e ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
641 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
642 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER,
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
643 "exponent cannot be empty");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
644 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
645 cxJsonReset(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
646
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
647 cxJsonFill(&json, "3.14e~7 ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
648 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
649 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER,
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
650 "exponent cannot start with bullshit");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
651 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
652 cxJsonReset(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
653
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
654 cxJsonFill(&json, "1.23e4f ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
655 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
656 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER,
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
657 "non-digits in exponent");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
658 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
659 cxJsonReset(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
660
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
661 cxJsonFill(&json, "1.23f ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
662 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
663 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER,
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
664 "non-digits in value");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
665 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
666 cxJsonReset(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
667
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
668 cxJsonFill(&json, "1.23.45 ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
669 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
670 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER,
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
671 "multiple decimal separators");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
672 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
673 cxJsonReset(&json);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
674
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
675 cxJsonFill(&json, "184467440737095516150123456789 ");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
676 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
677 CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER,
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
678 "30 digit int does not fit into 64-bit int");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
679 CX_TEST_ASSERT(v->type == CX_JSON_NOTHING);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
680 cxJsonReset(&json);
973
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
681 }
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
682 cxJsonDestroy(&json);
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
683 }
05910a8994f7 add UCX string support to cxJsonFill()
Mike Becker <universe@uap-core.de>
parents: 966
diff changeset
684
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
685 CX_TEST(test_json_multiple_values) {
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
686 CxJson json;
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
687 cxJsonInit(&json, NULL);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
688 CX_TEST_DO {
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
689 CxJsonValue *v;
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
690 CxJsonStatus result;
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
691
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
692 // read number
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
693 cxJsonFill(&json, "10\n");
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
694 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
695 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
696 CX_TEST_ASSERT(cxJsonIsNumber(v));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
697 CX_TEST_ASSERT(cxJsonAsInteger(v) == 10);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
698 cxJsonValueFree(v);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
699 // read remaining '\n'
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
700 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
701 CX_TEST_ASSERT(result == CX_JSON_INCOMPLETE_DATA);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
702 // read string
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
703 cxJsonFill(&json, "\"hello world\"\n");
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
704 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
705 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
706 CX_TEST_ASSERT(cxJsonIsString(v));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
707 CX_TEST_ASSERT(!cx_strcmp(cxJsonAsCxString(v), CX_STR("hello world")));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
708 cxJsonValueFree(v);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
709 // don't process the remaining newline this time
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
710 // read obj
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
711 cxJsonFill(&json, "{ \"value\": \"test\" }\n");
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
712 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
713 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
714 CX_TEST_ASSERT(cxJsonIsObject(v));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
715 CxJsonValue *value = cxJsonObjGet(v, "value");
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
716 CX_TEST_ASSERT(cxJsonAsString(value));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
717 cxJsonValueFree(v);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
718 // read array
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
719 cxJsonFill(&json, "[ 0, 1, 2, 3, 4, 5 ]\n");
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
720 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
721 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
722 CX_TEST_ASSERT(cxJsonIsArray(v));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
723 CxJsonValue *a0 = cxJsonArrGet(v, 0);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
724 CxJsonValue *a3 = cxJsonArrGet(v, 3);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
725 CX_TEST_ASSERT(cxJsonIsNumber(a0));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
726 CX_TEST_ASSERT(cxJsonAsInteger(a0) == 0);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
727 CX_TEST_ASSERT(cxJsonIsNumber(a3));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
728 CX_TEST_ASSERT(cxJsonAsInteger(a3) == 3);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
729 cxJsonValueFree(v);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
730 // read literal
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
731 cxJsonFill(&json, "true\n");
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
732 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
733 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
734 CX_TEST_ASSERT(cxJsonIsLiteral(v));
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
735 CX_TEST_ASSERT(cxJsonIsBool(v));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
736 CX_TEST_ASSERT(cxJsonIsTrue(v));
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
737 CX_TEST_ASSERT(cxJsonAsBool(v));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
738 cxJsonValueFree(v);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
739 cxJsonFill(&json, "false\n");
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
740 result = cxJsonNext(&json, &v);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
741 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
742 CX_TEST_ASSERT(cxJsonIsLiteral(v));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
743 CX_TEST_ASSERT(cxJsonIsBool(v));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
744 CX_TEST_ASSERT(cxJsonIsFalse(v));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
745 CX_TEST_ASSERT(!cxJsonAsBool(v));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
746 cxJsonValueFree(v);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
747 cxJsonFill(&json, "null\n");
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
748 result = cxJsonNext(&json, &v);
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
749 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
750 CX_TEST_ASSERT(cxJsonIsLiteral(v));
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
751 CX_TEST_ASSERT(!cxJsonIsBool(v));
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
752 CX_TEST_ASSERT(cxJsonIsNull(v));
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
753 cxJsonValueFree(v);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
754 }
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
755 cxJsonDestroy(&json);
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
756 }
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
757
1337
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
758 CX_TEST(test_json_array) {
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
759 CxTestingAllocator talloc;
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
760 cx_testing_allocator_init(&talloc);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
761 const CxAllocator *allocator = &talloc.base;
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
762 CX_TEST_DO {
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
763 CxJsonValue *arr = cxJsonCreateArr(allocator);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
764 cxJsonArrAddIntegers(arr, (int64_t[]){ 0, 3, 6, 9, 12, 15}, 6);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
765 CX_TEST_ASSERT(cxJsonArrSize(arr) == 6);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
766 CxJsonValue *e = cxJsonArrGet(arr, 3);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
767 CX_TEST_ASSERT(cxJsonIsNumber(e));
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
768 CX_TEST_ASSERT(cxJsonAsInteger(e) == 9);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
769 CX_TEST_ASSERT(cxJsonAsDouble(e) == 9.0);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
770 CX_TEST_ASSERT(cxJsonArrSize(arr) == 6);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
771 e = cxJsonArrGet(arr, 6);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
772 CX_TEST_ASSERT(!cxJsonIsNumber(e));
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
773 // also not null, because "nothing" is not null
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
774 CX_TEST_ASSERT(!cxJsonIsNull(e));
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
775 CX_TEST_ASSERT(e->type == CX_JSON_NOTHING);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
776 CxJsonValue *removed = cxJsonArrRemove(arr, 2);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
777 CX_TEST_ASSERT(cxJsonIsNumber(removed));
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
778 CX_TEST_ASSERT(cxJsonAsInteger(removed) == 6);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
779 CX_TEST_ASSERT(cxJsonArrSize(arr) == 5);
1338
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
780 e = cxJsonArrGet(arr, 3);
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
781 CX_TEST_ASSERT(cxJsonIsNumber(e));
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
782 CX_TEST_ASSERT(cxJsonAsInteger(e) == 12);
1337
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
783 e = cxJsonArrRemove(arr, 5);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
784 CX_TEST_ASSERT(e == NULL);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
785 cxJsonValueFree(arr);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
786 // the removed element still needs to be freed
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
787 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc));
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
788 cxJsonValueFree(removed);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
789 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
790 }
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
791 cx_testing_allocator_destroy(&talloc);
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
792 }
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
793
1033
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
794 CX_TEST(test_json_array_iterator) {
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
795 CxJson json;
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
796 cxJsonInit(&json, NULL);
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
797 CX_TEST_DO {
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
798 CxJsonValue *v;
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
799 CxJsonStatus result;
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
800 cxJsonFill(&json, "[ 0, 3, 6, 9, 12, 15 ]\n");
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
801 result = cxJsonNext(&json, &v);
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
802 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
803 CX_TEST_ASSERT(cxJsonIsArray(v));
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
804 CxIterator iter = cxJsonArrIter(v);
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
805 unsigned i = 0;
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
806 cx_foreach(CxJsonValue*, elem, iter) {
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
807 CX_TEST_ASSERT(cxJsonIsNumber(elem));
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
808 CX_TEST_ASSERT(i == cxJsonAsInteger(elem));
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
809 i += 3;
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
810 }
1051
7d17bd1103d7 fix another missing free() in json tests
Mike Becker <universe@uap-core.de>
parents: 1033
diff changeset
811 cxJsonValueFree(v);
1033
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
812 }
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
813 cxJsonDestroy(&json);
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
814 }
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
815
996
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
816 CX_TEST(test_json_allocator) {
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
817 CxTestingAllocator talloc;
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
818 cx_testing_allocator_init(&talloc);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
819 CxAllocator *allocator = &talloc.base;
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
820
996
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
821 cxstring text = cx_str(
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
822 "{\n"
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
823 "\t\"message\":\"success\",\n"
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
824 "\t\"data\":[\"value1\",{\"x\":123, \"y\":523 }]\n"
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
825 "}"
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
826 );
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
827
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
828 CX_TEST_DO {
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
829 CxJson json;
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
830 cxJsonInit(&json, allocator);
996
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
831 cxJsonFill(&json, text);
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
832
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
833 CxJsonValue *obj;
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
834 CxJsonStatus result = cxJsonNext(&json, &obj);
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
835 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR);
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
836 CX_TEST_ASSERT(obj->allocator == allocator);
996
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
837
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
838 // this recursively frees everything
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
839 cxJsonValueFree(obj);
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
840 cxJsonDestroy(&json);
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
841
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
842 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
996
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
843 }
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
844 cx_testing_allocator_destroy(&talloc);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
845 }
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
846
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
847 CX_TEST(test_json_allocator_parse_error) {
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
848 CxTestingAllocator talloc;
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
849 cx_testing_allocator_init(&talloc);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
850 CxAllocator *allocator = &talloc.base;
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
851
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
852 cxstring text = cx_str(
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
853 "{\n"
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
854 "\t\"message\":\"success\"\n" // <-- missing comma
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
855 "\t\"data\":[\"value1\",{\"x\":123, \"y\":523 }]\n"
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
856 "}"
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
857 );
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
858
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
859 CX_TEST_DO {
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
860 CxJson json;
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
861 cxJsonInit(&json, allocator);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
862 cxJsonFill(&json, text);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
863
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
864 CxJsonValue *obj = NULL;
1002
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
865 CxJsonStatus result = cxJsonNext(&json, &obj);
1483c47063a8 add status codes to json parser - relates to #431
Mike Becker <universe@uap-core.de>
parents: 1000
diff changeset
866 CX_TEST_ASSERT(result == CX_JSON_FORMAT_ERROR_UNEXPECTED_TOKEN);
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
867 CX_TEST_ASSERT(obj != NULL && obj->type == CX_JSON_NOTHING);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
868
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
869 // clean-up any left-over memory
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
870 cxJsonDestroy(&json);
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
871
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
872 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
873 }
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
874 cx_testing_allocator_destroy(&talloc);
996
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
875 }
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
876
1057
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
877 CX_TEST(test_json_create_value) {
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
878 CxTestingAllocator talloc;
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
879 cx_testing_allocator_init(&talloc);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
880 CxAllocator *allocator = &talloc.base;
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
881 CX_TEST_DO {
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
882 /*
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
883 * This is the value we want to create in this test:
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
884 *
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
885 * {
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
886 * "bool": false,
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
887 * "int": 47,
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
888 * "strings": [ "hello", "world" ],
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
889 * "nested": {
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
890 * "string": "test",
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
891 * "floats": [ 3.1415, 47.11, 8.15 ],
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
892 * "ints": [ 4, 8, 15, 16, 23, 42 ],
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
893 * "literals": [ true, null, false ]
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
894 * }
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
895 * }
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
896 */
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
897
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
898
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
899 // create the object
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
900 CxJsonValue *obj = cxJsonCreateObj(allocator);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
901 CX_TEST_ASSERT(obj != NULL);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
902 CX_TEST_ASSERT(cxJsonIsObject(obj));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
903 CX_TEST_ASSERT(obj->allocator == allocator);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
904
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
905 // add the members
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
906 {
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
907 cxJsonObjPutLiteral(obj, CX_STR("bool"), CX_JSON_FALSE);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
908 cxJsonObjPutInteger(obj, CX_STR("int"), 47);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
909 CxJsonValue *strings = cxJsonObjPutArr(obj, CX_STR("strings"));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
910 CX_TEST_ASSERT(strings != NULL);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
911 CX_TEST_ASSERT(cxJsonIsArray(strings));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
912 const char* str[] = {"hello", "world"};
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
913 CX_TEST_ASSERT(0 == cxJsonArrAddStrings(strings, str, 2));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
914
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
915 CxJsonValue *nested = cxJsonObjPutObj(obj, CX_STR("nested"));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
916 CX_TEST_ASSERT(nested != NULL);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
917 CX_TEST_ASSERT(cxJsonIsObject(nested));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
918 cxJsonObjPutCxString(nested, CX_STR("string"), CX_STR("test"));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
919
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
920 cxJsonArrAddNumbers(cxJsonObjPutArr(nested, CX_STR("floats")),
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
921 (double[]){3.1415, 47.11, 8.15}, 3);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
922 cxJsonArrAddIntegers(cxJsonObjPutArr(nested, CX_STR("ints")),
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
923 (int64_t[]){4, 8, 15, 16, 23, 42}, 6);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
924 cxJsonArrAddLiterals(cxJsonObjPutArr(nested, CX_STR("literals")),
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
925 (CxJsonLiteral[]){CX_JSON_TRUE, CX_JSON_NULL, CX_JSON_FALSE}, 3);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
926 }
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
927
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
928 // verify the contents
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
929 {
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
930 CX_TEST_ASSERT(cxJsonIsFalse(cxJsonObjGet(obj, "bool")));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
931 CX_TEST_ASSERT(47 == cxJsonAsInteger(cxJsonObjGet(obj, "int")));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
932 CxJsonValue *strings = cxJsonObjGet(obj, "strings");
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
933 CX_TEST_ASSERT(cxJsonIsArray(strings));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
934 CX_TEST_ASSERT(2 == cxJsonArrSize(strings));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
935 CX_TEST_ASSERT(0 == cx_strcmp(CX_STR("hello"), cxJsonAsCxString(cxJsonArrGet(strings, 0))));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
936 CX_TEST_ASSERT(0 == cx_strcmp(CX_STR("world"), cxJsonAsCxString(cxJsonArrGet(strings, 1))));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
937
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
938 CxJsonValue *nested = cxJsonObjGet(obj, "nested");
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
939 CX_TEST_ASSERT(cxJsonIsObject(nested));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
940 CX_TEST_ASSERT(0 == strcmp("test", cxJsonAsString(cxJsonObjGet(nested, "string"))));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
941 CxJsonValue *floats = cxJsonObjGet(nested, "floats");
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
942 CX_TEST_ASSERT(cxJsonIsArray(floats));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
943 CX_TEST_ASSERT(3 == cxJsonArrSize(floats));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
944 CX_TEST_ASSERT(3.1415 == cxJsonAsDouble(cxJsonArrGet(floats, 0)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
945 CX_TEST_ASSERT(47.11 == cxJsonAsDouble(cxJsonArrGet(floats, 1)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
946 CX_TEST_ASSERT(8.15 == cxJsonAsDouble(cxJsonArrGet(floats, 2)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
947 CxJsonValue *ints = cxJsonObjGet(nested, "ints");
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
948 CX_TEST_ASSERT(cxJsonIsArray(ints));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
949 CX_TEST_ASSERT(6 == cxJsonArrSize(ints));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
950 CX_TEST_ASSERT(4 == cxJsonAsInteger(cxJsonArrGet(ints, 0)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
951 CX_TEST_ASSERT(8 == cxJsonAsInteger(cxJsonArrGet(ints, 1)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
952 CX_TEST_ASSERT(15 == cxJsonAsInteger(cxJsonArrGet(ints, 2)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
953 CX_TEST_ASSERT(16 == cxJsonAsInteger(cxJsonArrGet(ints, 3)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
954 CX_TEST_ASSERT(23 == cxJsonAsInteger(cxJsonArrGet(ints, 4)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
955 CX_TEST_ASSERT(42 == cxJsonAsInteger(cxJsonArrGet(ints, 5)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
956 CxJsonValue *literals = cxJsonObjGet(nested, "literals");
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
957 CX_TEST_ASSERT(cxJsonIsArray(literals));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
958 CX_TEST_ASSERT(3 == cxJsonArrSize(literals));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
959 CX_TEST_ASSERT(cxJsonIsTrue(cxJsonArrGet(literals, 0)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
960 CX_TEST_ASSERT(cxJsonIsNull(cxJsonArrGet(literals, 1)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
961 CX_TEST_ASSERT(cxJsonIsFalse(cxJsonArrGet(literals, 2)));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
962 }
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
963
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
964 // destroy the value and verify the allocations
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
965 cxJsonValueFree(obj);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
966 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
967 }
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
968 cx_testing_allocator_destroy(&talloc);
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
969 }
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
970
1072
c89283cd559b first mvp for the json writer - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1063
diff changeset
971
1081
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
972 CX_TEST_SUBROUTINE(test_json_write_sub,
1080
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
973 const CxAllocator *allocator,
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
974 cxstring expected,
1081
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
975 const CxJsonWriter *writer
1080
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
976 ) {
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
977 // create the value
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
978 CxJsonValue *obj = cxJsonCreateObj(allocator);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
979 cxJsonObjPutLiteral(obj, CX_STR("bool"), CX_JSON_FALSE);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
980 cxJsonObjPutNumber(obj, CX_STR("int"), 47); // purposely use PutNumber to put an int
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
981 CxJsonValue *strings = cxJsonObjPutArr(obj, CX_STR("strings"));
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
982 cxJsonArrAddCxStrings(strings, (cxstring[]) {CX_STR("hello"), CX_STR("world")}, 2);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
983 CxJsonValue *nested = cxJsonObjPutObj(obj, CX_STR("nested"));
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
984 CxJsonValue *objects = cxJsonObjPutArr(nested, CX_STR("objects"));
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
985 CxJsonValue *obj_in_arr[2] = {cxJsonCreateObj(allocator), cxJsonCreateObj(allocator)};
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
986 cxJsonObjPutInteger(obj_in_arr[0], CX_STR("name1"), 1);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
987 cxJsonObjPutInteger(obj_in_arr[0], CX_STR("name2"), 3);
1082
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
988 cxJsonObjPutInteger(obj_in_arr[1], CX_STR("name2"), 7);
1080
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
989 cxJsonObjPutInteger(obj_in_arr[1], CX_STR("name1"), 3);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
990 cxJsonArrAddValues(objects, obj_in_arr, 2);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
991 cxJsonArrAddNumbers(cxJsonObjPutArr(nested, CX_STR("floats")),
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
992 (double[]){3.1415, 47.11, 8.15}, 3);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
993 cxJsonArrAddLiterals(cxJsonObjPutArr(nested, CX_STR("literals")),
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
994 (CxJsonLiteral[]){CX_JSON_TRUE, CX_JSON_NULL, CX_JSON_FALSE}, 3);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
995 CxJsonValue *ints = cxJsonObjPutArr(nested, CX_STR("ints"));
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
996 cxJsonArrAddIntegers(ints, (int64_t[]){4, 8, 15}, 3);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
997 CxJsonValue *nested_array = cxJsonCreateArr(allocator);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
998 cxJsonArrAddValues(ints, &nested_array, 1);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
999 cxJsonArrAddIntegers(nested_array, (int64_t[]){16, 23}, 2);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1000 cxJsonArrAddIntegers(ints, (int64_t[]){42}, 1);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1001
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1002 // write it to a buffer
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1003 CxBuffer buf;
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1004 cxBufferInit(&buf, NULL, 512, NULL, CX_BUFFER_DEFAULT);
1112
22dc2163fffd add convenience macros to avoid a fptr cast for cxBufferRead and cxBufferWrite
Mike Becker <universe@uap-core.de>
parents: 1082
diff changeset
1005 int result = cxJsonWrite(&buf, obj, cxBufferWriteFunc, writer);
1080
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1006 cxBufferTerminate(&buf); // makes debugging easier
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1007 CX_TEST_ASSERT(result == 0);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1008
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1009 // compare the string
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1010 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), expected));
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1011
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1012 // destroy everything
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1013 cxBufferDestroy(&buf);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1014 cxJsonValueFree(obj);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1015 }
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1016
1081
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1017 CX_TEST(test_json_write_default_format) {
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1018 CxTestingAllocator talloc;
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1019 cx_testing_allocator_init(&talloc);
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1020 CxAllocator *allocator = &talloc.base;
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1021 CX_TEST_DO {
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1022 // expected value
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1023 cxstring expected = CX_STR(
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1024 "{\"bool\":false,"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1025 "\"int\":47,"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1026 "\"nested\":{"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1027 "\"floats\":[3.1415,47.11,8.15],"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1028 "\"ints\":[4,8,15,[16,23],42],"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1029 "\"literals\":[true,null,false],"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1030 "\"objects\":[{"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1031 "\"name1\":1,"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1032 "\"name2\":3"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1033 "},{"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1034 "\"name1\":3,"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1035 "\"name2\":7"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1036 "}]"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1037 "},"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1038 "\"strings\":[\"hello\",\"world\"]"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1039 "}"
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1040 );
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1041
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1042 CxJsonWriter writer = cxJsonWriterCompact();
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1043 CX_TEST_CALL_SUBROUTINE(test_json_write_sub, allocator, expected, &writer);
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1044 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1045 }
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1046 cx_testing_allocator_destroy(&talloc);
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1047 }
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1048
1078
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1049 CX_TEST(test_json_write_pretty_default_spaces) {
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1050 CxTestingAllocator talloc;
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1051 cx_testing_allocator_init(&talloc);
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1052 CxAllocator *allocator = &talloc.base;
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1053 CX_TEST_DO {
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1054 cxstring expected = CX_STR(
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1055 "{\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1056 " \"bool\": false,\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1057 " \"int\": 47,\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1058 " \"nested\": {\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1059 " \"floats\": [3.1415, 47.11, 8.15],\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1060 " \"ints\": [4, 8, 15, [16, 23], 42],\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1061 " \"literals\": [true, null, false],\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1062 " \"objects\": [{\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1063 " \"name1\": 1,\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1064 " \"name2\": 3\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1065 " }, {\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1066 " \"name1\": 3,\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1067 " \"name2\": 7\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1068 " }]\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1069 " },\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1070 " \"strings\": [\"hello\", \"world\"]\n"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1071 "}"
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1072 );
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1073
1081
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1074 CxJsonWriter writer = cxJsonWriterPretty(true);
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1075 CX_TEST_CALL_SUBROUTINE(test_json_write_sub, allocator, expected, &writer);
1080
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1076 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1077 }
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1078 cx_testing_allocator_destroy(&talloc);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1079 }
1078
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1080
1080
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1081 CX_TEST(test_json_write_pretty_default_tabs) {
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1082 CxTestingAllocator talloc;
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1083 cx_testing_allocator_init(&talloc);
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1084 CxAllocator *allocator = &talloc.base;
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1085 CX_TEST_DO {
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1086 cxstring expected = CX_STR(
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1087 "{\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1088 "\t\"bool\": false,\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1089 "\t\"int\": 47,\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1090 "\t\"nested\": {\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1091 "\t\t\"floats\": [3.1415, 47.11, 8.15],\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1092 "\t\t\"ints\": [4, 8, 15, [16, 23], 42],\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1093 "\t\t\"literals\": [true, null, false],\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1094 "\t\t\"objects\": [{\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1095 "\t\t\t\"name1\": 1,\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1096 "\t\t\t\"name2\": 3\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1097 "\t\t}, {\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1098 "\t\t\t\"name1\": 3,\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1099 "\t\t\t\"name2\": 7\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1100 "\t\t}]\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1101 "\t},\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1102 "\t\"strings\": [\"hello\", \"world\"]\n"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1103 "}"
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1104 );
1081
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1105 CxJsonWriter writer = cxJsonWriterPretty(false);
33c9d7e7d830 remove code duplication from writer tests - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1080
diff changeset
1106 CX_TEST_CALL_SUBROUTINE(test_json_write_sub, allocator, expected, &writer);
1072
c89283cd559b first mvp for the json writer - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1063
diff changeset
1107 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
c89283cd559b first mvp for the json writer - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1063
diff changeset
1108 }
c89283cd559b first mvp for the json writer - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1063
diff changeset
1109 cx_testing_allocator_destroy(&talloc);
c89283cd559b first mvp for the json writer - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1063
diff changeset
1110 }
c89283cd559b first mvp for the json writer - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1063
diff changeset
1111
1082
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1112 CX_TEST(test_json_write_pretty_preserve_order) {
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1113 CxTestingAllocator talloc;
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1114 cx_testing_allocator_init(&talloc);
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1115 CxAllocator *allocator = &talloc.base;
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1116 CX_TEST_DO {
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1117 cxstring expected = CX_STR(
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1118 "{\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1119 " \"bool\": false,\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1120 " \"int\": 47,\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1121 " \"strings\": [\"hello\", \"world\"],\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1122 " \"nested\": {\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1123 " \"objects\": [{\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1124 " \"name1\": 1,\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1125 " \"name2\": 3\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1126 " }, {\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1127 " \"name2\": 7,\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1128 " \"name1\": 3\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1129 " }],\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1130 " \"floats\": [3.1415, 47.11, 8.15],\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1131 " \"literals\": [true, null, false],\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1132 " \"ints\": [4, 8, 15, [16, 23], 42]\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1133 " }\n"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1134 "}"
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1135 );
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1136
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1137 CxJsonWriter writer = cxJsonWriterPretty(true);
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1138 writer.sort_members = false;
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1139 CX_TEST_CALL_SUBROUTINE(test_json_write_sub, allocator, expected, &writer);
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1140 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc));
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1141 }
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1142 cx_testing_allocator_destroy(&talloc);
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1143 }
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1144
1117
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1145 CX_TEST(test_json_write_frac_max_digits) {
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1146 CxJsonValue* num = cxJsonCreateNumber(NULL, 3.141592653589793);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1147 CxJsonWriter writer = cxJsonWriterCompact();
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1148 CxBuffer buf;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1149 cxBufferInit(&buf, NULL, 32, NULL, 0);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1150 CX_TEST_DO {
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1151 // test default settings (6 digits)
1119
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1152 cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer);
1117
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1153 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("3.141592")));
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1154
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1155 // test too many digits
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1156 cxBufferReset(&buf);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1157 writer.frac_max_digits = 200;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1158 cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1159 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("3.141592653589793")));
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1160
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1161 // test 0 digits
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1162 cxBufferReset(&buf);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1163 writer.frac_max_digits = 0;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1164 cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1165 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("3")));
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1166
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1167 // test 2 digits
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1168 cxBufferReset(&buf);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1169 writer.frac_max_digits = 2;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1170 cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1171 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("3.14")));
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1172
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1173 // test 3 digits
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1174 cxBufferReset(&buf);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1175 writer.frac_max_digits = 3;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1176 cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1177 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("3.141")));
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1178
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1179 // test 6 digits, but two are left of the decimal point
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1180 num->value.number = 47.110815;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1181 cxBufferReset(&buf);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1182 writer.frac_max_digits = 6;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1183 cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1184 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("47.110815")));
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1185
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1186 // test 4 digits with exponent
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1187 num->value.number = 5.11223344e23;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1188 cxBufferReset(&buf);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1189 writer.frac_max_digits = 4;
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1190 cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1191 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("5.1122e+23")));
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1192 }
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1193 cxBufferDestroy(&buf);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1194 cxJsonValueFree(num);
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1195 }
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1196
1119
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1197 CX_TEST(test_json_write_string_escape) {
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1198 /**
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1199 * According to RFC-8259 we have to test the following characters:
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1200 * " quotation mark
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1201 * \ reverse solidus
1123
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1202 * / solidus ---> we make this optional, see test_json_write_solidus
1119
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1203 * b backspace
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1204 * f form feed
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1205 * n line feed
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1206 * r carriage return
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1207 * t tab
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1208 * And all other control characters must be encoded uXXXX - in our example the bell character.
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1209 * Also, all unicode characters are encoded that way - in our example the 'ö'.
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1210 */
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1211 CxJsonValue* str = cxJsonCreateString(NULL,
1123
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1212 "hello\twörld\r\nthis is\\a \"string\"\b in \a string\f");
1119
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1213 CxJsonWriter writer = cxJsonWriterCompact();
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1214 CxBuffer buf;
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1215 cxBufferInit(&buf, NULL, 128, NULL, 0);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1216 CX_TEST_DO {
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1217 cxJsonWrite(&buf, str, cxBufferWriteFunc, &writer);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1218 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size),
1130
5bcb725119b6 fix wrong accidental unicode escaping
Mike Becker <universe@uap-core.de>
parents: 1123
diff changeset
1219 CX_STR("\"hello\\twörld\\r\\nthis is\\\\a \\\"string\\\"\\b in \\u0007 string\\f\"")));
1119
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1220 }
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1221 cxBufferDestroy(&buf);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1222 cxJsonValueFree(str);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1223 }
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1224
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1225 CX_TEST(test_json_write_name_escape) {
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1226 CxJsonValue* obj = cxJsonCreateObj(NULL);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1227 cxJsonObjPutLiteral(obj,
1123
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1228 CX_STR("hello\twörld\r\nthis is\\a \"string\"\b in \a string\f"), CX_JSON_TRUE);
1119
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1229 CxJsonWriter writer = cxJsonWriterCompact();
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1230 CxBuffer buf;
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1231 cxBufferInit(&buf, NULL, 128, NULL, 0);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1232 CX_TEST_DO {
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1233 cxJsonWrite(&buf, obj, cxBufferWriteFunc, &writer);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1234 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size),
1130
5bcb725119b6 fix wrong accidental unicode escaping
Mike Becker <universe@uap-core.de>
parents: 1123
diff changeset
1235 CX_STR("{\"hello\\twörld\\r\\nthis is\\\\a \\\"string\\\"\\b in \\u0007 string\\f\":true}")));
1119
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1236 }
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1237 cxBufferDestroy(&buf);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1238 cxJsonValueFree(obj);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1239 }
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1240
1123
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1241 CX_TEST(test_json_write_solidus) {
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1242 CxJsonValue* str = cxJsonCreateString(NULL,"test/solidus");
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1243 CxJsonWriter writer = cxJsonWriterCompact();
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1244 CxBuffer buf;
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1245 cxBufferInit(&buf, NULL, 16, NULL, 0);
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1246 CX_TEST_DO {
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1247 // default: do not escape
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1248 cxJsonWrite(&buf, str, cxBufferWriteFunc, &writer);
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1249 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("\"test/solidus\"")));
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1250
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1251 // enable escaping
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1252 writer.escape_slash = true;
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1253 cxBufferReset(&buf);
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1254 cxJsonWrite(&buf, str, cxBufferWriteFunc, &writer);
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1255 CX_TEST_ASSERT(0 == cx_strcmp(cx_strn(buf.space, buf.size), CX_STR("\"test\\/solidus\"")));
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1256 }
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1257 cxBufferDestroy(&buf);
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1258 cxJsonValueFree(str);
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1259 }
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1260
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1261 CxTestSuite *cx_test_suite_json(void) {
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1262 CxTestSuite *suite = cx_test_suite_new("json");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1263
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
1264 cx_test_register(suite, test_json_init_default);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1265 cx_test_register(suite, test_json_simple_object);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
1266 cx_test_register(suite, test_json_escaped_strings);
1149
df5665de7344 implement unicode escape sequences in json unescape_string function
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 1139
diff changeset
1267 cx_test_register(suite, test_json_escaped_unicode_strings);
1156
96f16b5a0029 add test and implementation for malformed escape sequences
Mike Becker <universe@uap-core.de>
parents: 1154
diff changeset
1268 cx_test_register(suite, test_json_escaped_unicode_malformed);
1139
7dfa5bcf39ee remove token_escape bool from CxJson struct
Mike Becker <universe@uap-core.de>
parents: 1130
diff changeset
1269 cx_test_register(suite, test_json_escaped_end_of_string);
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
1270 cx_test_register(suite, test_json_object_incomplete_token);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
1271 cx_test_register(suite, test_json_token_wrongly_completed);
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
1272 cx_test_register(suite, test_json_object_error);
1338
cc153bffea28 add cxJsonObjRemove() #627
Mike Becker <universe@uap-core.de>
parents: 1337
diff changeset
1273 cx_test_register(suite, test_json_object_remove_member);
1007
81b2986d2b04 fix that cxBufferSeek() cannot move pos past the end - fixes #523
Mike Becker <universe@uap-core.de>
parents: 1002
diff changeset
1274 cx_test_register(suite, test_json_subsequent_fill);
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
1275 cx_test_register(suite, test_json_large_nesting_depth);
975
96bf02371aef adds test case for numbers - currently fails due to issue #482
Mike Becker <universe@uap-core.de>
parents: 973
diff changeset
1276 cx_test_register(suite, test_json_number);
1015
a0922b925d2a increase test coverage
Mike Becker <universe@uap-core.de>
parents: 1007
diff changeset
1277 cx_test_register(suite, test_json_number_format_errors);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
1278 cx_test_register(suite, test_json_multiple_values);
1337
6dfa1eb58ce3 add cxJsonArrayRemove()
Mike Becker <universe@uap-core.de>
parents: 1247
diff changeset
1279 cx_test_register(suite, test_json_array);
1033
e3009345984b add cxJsonArrIter() - fixes #524
Mike Becker <universe@uap-core.de>
parents: 1032
diff changeset
1280 cx_test_register(suite, test_json_array_iterator);
996
333155f234c4 add support for allocators to the json parser
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 978
diff changeset
1281 cx_test_register(suite, test_json_allocator);
1000
1aecddf7e209 simplify how the json parser works
Mike Becker <universe@uap-core.de>
parents: 997
diff changeset
1282 cx_test_register(suite, test_json_allocator_parse_error);
1057
4e8436c3e806 add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
Mike Becker <universe@uap-core.de>
parents: 1051
diff changeset
1283 cx_test_register(suite, test_json_create_value);
1072
c89283cd559b first mvp for the json writer - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1063
diff changeset
1284 cx_test_register(suite, test_json_write_default_format);
1078
ffa8bb4e9288 implement JSON pretty printing - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1075
diff changeset
1285 cx_test_register(suite, test_json_write_pretty_default_spaces);
1080
e16f4f336e3c add test case for pretty printing with tabs - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1078
diff changeset
1286 cx_test_register(suite, test_json_write_pretty_default_tabs);
1082
46cdc8689fc4 implement index array to preserve order of json object members
Mike Becker <universe@uap-core.de>
parents: 1081
diff changeset
1287 cx_test_register(suite, test_json_write_pretty_preserve_order);
1117
54df904472b0 add fractional number formatting - relates to #526
Mike Becker <universe@uap-core.de>
parents: 1112
diff changeset
1288 cx_test_register(suite, test_json_write_frac_max_digits);
1119
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1289 cx_test_register(suite, test_json_write_string_escape);
ff4d7e76f85a implement string escape - resolves #526
Mike Becker <universe@uap-core.de>
parents: 1117
diff changeset
1290 cx_test_register(suite, test_json_write_name_escape);
1123
2b83302d595a make escaping slashes optional - fixes #569
Mike Becker <universe@uap-core.de>
parents: 1119
diff changeset
1291 cx_test_register(suite, test_json_write_solidus);
977
a941b01b684f add test for reading multiple json values
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 975
diff changeset
1292
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1293 return suite;
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1294 }
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1295

mercurial