| 136 CX_TEST_ASSERT(cxJsonIsString(object)); |
137 CX_TEST_ASSERT(cxJsonIsString(object)); |
| 137 CX_TEST_ASSERT(0 == cx_strcmp( |
138 CX_TEST_ASSERT(0 == cx_strcmp( |
| 138 cxJsonAsCxString(object), |
139 cxJsonAsCxString(object), |
| 139 CX_STR("{\n\t\"object\":null\n}")) |
140 CX_STR("{\n\t\"object\":null\n}")) |
| 140 ); |
141 ); |
| |
142 CxJsonValue *ctrl = cxJsonObjGet(obj, "ctrl-chars"); |
| |
143 CX_TEST_ASSERT(cxJsonIsString(ctrl)); |
| |
144 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
145 cxJsonAsCxString(ctrl), |
| |
146 CX_STR("\\foo\r\nbar\f*ring/ring*\b")) |
| |
147 ); |
| |
148 cxJsonValueFree(obj); |
| |
149 } |
| |
150 cxJsonDestroy(&json); |
| |
151 } |
| |
152 |
| |
153 CX_TEST(test_json_escaped_unicode_strings) { |
| |
154 cxstring text = cx_str( |
| |
155 "{\n" |
| |
156 "\"ascii\":\"\\u0041\\u0053\\u0043\\u0049\\u0049\",\n" |
| |
157 "\"unicode\":\"\\u00df\\u00DF\",\n" |
| |
158 "\"mixed\":\"mixed ä ö \\u00e4 \\u00f6\",\n" |
| |
159 "\"wide\":\"\\u03a3\\u29b0\",\n" |
| |
160 "\"surrogatepair1\":\"\\ud83e\\udff5\",\n" |
| |
161 "\"surrogatepair2\":\"test\\ud83e\\udff1AA\"\n," |
| |
162 "\"mixed2\":\"123\\u03a3\\ud83e\\udfc5\\u00df\"" |
| |
163 "}" |
| |
164 ); |
| |
165 |
| |
166 CxJson json; |
| |
167 cxJsonInit(&json, NULL); |
| |
168 CX_TEST_DO { |
| |
169 cxJsonFill(&json, text); |
| |
170 CxJsonValue *obj; |
| |
171 CxJsonStatus result = cxJsonNext(&json, &obj); |
| |
172 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
| |
173 CX_TEST_ASSERT(cxJsonIsObject(obj)); |
| |
174 |
| |
175 CxJsonValue *ascii = cxJsonObjGet(obj, "ascii"); |
| |
176 CX_TEST_ASSERT(cxJsonIsString(ascii)); |
| |
177 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
178 cxJsonAsCxString(ascii), |
| |
179 CX_STR("ASCII")) |
| |
180 ); |
| |
181 |
| |
182 CxJsonValue *unicode = cxJsonObjGet(obj, "unicode"); |
| |
183 CX_TEST_ASSERT(cxJsonIsString(unicode)); |
| |
184 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
185 cxJsonAsCxString(unicode), |
| |
186 CX_STR("ßß")) |
| |
187 ); |
| |
188 |
| |
189 CxJsonValue *mixed = cxJsonObjGet(obj, "mixed"); |
| |
190 CX_TEST_ASSERT(cxJsonIsString(mixed)); |
| |
191 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
192 cxJsonAsCxString(mixed), |
| |
193 CX_STR("mixed ä ö ä ö")) |
| |
194 ); |
| |
195 |
| |
196 CxJsonValue *wide = cxJsonObjGet(obj, "wide"); |
| |
197 CX_TEST_ASSERT(cxJsonIsString(wide)); |
| |
198 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
199 cxJsonAsCxString(wide), |
| |
200 CX_STR("\u03a3\u29b0")) |
| |
201 ); |
| |
202 |
| |
203 CxJsonValue *surrogatepair1 = cxJsonObjGet(obj, "surrogatepair1"); |
| |
204 CX_TEST_ASSERT(cxJsonIsString(surrogatepair1)); |
| |
205 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
206 cxJsonAsCxString(surrogatepair1), |
| |
207 CX_STR("\xf0\x9f\xaf\xb5")) |
| |
208 ); |
| |
209 |
| |
210 CxJsonValue *surrogatepair2 = cxJsonObjGet(obj, "surrogatepair2"); |
| |
211 CX_TEST_ASSERT(cxJsonIsString(surrogatepair2)); |
| |
212 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
213 cxJsonAsCxString(surrogatepair2), |
| |
214 CX_STR("test\xf0\x9f\xaf\xb1" "AA")) |
| |
215 ); |
| |
216 |
| |
217 CxJsonValue *mixed2 = cxJsonObjGet(obj, "mixed2"); |
| |
218 CX_TEST_ASSERT(cxJsonIsString(mixed2)); |
| |
219 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
220 cxJsonAsCxString(mixed2), |
| |
221 CX_STR("123\u03a3\xf0\x9f\xaf\x85ß")) |
| |
222 ); |
| |
223 |
| |
224 cxJsonValueFree(obj); |
| |
225 } |
| |
226 cxJsonDestroy(&json); |
| |
227 } |
| |
228 |
| |
229 CX_TEST(test_json_escaped_unicode_malformed) { |
| |
230 CxJson json; |
| |
231 cxJsonInit(&json, NULL); |
| |
232 CxJsonValue *obj; |
| |
233 CxJsonStatus result; |
| |
234 CX_TEST_DO { |
| |
235 cxJsonFill(&json, "\"too few \\u123 digits\""); |
| |
236 result = cxJsonNext(&json, &obj); |
| |
237 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
| |
238 CX_TEST_ASSERT(cxJsonIsString(obj)); |
| |
239 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
240 cxJsonAsCxString(obj), |
| |
241 CX_STR("too few \\u123 digits") |
| |
242 )); |
| |
243 cxJsonValueFree(obj); |
| |
244 cxJsonFill(&json, "\"too many \\u00E456 digits\""); |
| |
245 result = cxJsonNext(&json, &obj); |
| |
246 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
| |
247 CX_TEST_ASSERT(cxJsonIsString(obj)); |
| |
248 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
249 cxJsonAsCxString(obj), |
| |
250 CX_STR("too many ä56 digits") |
| |
251 )); |
| |
252 cxJsonValueFree(obj); |
| |
253 cxJsonFill(&json, "\"only high \\uD800 surrogate\""); |
| |
254 result = cxJsonNext(&json, &obj); |
| |
255 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
| |
256 CX_TEST_ASSERT(cxJsonIsString(obj)); |
| |
257 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
258 cxJsonAsCxString(obj), |
| |
259 CX_STR("only high \\uD800 surrogate") |
| |
260 )); |
| |
261 cxJsonValueFree(obj); |
| |
262 cxJsonFill(&json, "\"only low \\uDC00 surrogate\""); |
| |
263 result = cxJsonNext(&json, &obj); |
| |
264 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
| |
265 CX_TEST_ASSERT(cxJsonIsString(obj)); |
| |
266 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
267 cxJsonAsCxString(obj), |
| |
268 CX_STR("only low \\uDC00 surrogate") |
| |
269 )); |
| |
270 cxJsonValueFree(obj); |
| |
271 cxJsonFill(&json, "\"two high \\uD800\\uD800 surrogates\""); |
| |
272 result = cxJsonNext(&json, &obj); |
| |
273 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
| |
274 CX_TEST_ASSERT(cxJsonIsString(obj)); |
| |
275 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
276 cxJsonAsCxString(obj), |
| |
277 CX_STR("two high \\uD800\\uD800 surrogates") |
| |
278 )); |
| |
279 cxJsonValueFree(obj); |
| |
280 cxJsonFill(&json, "\"high plus bullshit \\uD800\\u567 foo\""); |
| |
281 result = cxJsonNext(&json, &obj); |
| |
282 CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); |
| |
283 CX_TEST_ASSERT(cxJsonIsString(obj)); |
| |
284 CX_TEST_ASSERT(0 == cx_strcmp( |
| |
285 cxJsonAsCxString(obj), |
| |
286 CX_STR("high plus bullshit \\uD800\\u567 foo") |
| |
287 )); |
| 141 cxJsonValueFree(obj); |
288 cxJsonValueFree(obj); |
| 142 } |
289 } |
| 143 cxJsonDestroy(&json); |
290 cxJsonDestroy(&json); |
| 144 } |
291 } |
| 145 |
292 |
| 1040 CxTestSuite *suite = cx_test_suite_new("json"); |
1187 CxTestSuite *suite = cx_test_suite_new("json"); |
| 1041 |
1188 |
| 1042 cx_test_register(suite, test_json_init_default); |
1189 cx_test_register(suite, test_json_init_default); |
| 1043 cx_test_register(suite, test_json_simple_object); |
1190 cx_test_register(suite, test_json_simple_object); |
| 1044 cx_test_register(suite, test_json_escaped_strings); |
1191 cx_test_register(suite, test_json_escaped_strings); |
| |
1192 cx_test_register(suite, test_json_escaped_unicode_strings); |
| |
1193 cx_test_register(suite, test_json_escaped_unicode_malformed); |
| 1045 cx_test_register(suite, test_json_escaped_end_of_string); |
1194 cx_test_register(suite, test_json_escaped_end_of_string); |
| 1046 cx_test_register(suite, test_json_object_incomplete_token); |
1195 cx_test_register(suite, test_json_object_incomplete_token); |
| 1047 cx_test_register(suite, test_json_token_wrongly_completed); |
1196 cx_test_register(suite, test_json_token_wrongly_completed); |
| 1048 cx_test_register(suite, test_json_object_error); |
1197 cx_test_register(suite, test_json_object_error); |
| 1049 cx_test_register(suite, test_json_subsequent_fill); |
1198 cx_test_register(suite, test_json_subsequent_fill); |