Fri, 10 Oct 2025 12:26:43 +0200
assert instead of assume sorted property in debug builds
| 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: 
997diff
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: 
1060diff
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: 
941diff
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: 
941diff
changeset | 36 | CxJson json; | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 37 | CX_TEST_DO { | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 38 | cxJsonInit(&json, NULL); | 
| 946 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
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: 
997diff
changeset | 40 | CX_TEST_ASSERT(json.states_size == 1); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 41 | CX_TEST_ASSERT(json.states_capacity >= 8); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 42 | CX_TEST_ASSERT(json.vbuf == json.vbuf_internal); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 43 | CX_TEST_ASSERT(json.vbuf_size == 0); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 44 | CX_TEST_ASSERT(json.vbuf_capacity >= 8); | 
| 1032 
aaad28e23dac
fix memory leaks in json tests
 Mike Becker <universe@uap-core.de> parents: 
1015diff
changeset | 45 | cxJsonDestroy(&json); | 
| 946 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 46 | } | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 47 | } | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
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: 
1000diff
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: 
997diff
changeset | 66 | cxJsonInit(&json, NULL); | 
| 973 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
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: 
1000diff
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: 
946diff
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: 
946diff
changeset | 88 | CX_TEST_ASSERT(!cxJsonIsInteger(longitude)); | 
| 1063 
e453e717876e
implement floating point string to number conversions
 Mike Becker <universe@uap-core.de> parents: 
1060diff
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: 
946diff
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: 
946diff
changeset | 93 | CX_TEST_ASSERT(!cxJsonIsInteger(latitude)); | 
| 1063 
e453e717876e
implement floating point string to number conversions
 Mike Becker <universe@uap-core.de> parents: 
1060diff
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: 
946diff
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: 
946diff
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: 
946diff
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: 
1000diff
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 | 120 | CX_TEST(test_json_escaped_strings) { | 
| 121 | cxstring text = cx_str( | |
| 122 | "{\n" | |
| 1154 
afd12f31d28a
add missing test coverage for escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1152diff
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: 
1152diff
changeset | 124 | "\t\"ctrl-chars\":\"\\\\foo\\r\\nbar\\f*ring\\/ring*\\b\"\n" | 
| 1015 | 125 | "}" | 
| 126 | ); | |
| 127 | ||
| 128 | CxJson json; | |
| 129 | cxJsonInit(&json, NULL); | |
| 130 | CX_TEST_DO { | |
| 131 | cxJsonFill(&json, text); | |
| 132 | CxJsonValue *obj; | |
| 133 | CxJsonStatus result = cxJsonNext(&json, &obj); | |
| 134 | CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); | |
| 135 | CX_TEST_ASSERT(cxJsonIsObject(obj)); | |
| 136 | CxJsonValue *object = cxJsonObjGet(obj, "object"); | |
| 137 | CX_TEST_ASSERT(cxJsonIsString(object)); | |
| 138 | CX_TEST_ASSERT(0 == cx_strcmp( | |
| 139 | cxJsonAsCxString(object), | |
| 140 | CX_STR("{\n\t\"object\":null\n}")) | |
| 141 | ); | |
| 1154 
afd12f31d28a
add missing test coverage for escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1152diff
changeset | 142 | CxJsonValue *ctrl = cxJsonObjGet(obj, "ctrl-chars"); | 
| 
afd12f31d28a
add missing test coverage for escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1152diff
changeset | 143 | CX_TEST_ASSERT(cxJsonIsString(ctrl)); | 
| 
afd12f31d28a
add missing test coverage for escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1152diff
changeset | 144 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
afd12f31d28a
add missing test coverage for escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1152diff
changeset | 145 | cxJsonAsCxString(ctrl), | 
| 
afd12f31d28a
add missing test coverage for escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1152diff
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: 
1152diff
changeset | 147 | ); | 
| 1157 | 148 | cxJsonValueFree(obj); | 
| 1015 | 149 | } | 
| 150 | cxJsonDestroy(&json); | |
| 151 | } | |
| 152 | ||
| 1149 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
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: 
1139diff
changeset | 154 | cxstring text = cx_str( | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 155 | "{\n" | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
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: 
1139diff
changeset | 157 | "\"unicode\":\"\\u00df\\u00DF\",\n" | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
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: 
1149diff
changeset | 159 | "\"wide\":\"\\u03a3\\u29b0\",\n" | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 160 | "\"surrogatepair1\":\"\\ud83e\\udff5\",\n" | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 161 | "\"surrogatepair2\":\"test\\ud83e\\udff1AA\"\n," | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
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: 
1139diff
changeset | 163 | "}" | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 164 | ); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 165 | |
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 166 | CxJson json; | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 167 | cxJsonInit(&json, NULL); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 168 | CX_TEST_DO { | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 169 | cxJsonFill(&json, text); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 170 | CxJsonValue *obj; | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 171 | CxJsonStatus result = cxJsonNext(&json, &obj); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
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: 
1139diff
changeset | 173 | CX_TEST_ASSERT(cxJsonIsObject(obj)); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 174 | |
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 175 | CxJsonValue *ascii = cxJsonObjGet(obj, "ascii"); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 176 | CX_TEST_ASSERT(cxJsonIsString(ascii)); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
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: 
1139diff
changeset | 178 | cxJsonAsCxString(ascii), | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 179 | CX_STR("ASCII")) | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 180 | ); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 181 | |
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 182 | CxJsonValue *unicode = cxJsonObjGet(obj, "unicode"); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 183 | CX_TEST_ASSERT(cxJsonIsString(unicode)); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
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: 
1139diff
changeset | 185 | cxJsonAsCxString(unicode), | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 186 | CX_STR("ßß")) | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 187 | ); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 188 | |
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 189 | CxJsonValue *mixed = cxJsonObjGet(obj, "mixed"); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 190 | CX_TEST_ASSERT(cxJsonIsString(mixed)); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
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: 
1139diff
changeset | 192 | cxJsonAsCxString(mixed), | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 193 | CX_STR("mixed ä ö ä ö")) | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 194 | ); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 195 | |
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 196 | CxJsonValue *wide = cxJsonObjGet(obj, "wide"); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
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: 
1179diff
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: 
1139diff
changeset | 199 | |
| 1152 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 200 | CxJsonValue *surrogatepair1 = cxJsonObjGet(obj, "surrogatepair1"); | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 201 | CX_TEST_ASSERT(cxJsonIsString(surrogatepair1)); | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
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: 
1149diff
changeset | 203 | cxJsonAsCxString(surrogatepair1), | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
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: 
1149diff
changeset | 205 | ); | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 206 | |
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 207 | CxJsonValue *surrogatepair2 = cxJsonObjGet(obj, "surrogatepair2"); | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 208 | CX_TEST_ASSERT(cxJsonIsString(surrogatepair2)); | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
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: 
1149diff
changeset | 210 | cxJsonAsCxString(surrogatepair2), | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
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: 
1149diff
changeset | 212 | ); | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 213 | |
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 214 | CxJsonValue *mixed2 = cxJsonObjGet(obj, "mixed2"); | 
| 1177 
04ede4de9cec
fix unicode tests not working on all platforms
 Mike Becker <universe@uap-core.de> parents: 
1157diff
changeset | 215 | char test[16]; | 
| 
04ede4de9cec
fix unicode tests not working on all platforms
 Mike Becker <universe@uap-core.de> parents: 
1157diff
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: 
1157diff
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: 
1149diff
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: 
1149diff
changeset | 219 | cxJsonAsCxString(mixed2), | 
| 1177 
04ede4de9cec
fix unicode tests not working on all platforms
 Mike Becker <universe@uap-core.de> parents: 
1157diff
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: 
1149diff
changeset | 221 | ); | 
| 
e4af44b488bc
implement decoder for utf16 surrogate pairs in unescape_string
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1149diff
changeset | 222 | |
| 1149 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 223 | cxJsonValueFree(obj); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 224 | } | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 225 | cxJsonDestroy(&json); | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 226 | } | 
| 
df5665de7344
implement unicode escape sequences in json unescape_string function
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
1139diff
changeset | 227 | |
| 1156 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 229 | CxJson json; | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 230 | cxJsonInit(&json, NULL); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 231 | CxJsonValue *obj; | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 232 | CxJsonStatus result; | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 233 | CX_TEST_DO { | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 234 | cxJsonFill(&json, "\"too few \\u123 digits\""); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 235 | result = cxJsonNext(&json, &obj); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 237 | CX_TEST_ASSERT(cxJsonIsString(obj)); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 238 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 239 | cxJsonAsCxString(obj), | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 240 | CX_STR("too few \\u123 digits") | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 241 | )); | 
| 1157 | 242 | cxJsonValueFree(obj); | 
| 1156 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 243 | cxJsonFill(&json, "\"too many \\u00E456 digits\""); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 244 | result = cxJsonNext(&json, &obj); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 246 | CX_TEST_ASSERT(cxJsonIsString(obj)); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 247 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 248 | cxJsonAsCxString(obj), | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 249 | CX_STR("too many ä56 digits") | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 250 | )); | 
| 1157 | 251 | cxJsonValueFree(obj); | 
| 1156 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 252 | cxJsonFill(&json, "\"only high \\uD800 surrogate\""); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 253 | result = cxJsonNext(&json, &obj); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 255 | CX_TEST_ASSERT(cxJsonIsString(obj)); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 256 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 257 | cxJsonAsCxString(obj), | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 258 | CX_STR("only high \\uD800 surrogate") | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 259 | )); | 
| 1157 | 260 | cxJsonValueFree(obj); | 
| 1156 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 261 | cxJsonFill(&json, "\"only low \\uDC00 surrogate\""); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 262 | result = cxJsonNext(&json, &obj); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 264 | CX_TEST_ASSERT(cxJsonIsString(obj)); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 265 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 266 | cxJsonAsCxString(obj), | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 267 | CX_STR("only low \\uDC00 surrogate") | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 268 | )); | 
| 1157 | 269 | cxJsonValueFree(obj); | 
| 1156 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 271 | result = cxJsonNext(&json, &obj); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 273 | CX_TEST_ASSERT(cxJsonIsString(obj)); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 274 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 275 | cxJsonAsCxString(obj), | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 277 | )); | 
| 1157 | 278 | cxJsonValueFree(obj); | 
| 1156 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 280 | result = cxJsonNext(&json, &obj); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 282 | CX_TEST_ASSERT(cxJsonIsString(obj)); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 283 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 284 | cxJsonAsCxString(obj), | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
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: 
1154diff
changeset | 286 | )); | 
| 1157 | 287 | cxJsonValueFree(obj); | 
| 1156 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 288 | } | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 289 | cxJsonDestroy(&json); | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 290 | } | 
| 
96f16b5a0029
add test and implementation for malformed escape sequences
 Mike Becker <universe@uap-core.de> parents: 
1154diff
changeset | 291 | |
| 1139 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
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: 
1130diff
changeset | 293 | CxJson json; | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 294 | cxJsonInit(&json, NULL); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 295 | CX_TEST_DO { | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 296 | // first test, normal scenario | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 297 | cxJsonFill(&json, "\"a \\\"test\\\" string\""); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 298 | CxJsonValue *val; | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 299 | CxJsonStatus result = cxJsonNext(&json, &val); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
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: 
1130diff
changeset | 301 | CX_TEST_ASSERT(cxJsonIsString(val)); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 302 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 303 | cxJsonAsCxString(val), | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 304 | cx_str("a \"test\" string")) | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 305 | ); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 306 | cxJsonValueFree(val); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 307 | |
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
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: 
1130diff
changeset | 309 | cxJsonFill(&json, "\"a \\\"test\\"); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 310 | result = cxJsonNext(&json, &val); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
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: 
1130diff
changeset | 312 | cxJsonFill(&json, "\" string\""); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 313 | result = cxJsonNext(&json, &val); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
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: 
1130diff
changeset | 315 | CX_TEST_ASSERT(cxJsonIsString(val)); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 316 | CX_TEST_ASSERT(0 == cx_strcmp( | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 317 | cxJsonAsCxString(val), | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 318 | cx_str("a \"test\" string")) | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 319 | ); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 320 | cxJsonValueFree(val); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 321 | } | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 322 | cxJsonDestroy(&json); | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 323 | } | 
| 
7dfa5bcf39ee
remove token_escape bool from CxJson struct
 Mike Becker <universe@uap-core.de> parents: 
1130diff
changeset | 324 | |
| 939 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
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: 
937diff
changeset | 326 | cxstring text = cx_str( | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 327 | "{\"message\":\"success\" , \"__timestamp\":1729348561}"); | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 328 | cxstring parts[16]; | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
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: 
937diff
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: 
937diff
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: 
937diff
changeset | 332 | } | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 333 | |
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 334 | CX_TEST_DO { | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 335 | CxJsonStatus result; | 
| 939 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 336 | |
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 337 | CxJson json; | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 338 | cxJsonInit(&json, NULL); | 
| 939 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 339 | CxJsonValue *obj; | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 340 | |
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 341 | size_t part = 0; | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 342 | while(part < nparts - 1) { | 
| 973 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 343 | cxJsonFill(&json, parts[part]); | 
| 939 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 344 | part++; | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 345 | result = cxJsonNext(&json, &obj); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
937diff
changeset | 347 | } | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 348 | cxJsonFill(&json, parts[nparts - 1]); | 
| 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 349 | result = cxJsonNext(&json, &obj); | 
| 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
1002diff
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: 
937diff
changeset | 352 | |
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 353 | CxJsonValue *message = cxJsonObjGet(obj, "message"); | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 354 | CX_TEST_ASSERT(cxJsonIsString(message)); | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
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: 
946diff
changeset | 356 | cxJsonAsCxString(message), | 
| 939 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 357 | cx_str("success")) | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 358 | ); | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 359 | CxJsonValue *timestamp = cxJsonObjGet(obj, "__timestamp"); | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
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: 
937diff
changeset | 361 | CX_TEST_ASSERT(cxJsonIsInteger(timestamp)); | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
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: 
937diff
changeset | 363 | |
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 364 | // this recursively frees everything else | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 365 | cxJsonValueFree(obj); | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 366 | |
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
937diff
changeset | 368 | result = cxJsonNext(&json, &obj); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
937diff
changeset | 370 | |
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 371 | cxJsonDestroy(&json); | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 372 | } | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 373 | } | 
| 
0bb7258366a0
add test for parsing json with multiple incomplete tokens
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
937diff
changeset | 374 | |
| 1015 | 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: 
1072diff
changeset | 376 | CxTestingAllocator talloc; | 
| 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 377 | cx_testing_allocator_init(&talloc); | 
| 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 378 | const CxAllocator *alloc = &talloc.base; | 
| 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 379 | |
| 1015 | 380 | cxstring text = cx_str("{\"number\": 47110815!}"); | 
| 381 | cxstring part1 = cx_strsubsl(text, 0, 16); | |
| 382 | cxstring part2 = cx_strsubs(text, 16); | |
| 383 | ||
| 384 | CX_TEST_DO { | |
| 1075 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 385 | CxJson json; | 
| 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 386 | cxJsonInit(&json, alloc); | 
| 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 387 | |
| 1015 | 388 | CxJsonStatus result; | 
| 389 | CxJsonValue *obj; | |
| 390 | ||
| 391 | cxJsonFill(&json, part1); | |
| 392 | result = cxJsonNext(&json, &obj); | |
| 393 | CX_TEST_ASSERT(result == CX_JSON_INCOMPLETE_DATA); | |
| 394 | cxJsonFill(&json, part2); | |
| 395 | result = cxJsonNext(&json, &obj); | |
| 396 | CX_TEST_ASSERT(result == CX_JSON_FORMAT_ERROR_NUMBER); | |
| 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: 
1072diff
changeset | 398 | |
| 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 399 | cxJsonDestroy(&json); | 
| 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 400 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); | 
| 1015 | 401 | } | 
| 1075 
0cc4b63a0ae0
fix cxJsonDestroy() not freeing uncompleted object member names
 Mike Becker <universe@uap-core.de> parents: 
1072diff
changeset | 402 | cx_testing_allocator_destroy(&talloc); | 
| 1015 | 403 | } | 
| 404 | ||
| 1007 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
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: 
1002diff
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: 
1002diff
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: 
1002diff
changeset | 408 | |
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
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: 
1002diff
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: 
1002diff
changeset | 411 | |
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 412 | CX_TEST_DO { | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 413 | CxJson json; | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 414 | cxJsonInit(&json, NULL); | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 415 | CxJsonValue *obj; | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 416 | |
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 417 | cxJsonFill(&json, part1); | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 418 | cxJsonFill(&json, part2); | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
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: 
1002diff
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: 
1002diff
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: 
1002diff
changeset | 422 | |
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
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: 
1002diff
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: 
1002diff
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: 
1002diff
changeset | 426 | cxJsonAsCxString(message), | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 427 | cx_str("success")) | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 428 | ); | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
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: 
1002diff
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: 
1002diff
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: 
1002diff
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: 
1002diff
changeset | 433 | |
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 434 | cxJsonValueFree(obj); | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
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: 
1002diff
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: 
1002diff
changeset | 437 | |
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 438 | cxJsonDestroy(&json); | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 439 | } | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 440 | } | 
| 
81b2986d2b04
fix that cxBufferSeek() cannot move pos past the end - fixes #523
 Mike Becker <universe@uap-core.de> parents: 
1002diff
changeset | 441 | |
| 941 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
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: 
939diff
changeset | 443 | cxstring text0 = cx_str( | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 444 | "{\n" | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 445 | "\t\"message\":\"success\",\n" | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 446 | "\t\"data\":{\n" | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 447 | "\t\t\"obj\":{\n" | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 448 | "\t\t\t\"array\": [1, 2, 3, ?syntaxerror? ]\n" | 
| 1338 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 449 | "\t\t}\n" | 
| 941 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 450 | "\t},\n" | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 451 | "\t\"timestamp\":1729348561,\n" | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 452 | "}" | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 453 | ); | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 454 | cxstring text1 = cx_str("{ \"string\" }"); | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 455 | cxstring text2 = cx_str("{ \"a\" : }"); | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
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: 
939diff
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: 
939diff
changeset | 458 | |
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
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: 
1000diff
changeset | 460 | CxJsonStatus errors[] = { | 
| 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 461 | CX_JSON_FORMAT_ERROR_NUMBER, | 
| 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
1000diff
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: 
1000diff
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: 
1000diff
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: 
1000diff
changeset | 466 | }; | 
| 941 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 467 | |
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 468 | CX_TEST_DO { | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 469 | CxJsonStatus result; | 
| 941 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 470 | CxJson json; | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 471 | CxJsonValue *obj = NULL; | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 472 | |
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 473 | for(int i=0;i<5;i++) { | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 474 | cxJsonInit(&json, NULL); | 
| 973 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 475 | cxJsonFill(&json, tests[i]); | 
| 941 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 476 | result = cxJsonNext(&json, &obj); | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 477 | |
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 478 | CX_TEST_ASSERT(result == errors[i]); | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
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: 
939diff
changeset | 480 | cxJsonDestroy(&json); | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 481 | } | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 482 | } | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 483 | } | 
| 
9077724b75a0
fix incomplete json object not resulting in syntax error
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
939diff
changeset | 484 | |
| 1338 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 485 | CX_TEST(test_json_object_remove_member) { | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 486 | CxTestingAllocator talloc; | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 487 | cx_testing_allocator_init(&talloc); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 488 | const CxAllocator *alloc = &talloc.base; | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 489 | CX_TEST_DO { | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 490 | CxJson json; | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 491 | cxJsonInit(&json, alloc); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 492 | cxJsonFill(&json, cx_str( | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 493 | "{\n" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 494 | "\t\"message\":\"success\",\n" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 495 | "\t\"data\":{\n" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 496 | "\t\t\"obj\":{\n" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 497 | "\t\t\t\"array\": [1, 2, 3]\n" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 498 | "\t\t}\n" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 499 | "\t},\n" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 500 | "\t\"timestamp\":1729348561\n" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 501 | "}" | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 502 | )); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 503 | CxJsonValue *obj; | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 504 | CX_TEST_ASSERT(CX_JSON_NO_ERROR == cxJsonNext(&json, &obj)); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 505 | cxJsonDestroy(&json); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 506 | |
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 507 | CX_TEST_ASSERT(cxJsonIsObject(cxJsonObjGet(obj, "data"))); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 508 | CxJsonValue *data = cxJsonObjRemove(obj, "data"); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 509 | CX_TEST_ASSERT(cxJsonIsObject(data)); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 510 | CX_TEST_ASSERT(!cxJsonIsObject(cxJsonObjGet(obj, "data"))); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 511 | CX_TEST_ASSERT(cxJsonIsObject(cxJsonObjGet(data, "obj"))); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 512 | |
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 513 | CX_TEST_ASSERT(NULL == cxJsonObjRemove(obj, "data")); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 514 | |
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 515 | // does not verify, yet, because we extracted an object | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 516 | cxJsonValueFree(obj); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 517 | CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 518 | |
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 519 | cxJsonValueFree(data); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 520 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 521 | } | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 522 | cx_testing_allocator_destroy(&talloc); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 523 | } | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 524 | |
| 946 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
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: 
941diff
changeset | 526 | CxJson json; | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 527 | CxJsonValue *d1; | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
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: 
941diff
changeset | 529 | CX_TEST_DO { | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 530 | cxJsonInit(&json, NULL); | 
| 973 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 531 | cxJsonFill(&json, text); | 
| 946 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 532 | cxJsonNext(&json, &d1); | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 533 | |
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
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: 
941diff
changeset | 562 | |
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
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: 
997diff
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: 
975diff
changeset | 565 | |
| 978 
1da52af18ac3
fix memory leaks in json tests
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
977diff
changeset | 566 | cxJsonValueFree(d1); | 
| 946 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 567 | cxJsonDestroy(&json); | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 568 | } | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 569 | } | 
| 
b428424c0214
avoid state buffer allocation for JSON with reasonable nesting depth
 Mike Becker <universe@uap-core.de> parents: 
941diff
changeset | 570 | |
| 973 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 571 | CX_TEST(test_json_number) { | 
| 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 572 | CxJson json; | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 573 | cxJsonInit(&json, NULL); | 
| 973 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 574 | CX_TEST_DO { | 
| 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 575 | CxJsonValue *v; | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 576 | CxJsonStatus result; | 
| 1015 | 577 | |
| 975 
96bf02371aef
adds test case for numbers - currently fails due to issue #482
 Mike Becker <universe@uap-core.de> parents: 
973diff
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: 
973diff
changeset | 579 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
973diff
changeset | 581 | CX_TEST_ASSERT(cxJsonIsNumber(v)); | 
| 1063 
e453e717876e
implement floating point string to number conversions
 Mike Becker <universe@uap-core.de> parents: 
1060diff
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: 
977diff
changeset | 583 | cxJsonValueFree(v); | 
| 1015 | 584 | |
| 975 
96bf02371aef
adds test case for numbers - currently fails due to issue #482
 Mike Becker <universe@uap-core.de> parents: 
973diff
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: 
973diff
changeset | 586 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
973diff
changeset | 588 | CX_TEST_ASSERT(cxJsonIsNumber(v)); | 
| 1063 
e453e717876e
implement floating point string to number conversions
 Mike Becker <universe@uap-core.de> parents: 
1060diff
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: 
977diff
changeset | 590 | cxJsonValueFree(v); | 
| 1015 | 591 | |
| 592 | cxJsonFill(&json, "0.815e-3 "); | |
| 593 | result = cxJsonNext(&json, &v); | |
| 594 | CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); | |
| 595 | CX_TEST_ASSERT(cxJsonIsNumber(v)); | |
| 1063 
e453e717876e
implement floating point string to number conversions
 Mike Becker <universe@uap-core.de> parents: 
1060diff
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: 
1015diff
changeset | 597 | cxJsonValueFree(v); | 
| 1015 | 598 | |
| 599 | cxJsonFill(&json, "1.23E4 "); | |
| 600 | result = cxJsonNext(&json, &v); | |
| 601 | CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); | |
| 602 | CX_TEST_ASSERT(cxJsonIsNumber(v)); | |
| 603 | CX_TEST_ASSERT(cxJsonAsInteger(v) == 12300); | |
| 604 | CX_TEST_ASSERT(cxJsonAsDouble(v) == 12300.0); | |
| 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: 
1057diff
changeset | 606 | |
| 
0a7c1bb2372d
avoid copying the filled data in the json parser when possible - fixes #530
 Mike Becker <universe@uap-core.de> parents: 
1057diff
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: 
1057diff
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: 
1057diff
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: 
1057diff
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: 
1057diff
changeset | 611 | // be as precise as possible | 
| 1063 
e453e717876e
implement floating point string to number conversions
 Mike Becker <universe@uap-core.de> parents: 
1060diff
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: 
1060diff
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: 
1057diff
changeset | 614 | cxJsonValueFree(v); | 
| 1015 | 615 | } | 
| 616 | cxJsonDestroy(&json); | |
| 617 | } | |
| 618 | ||
| 619 | CX_TEST(test_json_number_format_errors) { | |
| 620 | CxJson json; | |
| 621 | cxJsonInit(&json, NULL); | |
| 622 | CX_TEST_DO { | |
| 623 | CxJsonValue *v; | |
| 624 | CxJsonStatus result; | |
| 625 | ||
| 626 | cxJsonFill(&json, "+3.1415 "); | |
| 627 | result = cxJsonNext(&json, &v); | |
| 628 | CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, | |
| 629 | "leading plus is not RFC-8259 compliant"); | |
| 630 | CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); | |
| 631 | cxJsonReset(&json); | |
| 632 | ||
| 633 | cxJsonFill(&json, "0.815e-3.0 "); | |
| 634 | result = cxJsonNext(&json, &v); | |
| 635 | CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, | |
| 636 | "exponent must be an integer"); | |
| 637 | CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); | |
| 638 | cxJsonReset(&json); | |
| 639 | ||
| 640 | cxJsonFill(&json, "3.14e "); | |
| 641 | result = cxJsonNext(&json, &v); | |
| 642 | CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, | |
| 643 | "exponent cannot be empty"); | |
| 644 | CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); | |
| 645 | cxJsonReset(&json); | |
| 646 | ||
| 647 | cxJsonFill(&json, "3.14e~7 "); | |
| 648 | result = cxJsonNext(&json, &v); | |
| 649 | CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, | |
| 650 | "exponent cannot start with bullshit"); | |
| 651 | CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); | |
| 652 | cxJsonReset(&json); | |
| 653 | ||
| 654 | cxJsonFill(&json, "1.23e4f "); | |
| 655 | result = cxJsonNext(&json, &v); | |
| 656 | CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, | |
| 657 | "non-digits in exponent"); | |
| 658 | CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); | |
| 659 | cxJsonReset(&json); | |
| 660 | ||
| 661 | cxJsonFill(&json, "1.23f "); | |
| 662 | result = cxJsonNext(&json, &v); | |
| 663 | CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, | |
| 664 | "non-digits in value"); | |
| 665 | CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); | |
| 666 | cxJsonReset(&json); | |
| 667 | ||
| 668 | cxJsonFill(&json, "1.23.45 "); | |
| 669 | result = cxJsonNext(&json, &v); | |
| 670 | CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, | |
| 671 | "multiple decimal separators"); | |
| 672 | CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); | |
| 673 | cxJsonReset(&json); | |
| 674 | ||
| 675 | cxJsonFill(&json, "184467440737095516150123456789 "); | |
| 676 | result = cxJsonNext(&json, &v); | |
| 677 | CX_TEST_ASSERTM(result == CX_JSON_FORMAT_ERROR_NUMBER, | |
| 678 | "30 digit int does not fit into 64-bit int"); | |
| 679 | CX_TEST_ASSERT(v->type == CX_JSON_NOTHING); | |
| 680 | cxJsonReset(&json); | |
| 973 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 681 | } | 
| 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 682 | cxJsonDestroy(&json); | 
| 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 683 | } | 
| 
05910a8994f7
add UCX string support to cxJsonFill()
 Mike Becker <universe@uap-core.de> parents: 
966diff
changeset | 684 | |
| 977 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 685 | CX_TEST(test_json_multiple_values) { | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 686 | CxJson json; | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 687 | cxJsonInit(&json, NULL); | 
| 977 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 688 | CX_TEST_DO { | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 689 | CxJsonValue *v; | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 690 | CxJsonStatus result; | 
| 977 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 691 | |
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 692 | // read number | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 693 | cxJsonFill(&json, "10\n"); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 694 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
975diff
changeset | 696 | CX_TEST_ASSERT(cxJsonIsNumber(v)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 697 | CX_TEST_ASSERT(cxJsonAsInteger(v) == 10); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 698 | cxJsonValueFree(v); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 699 | // read remaining '\n' | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 700 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
975diff
changeset | 702 | // read string | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 703 | cxJsonFill(&json, "\"hello world\"\n"); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 704 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
975diff
changeset | 706 | CX_TEST_ASSERT(cxJsonIsString(v)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
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: 
975diff
changeset | 708 | cxJsonValueFree(v); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
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: 
975diff
changeset | 710 | // read obj | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 711 | cxJsonFill(&json, "{ \"value\": \"test\" }\n"); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 712 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
975diff
changeset | 714 | CX_TEST_ASSERT(cxJsonIsObject(v)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 715 | CxJsonValue *value = cxJsonObjGet(v, "value"); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 716 | CX_TEST_ASSERT(cxJsonAsString(value)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 717 | cxJsonValueFree(v); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 718 | // read array | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
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: 
975diff
changeset | 720 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
975diff
changeset | 722 | CX_TEST_ASSERT(cxJsonIsArray(v)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 723 | CxJsonValue *a0 = cxJsonArrGet(v, 0); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 724 | CxJsonValue *a3 = cxJsonArrGet(v, 3); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 725 | CX_TEST_ASSERT(cxJsonIsNumber(a0)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 726 | CX_TEST_ASSERT(cxJsonAsInteger(a0) == 0); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 727 | CX_TEST_ASSERT(cxJsonIsNumber(a3)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 728 | CX_TEST_ASSERT(cxJsonAsInteger(a3) == 3); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 729 | cxJsonValueFree(v); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 730 | // read literal | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 731 | cxJsonFill(&json, "true\n"); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 732 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
975diff
changeset | 734 | CX_TEST_ASSERT(cxJsonIsLiteral(v)); | 
| 1015 | 735 | CX_TEST_ASSERT(cxJsonIsBool(v)); | 
| 736 | CX_TEST_ASSERT(cxJsonIsTrue(v)); | |
| 977 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 737 | CX_TEST_ASSERT(cxJsonAsBool(v)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 738 | cxJsonValueFree(v); | 
| 1015 | 739 | cxJsonFill(&json, "false\n"); | 
| 740 | result = cxJsonNext(&json, &v); | |
| 741 | CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); | |
| 742 | CX_TEST_ASSERT(cxJsonIsLiteral(v)); | |
| 743 | CX_TEST_ASSERT(cxJsonIsBool(v)); | |
| 744 | CX_TEST_ASSERT(cxJsonIsFalse(v)); | |
| 745 | CX_TEST_ASSERT(!cxJsonAsBool(v)); | |
| 746 | cxJsonValueFree(v); | |
| 977 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 747 | cxJsonFill(&json, "null\n"); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 748 | result = cxJsonNext(&json, &v); | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 749 | CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); | 
| 1015 | 750 | CX_TEST_ASSERT(cxJsonIsLiteral(v)); | 
| 751 | CX_TEST_ASSERT(!cxJsonIsBool(v)); | |
| 977 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 752 | CX_TEST_ASSERT(cxJsonIsNull(v)); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 753 | cxJsonValueFree(v); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 754 | } | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 755 | cxJsonDestroy(&json); | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 756 | } | 
| 
a941b01b684f
add test for reading multiple json values
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
975diff
changeset | 757 | |
| 1337 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 758 | CX_TEST(test_json_array) { | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 759 | CxTestingAllocator talloc; | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 760 | cx_testing_allocator_init(&talloc); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 761 | const CxAllocator *allocator = &talloc.base; | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 762 | CX_TEST_DO { | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 763 | CxJsonValue *arr = cxJsonCreateArr(allocator); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 764 | cxJsonArrAddIntegers(arr, (int64_t[]){ 0, 3, 6, 9, 12, 15}, 6); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 765 | CX_TEST_ASSERT(cxJsonArrSize(arr) == 6); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 766 | CxJsonValue *e = cxJsonArrGet(arr, 3); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 767 | CX_TEST_ASSERT(cxJsonIsNumber(e)); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 768 | CX_TEST_ASSERT(cxJsonAsInteger(e) == 9); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 769 | CX_TEST_ASSERT(cxJsonAsDouble(e) == 9.0); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 770 | CX_TEST_ASSERT(cxJsonArrSize(arr) == 6); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 771 | e = cxJsonArrGet(arr, 6); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 772 | CX_TEST_ASSERT(!cxJsonIsNumber(e)); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 773 | // also not null, because "nothing" is not null | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 774 | CX_TEST_ASSERT(!cxJsonIsNull(e)); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 775 | CX_TEST_ASSERT(e->type == CX_JSON_NOTHING); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 776 | CxJsonValue *removed = cxJsonArrRemove(arr, 2); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 777 | CX_TEST_ASSERT(cxJsonIsNumber(removed)); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 778 | CX_TEST_ASSERT(cxJsonAsInteger(removed) == 6); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 779 | CX_TEST_ASSERT(cxJsonArrSize(arr) == 5); | 
| 1338 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 780 | e = cxJsonArrGet(arr, 3); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 781 | CX_TEST_ASSERT(cxJsonIsNumber(e)); | 
| 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
changeset | 782 | CX_TEST_ASSERT(cxJsonAsInteger(e) == 12); | 
| 1337 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 783 | e = cxJsonArrRemove(arr, 5); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 784 | CX_TEST_ASSERT(e == NULL); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 785 | cxJsonValueFree(arr); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 786 | // the removed element still needs to be freed | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 787 | CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 788 | cxJsonValueFree(removed); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 789 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 790 | } | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 791 | cx_testing_allocator_destroy(&talloc); | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 792 | } | 
| 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 793 | |
| 1033 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 794 | CX_TEST(test_json_array_iterator) { | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 795 | CxJson json; | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 796 | cxJsonInit(&json, NULL); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 797 | CX_TEST_DO { | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 798 | CxJsonValue *v; | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 799 | CxJsonStatus result; | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 800 | cxJsonFill(&json, "[ 0, 3, 6, 9, 12, 15 ]\n"); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 801 | result = cxJsonNext(&json, &v); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 802 | CX_TEST_ASSERT(result == CX_JSON_NO_ERROR); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 803 | CX_TEST_ASSERT(cxJsonIsArray(v)); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 804 | CxIterator iter = cxJsonArrIter(v); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 805 | unsigned i = 0; | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 806 | cx_foreach(CxJsonValue*, elem, iter) { | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 807 | CX_TEST_ASSERT(cxJsonIsNumber(elem)); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 808 | CX_TEST_ASSERT(i == cxJsonAsInteger(elem)); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 809 | i += 3; | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 810 | } | 
| 1051 
7d17bd1103d7
fix another missing free() in json tests
 Mike Becker <universe@uap-core.de> parents: 
1033diff
changeset | 811 | cxJsonValueFree(v); | 
| 1033 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 812 | } | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 813 | cxJsonDestroy(&json); | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 814 | } | 
| 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
changeset | 815 | |
| 996 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 816 | CX_TEST(test_json_allocator) { | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 817 | CxTestingAllocator talloc; | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 818 | cx_testing_allocator_init(&talloc); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 819 | CxAllocator *allocator = &talloc.base; | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 820 | |
| 996 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 821 | cxstring text = cx_str( | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 822 | "{\n" | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 823 | "\t\"message\":\"success\",\n" | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
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: 
978diff
changeset | 825 | "}" | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 826 | ); | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 827 | |
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 828 | CX_TEST_DO { | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 829 | CxJson json; | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 830 | cxJsonInit(&json, allocator); | 
| 996 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 831 | cxJsonFill(&json, text); | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 832 | |
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 833 | CxJsonValue *obj; | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 834 | CxJsonStatus result = cxJsonNext(&json, &obj); | 
| 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
997diff
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: 
978diff
changeset | 837 | |
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 838 | // this recursively frees everything | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 839 | cxJsonValueFree(obj); | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 840 | cxJsonDestroy(&json); | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 841 | |
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
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: 
978diff
changeset | 843 | } | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 844 | cx_testing_allocator_destroy(&talloc); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 845 | } | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 846 | |
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 847 | CX_TEST(test_json_allocator_parse_error) { | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 848 | CxTestingAllocator talloc; | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 849 | cx_testing_allocator_init(&talloc); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 850 | CxAllocator *allocator = &talloc.base; | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 851 | |
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 852 | cxstring text = cx_str( | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 853 | "{\n" | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 854 | "\t\"message\":\"success\"\n" // <-- missing comma | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 855 | "\t\"data\":[\"value1\",{\"x\":123, \"y\":523 }]\n" | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 856 | "}" | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 857 | ); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 858 | |
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 859 | CX_TEST_DO { | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 860 | CxJson json; | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 861 | cxJsonInit(&json, allocator); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 862 | cxJsonFill(&json, text); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 863 | |
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 864 | CxJsonValue *obj = NULL; | 
| 1002 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
changeset | 865 | CxJsonStatus result = cxJsonNext(&json, &obj); | 
| 
1483c47063a8
add status codes to json parser - relates to #431
 Mike Becker <universe@uap-core.de> parents: 
1000diff
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: 
997diff
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: 
997diff
changeset | 868 | |
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 869 | // clean-up any left-over memory | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 870 | cxJsonDestroy(&json); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 871 | |
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 872 | CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 873 | } | 
| 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
changeset | 874 | cx_testing_allocator_destroy(&talloc); | 
| 996 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 875 | } | 
| 
333155f234c4
add support for allocators to the json parser
 Olaf Wintermann <olaf.wintermann@gmail.com> parents: 
978diff
changeset | 876 | |
| 1057 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
changeset | 878 | CxTestingAllocator talloc; | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
changeset | 882 | /* | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
changeset | 884 | * | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 885 | * { | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 886 | * "bool": false, | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 887 | * "int": 47, | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
changeset | 889 | * "nested": { | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 890 | * "string": "test", | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
changeset | 894 | * } | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 895 | * } | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 896 | */ | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 897 | |
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 898 | |
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
changeset | 904 | |
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
changeset | 906 | { | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
changeset | 914 | |
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
changeset | 919 | |
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
changeset | 926 | } | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 927 | |
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
changeset | 929 | { | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
changeset | 937 | |
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
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: 
1051diff
changeset | 962 | } | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 963 | |
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
changeset | 965 | cxJsonValueFree(obj); | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
changeset | 967 | } | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
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: 
1051diff
changeset | 969 | } | 
| 
4e8436c3e806
add tests for JSON create functions and fix a bug in cxJsonCreateCxString()
 Mike Becker <universe@uap-core.de> parents: 
1051diff
changeset | 970 | |
| 1072 
c89283cd559b
first mvp for the json writer - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1063diff
changeset | 971 | |
| 1081 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
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: 
1078diff
changeset | 973 | const CxAllocator *allocator, | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 974 | cxstring expected, | 
| 1081 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
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: 
1078diff
changeset | 976 | ) { | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 977 | // create the value | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1081diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
changeset | 1001 | |
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
changeset | 1003 | CxBuffer buf; | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1082diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
changeset | 1008 | |
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 1009 | // compare the string | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
changeset | 1011 | |
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 1012 | // destroy everything | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 1013 | cxBufferDestroy(&buf); | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 1014 | cxJsonValueFree(obj); | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 1015 | } | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 1016 | |
| 1081 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
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: 
1080diff
changeset | 1018 | CxTestingAllocator talloc; | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1019 | cx_testing_allocator_init(&talloc); | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1020 | CxAllocator *allocator = &talloc.base; | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1021 | CX_TEST_DO { | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1022 | // expected value | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1023 | cxstring expected = CX_STR( | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1024 | "{\"bool\":false," | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1025 | "\"int\":47," | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1026 | "\"nested\":{" | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
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: 
1080diff
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: 
1080diff
changeset | 1029 | "\"literals\":[true,null,false]," | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1030 | "\"objects\":[{" | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1031 | "\"name1\":1," | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1032 | "\"name2\":3" | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1033 | "},{" | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1034 | "\"name1\":3," | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1035 | "\"name2\":7" | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1036 | "}]" | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1037 | "}," | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1038 | "\"strings\":[\"hello\",\"world\"]" | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1039 | "}" | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1040 | ); | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1041 | |
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1042 | CxJsonWriter writer = cxJsonWriterCompact(); | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
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: 
1080diff
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: 
1080diff
changeset | 1045 | } | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1046 | cx_testing_allocator_destroy(&talloc); | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1047 | } | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1048 | |
| 1078 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
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: 
1075diff
changeset | 1050 | CxTestingAllocator talloc; | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1051 | cx_testing_allocator_init(&talloc); | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1052 | CxAllocator *allocator = &talloc.base; | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1053 | CX_TEST_DO { | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1054 | cxstring expected = CX_STR( | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1055 | "{\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1056 | " \"bool\": false,\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1057 | " \"int\": 47,\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1058 | " \"nested\": {\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
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: 
1075diff
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: 
1075diff
changeset | 1061 | " \"literals\": [true, null, false],\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1062 | " \"objects\": [{\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1063 | " \"name1\": 1,\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1064 | " \"name2\": 3\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1065 | " }, {\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1066 | " \"name1\": 3,\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1067 | " \"name2\": 7\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1068 | " }]\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1069 | " },\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1070 | " \"strings\": [\"hello\", \"world\"]\n" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1071 | "}" | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1072 | ); | 
| 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1073 | |
| 1081 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1074 | CxJsonWriter writer = cxJsonWriterPretty(true); | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
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: 
1078diff
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: 
1078diff
changeset | 1077 | } | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
changeset | 1079 | } | 
| 1078 
ffa8bb4e9288
implement JSON pretty printing - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1075diff
changeset | 1080 | |
| 1080 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
changeset | 1082 | CxTestingAllocator talloc; | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
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: 
1078diff
changeset | 1085 | CX_TEST_DO { | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
changeset | 1087 | "{\n" | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
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: 
1078diff
changeset | 1090 | "\t\"nested\": {\n" | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
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: 
1078diff
changeset | 1097 | "\t\t}, {\n" | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
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: 
1078diff
changeset | 1100 | "\t\t}]\n" | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 1101 | "\t},\n" | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
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: 
1078diff
changeset | 1103 | "}" | 
| 
e16f4f336e3c
add test case for pretty printing with tabs - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1078diff
changeset | 1104 | ); | 
| 1081 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
changeset | 1105 | CxJsonWriter writer = cxJsonWriterPretty(false); | 
| 
33c9d7e7d830
remove code duplication from writer tests - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1080diff
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: 
1063diff
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: 
1063diff
changeset | 1108 | } | 
| 
c89283cd559b
first mvp for the json writer - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1063diff
changeset | 1109 | cx_testing_allocator_destroy(&talloc); | 
| 
c89283cd559b
first mvp for the json writer - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1063diff
changeset | 1110 | } | 
| 
c89283cd559b
first mvp for the json writer - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1063diff
changeset | 1111 | |
| 1082 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
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: 
1081diff
changeset | 1113 | CxTestingAllocator talloc; | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
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: 
1081diff
changeset | 1115 | CxAllocator *allocator = &talloc.base; | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1116 | CX_TEST_DO { | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1117 | cxstring expected = CX_STR( | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1118 | "{\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1119 | " \"bool\": false,\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1120 | " \"int\": 47,\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1121 | " \"strings\": [\"hello\", \"world\"],\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1122 | " \"nested\": {\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1123 | " \"objects\": [{\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1124 | " \"name1\": 1,\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1125 | " \"name2\": 3\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1126 | " }, {\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1127 | " \"name2\": 7,\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1128 | " \"name1\": 3\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1129 | " }],\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
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: 
1081diff
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: 
1081diff
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: 
1081diff
changeset | 1133 | " }\n" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1134 | "}" | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1135 | ); | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1136 | |
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1137 | CxJsonWriter writer = cxJsonWriterPretty(true); | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1138 | writer.sort_members = false; | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
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: 
1081diff
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: 
1081diff
changeset | 1141 | } | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
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: 
1081diff
changeset | 1143 | } | 
| 
46cdc8689fc4
implement index array to preserve order of json object members
 Mike Becker <universe@uap-core.de> parents: 
1081diff
changeset | 1144 | |
| 1117 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1146 | CxJsonValue* num = cxJsonCreateNumber(NULL, 3.141592653589793); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1147 | CxJsonWriter writer = cxJsonWriterCompact(); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1148 | CxBuffer buf; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1149 | cxBufferInit(&buf, NULL, 32, NULL, 0); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1150 | CX_TEST_DO { | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1151 | // test default settings (6 digits) | 
| 1119 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1152 | cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer); | 
| 1117 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1154 | |
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1155 | // test too many digits | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1156 | cxBufferReset(&buf); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1157 | writer.frac_max_digits = 200; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1158 | cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1160 | |
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1161 | // test 0 digits | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1162 | cxBufferReset(&buf); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1163 | writer.frac_max_digits = 0; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1164 | cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1166 | |
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1167 | // test 2 digits | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1168 | cxBufferReset(&buf); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1169 | writer.frac_max_digits = 2; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1170 | cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1172 | |
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1173 | // test 3 digits | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1174 | cxBufferReset(&buf); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1175 | writer.frac_max_digits = 3; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1176 | cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1178 | |
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1180 | num->value.number = 47.110815; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1181 | cxBufferReset(&buf); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1182 | writer.frac_max_digits = 6; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1183 | cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1185 | |
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1186 | // test 4 digits with exponent | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1187 | num->value.number = 5.11223344e23; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1188 | cxBufferReset(&buf); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1189 | writer.frac_max_digits = 4; | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1190 | cxJsonWrite(&buf, num, cxBufferWriteFunc, &writer); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
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: 
1112diff
changeset | 1192 | } | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1193 | cxBufferDestroy(&buf); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1194 | cxJsonValueFree(num); | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1195 | } | 
| 
54df904472b0
add fractional number formatting - relates to #526
 Mike Becker <universe@uap-core.de> parents: 
1112diff
changeset | 1196 | |
| 1119 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1197 | CX_TEST(test_json_write_string_escape) { | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1198 | /** | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
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: 
1117diff
changeset | 1200 | * " quotation mark | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1201 | * \ reverse solidus | 
| 1123 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
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: 
1117diff
changeset | 1203 | * b backspace | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1204 | * f form feed | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1205 | * n line feed | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1206 | * r carriage return | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1207 | * t tab | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
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: 
1117diff
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: 
1117diff
changeset | 1210 | */ | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1211 | CxJsonValue* str = cxJsonCreateString(NULL, | 
| 1123 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
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: 
1117diff
changeset | 1213 | CxJsonWriter writer = cxJsonWriterCompact(); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1214 | CxBuffer buf; | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1215 | cxBufferInit(&buf, NULL, 128, NULL, 0); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1216 | CX_TEST_DO { | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1217 | cxJsonWrite(&buf, str, cxBufferWriteFunc, &writer); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
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: 
1123diff
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: 
1117diff
changeset | 1220 | } | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1221 | cxBufferDestroy(&buf); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1222 | cxJsonValueFree(str); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1223 | } | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1224 | |
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1225 | CX_TEST(test_json_write_name_escape) { | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1226 | CxJsonValue* obj = cxJsonCreateObj(NULL); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1227 | cxJsonObjPutLiteral(obj, | 
| 1123 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
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: 
1117diff
changeset | 1229 | CxJsonWriter writer = cxJsonWriterCompact(); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1230 | CxBuffer buf; | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1231 | cxBufferInit(&buf, NULL, 128, NULL, 0); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1232 | CX_TEST_DO { | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1233 | cxJsonWrite(&buf, obj, cxBufferWriteFunc, &writer); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
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: 
1123diff
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: 
1117diff
changeset | 1236 | } | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1237 | cxBufferDestroy(&buf); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1238 | cxJsonValueFree(obj); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1239 | } | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
changeset | 1240 | |
| 1123 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1241 | CX_TEST(test_json_write_solidus) { | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1242 | CxJsonValue* str = cxJsonCreateString(NULL,"test/solidus"); | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1243 | CxJsonWriter writer = cxJsonWriterCompact(); | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1244 | CxBuffer buf; | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1245 | cxBufferInit(&buf, NULL, 16, NULL, 0); | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1246 | CX_TEST_DO { | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1247 | // default: do not escape | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1248 | cxJsonWrite(&buf, str, cxBufferWriteFunc, &writer); | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
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: 
1119diff
changeset | 1250 | |
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1251 | // enable escaping | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1252 | writer.escape_slash = true; | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1253 | cxBufferReset(&buf); | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1254 | cxJsonWrite(&buf, str, cxBufferWriteFunc, &writer); | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
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: 
1119diff
changeset | 1256 | } | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1257 | cxBufferDestroy(&buf); | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1258 | cxJsonValueFree(str); | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
changeset | 1259 | } | 
| 
2b83302d595a
make escaping slashes optional - fixes #569
 Mike Becker <universe@uap-core.de> parents: 
1119diff
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: 
941diff
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 | 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: 
1139diff
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: 
1154diff
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: 
1130diff
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: 
937diff
changeset | 1270 | cx_test_register(suite, test_json_object_incomplete_token); | 
| 1015 | 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: 
939diff
changeset | 1272 | cx_test_register(suite, test_json_object_error); | 
| 1338 
cc153bffea28
add cxJsonObjRemove() #627
 Mike Becker <universe@uap-core.de> parents: 
1337diff
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: 
1002diff
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: 
941diff
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: 
973diff
changeset | 1276 | cx_test_register(suite, test_json_number); | 
| 1015 | 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: 
975diff
changeset | 1278 | cx_test_register(suite, test_json_multiple_values); | 
| 1337 
6dfa1eb58ce3
add cxJsonArrayRemove()
 Mike Becker <universe@uap-core.de> parents: 
1247diff
changeset | 1279 | cx_test_register(suite, test_json_array); | 
| 1033 
e3009345984b
add cxJsonArrIter() - fixes #524
 Mike Becker <universe@uap-core.de> parents: 
1032diff
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: 
978diff
changeset | 1281 | cx_test_register(suite, test_json_allocator); | 
| 1000 
1aecddf7e209
simplify how the json parser works
 Mike Becker <universe@uap-core.de> parents: 
997diff
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: 
1051diff
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: 
1063diff
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: 
1075diff
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: 
1078diff
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: 
1081diff
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: 
1112diff
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: 
1117diff
changeset | 1289 | cx_test_register(suite, test_json_write_string_escape); | 
| 
ff4d7e76f85a
implement string escape - resolves #526
 Mike Becker <universe@uap-core.de> parents: 
1117diff
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: 
1119diff
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: 
975diff
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 |