tests/test_json.c

Fri, 01 Nov 2024 18:16:32 +0100

author
Mike Becker <universe@uap-core.de>
date
Fri, 01 Nov 2024 18:16:32 +0100
changeset 967
a58f602ed2fe
parent 966
1aa7ec3e46e7
permissions
-rw-r--r--

simplify parsing of array and object elements

relates to #431

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
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #include "cx/test.h"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 #include "cx/json.h"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
33 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
34 CxJson json;
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
35 CX_TEST_DO {
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
36 cxJsonInit(&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_ASSERT(json.states == json.states_internal);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
38 CX_TEST_ASSERT(json.nstates == 0);
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_alloc == 8);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
40 CX_TEST_ASSERT(json.reader_array_alloc == 8);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
41 }
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
42 }
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
43
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 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
45 cxstring text = cx_str(
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 "{\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 "\t\"message\":\"success\",\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 "\t\"position\":{\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 "\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
50 "\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
51 "\t},\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 "\t\"timestamp\":1729348561,\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 "\t\"alive\":true\n"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 "}"
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 );
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 CX_TEST_DO {
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 int result;
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 CxJson json;
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61 cxJsonInit(&json);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 cxJsonFill(&json, text.ptr, text.length);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64 // parse the big fat object
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 CxJsonValue *obj;
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 result = cxJsonNext(&json, &obj);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 CX_TEST_ASSERT(result == 1);
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 // check the contents
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 CX_TEST_ASSERT(cxJsonIsObject(obj));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 CxJsonValue *message = cxJsonObjGet(obj, "message");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 CX_TEST_ASSERT(cxJsonIsString(message));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 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
75 cxJsonAsCxString(message),
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 cx_str("success"))
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 );
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 CxJsonValue *position = cxJsonObjGet(obj, "position");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 CX_TEST_ASSERT(cxJsonIsObject(position));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 CxJsonValue *longitude = cxJsonObjGet(position, "longitude");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 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
83 CX_TEST_ASSERT(!cxJsonIsInteger(longitude));
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 CX_TEST_ASSERT(cxJsonAsDouble(longitude) == -94.7099);
966
1aa7ec3e46e7 treat integers and doubles both as JSON numbers
Mike Becker <universe@uap-core.de>
parents: 946
diff changeset
85 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
86 CxJsonValue *latitude = cxJsonObjGet(position, "latitude");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87 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
88 CX_TEST_ASSERT(!cxJsonIsInteger(latitude));
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
89 CX_TEST_ASSERT(cxJsonAsDouble(latitude) == 51.5539);
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(latitude) == 51);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 CxJsonValue *timestamp = cxJsonObjGet(obj, "timestamp");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 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
94 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
95 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
96 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
97
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 CxJsonValue *alive = cxJsonObjGet(obj, "alive");
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 CX_TEST_ASSERT(cxJsonIsBool(alive));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 CX_TEST_ASSERT(cxJsonIsTrue(alive));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101 CX_TEST_ASSERT(!cxJsonIsFalse(alive));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 CX_TEST_ASSERT(cxJsonAsBool(alive));
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
103
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
104 // this recursively frees everything else
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105 cxJsonValueFree(obj);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 // 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
108 result = cxJsonNext(&json, &obj);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 CX_TEST_ASSERT(result == 0);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 cxJsonDestroy(&json);
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 }
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 }
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
115 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
116 cxstring text = cx_str(
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
117 "{\"message\":\"success\" , \"__timestamp\":1729348561}");
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
118 cxstring parts[16];
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
119 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
120 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
121 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
122 }
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
123
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
124 CX_TEST_DO {
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
125 int result;
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
126
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
127 CxJson json;
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
128 cxJsonInit(&json);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
129 CxJsonValue *obj;
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
130
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
131 size_t part = 0;
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
132 while(part < nparts) {
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
133 cxJsonFill(&json, parts[part].ptr, parts[part].length);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
134 part++;
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
135 result = cxJsonNext(&json, &obj);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
136
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
137 if(result != 0) {
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
138 break;
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
139 }
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
140 }
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
141
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
142 CX_TEST_ASSERT(result == 1);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
143 CX_TEST_ASSERT(part == nparts);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
144 CX_TEST_ASSERT(obj);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
145
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
146 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
147 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
148 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
149 cxJsonAsCxString(message),
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
150 cx_str("success"))
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
151 );
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
152 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
153 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
154 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
155 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
156
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
157 // 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
158 cxJsonValueFree(obj);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
159
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
160 // we only have one object that already contained all the data
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
161 result = cxJsonNext(&json, &obj);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
162 CX_TEST_ASSERT(result == 0);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
163
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
164 cxJsonDestroy(&json);
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
165 }
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
166 }
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
167
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
168 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
169 cxstring text0 = cx_str(
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
170 "{\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
171 "\t\"message\":\"success\",\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
172 "\t\"data\":{\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
173 "\t\t\"obj\":{\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
174 "\t\t\t\"array\": [1, 2, 3, ?syntaxerror? ]\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
175 "\t\t\"}\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
176 "\t},\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
177 "\t\"timestamp\":1729348561,\n"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
178 "}"
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
179 );
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
180 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
181 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
182 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
183 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
184
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
185 cxstring tests[] = { text0, text1, text2, text3, text4 };
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
186
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
187 CX_TEST_DO {
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
188 int result;
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
189 CxJson json;
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
190 CxJsonValue *obj = NULL;
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
191
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
192 for(int i=0;i<5;i++) {
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
193 cxJsonInit(&json);
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
194 cxJsonFill(&json, tests[i].ptr, tests[i].length);
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
195 result = cxJsonNext(&json, &obj);
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
196
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
197 CX_TEST_ASSERT(result == -1);
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
198 CX_TEST_ASSERT(obj == NULL);
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
199 cxJsonDestroy(&json);
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
200 }
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
201 }
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
202 }
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
203
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
204 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
205 CxJson json;
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
206 CxJsonValue *d1;
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
207 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
208 CX_TEST_DO {
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
209 cxJsonInit(&json);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
210 cxJsonFill(&json, text.ptr, text.length);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
211 cxJsonNext(&json, &d1);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
212
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
213 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
214 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
215 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
216 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
217 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
218 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
219 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
220 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
221 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
222 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
223 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
224 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
225 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
226 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
227 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
228 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
229 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
230 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
231 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
232 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
233 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
234 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
235 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
236 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
237 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
238 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
239 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
240 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
241
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
242 CX_TEST_ASSERT(json.states != json.states_internal);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
243 CX_TEST_ASSERT(json.states_alloc > cx_nmemb(json.states_internal));
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
244
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
245 cxJsonDestroy(&json);
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
246 }
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
247 }
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
248
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
249 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
250 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
251
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
252 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
253 cx_test_register(suite, test_json_simple_object);
939
0bb7258366a0 add test for parsing json with multiple incomplete tokens
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 937
diff changeset
254 cx_test_register(suite, test_json_object_incomplete_token);
941
9077724b75a0 fix incomplete json object not resulting in syntax error
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 939
diff changeset
255 cx_test_register(suite, test_json_object_error);
946
b428424c0214 avoid state buffer allocation for JSON with reasonable nesting depth
Mike Becker <universe@uap-core.de>
parents: 941
diff changeset
256 cx_test_register(suite, test_json_large_nesting_depth);
937
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
257
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
258 return suite;
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
259 }
10123f4d5618 add first draft of json implementation - relates to #431
Mike Becker <universe@uap-core.de>
parents:
diff changeset
260

mercurial