Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
json_test.cc
Go to the documentation of this 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
3// BSD-style license that can be found in the LICENSE file.
4
5#include "platform/assert.h"
7#include "vm/dart_api_impl.h"
8#include "vm/json_stream.h"
9#include "vm/unit_test.h"
10
11namespace dart {
12
13#ifndef PRODUCT
14
15TEST_CASE(JSON_TextBuffer) {
16 TextBuffer w(5); // Small enough to make buffer grow at least once.
17 w.Printf("{ \"%s\" : %d", "length", 175);
18 EXPECT_STREQ("{ \"length\" : 175", w.buffer());
19 w.Printf(", \"%s\" : \"%s\" }", "command", "stopIt");
20 EXPECT_STREQ("{ \"length\" : 175, \"command\" : \"stopIt\" }", w.buffer());
21}
22
23TEST_CASE(JSON_JSONStream_Primitives) {
24 {
25 JSONStream js;
26 { JSONObject jsobj(&js); }
27 EXPECT_STREQ("{}", js.ToCString());
28 }
29 {
30 JSONStream js;
31 { JSONArray jsarr(&js); }
32 EXPECT_STREQ("[]", js.ToCString());
33 }
34 {
35 JSONStream js;
36 {
37 JSONArray jsarr(&js);
38 jsarr.AddValue(true);
39 }
40 EXPECT_STREQ("[true]", js.ToCString());
41 }
42 {
43 JSONStream js;
44 {
45 JSONArray jsarr(&js);
46 jsarr.AddValue(false);
47 }
48 EXPECT_STREQ("[false]", js.ToCString());
49 }
50 {
51 JSONStream js;
52 {
53 JSONArray jsarr(&js);
54 jsarr.AddValue(static_cast<intptr_t>(4));
55 }
56 EXPECT_STREQ("[4]", js.ToCString());
57 }
58 {
59 JSONStream js;
60 {
61 JSONArray jsarr(&js);
62 jsarr.AddValue(1.0);
63 }
64 EXPECT_STREQ("[1.0]", js.ToCString());
65 }
66 {
67 JSONStream js;
68 {
69 JSONArray jsarr(&js);
70 jsarr.AddValue("hello");
71 }
72 EXPECT_STREQ("[\"hello\"]", js.ToCString());
73 }
74 {
75 JSONStream js;
76 {
77 JSONArray jsarr(&js);
78 jsarr.AddValueF("h%s", "elo");
79 }
80 EXPECT_STREQ("[\"helo\"]", js.ToCString());
81 }
82}
83
84TEST_CASE(JSON_JSONStream_Array) {
85 JSONStream js;
86 {
87 JSONArray jsarr(&js);
88 jsarr.AddValue(true);
89 jsarr.AddValue(false);
90 }
91 EXPECT_STREQ("[true,false]", js.ToCString());
92}
93
94TEST_CASE(JSON_JSONStream_Base64String) {
95 JSONStream js;
96 {
97 JSONBase64String jsonBase64String(&js);
98 jsonBase64String.AppendBytes(reinterpret_cast<const uint8_t*>("Hello"), 5);
99 jsonBase64String.AppendBytes(reinterpret_cast<const uint8_t*>(", "), 2);
100 jsonBase64String.AppendBytes(reinterpret_cast<const uint8_t*>("world!"), 6);
101 }
102 EXPECT_STREQ("\"SGVsbG8sIHdvcmxkIQ==\"", js.ToCString());
103}
104
105TEST_CASE(JSON_JSONStream_Object) {
106 JSONStream js;
107 {
108 JSONObject jsobj(&js);
109 jsobj.AddProperty("key1", "a");
110 jsobj.AddProperty("key2", "b");
111 }
112 EXPECT_STREQ("{\"key1\":\"a\",\"key2\":\"b\"}", js.ToCString());
113}
114
115TEST_CASE(JSON_JSONStream_NestedObject) {
116 JSONStream js;
117 {
118 JSONObject jsobj(&js);
119 JSONObject jsobj1(&jsobj, "key");
120 jsobj1.AddProperty("key1", "d");
121 }
122 EXPECT_STREQ("{\"key\":{\"key1\":\"d\"}}", js.ToCString());
123}
124
125TEST_CASE(JSON_JSONStream_ObjectArray) {
126 JSONStream js;
127 {
128 JSONArray jsarr(&js);
129 {
130 JSONObject jsobj(&jsarr);
131 jsobj.AddProperty("key", "e");
132 }
133 {
134 JSONObject jsobj(&jsarr);
135 jsobj.AddProperty("yek", "f");
136 }
137 }
138 EXPECT_STREQ("[{\"key\":\"e\"},{\"yek\":\"f\"}]", js.ToCString());
139}
140
141TEST_CASE(JSON_JSONStream_ArrayArray) {
142 JSONStream js;
143 {
144 JSONArray jsarr(&js);
145 {
146 JSONArray jsarr1(&jsarr);
147 jsarr1.AddValue(static_cast<intptr_t>(4));
148 }
149 {
150 JSONArray jsarr1(&jsarr);
151 jsarr1.AddValue(false);
152 }
153 }
154 EXPECT_STREQ("[[4],[false]]", js.ToCString());
155}
156
157TEST_CASE(JSON_JSONStream_Printf) {
158 JSONStream js;
159 {
160 JSONArray jsarr(&js);
161 jsarr.AddValueF("%d %s", 2, "hello");
162 }
163 EXPECT_STREQ("[\"2 hello\"]", js.ToCString());
164}
165
166TEST_CASE(JSON_JSONStream_ObjectPrintf) {
167 JSONStream js;
168 {
169 JSONObject jsobj(&js);
170 jsobj.AddPropertyF("key", "%d %s", 2, "hello");
171 }
172 EXPECT_STREQ("{\"key\":\"2 hello\"}", js.ToCString());
173}
174
175ISOLATE_UNIT_TEST_CASE(JSON_JSONStream_DartObject) {
176 JSONStream js;
177 {
178 JSONArray jsarr(&js);
180 JSONObject jsobj(&jsarr);
181 jsobj.AddProperty("object_key", Object::Handle(Object::null()));
182 }
183 // WARNING: This MUST be big enough for the serialized JSON string.
184 const int kBufferSize = 2048;
185 char buffer[kBufferSize];
186 const char* json_str = js.ToCString();
187 ASSERT(strlen(json_str) < kBufferSize);
188 ElideJSONSubstring("classes", json_str, buffer);
189 ElideJSONSubstring("libraries", buffer, buffer);
190 ElideJSONSubstring("objects", buffer, buffer);
192 ElideJSONSubstring("column", buffer, buffer);
194
195 EXPECT_STREQ(
196 "[{\"type\":\"@Instance\",\"_vmType\":\"null\",\"class\":{\"type\":\"@"
197 "Class\",\"fixedId\":true,\"id\":\"\",\"name\":\"Null\",\"location\":{"
198 "\"type\":\"SourceLocation\",\"script\":{\"type\":\"@Script\","
199 "\"fixedId\":true,\"id\":\"\",\"uri\":\"dart:core\\/null.dart\","
200 "\"_kind\":\"kernel\"}},\"library\":{"
201 "\"type\":\"@Library\",\"fixedId\":true,\"id\":\"\",\"name\":\"dart."
202 "core\",\"uri\":\"dart:core\"}},\"kind\":\"Null\",\"fixedId\":true,"
203 "\"id\":\"\",\"valueAsString\":\"null\"},{\"object_key\":{\"type\":\"@"
204 "Instance\",\"_vmType\":\"null\",\"class\":{\"type\":\"@Class\","
205 "\"fixedId\":true,\"id\":\"\",\"name\":\"Null\",\"location\":{\"type\":"
206 "\"SourceLocation\",\"script\":{\"type\":\"@Script\",\"fixedId\":true,"
207 "\"id\":\"\",\"uri\":\"dart:core\\/null.dart\",\"_kind\":\"kernel\"}},"
208 "\"library\":{\"type\":\"@"
209 "Library\",\"fixedId\":true,\"id\":\"\",\"name\":\"dart.core\",\"uri\":"
210 "\"dart:core\"}},\"kind\":\"Null\",\"fixedId\":true,\"id\":\"\","
211 "\"valueAsString\":\"null\"}}]",
212 buffer);
213}
214
215TEST_CASE(JSON_JSONStream_EscapedString) {
216 JSONStream js;
217 {
218 JSONArray jsarr(&js);
219 jsarr.AddValue("Hel\"\"lo\r\n\t");
220 }
221 EXPECT_STREQ("[\"Hel\\\"\\\"lo\\r\\n\\t\"]", js.ToCString());
222}
223
224TEST_CASE(JSON_JSONStream_DartString) {
225 const char* kScriptChars =
226 "var ascii = 'Hello, World!';\n"
227 "var unicode = '\\u00CE\\u00F1\\u0163\\u00E9r\\u00F1\\u00E5\\u0163"
228 "\\u00EE\\u00F6\\u00F1\\u00E5\\u013C\\u00EE\\u017E\\u00E5\\u0163"
229 "\\u00EE\\u1EDD\\u00F1';\n"
230 "var surrogates = '\\u{1D11E}\\u{1D11E}\\u{1D11E}"
231 "\\u{1D11E}\\u{1D11E}';\n"
232 "var wrongEncoding = '\\u{1D11E}' + surrogates[0] + '\\u{1D11E}';"
233 "var nullInMiddle = 'This has\\u0000 four words.';";
234
235 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, nullptr);
236 EXPECT_VALID(lib);
237
239 TransitionNativeToVM transition1(thread);
240 String& obj = String::Handle();
241
242 auto do_test = [&](const char* field_name, const char* expected) {
243 {
244 TransitionVMToNative to_native(thread);
245 result = Dart_GetField(lib, NewString(field_name));
247 }
248
250
251 {
252 JSONStream js;
253 {
254 JSONObject jsobj(&js);
255 EXPECT(!jsobj.AddPropertyStr(field_name, obj));
256 }
257 EXPECT_STREQ(expected, js.ToCString());
258 }
259 };
260
261 {
262 TransitionVMToNative to_native(thread);
263 result = Dart_GetField(lib, NewString("ascii"));
265 }
266
268
269 {
270 JSONStream js;
271 {
272 JSONObject jsobj(&js);
273 EXPECT(jsobj.AddPropertyStr("subrange", obj, 1, 4));
274 }
275 EXPECT_STREQ("{\"subrange\":\"ello\"}", js.ToCString());
276 }
277
278 do_test("ascii", "{\"ascii\":\"Hello, World!\"}");
279 do_test("unicode", "{\"unicode\":\"Îñţérñåţîöñåļîžåţîờñ\"}");
280 do_test("surrogates", "{\"surrogates\":\"𝄞𝄞𝄞𝄞𝄞\"}");
281 do_test("wrongEncoding", "{\"wrongEncoding\":\"𝄞\\uD834𝄞\"}");
282 do_test("nullInMiddle", "{\"nullInMiddle\":\"This has\\u0000 four words.\"}");
283}
284
285TEST_CASE(JSON_JSONStream_Params) {
286 const char* param_keys[] = {"dog", "cat"};
287 const char* param_values[] = {"apple", "banana"};
288
289 JSONStream js;
290 EXPECT(js.num_params() == 0);
291 js.SetParams(&param_keys[0], &param_values[0], 2);
292 EXPECT(js.num_params() == 2);
293 EXPECT(!js.HasParam("lizard"));
294 EXPECT(js.HasParam("dog"));
295 EXPECT(js.HasParam("cat"));
296 EXPECT(js.ParamIs("cat", "banana"));
297 EXPECT(!js.ParamIs("dog", "banana"));
298}
299
300#endif // !PRODUCT
301
302} // namespace dart
static const size_t kBufferSize
Definition SkString.cpp:27
#define EXPECT(type, expectedAlignment, expectedSize)
static ObjectPtr UnwrapHandle(Dart_Handle object)
void AddValue(bool b) const
void AddValueF(const char *format,...) const PRINTF_ATTRIBUTE(2
void AppendBytes(const uint8_t *bytes, intptr_t length)
void AddProperty(const char *name, bool b) const
bool AddPropertyStr(const char *name, const String &s, intptr_t offset=0, intptr_t count=-1) const
void AddPropertyF(const char *name, const char *format,...) const PRINTF_ATTRIBUTE(3
static ObjectPtr null()
Definition object.h:433
static Object & Handle()
Definition object.h:407
static Dart_Handle LoadTestScript(const char *script, Dart_NativeEntryResolver resolver, const char *lib_uri=RESOLVED_USER_TEST_URI, bool finalize=true, bool allow_compile_errors=false)
Definition unit_test.cc:422
struct _Dart_Handle * Dart_Handle
Definition dart_api.h:258
#define ASSERT(E)
static const uint8_t buffer[]
GAsyncResult * result
void ElideJSONSubstring(const char *prefix, const char *in, char *out, const char *postfix)
Definition unit_test.cc:776
DART_EXPORT Dart_Handle Dart_GetField(Dart_Handle container, Dart_Handle name)
Dart_Handle NewString(const char *str)
void StripTokenPositions(char *buffer)
Definition unit_test.cc:799
SkScalar w
#define ISOLATE_UNIT_TEST_CASE(name)
Definition unit_test.h:64
#define TEST_CASE(name)
Definition unit_test.h:85
#define EXPECT_VALID(handle)
Definition unit_test.h:650