OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "testing/gtest/include/gtest/gtest.h" | 5 #include "testing/gtest/include/gtest/gtest.h" |
6 #include "base/json/json_reader.h" | 6 #include "base/json/json_reader.h" |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/string_piece.h" | 8 #include "base/string_piece.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
12 | 12 |
13 namespace base { | 13 namespace base { |
14 | 14 |
15 TEST(JSONReaderTest, Reading) { | 15 TEST(JSONReaderTest, Reading) { |
16 // some whitespace checking | 16 // some whitespace checking |
17 scoped_ptr<Value> root; | 17 scoped_ptr<Value> root; |
18 root.reset(JSONReader().JsonToValue(" null ", false, false)); | 18 root.reset(JSONReader().JsonToValue(" null ", false, false)); |
19 ASSERT_TRUE(root.get()); | 19 ASSERT_TRUE(root.get()); |
20 ASSERT_TRUE(root->IsType(Value::TYPE_NULL)); | 20 ASSERT_TRUE(root->IsNull()); |
21 | 21 |
22 // Invalid JSON string | 22 // Invalid JSON string |
23 root.reset(JSONReader().JsonToValue("nu", false, false)); | 23 root.reset(JSONReader().JsonToValue("nu", false, false)); |
24 ASSERT_FALSE(root.get()); | 24 ASSERT_FALSE(root.get()); |
25 | 25 |
26 // Simple bool | 26 // Simple bool |
27 root.reset(JSONReader().JsonToValue("true ", false, false)); | 27 root.reset(JSONReader().JsonToValue("true ", false, false)); |
28 ASSERT_TRUE(root.get()); | 28 ASSERT_TRUE(root.get()); |
29 ASSERT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); | 29 ASSERT_TRUE(root->IsBoolean()); |
30 | 30 |
31 // Embedded comment | 31 // Embedded comment |
32 root.reset(JSONReader().JsonToValue("/* comment */null", false, false)); | 32 root.reset(JSONReader().JsonToValue("/* comment */null", false, false)); |
33 ASSERT_TRUE(root.get()); | 33 ASSERT_TRUE(root.get()); |
34 ASSERT_TRUE(root->IsType(Value::TYPE_NULL)); | 34 ASSERT_TRUE(root->IsNull()); |
35 root.reset(JSONReader().JsonToValue("40 /* comment */", false, false)); | 35 root.reset(JSONReader().JsonToValue("40 /* comment */", false, false)); |
36 ASSERT_TRUE(root.get()); | 36 ASSERT_TRUE(root.get()); |
37 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 37 ASSERT_TRUE(root->IsInteger()); |
38 root.reset(JSONReader().JsonToValue("true // comment", false, false)); | 38 root.reset(JSONReader().JsonToValue("true // comment", false, false)); |
39 ASSERT_TRUE(root.get()); | 39 ASSERT_TRUE(root.get()); |
40 ASSERT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); | 40 ASSERT_TRUE(root->IsBoolean()); |
41 root.reset(JSONReader().JsonToValue("/* comment */\"sample string\"", | 41 root.reset(JSONReader().JsonToValue("/* comment */\"sample string\"", |
42 false, false)); | 42 false, false)); |
43 ASSERT_TRUE(root.get()); | 43 ASSERT_TRUE(root.get()); |
44 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 44 ASSERT_TRUE(root->IsString()); |
45 std::string value; | 45 std::string value; |
46 ASSERT_TRUE(root->GetAsString(&value)); | 46 ASSERT_TRUE(root->GetAsString(&value)); |
47 ASSERT_EQ("sample string", value); | 47 ASSERT_EQ("sample string", value); |
48 | 48 |
49 // Test number formats | 49 // Test number formats |
50 root.reset(JSONReader().JsonToValue("43", false, false)); | 50 root.reset(JSONReader().JsonToValue("43", false, false)); |
51 ASSERT_TRUE(root.get()); | 51 ASSERT_TRUE(root.get()); |
52 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 52 ASSERT_TRUE(root->IsInteger()); |
53 int int_val = 0; | 53 int int_val = 0; |
54 ASSERT_TRUE(root->GetAsInteger(&int_val)); | 54 ASSERT_TRUE(root->GetAsInteger(&int_val)); |
55 ASSERT_EQ(43, int_val); | 55 ASSERT_EQ(43, int_val); |
56 | 56 |
57 // According to RFC4627, oct, hex, and leading zeros are invalid JSON. | 57 // According to RFC4627, oct, hex, and leading zeros are invalid JSON. |
58 root.reset(JSONReader().JsonToValue("043", false, false)); | 58 root.reset(JSONReader().JsonToValue("043", false, false)); |
59 ASSERT_FALSE(root.get()); | 59 ASSERT_FALSE(root.get()); |
60 root.reset(JSONReader().JsonToValue("0x43", false, false)); | 60 root.reset(JSONReader().JsonToValue("0x43", false, false)); |
61 ASSERT_FALSE(root.get()); | 61 ASSERT_FALSE(root.get()); |
62 root.reset(JSONReader().JsonToValue("00", false, false)); | 62 root.reset(JSONReader().JsonToValue("00", false, false)); |
63 ASSERT_FALSE(root.get()); | 63 ASSERT_FALSE(root.get()); |
64 | 64 |
65 // Test 0 (which needs to be special cased because of the leading zero | 65 // Test 0 (which needs to be special cased because of the leading zero |
66 // clause). | 66 // clause). |
67 root.reset(JSONReader().JsonToValue("0", false, false)); | 67 root.reset(JSONReader().JsonToValue("0", false, false)); |
68 ASSERT_TRUE(root.get()); | 68 ASSERT_TRUE(root.get()); |
69 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 69 ASSERT_TRUE(root->IsInteger()); |
70 int_val = 1; | 70 int_val = 1; |
71 ASSERT_TRUE(root->GetAsInteger(&int_val)); | 71 ASSERT_TRUE(root->GetAsInteger(&int_val)); |
72 ASSERT_EQ(0, int_val); | 72 ASSERT_EQ(0, int_val); |
73 | 73 |
74 // Numbers that overflow ints should succeed, being internally promoted to | 74 // Numbers that overflow ints should succeed, being internally promoted to |
75 // storage as doubles | 75 // storage as doubles |
76 root.reset(JSONReader().JsonToValue("2147483648", false, false)); | 76 root.reset(JSONReader().JsonToValue("2147483648", false, false)); |
77 ASSERT_TRUE(root.get()); | 77 ASSERT_TRUE(root.get()); |
78 double double_val; | 78 double double_val; |
79 ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 79 ASSERT_TRUE(root->IsDouble()); |
80 double_val = 0.0; | 80 double_val = 0.0; |
81 ASSERT_TRUE(root->GetAsDouble(&double_val)); | 81 ASSERT_TRUE(root->GetAsDouble(&double_val)); |
82 ASSERT_DOUBLE_EQ(2147483648.0, double_val); | 82 ASSERT_DOUBLE_EQ(2147483648.0, double_val); |
83 root.reset(JSONReader().JsonToValue("-2147483649", false, false)); | 83 root.reset(JSONReader().JsonToValue("-2147483649", false, false)); |
84 ASSERT_TRUE(root.get()); | 84 ASSERT_TRUE(root.get()); |
85 ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 85 ASSERT_TRUE(root->IsDouble()); |
86 double_val = 0.0; | 86 double_val = 0.0; |
87 ASSERT_TRUE(root->GetAsDouble(&double_val)); | 87 ASSERT_TRUE(root->GetAsDouble(&double_val)); |
88 ASSERT_DOUBLE_EQ(-2147483649.0, double_val); | 88 ASSERT_DOUBLE_EQ(-2147483649.0, double_val); |
89 | 89 |
90 // Parse a double | 90 // Parse a double |
91 root.reset(JSONReader().JsonToValue("43.1", false, false)); | 91 root.reset(JSONReader().JsonToValue("43.1", false, false)); |
92 ASSERT_TRUE(root.get()); | 92 ASSERT_TRUE(root.get()); |
93 ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 93 ASSERT_TRUE(root->IsDouble()); |
94 double_val = 0.0; | 94 double_val = 0.0; |
95 ASSERT_TRUE(root->GetAsDouble(&double_val)); | 95 ASSERT_TRUE(root->GetAsDouble(&double_val)); |
96 ASSERT_DOUBLE_EQ(43.1, double_val); | 96 ASSERT_DOUBLE_EQ(43.1, double_val); |
97 | 97 |
98 root.reset(JSONReader().JsonToValue("4.3e-1", false, false)); | 98 root.reset(JSONReader().JsonToValue("4.3e-1", false, false)); |
99 ASSERT_TRUE(root.get()); | 99 ASSERT_TRUE(root.get()); |
100 ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 100 ASSERT_TRUE(root->IsDouble()); |
101 double_val = 0.0; | 101 double_val = 0.0; |
102 ASSERT_TRUE(root->GetAsDouble(&double_val)); | 102 ASSERT_TRUE(root->GetAsDouble(&double_val)); |
103 ASSERT_DOUBLE_EQ(.43, double_val); | 103 ASSERT_DOUBLE_EQ(.43, double_val); |
104 | 104 |
105 root.reset(JSONReader().JsonToValue("2.1e0", false, false)); | 105 root.reset(JSONReader().JsonToValue("2.1e0", false, false)); |
106 ASSERT_TRUE(root.get()); | 106 ASSERT_TRUE(root.get()); |
107 ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 107 ASSERT_TRUE(root->IsDouble()); |
108 double_val = 0.0; | 108 double_val = 0.0; |
109 ASSERT_TRUE(root->GetAsDouble(&double_val)); | 109 ASSERT_TRUE(root->GetAsDouble(&double_val)); |
110 ASSERT_DOUBLE_EQ(2.1, double_val); | 110 ASSERT_DOUBLE_EQ(2.1, double_val); |
111 | 111 |
112 root.reset(JSONReader().JsonToValue("2.1e+0001", false, false)); | 112 root.reset(JSONReader().JsonToValue("2.1e+0001", false, false)); |
113 ASSERT_TRUE(root.get()); | 113 ASSERT_TRUE(root.get()); |
114 ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 114 ASSERT_TRUE(root->IsDouble()); |
115 double_val = 0.0; | 115 double_val = 0.0; |
116 ASSERT_TRUE(root->GetAsDouble(&double_val)); | 116 ASSERT_TRUE(root->GetAsDouble(&double_val)); |
117 ASSERT_DOUBLE_EQ(21.0, double_val); | 117 ASSERT_DOUBLE_EQ(21.0, double_val); |
118 | 118 |
119 root.reset(JSONReader().JsonToValue("0.01", false, false)); | 119 root.reset(JSONReader().JsonToValue("0.01", false, false)); |
120 ASSERT_TRUE(root.get()); | 120 ASSERT_TRUE(root.get()); |
121 ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 121 ASSERT_TRUE(root->IsDouble()); |
122 double_val = 0.0; | 122 double_val = 0.0; |
123 ASSERT_TRUE(root->GetAsDouble(&double_val)); | 123 ASSERT_TRUE(root->GetAsDouble(&double_val)); |
124 ASSERT_DOUBLE_EQ(0.01, double_val); | 124 ASSERT_DOUBLE_EQ(0.01, double_val); |
125 | 125 |
126 root.reset(JSONReader().JsonToValue("1.00", false, false)); | 126 root.reset(JSONReader().JsonToValue("1.00", false, false)); |
127 ASSERT_TRUE(root.get()); | 127 ASSERT_TRUE(root.get()); |
128 ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE)); | 128 ASSERT_TRUE(root->IsDouble()); |
129 double_val = 0.0; | 129 double_val = 0.0; |
130 ASSERT_TRUE(root->GetAsDouble(&double_val)); | 130 ASSERT_TRUE(root->GetAsDouble(&double_val)); |
131 ASSERT_DOUBLE_EQ(1.0, double_val); | 131 ASSERT_DOUBLE_EQ(1.0, double_val); |
132 | 132 |
133 // Fractional parts must have a digit before and after the decimal point. | 133 // Fractional parts must have a digit before and after the decimal point. |
134 root.reset(JSONReader().JsonToValue("1.", false, false)); | 134 root.reset(JSONReader().JsonToValue("1.", false, false)); |
135 ASSERT_FALSE(root.get()); | 135 ASSERT_FALSE(root.get()); |
136 root.reset(JSONReader().JsonToValue(".1", false, false)); | 136 root.reset(JSONReader().JsonToValue(".1", false, false)); |
137 ASSERT_FALSE(root.get()); | 137 ASSERT_FALSE(root.get()); |
138 root.reset(JSONReader().JsonToValue("1.e10", false, false)); | 138 root.reset(JSONReader().JsonToValue("1.e10", false, false)); |
(...skipping 23 matching lines...) Expand all Loading... |
162 | 162 |
163 // Invalid number formats | 163 // Invalid number formats |
164 root.reset(JSONReader().JsonToValue("4.3.1", false, false)); | 164 root.reset(JSONReader().JsonToValue("4.3.1", false, false)); |
165 ASSERT_FALSE(root.get()); | 165 ASSERT_FALSE(root.get()); |
166 root.reset(JSONReader().JsonToValue("4e3.1", false, false)); | 166 root.reset(JSONReader().JsonToValue("4e3.1", false, false)); |
167 ASSERT_FALSE(root.get()); | 167 ASSERT_FALSE(root.get()); |
168 | 168 |
169 // Test string parser | 169 // Test string parser |
170 root.reset(JSONReader().JsonToValue("\"hello world\"", false, false)); | 170 root.reset(JSONReader().JsonToValue("\"hello world\"", false, false)); |
171 ASSERT_TRUE(root.get()); | 171 ASSERT_TRUE(root.get()); |
172 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 172 ASSERT_TRUE(root->IsString()); |
173 std::string str_val; | 173 std::string str_val; |
174 ASSERT_TRUE(root->GetAsString(&str_val)); | 174 ASSERT_TRUE(root->GetAsString(&str_val)); |
175 ASSERT_EQ("hello world", str_val); | 175 ASSERT_EQ("hello world", str_val); |
176 | 176 |
177 // Empty string | 177 // Empty string |
178 root.reset(JSONReader().JsonToValue("\"\"", false, false)); | 178 root.reset(JSONReader().JsonToValue("\"\"", false, false)); |
179 ASSERT_TRUE(root.get()); | 179 ASSERT_TRUE(root.get()); |
180 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 180 ASSERT_TRUE(root->IsString()); |
181 str_val.clear(); | 181 str_val.clear(); |
182 ASSERT_TRUE(root->GetAsString(&str_val)); | 182 ASSERT_TRUE(root->GetAsString(&str_val)); |
183 ASSERT_EQ("", str_val); | 183 ASSERT_EQ("", str_val); |
184 | 184 |
185 // Test basic string escapes | 185 // Test basic string escapes |
186 root.reset(JSONReader().JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"", | 186 root.reset(JSONReader().JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"", |
187 false, false)); | 187 false, false)); |
188 ASSERT_TRUE(root.get()); | 188 ASSERT_TRUE(root.get()); |
189 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 189 ASSERT_TRUE(root->IsString()); |
190 str_val.clear(); | 190 str_val.clear(); |
191 ASSERT_TRUE(root->GetAsString(&str_val)); | 191 ASSERT_TRUE(root->GetAsString(&str_val)); |
192 ASSERT_EQ(" \"\\/\b\f\n\r\t\v", str_val); | 192 ASSERT_EQ(" \"\\/\b\f\n\r\t\v", str_val); |
193 | 193 |
194 // Test hex and unicode escapes including the null character. | 194 // Test hex and unicode escapes including the null character. |
195 root.reset(JSONReader().JsonToValue("\"\\x41\\x00\\u1234\"", false, | 195 root.reset(JSONReader().JsonToValue("\"\\x41\\x00\\u1234\"", false, |
196 false)); | 196 false)); |
197 ASSERT_TRUE(root.get()); | 197 ASSERT_TRUE(root.get()); |
198 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 198 ASSERT_TRUE(root->IsString()); |
199 str_val.clear(); | 199 str_val.clear(); |
200 ASSERT_TRUE(root->GetAsString(&str_val)); | 200 ASSERT_TRUE(root->GetAsString(&str_val)); |
201 ASSERT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val)); | 201 ASSERT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val)); |
202 | 202 |
203 // Test invalid strings | 203 // Test invalid strings |
204 root.reset(JSONReader().JsonToValue("\"no closing quote", false, false)); | 204 root.reset(JSONReader().JsonToValue("\"no closing quote", false, false)); |
205 ASSERT_FALSE(root.get()); | 205 ASSERT_FALSE(root.get()); |
206 root.reset(JSONReader().JsonToValue("\"\\z invalid escape char\"", false, | 206 root.reset(JSONReader().JsonToValue("\"\\z invalid escape char\"", false, |
207 false)); | 207 false)); |
208 ASSERT_FALSE(root.get()); | 208 ASSERT_FALSE(root.get()); |
209 root.reset(JSONReader().JsonToValue("\"\\xAQ invalid hex code\"", false, | 209 root.reset(JSONReader().JsonToValue("\"\\xAQ invalid hex code\"", false, |
210 false)); | 210 false)); |
211 ASSERT_FALSE(root.get()); | 211 ASSERT_FALSE(root.get()); |
212 root.reset(JSONReader().JsonToValue("not enough hex chars\\x1\"", false, | 212 root.reset(JSONReader().JsonToValue("not enough hex chars\\x1\"", false, |
213 false)); | 213 false)); |
214 ASSERT_FALSE(root.get()); | 214 ASSERT_FALSE(root.get()); |
215 root.reset(JSONReader().JsonToValue("\"not enough escape chars\\u123\"", | 215 root.reset(JSONReader().JsonToValue("\"not enough escape chars\\u123\"", |
216 false, false)); | 216 false, false)); |
217 ASSERT_FALSE(root.get()); | 217 ASSERT_FALSE(root.get()); |
218 root.reset(JSONReader().JsonToValue("\"extra backslash at end of input\\\"", | 218 root.reset(JSONReader().JsonToValue("\"extra backslash at end of input\\\"", |
219 false, false)); | 219 false, false)); |
220 ASSERT_FALSE(root.get()); | 220 ASSERT_FALSE(root.get()); |
221 | 221 |
222 // Basic array | 222 // Basic array |
223 root.reset(JSONReader::Read("[true, false, null]", false)); | 223 root.reset(JSONReader::Read("[true, false, null]", false)); |
224 ASSERT_TRUE(root.get()); | 224 ASSERT_TRUE(root.get()); |
225 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); | 225 ASSERT_TRUE(root->IsList()); |
226 ListValue* list = static_cast<ListValue*>(root.get()); | 226 ListValue* list = static_cast<ListValue*>(root.get()); |
227 ASSERT_EQ(3U, list->GetSize()); | 227 ASSERT_EQ(3U, list->GetSize()); |
228 | 228 |
229 // Test with trailing comma. Should be parsed the same as above. | 229 // Test with trailing comma. Should be parsed the same as above. |
230 scoped_ptr<Value> root2; | 230 scoped_ptr<Value> root2; |
231 root2.reset(JSONReader::Read("[true, false, null, ]", true)); | 231 root2.reset(JSONReader::Read("[true, false, null, ]", true)); |
232 EXPECT_TRUE(root->Equals(root2.get())); | 232 EXPECT_TRUE(root->Equals(root2.get())); |
233 | 233 |
234 // Empty array | 234 // Empty array |
235 root.reset(JSONReader::Read("[]", false)); | 235 root.reset(JSONReader::Read("[]", false)); |
236 ASSERT_TRUE(root.get()); | 236 ASSERT_TRUE(root.get()); |
237 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); | 237 ASSERT_TRUE(root->IsList()); |
238 list = static_cast<ListValue*>(root.get()); | 238 list = static_cast<ListValue*>(root.get()); |
239 ASSERT_EQ(0U, list->GetSize()); | 239 ASSERT_EQ(0U, list->GetSize()); |
240 | 240 |
241 // Nested arrays | 241 // Nested arrays |
242 root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null]", | 242 root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null]", |
243 false)); | 243 false)); |
244 ASSERT_TRUE(root.get()); | 244 ASSERT_TRUE(root.get()); |
245 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); | 245 ASSERT_TRUE(root->IsList()); |
246 list = static_cast<ListValue*>(root.get()); | 246 list = static_cast<ListValue*>(root.get()); |
247 ASSERT_EQ(4U, list->GetSize()); | 247 ASSERT_EQ(4U, list->GetSize()); |
248 | 248 |
249 // Lots of trailing commas. | 249 // Lots of trailing commas. |
250 root2.reset(JSONReader::Read("[[true], [], [false, [], [null, ] , ], null,]", | 250 root2.reset(JSONReader::Read("[[true], [], [false, [], [null, ] , ], null,]", |
251 true)); | 251 true)); |
252 EXPECT_TRUE(root->Equals(root2.get())); | 252 EXPECT_TRUE(root->Equals(root2.get())); |
253 | 253 |
254 // Invalid, missing close brace. | 254 // Invalid, missing close brace. |
255 root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null", false)); | 255 root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null", false)); |
256 ASSERT_FALSE(root.get()); | 256 ASSERT_FALSE(root.get()); |
257 | 257 |
258 // Invalid, too many commas | 258 // Invalid, too many commas |
259 root.reset(JSONReader::Read("[true,, null]", false)); | 259 root.reset(JSONReader::Read("[true,, null]", false)); |
260 ASSERT_FALSE(root.get()); | 260 ASSERT_FALSE(root.get()); |
261 root.reset(JSONReader::Read("[true,, null]", true)); | 261 root.reset(JSONReader::Read("[true,, null]", true)); |
262 ASSERT_FALSE(root.get()); | 262 ASSERT_FALSE(root.get()); |
263 | 263 |
264 // Invalid, no commas | 264 // Invalid, no commas |
265 root.reset(JSONReader::Read("[true null]", false)); | 265 root.reset(JSONReader::Read("[true null]", false)); |
266 ASSERT_FALSE(root.get()); | 266 ASSERT_FALSE(root.get()); |
267 | 267 |
268 // Invalid, trailing comma | 268 // Invalid, trailing comma |
269 root.reset(JSONReader::Read("[true,]", false)); | 269 root.reset(JSONReader::Read("[true,]", false)); |
270 ASSERT_FALSE(root.get()); | 270 ASSERT_FALSE(root.get()); |
271 | 271 |
272 // Valid if we set |allow_trailing_comma| to true. | 272 // Valid if we set |allow_trailing_comma| to true. |
273 root.reset(JSONReader::Read("[true,]", true)); | 273 root.reset(JSONReader::Read("[true,]", true)); |
274 ASSERT_TRUE(root.get()); | 274 ASSERT_TRUE(root.get()); |
275 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); | 275 ASSERT_TRUE(root->IsList()); |
276 list = static_cast<ListValue*>(root.get()); | 276 list = static_cast<ListValue*>(root.get()); |
277 EXPECT_EQ(1U, list->GetSize()); | 277 EXPECT_EQ(1U, list->GetSize()); |
278 Value* tmp_value = NULL; | 278 Value* tmp_value = NULL; |
279 ASSERT_TRUE(list->Get(0, &tmp_value)); | 279 ASSERT_TRUE(list->Get(0, &tmp_value)); |
280 EXPECT_TRUE(tmp_value->IsType(Value::TYPE_BOOLEAN)); | 280 EXPECT_TRUE(tmp_value->IsBoolean()); |
281 bool bool_value = false; | 281 bool bool_value = false; |
282 ASSERT_TRUE(tmp_value->GetAsBoolean(&bool_value)); | 282 ASSERT_TRUE(tmp_value->GetAsBoolean(&bool_value)); |
283 EXPECT_TRUE(bool_value); | 283 EXPECT_TRUE(bool_value); |
284 | 284 |
285 // Don't allow empty elements, even if |allow_trailing_comma| is | 285 // Don't allow empty elements, even if |allow_trailing_comma| is |
286 // true. | 286 // true. |
287 root.reset(JSONReader::Read("[,]", true)); | 287 root.reset(JSONReader::Read("[,]", true)); |
288 EXPECT_FALSE(root.get()); | 288 EXPECT_FALSE(root.get()); |
289 root.reset(JSONReader::Read("[true,,]", true)); | 289 root.reset(JSONReader::Read("[true,,]", true)); |
290 EXPECT_FALSE(root.get()); | 290 EXPECT_FALSE(root.get()); |
291 root.reset(JSONReader::Read("[,true,]", true)); | 291 root.reset(JSONReader::Read("[,true,]", true)); |
292 EXPECT_FALSE(root.get()); | 292 EXPECT_FALSE(root.get()); |
293 root.reset(JSONReader::Read("[true,,false]", true)); | 293 root.reset(JSONReader::Read("[true,,false]", true)); |
294 EXPECT_FALSE(root.get()); | 294 EXPECT_FALSE(root.get()); |
295 | 295 |
296 // Test objects | 296 // Test objects |
297 root.reset(JSONReader::Read("{}", false)); | 297 root.reset(JSONReader::Read("{}", false)); |
298 ASSERT_TRUE(root.get()); | 298 ASSERT_TRUE(root.get()); |
299 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 299 ASSERT_TRUE(root->IsDictionary()); |
300 | 300 |
301 root.reset(JSONReader::Read( | 301 root.reset(JSONReader::Read( |
302 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }", false)); | 302 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }", false)); |
303 ASSERT_TRUE(root.get()); | 303 ASSERT_TRUE(root.get()); |
304 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 304 ASSERT_TRUE(root->IsDictionary()); |
305 DictionaryValue* dict_val = static_cast<DictionaryValue*>(root.get()); | 305 DictionaryValue* dict_val = static_cast<DictionaryValue*>(root.get()); |
306 double_val = 0.0; | 306 double_val = 0.0; |
307 ASSERT_TRUE(dict_val->GetDouble("number", &double_val)); | 307 ASSERT_TRUE(dict_val->GetDouble("number", &double_val)); |
308 ASSERT_DOUBLE_EQ(9.87654321, double_val); | 308 ASSERT_DOUBLE_EQ(9.87654321, double_val); |
309 Value* null_val = NULL; | 309 Value* null_val = NULL; |
310 ASSERT_TRUE(dict_val->Get("null", &null_val)); | 310 ASSERT_TRUE(dict_val->Get("null", &null_val)); |
311 ASSERT_TRUE(null_val->IsType(Value::TYPE_NULL)); | 311 ASSERT_TRUE(null_val->IsNull()); |
312 str_val.clear(); | 312 str_val.clear(); |
313 ASSERT_TRUE(dict_val->GetString("S", &str_val)); | 313 ASSERT_TRUE(dict_val->GetString("S", &str_val)); |
314 ASSERT_EQ("str", str_val); | 314 ASSERT_EQ("str", str_val); |
315 | 315 |
316 root2.reset(JSONReader::Read( | 316 root2.reset(JSONReader::Read( |
317 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", true)); | 317 "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", true)); |
318 ASSERT_TRUE(root2.get()); | 318 ASSERT_TRUE(root2.get()); |
319 EXPECT_TRUE(root->Equals(root2.get())); | 319 EXPECT_TRUE(root->Equals(root2.get())); |
320 | 320 |
321 // Test newline equivalence. | 321 // Test newline equivalence. |
(...skipping 12 matching lines...) Expand all Loading... |
334 " \"null\":null,\r\n" | 334 " \"null\":null,\r\n" |
335 " \"\\x53\":\"str\",\r\n" | 335 " \"\\x53\":\"str\",\r\n" |
336 "}\r\n", true)); | 336 "}\r\n", true)); |
337 ASSERT_TRUE(root2.get()); | 337 ASSERT_TRUE(root2.get()); |
338 EXPECT_TRUE(root->Equals(root2.get())); | 338 EXPECT_TRUE(root->Equals(root2.get())); |
339 | 339 |
340 // Test nesting | 340 // Test nesting |
341 root.reset(JSONReader::Read( | 341 root.reset(JSONReader::Read( |
342 "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}", false)); | 342 "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}", false)); |
343 ASSERT_TRUE(root.get()); | 343 ASSERT_TRUE(root.get()); |
344 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 344 ASSERT_TRUE(root->IsDictionary()); |
345 dict_val = static_cast<DictionaryValue*>(root.get()); | 345 dict_val = static_cast<DictionaryValue*>(root.get()); |
346 DictionaryValue* inner_dict = NULL; | 346 DictionaryValue* inner_dict = NULL; |
347 ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict)); | 347 ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict)); |
348 ListValue* inner_array = NULL; | 348 ListValue* inner_array = NULL; |
349 ASSERT_TRUE(inner_dict->GetList("array", &inner_array)); | 349 ASSERT_TRUE(inner_dict->GetList("array", &inner_array)); |
350 ASSERT_EQ(1U, inner_array->GetSize()); | 350 ASSERT_EQ(1U, inner_array->GetSize()); |
351 bool_value = true; | 351 bool_value = true; |
352 ASSERT_TRUE(dict_val->GetBoolean("false", &bool_value)); | 352 ASSERT_TRUE(dict_val->GetBoolean("false", &bool_value)); |
353 ASSERT_FALSE(bool_value); | 353 ASSERT_FALSE(bool_value); |
354 inner_dict = NULL; | 354 inner_dict = NULL; |
355 ASSERT_TRUE(dict_val->GetDictionary("d", &inner_dict)); | 355 ASSERT_TRUE(dict_val->GetDictionary("d", &inner_dict)); |
356 | 356 |
357 root2.reset(JSONReader::Read( | 357 root2.reset(JSONReader::Read( |
358 "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}", true)); | 358 "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}", true)); |
359 EXPECT_TRUE(root->Equals(root2.get())); | 359 EXPECT_TRUE(root->Equals(root2.get())); |
360 | 360 |
361 // Test keys with periods | 361 // Test keys with periods |
362 root.reset(JSONReader::Read( | 362 root.reset(JSONReader::Read( |
363 "{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}", false)); | 363 "{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}", false)); |
364 ASSERT_TRUE(root.get()); | 364 ASSERT_TRUE(root.get()); |
365 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 365 ASSERT_TRUE(root->IsDictionary()); |
366 dict_val = static_cast<DictionaryValue*>(root.get()); | 366 dict_val = static_cast<DictionaryValue*>(root.get()); |
367 int integer_value = 0; | 367 int integer_value = 0; |
368 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); | 368 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); |
369 EXPECT_EQ(3, integer_value); | 369 EXPECT_EQ(3, integer_value); |
370 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value)); | 370 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value)); |
371 EXPECT_EQ(2, integer_value); | 371 EXPECT_EQ(2, integer_value); |
372 inner_dict = NULL; | 372 inner_dict = NULL; |
373 ASSERT_TRUE(dict_val->GetDictionaryWithoutPathExpansion("d.e.f", | 373 ASSERT_TRUE(dict_val->GetDictionaryWithoutPathExpansion("d.e.f", |
374 &inner_dict)); | 374 &inner_dict)); |
375 ASSERT_EQ(1U, inner_dict->size()); | 375 ASSERT_EQ(1U, inner_dict->size()); |
376 EXPECT_TRUE(inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j", | 376 EXPECT_TRUE(inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j", |
377 &integer_value)); | 377 &integer_value)); |
378 EXPECT_EQ(1, integer_value); | 378 EXPECT_EQ(1, integer_value); |
379 | 379 |
380 root.reset(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}", false)); | 380 root.reset(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}", false)); |
381 ASSERT_TRUE(root.get()); | 381 ASSERT_TRUE(root.get()); |
382 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 382 ASSERT_TRUE(root->IsDictionary()); |
383 dict_val = static_cast<DictionaryValue*>(root.get()); | 383 dict_val = static_cast<DictionaryValue*>(root.get()); |
384 EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value)); | 384 EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value)); |
385 EXPECT_EQ(2, integer_value); | 385 EXPECT_EQ(2, integer_value); |
386 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); | 386 EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value)); |
387 EXPECT_EQ(1, integer_value); | 387 EXPECT_EQ(1, integer_value); |
388 | 388 |
389 // Invalid, no closing brace | 389 // Invalid, no closing brace |
390 root.reset(JSONReader::Read("{\"a\": true", false)); | 390 root.reset(JSONReader::Read("{\"a\": true", false)); |
391 ASSERT_FALSE(root.get()); | 391 ASSERT_FALSE(root.get()); |
392 | 392 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 | 428 |
429 // A few thousand adjacent lists is fine. | 429 // A few thousand adjacent lists is fine. |
430 std::string not_evil("["); | 430 std::string not_evil("["); |
431 not_evil.reserve(15010); | 431 not_evil.reserve(15010); |
432 for (int i = 0; i < 5000; ++i) { | 432 for (int i = 0; i < 5000; ++i) { |
433 not_evil.append("[],"); | 433 not_evil.append("[],"); |
434 } | 434 } |
435 not_evil.append("[]]"); | 435 not_evil.append("[]]"); |
436 root.reset(JSONReader::Read(not_evil, false)); | 436 root.reset(JSONReader::Read(not_evil, false)); |
437 ASSERT_TRUE(root.get()); | 437 ASSERT_TRUE(root.get()); |
438 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); | 438 ASSERT_TRUE(root->IsList()); |
439 list = static_cast<ListValue*>(root.get()); | 439 list = static_cast<ListValue*>(root.get()); |
440 ASSERT_EQ(5001U, list->GetSize()); | 440 ASSERT_EQ(5001U, list->GetSize()); |
441 | 441 |
442 // Test utf8 encoded input | 442 // Test utf8 encoded input |
443 root.reset(JSONReader().JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", | 443 root.reset(JSONReader().JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", |
444 false, false)); | 444 false, false)); |
445 ASSERT_TRUE(root.get()); | 445 ASSERT_TRUE(root.get()); |
446 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 446 ASSERT_TRUE(root->IsString()); |
447 str_val.clear(); | 447 str_val.clear(); |
448 ASSERT_TRUE(root->GetAsString(&str_val)); | 448 ASSERT_TRUE(root->GetAsString(&str_val)); |
449 ASSERT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val)); | 449 ASSERT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val)); |
450 | 450 |
451 // Test invalid utf8 encoded input | 451 // Test invalid utf8 encoded input |
452 root.reset(JSONReader().JsonToValue("\"345\xb0\xa1\xb0\xa2\"", | 452 root.reset(JSONReader().JsonToValue("\"345\xb0\xa1\xb0\xa2\"", |
453 false, false)); | 453 false, false)); |
454 ASSERT_FALSE(root.get()); | 454 ASSERT_FALSE(root.get()); |
455 root.reset(JSONReader().JsonToValue("\"123\xc0\x81\"", | 455 root.reset(JSONReader().JsonToValue("\"123\xc0\x81\"", |
456 false, false)); | 456 false, false)); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 | 557 |
558 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", false, | 558 root.reset(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", false, |
559 &error_code, &error_message)); | 559 &error_code, &error_message)); |
560 EXPECT_FALSE(root.get()); | 560 EXPECT_FALSE(root.get()); |
561 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), | 561 EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
562 error_message); | 562 error_message); |
563 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); | 563 EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code); |
564 } | 564 } |
565 | 565 |
566 } // namespace base | 566 } // namespace base |
OLD | NEW |