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 |