| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 #include "platform/text_buffer.h" | 6 #include "platform/text_buffer.h" |
| 7 #include "vm/dart_api_impl.h" |
| 7 #include "vm/json_stream.h" | 8 #include "vm/json_stream.h" |
| 8 #include "vm/unit_test.h" | 9 #include "vm/unit_test.h" |
| 9 #include "vm/dart_api_impl.h" | |
| 10 | 10 |
| 11 namespace dart { | 11 namespace dart { |
| 12 | 12 |
| 13 #ifndef PRODUCT | 13 #ifndef PRODUCT |
| 14 | 14 |
| 15 TEST_CASE(JSON_TextBuffer) { | 15 TEST_CASE(JSON_TextBuffer) { |
| 16 TextBuffer w(5); // Small enough to make buffer grow at least once. | 16 TextBuffer w(5); // Small enough to make buffer grow at least once. |
| 17 w.Printf("{ \"%s\" : %d", "length", 175); | 17 w.Printf("{ \"%s\" : %d", "length", 175); |
| 18 EXPECT_STREQ("{ \"length\" : 175", w.buf()); | 18 EXPECT_STREQ("{ \"length\" : 175", w.buf()); |
| 19 w.Printf(", \"%s\" : \"%s\" }", "command", "stopIt"); | 19 w.Printf(", \"%s\" : \"%s\" }", "command", "stopIt"); |
| 20 EXPECT_STREQ("{ \"length\" : 175, \"command\" : \"stopIt\" }", w.buf()); | 20 EXPECT_STREQ("{ \"length\" : 175, \"command\" : \"stopIt\" }", w.buf()); |
| 21 } | 21 } |
| 22 | 22 |
| 23 | |
| 24 TEST_CASE(JSON_JSONStream_Primitives) { | 23 TEST_CASE(JSON_JSONStream_Primitives) { |
| 25 { | 24 { |
| 26 JSONStream js; | 25 JSONStream js; |
| 27 { JSONObject jsobj(&js); } | 26 { JSONObject jsobj(&js); } |
| 28 EXPECT_STREQ("{}", js.ToCString()); | 27 EXPECT_STREQ("{}", js.ToCString()); |
| 29 } | 28 } |
| 30 { | 29 { |
| 31 JSONStream js; | 30 JSONStream js; |
| 32 { JSONArray jsarr(&js); } | 31 { JSONArray jsarr(&js); } |
| 33 EXPECT_STREQ("[]", js.ToCString()); | 32 EXPECT_STREQ("[]", js.ToCString()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 { | 74 { |
| 76 JSONStream js; | 75 JSONStream js; |
| 77 { | 76 { |
| 78 JSONArray jsarr(&js); | 77 JSONArray jsarr(&js); |
| 79 jsarr.AddValueF("h%s", "elo"); | 78 jsarr.AddValueF("h%s", "elo"); |
| 80 } | 79 } |
| 81 EXPECT_STREQ("[\"helo\"]", js.ToCString()); | 80 EXPECT_STREQ("[\"helo\"]", js.ToCString()); |
| 82 } | 81 } |
| 83 } | 82 } |
| 84 | 83 |
| 85 | |
| 86 TEST_CASE(JSON_JSONStream_Array) { | 84 TEST_CASE(JSON_JSONStream_Array) { |
| 87 JSONStream js; | 85 JSONStream js; |
| 88 { | 86 { |
| 89 JSONArray jsarr(&js); | 87 JSONArray jsarr(&js); |
| 90 jsarr.AddValue(true); | 88 jsarr.AddValue(true); |
| 91 jsarr.AddValue(false); | 89 jsarr.AddValue(false); |
| 92 } | 90 } |
| 93 EXPECT_STREQ("[true,false]", js.ToCString()); | 91 EXPECT_STREQ("[true,false]", js.ToCString()); |
| 94 } | 92 } |
| 95 | 93 |
| 96 | |
| 97 TEST_CASE(JSON_JSONStream_Object) { | 94 TEST_CASE(JSON_JSONStream_Object) { |
| 98 JSONStream js; | 95 JSONStream js; |
| 99 { | 96 { |
| 100 JSONObject jsobj(&js); | 97 JSONObject jsobj(&js); |
| 101 jsobj.AddProperty("key1", "a"); | 98 jsobj.AddProperty("key1", "a"); |
| 102 jsobj.AddProperty("key2", "b"); | 99 jsobj.AddProperty("key2", "b"); |
| 103 } | 100 } |
| 104 EXPECT_STREQ("{\"key1\":\"a\",\"key2\":\"b\"}", js.ToCString()); | 101 EXPECT_STREQ("{\"key1\":\"a\",\"key2\":\"b\"}", js.ToCString()); |
| 105 } | 102 } |
| 106 | 103 |
| 107 TEST_CASE(JSON_JSONStream_NestedObject) { | 104 TEST_CASE(JSON_JSONStream_NestedObject) { |
| 108 JSONStream js; | 105 JSONStream js; |
| 109 { | 106 { |
| 110 JSONObject jsobj(&js); | 107 JSONObject jsobj(&js); |
| 111 JSONObject jsobj1(&jsobj, "key"); | 108 JSONObject jsobj1(&jsobj, "key"); |
| 112 jsobj1.AddProperty("key1", "d"); | 109 jsobj1.AddProperty("key1", "d"); |
| 113 } | 110 } |
| 114 EXPECT_STREQ("{\"key\":{\"key1\":\"d\"}}", js.ToCString()); | 111 EXPECT_STREQ("{\"key\":{\"key1\":\"d\"}}", js.ToCString()); |
| 115 } | 112 } |
| 116 | 113 |
| 117 | |
| 118 TEST_CASE(JSON_JSONStream_ObjectArray) { | 114 TEST_CASE(JSON_JSONStream_ObjectArray) { |
| 119 JSONStream js; | 115 JSONStream js; |
| 120 { | 116 { |
| 121 JSONArray jsarr(&js); | 117 JSONArray jsarr(&js); |
| 122 { | 118 { |
| 123 JSONObject jsobj(&jsarr); | 119 JSONObject jsobj(&jsarr); |
| 124 jsobj.AddProperty("key", "e"); | 120 jsobj.AddProperty("key", "e"); |
| 125 } | 121 } |
| 126 { | 122 { |
| 127 JSONObject jsobj(&jsarr); | 123 JSONObject jsobj(&jsarr); |
| 128 jsobj.AddProperty("yek", "f"); | 124 jsobj.AddProperty("yek", "f"); |
| 129 } | 125 } |
| 130 } | 126 } |
| 131 EXPECT_STREQ("[{\"key\":\"e\"},{\"yek\":\"f\"}]", js.ToCString()); | 127 EXPECT_STREQ("[{\"key\":\"e\"},{\"yek\":\"f\"}]", js.ToCString()); |
| 132 } | 128 } |
| 133 | 129 |
| 134 | |
| 135 TEST_CASE(JSON_JSONStream_ArrayArray) { | 130 TEST_CASE(JSON_JSONStream_ArrayArray) { |
| 136 JSONStream js; | 131 JSONStream js; |
| 137 { | 132 { |
| 138 JSONArray jsarr(&js); | 133 JSONArray jsarr(&js); |
| 139 { | 134 { |
| 140 JSONArray jsarr1(&jsarr); | 135 JSONArray jsarr1(&jsarr); |
| 141 jsarr1.AddValue(static_cast<intptr_t>(4)); | 136 jsarr1.AddValue(static_cast<intptr_t>(4)); |
| 142 } | 137 } |
| 143 { | 138 { |
| 144 JSONArray jsarr1(&jsarr); | 139 JSONArray jsarr1(&jsarr); |
| 145 jsarr1.AddValue(false); | 140 jsarr1.AddValue(false); |
| 146 } | 141 } |
| 147 } | 142 } |
| 148 EXPECT_STREQ("[[4],[false]]", js.ToCString()); | 143 EXPECT_STREQ("[[4],[false]]", js.ToCString()); |
| 149 } | 144 } |
| 150 | 145 |
| 151 | |
| 152 TEST_CASE(JSON_JSONStream_Printf) { | 146 TEST_CASE(JSON_JSONStream_Printf) { |
| 153 JSONStream js; | 147 JSONStream js; |
| 154 { | 148 { |
| 155 JSONArray jsarr(&js); | 149 JSONArray jsarr(&js); |
| 156 jsarr.AddValueF("%d %s", 2, "hello"); | 150 jsarr.AddValueF("%d %s", 2, "hello"); |
| 157 } | 151 } |
| 158 EXPECT_STREQ("[\"2 hello\"]", js.ToCString()); | 152 EXPECT_STREQ("[\"2 hello\"]", js.ToCString()); |
| 159 } | 153 } |
| 160 | 154 |
| 161 | |
| 162 TEST_CASE(JSON_JSONStream_ObjectPrintf) { | 155 TEST_CASE(JSON_JSONStream_ObjectPrintf) { |
| 163 JSONStream js; | 156 JSONStream js; |
| 164 { | 157 { |
| 165 JSONObject jsobj(&js); | 158 JSONObject jsobj(&js); |
| 166 jsobj.AddPropertyF("key", "%d %s", 2, "hello"); | 159 jsobj.AddPropertyF("key", "%d %s", 2, "hello"); |
| 167 } | 160 } |
| 168 EXPECT_STREQ("{\"key\":\"2 hello\"}", js.ToCString()); | 161 EXPECT_STREQ("{\"key\":\"2 hello\"}", js.ToCString()); |
| 169 } | 162 } |
| 170 | 163 |
| 171 | |
| 172 TEST_CASE(JSON_JSONStream_DartObject) { | 164 TEST_CASE(JSON_JSONStream_DartObject) { |
| 173 JSONStream js; | 165 JSONStream js; |
| 174 { | 166 { |
| 175 JSONArray jsarr(&js); | 167 JSONArray jsarr(&js); |
| 176 jsarr.AddValue(Object::Handle(Object::null())); | 168 jsarr.AddValue(Object::Handle(Object::null())); |
| 177 JSONObject jsobj(&jsarr); | 169 JSONObject jsobj(&jsarr); |
| 178 jsobj.AddProperty("object_key", Object::Handle(Object::null())); | 170 jsobj.AddProperty("object_key", Object::Handle(Object::null())); |
| 179 } | 171 } |
| 180 char buffer[1024]; | 172 char buffer[1024]; |
| 181 ElideJSONSubstring("classes", js.ToCString(), buffer); | 173 ElideJSONSubstring("classes", js.ToCString(), buffer); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 202 | 194 |
| 203 TEST_CASE(JSON_JSONStream_EscapedString) { | 195 TEST_CASE(JSON_JSONStream_EscapedString) { |
| 204 JSONStream js; | 196 JSONStream js; |
| 205 { | 197 { |
| 206 JSONArray jsarr(&js); | 198 JSONArray jsarr(&js); |
| 207 jsarr.AddValue("Hel\"\"lo\r\n\t"); | 199 jsarr.AddValue("Hel\"\"lo\r\n\t"); |
| 208 } | 200 } |
| 209 EXPECT_STREQ("[\"Hel\\\"\\\"lo\\r\\n\\t\"]", js.ToCString()); | 201 EXPECT_STREQ("[\"Hel\\\"\\\"lo\\r\\n\\t\"]", js.ToCString()); |
| 210 } | 202 } |
| 211 | 203 |
| 212 | |
| 213 TEST_CASE(JSON_JSONStream_DartString) { | 204 TEST_CASE(JSON_JSONStream_DartString) { |
| 214 const char* kScriptChars = | 205 const char* kScriptChars = |
| 215 "var ascii = 'Hello, World!';\n" | 206 "var ascii = 'Hello, World!';\n" |
| 216 "var unicode = '\\u00CE\\u00F1\\u0163\\u00E9r\\u00F1\\u00E5\\u0163" | 207 "var unicode = '\\u00CE\\u00F1\\u0163\\u00E9r\\u00F1\\u00E5\\u0163" |
| 217 "\\u00EE\\u00F6\\u00F1\\u00E5\\u013C\\u00EE\\u017E\\u00E5\\u0163" | 208 "\\u00EE\\u00F6\\u00F1\\u00E5\\u013C\\u00EE\\u017E\\u00E5\\u0163" |
| 218 "\\u00EE\\u1EDD\\u00F1';\n" | 209 "\\u00EE\\u1EDD\\u00F1';\n" |
| 219 "var surrogates = '\\u{1D11E}\\u{1D11E}\\u{1D11E}" | 210 "var surrogates = '\\u{1D11E}\\u{1D11E}\\u{1D11E}" |
| 220 "\\u{1D11E}\\u{1D11E}';\n" | 211 "\\u{1D11E}\\u{1D11E}';\n" |
| 221 "var wrongEncoding = '\\u{1D11E}' + surrogates[0] + '\\u{1D11E}';" | 212 "var wrongEncoding = '\\u{1D11E}' + surrogates[0] + '\\u{1D11E}';" |
| 222 "var nullInMiddle = 'This has\\u0000 four words.';"; | 213 "var nullInMiddle = 'This has\\u0000 four words.';"; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 obj ^= Api::UnwrapHandle(result); | 276 obj ^= Api::UnwrapHandle(result); |
| 286 | 277 |
| 287 JSONStream js; | 278 JSONStream js; |
| 288 { | 279 { |
| 289 JSONObject jsobj(&js); | 280 JSONObject jsobj(&js); |
| 290 EXPECT(!jsobj.AddPropertyStr("wrongEncoding", obj)); | 281 EXPECT(!jsobj.AddPropertyStr("wrongEncoding", obj)); |
| 291 } | 282 } |
| 292 EXPECT_STREQ("{\"wrongEncoding\":\"𝄞\\uD834𝄞\"}", js.ToCString()); | 283 EXPECT_STREQ("{\"wrongEncoding\":\"𝄞\\uD834𝄞\"}", js.ToCString()); |
| 293 } | 284 } |
| 294 | 285 |
| 295 | |
| 296 { | 286 { |
| 297 result = Dart_GetField(lib, NewString("nullInMiddle")); | 287 result = Dart_GetField(lib, NewString("nullInMiddle")); |
| 298 EXPECT_VALID(result); | 288 EXPECT_VALID(result); |
| 299 obj ^= Api::UnwrapHandle(result); | 289 obj ^= Api::UnwrapHandle(result); |
| 300 | 290 |
| 301 JSONStream js; | 291 JSONStream js; |
| 302 { | 292 { |
| 303 JSONObject jsobj(&js); | 293 JSONObject jsobj(&js); |
| 304 EXPECT(!jsobj.AddPropertyStr("nullInMiddle", obj)); | 294 EXPECT(!jsobj.AddPropertyStr("nullInMiddle", obj)); |
| 305 } | 295 } |
| 306 EXPECT_STREQ("{\"nullInMiddle\":\"This has\\u0000 four words.\"}", | 296 EXPECT_STREQ("{\"nullInMiddle\":\"This has\\u0000 four words.\"}", |
| 307 js.ToCString()); | 297 js.ToCString()); |
| 308 } | 298 } |
| 309 } | 299 } |
| 310 | 300 |
| 311 | |
| 312 TEST_CASE(JSON_JSONStream_Params) { | 301 TEST_CASE(JSON_JSONStream_Params) { |
| 313 const char* param_keys[] = {"dog", "cat"}; | 302 const char* param_keys[] = {"dog", "cat"}; |
| 314 const char* param_values[] = {"apple", "banana"}; | 303 const char* param_values[] = {"apple", "banana"}; |
| 315 | 304 |
| 316 JSONStream js; | 305 JSONStream js; |
| 317 EXPECT(js.num_params() == 0); | 306 EXPECT(js.num_params() == 0); |
| 318 js.SetParams(¶m_keys[0], ¶m_values[0], 2); | 307 js.SetParams(¶m_keys[0], ¶m_values[0], 2); |
| 319 EXPECT(js.num_params() == 2); | 308 EXPECT(js.num_params() == 2); |
| 320 EXPECT(!js.HasParam("lizard")); | 309 EXPECT(!js.HasParam("lizard")); |
| 321 EXPECT(js.HasParam("dog")); | 310 EXPECT(js.HasParam("dog")); |
| 322 EXPECT(js.HasParam("cat")); | 311 EXPECT(js.HasParam("cat")); |
| 323 EXPECT(js.ParamIs("cat", "banana")); | 312 EXPECT(js.ParamIs("cat", "banana")); |
| 324 EXPECT(!js.ParamIs("dog", "banana")); | 313 EXPECT(!js.ParamIs("dog", "banana")); |
| 325 } | 314 } |
| 326 | 315 |
| 327 | |
| 328 TEST_CASE(JSON_JSONStream_AppendJSONStreamConsumer) { | 316 TEST_CASE(JSON_JSONStream_AppendJSONStreamConsumer) { |
| 329 JSONStream js; | 317 JSONStream js; |
| 330 | 318 |
| 331 { | 319 { |
| 332 JSONObject obj(&js); | 320 JSONObject obj(&js); |
| 333 { | 321 { |
| 334 JSONArray arr(&obj, "test"); | 322 JSONArray arr(&obj, "test"); |
| 335 const char* test_data = "{a, b, c},"; | 323 const char* test_data = "{a, b, c},"; |
| 336 AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "", | 324 AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "", |
| 337 reinterpret_cast<const uint8_t*>(&test_data[0]), | 325 reinterpret_cast<const uint8_t*>(&test_data[0]), |
| 338 strlen(test_data), &js); | 326 strlen(test_data), &js); |
| 339 AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "", | 327 AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "", |
| 340 reinterpret_cast<const uint8_t*>(&test_data[0]), | 328 reinterpret_cast<const uint8_t*>(&test_data[0]), |
| 341 strlen(test_data), &js); | 329 strlen(test_data), &js); |
| 342 AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "", | 330 AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "", |
| 343 reinterpret_cast<const uint8_t*>(&test_data[0]), | 331 reinterpret_cast<const uint8_t*>(&test_data[0]), |
| 344 strlen(test_data) - 1, &js); | 332 strlen(test_data) - 1, &js); |
| 345 } | 333 } |
| 346 } | 334 } |
| 347 | 335 |
| 348 EXPECT_STREQ("{\"test\":[{a, b, c},{a, b, c},{a, b, c}]}", js.ToCString()); | 336 EXPECT_STREQ("{\"test\":[{a, b, c},{a, b, c},{a, b, c}]}", js.ToCString()); |
| 349 } | 337 } |
| 350 | 338 |
| 351 #endif // !PRODUCT | 339 #endif // !PRODUCT |
| 352 | 340 |
| 353 } // namespace dart | 341 } // namespace dart |
| OLD | NEW |