OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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_reader.h" | 6 #include "base/json_reader.h" |
7 #include "base/values.h" | 7 #include "base/values.h" |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 | 9 |
10 TEST(JSONReaderTest, Reading) { | 10 TEST(JSONReaderTest, Reading) { |
11 // some whitespace checking | 11 // some whitespace checking |
12 Value* root = NULL; | 12 Value* root = NULL; |
13 ASSERT_TRUE(JSONReader::JsonToValue(" null ", &root, false, false)); | 13 ASSERT_TRUE(JSONReader().JsonToValue(" null ", &root, false, false)); |
14 ASSERT_TRUE(root); | 14 ASSERT_TRUE(root); |
15 ASSERT_TRUE(root->IsType(Value::TYPE_NULL)); | 15 ASSERT_TRUE(root->IsType(Value::TYPE_NULL)); |
16 delete root; | 16 delete root; |
17 | 17 |
18 // Invalid JSON string | 18 // Invalid JSON string |
19 root = NULL; | 19 root = NULL; |
20 ASSERT_FALSE(JSONReader::JsonToValue("nu", &root, false, false)); | 20 ASSERT_FALSE(JSONReader().JsonToValue("nu", &root, false, false)); |
21 ASSERT_FALSE(root); | 21 ASSERT_FALSE(root); |
22 | 22 |
23 // Simple bool | 23 // Simple bool |
24 root = NULL; | 24 root = NULL; |
25 ASSERT_TRUE(JSONReader::JsonToValue("true ", &root, false, false)); | 25 ASSERT_TRUE(JSONReader().JsonToValue("true ", &root, false, false)); |
26 ASSERT_TRUE(root); | 26 ASSERT_TRUE(root); |
27 ASSERT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); | 27 ASSERT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); |
28 delete root; | 28 delete root; |
29 | 29 |
30 // Test number formats | 30 // Test number formats |
31 root = NULL; | 31 root = NULL; |
32 ASSERT_TRUE(JSONReader::JsonToValue("43", &root, false, false)); | 32 ASSERT_TRUE(JSONReader().JsonToValue("43", &root, false, false)); |
33 ASSERT_TRUE(root); | 33 ASSERT_TRUE(root); |
34 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 34 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
35 int int_val = 0; | 35 int int_val = 0; |
36 ASSERT_TRUE(root->GetAsInteger(&int_val)); | 36 ASSERT_TRUE(root->GetAsInteger(&int_val)); |
37 ASSERT_EQ(43, int_val); | 37 ASSERT_EQ(43, int_val); |
38 delete root; | 38 delete root; |
39 | 39 |
40 // According to RFC4627, oct, hex, and leading zeros are invalid JSON. | 40 // According to RFC4627, oct, hex, and leading zeros are invalid JSON. |
41 root = NULL; | 41 root = NULL; |
42 ASSERT_FALSE(JSONReader::JsonToValue("043", &root, false, false)); | 42 ASSERT_FALSE(JSONReader().JsonToValue("043", &root, false, false)); |
43 ASSERT_FALSE(root); | 43 ASSERT_FALSE(root); |
44 root = NULL; | 44 root = NULL; |
45 ASSERT_FALSE(JSONReader::JsonToValue("0x43", &root, false, false)); | 45 ASSERT_FALSE(JSONReader().JsonToValue("0x43", &root, false, false)); |
46 ASSERT_FALSE(root); | 46 ASSERT_FALSE(root); |
47 root = NULL; | 47 root = NULL; |
48 ASSERT_FALSE(JSONReader::JsonToValue("00", &root, false, false)); | 48 ASSERT_FALSE(JSONReader().JsonToValue("00", &root, false, false)); |
49 ASSERT_FALSE(root); | 49 ASSERT_FALSE(root); |
50 | 50 |
51 // Test 0 (which needs to be special cased because of the leading zero | 51 // Test 0 (which needs to be special cased because of the leading zero |
52 // clause). | 52 // clause). |
53 root = NULL; | 53 root = NULL; |
54 ASSERT_TRUE(JSONReader::JsonToValue("0", &root, false, false)); | 54 ASSERT_TRUE(JSONReader().JsonToValue("0", &root, false, false)); |
55 ASSERT_TRUE(root); | 55 ASSERT_TRUE(root); |
56 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 56 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
57 int_val = 1; | 57 int_val = 1; |
58 ASSERT_TRUE(root->GetAsInteger(&int_val)); | 58 ASSERT_TRUE(root->GetAsInteger(&int_val)); |
59 ASSERT_EQ(0, int_val); | 59 ASSERT_EQ(0, int_val); |
60 delete root; | 60 delete root; |
61 | 61 |
62 // Numbers that overflow ints should succeed, being internally promoted to | 62 // Numbers that overflow ints should succeed, being internally promoted to |
63 // storage as doubles | 63 // storage as doubles |
64 root = NULL; | 64 root = NULL; |
65 ASSERT_TRUE(JSONReader::JsonToValue("2147483648", &root, false, false)); | 65 ASSERT_TRUE(JSONReader().JsonToValue("2147483648", &root, false, false)); |
66 ASSERT_TRUE(root); | 66 ASSERT_TRUE(root); |
67 double real_val; | 67 double real_val; |
68 #ifdef ARCH_CPU_32_BITS | 68 #ifdef ARCH_CPU_32_BITS |
69 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); | 69 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
70 real_val = 0.0; | 70 real_val = 0.0; |
71 ASSERT_TRUE(root->GetAsReal(&real_val)); | 71 ASSERT_TRUE(root->GetAsReal(&real_val)); |
72 ASSERT_DOUBLE_EQ(2147483648.0, real_val); | 72 ASSERT_DOUBLE_EQ(2147483648.0, real_val); |
73 #else | 73 #else |
74 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 74 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
75 int_val = 0; | 75 int_val = 0; |
76 ASSERT_TRUE(root->GetAsInteger(&int_val)); | 76 ASSERT_TRUE(root->GetAsInteger(&int_val)); |
77 ASSERT_EQ(2147483648, int_val); | 77 ASSERT_EQ(2147483648, int_val); |
78 #endif | 78 #endif |
79 delete root; | 79 delete root; |
80 root = NULL; | 80 root = NULL; |
81 ASSERT_TRUE(JSONReader::JsonToValue("-2147483649", &root, false, false)); | 81 ASSERT_TRUE(JSONReader().JsonToValue("-2147483649", &root, false, false)); |
82 ASSERT_TRUE(root); | 82 ASSERT_TRUE(root); |
83 #ifdef ARCH_CPU_32_BITS | 83 #ifdef ARCH_CPU_32_BITS |
84 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); | 84 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
85 real_val = 0.0; | 85 real_val = 0.0; |
86 ASSERT_TRUE(root->GetAsReal(&real_val)); | 86 ASSERT_TRUE(root->GetAsReal(&real_val)); |
87 ASSERT_DOUBLE_EQ(-2147483649.0, real_val); | 87 ASSERT_DOUBLE_EQ(-2147483649.0, real_val); |
88 #else | 88 #else |
89 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); | 89 ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
90 int_val = 0; | 90 int_val = 0; |
91 ASSERT_TRUE(root->GetAsInteger(&int_val)); | 91 ASSERT_TRUE(root->GetAsInteger(&int_val)); |
92 ASSERT_EQ(-2147483649, int_val); | 92 ASSERT_EQ(-2147483649, int_val); |
93 #endif | 93 #endif |
94 delete root; | 94 delete root; |
95 | 95 |
96 // Parse a double | 96 // Parse a double |
97 root = NULL; | 97 root = NULL; |
98 ASSERT_TRUE(JSONReader::JsonToValue("43.1", &root, false, false)); | 98 ASSERT_TRUE(JSONReader().JsonToValue("43.1", &root, false, false)); |
99 ASSERT_TRUE(root); | 99 ASSERT_TRUE(root); |
100 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); | 100 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
101 real_val = 0.0; | 101 real_val = 0.0; |
102 ASSERT_TRUE(root->GetAsReal(&real_val)); | 102 ASSERT_TRUE(root->GetAsReal(&real_val)); |
103 ASSERT_DOUBLE_EQ(43.1, real_val); | 103 ASSERT_DOUBLE_EQ(43.1, real_val); |
104 delete root; | 104 delete root; |
105 | 105 |
106 root = NULL; | 106 root = NULL; |
107 ASSERT_TRUE(JSONReader::JsonToValue("4.3e-1", &root, false, false)); | 107 ASSERT_TRUE(JSONReader().JsonToValue("4.3e-1", &root, false, false)); |
108 ASSERT_TRUE(root); | 108 ASSERT_TRUE(root); |
109 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); | 109 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
110 real_val = 0.0; | 110 real_val = 0.0; |
111 ASSERT_TRUE(root->GetAsReal(&real_val)); | 111 ASSERT_TRUE(root->GetAsReal(&real_val)); |
112 ASSERT_DOUBLE_EQ(.43, real_val); | 112 ASSERT_DOUBLE_EQ(.43, real_val); |
113 delete root; | 113 delete root; |
114 | 114 |
115 root = NULL; | 115 root = NULL; |
116 ASSERT_TRUE(JSONReader::JsonToValue("2.1e0", &root, false, false)); | 116 ASSERT_TRUE(JSONReader().JsonToValue("2.1e0", &root, false, false)); |
117 ASSERT_TRUE(root); | 117 ASSERT_TRUE(root); |
118 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); | 118 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
119 real_val = 0.0; | 119 real_val = 0.0; |
120 ASSERT_TRUE(root->GetAsReal(&real_val)); | 120 ASSERT_TRUE(root->GetAsReal(&real_val)); |
121 ASSERT_DOUBLE_EQ(2.1, real_val); | 121 ASSERT_DOUBLE_EQ(2.1, real_val); |
122 delete root; | 122 delete root; |
123 | 123 |
124 root = NULL; | 124 root = NULL; |
125 ASSERT_TRUE(JSONReader::JsonToValue("2.1e+0001", &root, false, false)); | 125 ASSERT_TRUE(JSONReader().JsonToValue("2.1e+0001", &root, false, false)); |
126 ASSERT_TRUE(root); | 126 ASSERT_TRUE(root); |
127 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); | 127 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
128 real_val = 0.0; | 128 real_val = 0.0; |
129 ASSERT_TRUE(root->GetAsReal(&real_val)); | 129 ASSERT_TRUE(root->GetAsReal(&real_val)); |
130 ASSERT_DOUBLE_EQ(21.0, real_val); | 130 ASSERT_DOUBLE_EQ(21.0, real_val); |
131 delete root; | 131 delete root; |
132 | 132 |
133 root = NULL; | 133 root = NULL; |
134 ASSERT_TRUE(JSONReader::JsonToValue("0.01", &root, false, false)); | 134 ASSERT_TRUE(JSONReader().JsonToValue("0.01", &root, false, false)); |
135 ASSERT_TRUE(root); | 135 ASSERT_TRUE(root); |
136 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); | 136 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
137 real_val = 0.0; | 137 real_val = 0.0; |
138 ASSERT_TRUE(root->GetAsReal(&real_val)); | 138 ASSERT_TRUE(root->GetAsReal(&real_val)); |
139 ASSERT_DOUBLE_EQ(0.01, real_val); | 139 ASSERT_DOUBLE_EQ(0.01, real_val); |
140 delete root; | 140 delete root; |
141 | 141 |
142 root = NULL; | 142 root = NULL; |
143 ASSERT_TRUE(JSONReader::JsonToValue("1.00", &root, false, false)); | 143 ASSERT_TRUE(JSONReader().JsonToValue("1.00", &root, false, false)); |
144 ASSERT_TRUE(root); | 144 ASSERT_TRUE(root); |
145 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); | 145 ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
146 real_val = 0.0; | 146 real_val = 0.0; |
147 ASSERT_TRUE(root->GetAsReal(&real_val)); | 147 ASSERT_TRUE(root->GetAsReal(&real_val)); |
148 ASSERT_DOUBLE_EQ(1.0, real_val); | 148 ASSERT_DOUBLE_EQ(1.0, real_val); |
149 delete root; | 149 delete root; |
150 | 150 |
151 // Fractional parts must have a digit before and after the decimal point. | 151 // Fractional parts must have a digit before and after the decimal point. |
152 root = NULL; | 152 root = NULL; |
153 ASSERT_FALSE(JSONReader::JsonToValue("1.", &root, false, false)); | 153 ASSERT_FALSE(JSONReader().JsonToValue("1.", &root, false, false)); |
154 ASSERT_FALSE(root); | 154 ASSERT_FALSE(root); |
155 root = NULL; | 155 root = NULL; |
156 ASSERT_FALSE(JSONReader::JsonToValue(".1", &root, false, false)); | 156 ASSERT_FALSE(JSONReader().JsonToValue(".1", &root, false, false)); |
157 ASSERT_FALSE(root); | 157 ASSERT_FALSE(root); |
158 root = NULL; | 158 root = NULL; |
159 ASSERT_FALSE(JSONReader::JsonToValue("1.e10", &root, false, false)); | 159 ASSERT_FALSE(JSONReader().JsonToValue("1.e10", &root, false, false)); |
160 ASSERT_FALSE(root); | 160 ASSERT_FALSE(root); |
161 | 161 |
162 // Exponent must have a digit following the 'e'. | 162 // Exponent must have a digit following the 'e'. |
163 root = NULL; | 163 root = NULL; |
164 ASSERT_FALSE(JSONReader::JsonToValue("1e", &root, false, false)); | 164 ASSERT_FALSE(JSONReader().JsonToValue("1e", &root, false, false)); |
165 ASSERT_FALSE(root); | 165 ASSERT_FALSE(root); |
166 root = NULL; | 166 root = NULL; |
167 ASSERT_FALSE(JSONReader::JsonToValue("1E", &root, false, false)); | 167 ASSERT_FALSE(JSONReader().JsonToValue("1E", &root, false, false)); |
168 ASSERT_FALSE(root); | 168 ASSERT_FALSE(root); |
169 root = NULL; | 169 root = NULL; |
170 ASSERT_FALSE(JSONReader::JsonToValue("1e1.", &root, false, false)); | 170 ASSERT_FALSE(JSONReader().JsonToValue("1e1.", &root, false, false)); |
171 ASSERT_FALSE(root); | 171 ASSERT_FALSE(root); |
172 root = NULL; | 172 root = NULL; |
173 ASSERT_FALSE(JSONReader::JsonToValue("1e1.0", &root, false, false)); | 173 ASSERT_FALSE(JSONReader().JsonToValue("1e1.0", &root, false, false)); |
174 ASSERT_FALSE(root); | 174 ASSERT_FALSE(root); |
175 | 175 |
176 // INF/-INF/NaN are not valid | 176 // INF/-INF/NaN are not valid |
177 root = NULL; | 177 root = NULL; |
178 ASSERT_FALSE(JSONReader::JsonToValue("1e1000", &root, false, false)); | 178 ASSERT_FALSE(JSONReader().JsonToValue("1e1000", &root, false, false)); |
179 ASSERT_FALSE(root); | 179 ASSERT_FALSE(root); |
180 root = NULL; | 180 root = NULL; |
181 ASSERT_FALSE(JSONReader::JsonToValue("-1e1000", &root, false, false)); | 181 ASSERT_FALSE(JSONReader().JsonToValue("-1e1000", &root, false, false)); |
182 ASSERT_FALSE(root); | 182 ASSERT_FALSE(root); |
183 root = NULL; | 183 root = NULL; |
184 ASSERT_FALSE(JSONReader::JsonToValue("NaN", &root, false, false)); | 184 ASSERT_FALSE(JSONReader().JsonToValue("NaN", &root, false, false)); |
185 ASSERT_FALSE(root); | 185 ASSERT_FALSE(root); |
186 root = NULL; | 186 root = NULL; |
187 ASSERT_FALSE(JSONReader::JsonToValue("nan", &root, false, false)); | 187 ASSERT_FALSE(JSONReader().JsonToValue("nan", &root, false, false)); |
188 ASSERT_FALSE(root); | 188 ASSERT_FALSE(root); |
189 root = NULL; | 189 root = NULL; |
190 ASSERT_FALSE(JSONReader::JsonToValue("inf", &root, false, false)); | 190 ASSERT_FALSE(JSONReader().JsonToValue("inf", &root, false, false)); |
191 ASSERT_FALSE(root); | 191 ASSERT_FALSE(root); |
192 | 192 |
193 // Invalid number formats | 193 // Invalid number formats |
194 root = NULL; | 194 root = NULL; |
195 ASSERT_FALSE(JSONReader::JsonToValue("4.3.1", &root, false, false)); | 195 ASSERT_FALSE(JSONReader().JsonToValue("4.3.1", &root, false, false)); |
196 ASSERT_FALSE(root); | 196 ASSERT_FALSE(root); |
197 root = NULL; | 197 root = NULL; |
198 ASSERT_FALSE(JSONReader::JsonToValue("4e3.1", &root, false, false)); | 198 ASSERT_FALSE(JSONReader().JsonToValue("4e3.1", &root, false, false)); |
199 ASSERT_FALSE(root); | 199 ASSERT_FALSE(root); |
200 | 200 |
201 // Test string parser | 201 // Test string parser |
202 root = NULL; | 202 root = NULL; |
203 ASSERT_TRUE(JSONReader::JsonToValue("\"hello world\"", &root, false, false)); | 203 ASSERT_TRUE(JSONReader().JsonToValue("\"hello world\"", &root, false, false)); |
204 ASSERT_TRUE(root); | 204 ASSERT_TRUE(root); |
205 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 205 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
206 std::wstring str_val; | 206 std::wstring str_val; |
207 ASSERT_TRUE(root->GetAsString(&str_val)); | 207 ASSERT_TRUE(root->GetAsString(&str_val)); |
208 ASSERT_EQ(L"hello world", str_val); | 208 ASSERT_EQ(L"hello world", str_val); |
209 delete root; | 209 delete root; |
210 | 210 |
211 // Empty string | 211 // Empty string |
212 root = NULL; | 212 root = NULL; |
213 ASSERT_TRUE(JSONReader::JsonToValue("\"\"", &root, false, false)); | 213 ASSERT_TRUE(JSONReader().JsonToValue("\"\"", &root, false, false)); |
214 ASSERT_TRUE(root); | 214 ASSERT_TRUE(root); |
215 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 215 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
216 str_val.clear(); | 216 str_val.clear(); |
217 ASSERT_TRUE(root->GetAsString(&str_val)); | 217 ASSERT_TRUE(root->GetAsString(&str_val)); |
218 ASSERT_EQ(L"", str_val); | 218 ASSERT_EQ(L"", str_val); |
219 delete root; | 219 delete root; |
220 | 220 |
221 // Test basic string escapes | 221 // Test basic string escapes |
222 root = NULL; | 222 root = NULL; |
223 ASSERT_TRUE(JSONReader::JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"", &roo
t, | 223 ASSERT_TRUE(JSONReader().JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"", |
224 false, false)); | 224 &root, false, false)); |
225 ASSERT_TRUE(root); | 225 ASSERT_TRUE(root); |
226 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 226 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
227 str_val.clear(); | 227 str_val.clear(); |
228 ASSERT_TRUE(root->GetAsString(&str_val)); | 228 ASSERT_TRUE(root->GetAsString(&str_val)); |
229 ASSERT_EQ(L" \"\\/\b\f\n\r\t\v", str_val); | 229 ASSERT_EQ(L" \"\\/\b\f\n\r\t\v", str_val); |
230 delete root; | 230 delete root; |
231 | 231 |
232 // Test hex and unicode escapes including the null character. | 232 // Test hex and unicode escapes including the null character. |
233 root = NULL; | 233 root = NULL; |
234 ASSERT_TRUE(JSONReader::JsonToValue("\"\\x41\\x00\\u1234\"", &root, false, | 234 ASSERT_TRUE(JSONReader().JsonToValue("\"\\x41\\x00\\u1234\"", &root, false, |
235 false)); | 235 false)); |
236 ASSERT_TRUE(root); | 236 ASSERT_TRUE(root); |
237 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 237 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
238 str_val.clear(); | 238 str_val.clear(); |
239 ASSERT_TRUE(root->GetAsString(&str_val)); | 239 ASSERT_TRUE(root->GetAsString(&str_val)); |
240 ASSERT_EQ(std::wstring(L"A\0\x1234", 3), str_val); | 240 ASSERT_EQ(std::wstring(L"A\0\x1234", 3), str_val); |
241 delete root; | 241 delete root; |
242 | 242 |
243 // Test invalid strings | 243 // Test invalid strings |
244 root = NULL; | 244 root = NULL; |
245 ASSERT_FALSE(JSONReader::JsonToValue("\"no closing quote", &root, false, | 245 ASSERT_FALSE(JSONReader().JsonToValue("\"no closing quote", &root, false, |
246 false)); | 246 false)); |
247 ASSERT_FALSE(root); | 247 ASSERT_FALSE(root); |
248 root = NULL; | 248 root = NULL; |
249 ASSERT_FALSE(JSONReader::JsonToValue("\"\\z invalid escape char\"", &root, | 249 ASSERT_FALSE(JSONReader().JsonToValue("\"\\z invalid escape char\"", &root, |
250 false, false)); | 250 false, false)); |
251 ASSERT_FALSE(root); | 251 ASSERT_FALSE(root); |
252 root = NULL; | 252 root = NULL; |
253 ASSERT_FALSE(JSONReader::JsonToValue("\"\\xAQ invalid hex code\"", &root, | 253 ASSERT_FALSE(JSONReader().JsonToValue("\"\\xAQ invalid hex code\"", &root, |
254 false, false)); | 254 false, false)); |
255 ASSERT_FALSE(root); | 255 ASSERT_FALSE(root); |
256 root = NULL; | 256 root = NULL; |
257 ASSERT_FALSE(JSONReader::JsonToValue("not enough hex chars\\x1\"", &root, | 257 ASSERT_FALSE(JSONReader().JsonToValue("not enough hex chars\\x1\"", &root, |
258 false, false)); | 258 false, false)); |
259 ASSERT_FALSE(root); | 259 ASSERT_FALSE(root); |
260 root = NULL; | 260 root = NULL; |
261 ASSERT_FALSE(JSONReader::JsonToValue("\"not enough escape chars\\u123\"", | 261 ASSERT_FALSE(JSONReader().JsonToValue("\"not enough escape chars\\u123\"", |
262 &root, false, false)); | 262 &root, false, false)); |
263 ASSERT_FALSE(root); | 263 ASSERT_FALSE(root); |
264 root = NULL; | 264 root = NULL; |
265 ASSERT_FALSE(JSONReader::JsonToValue("\"extra backslash at end of input\\\"", | 265 ASSERT_FALSE(JSONReader().JsonToValue("\"extra backslash at end of input\\\"", |
266 &root, false, false)); | 266 &root, false, false)); |
267 ASSERT_FALSE(root); | 267 ASSERT_FALSE(root); |
268 | 268 |
269 // Basic array | 269 // Basic array |
270 root = NULL; | 270 root = NULL; |
271 ASSERT_TRUE(JSONReader::Read("[true, false, null]", &root, false)); | 271 ASSERT_TRUE(JSONReader::Read("[true, false, null]", &root, false)); |
272 ASSERT_TRUE(root); | 272 ASSERT_TRUE(root); |
273 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); | 273 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); |
274 ListValue* list = static_cast<ListValue*>(root); | 274 ListValue* list = static_cast<ListValue*>(root); |
275 ASSERT_EQ(3U, list->GetSize()); | 275 ASSERT_EQ(3U, list->GetSize()); |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 not_evil.append("[]]"); | 471 not_evil.append("[]]"); |
472 ASSERT_TRUE(JSONReader::Read(not_evil, &root, false)); | 472 ASSERT_TRUE(JSONReader::Read(not_evil, &root, false)); |
473 ASSERT_TRUE(root); | 473 ASSERT_TRUE(root); |
474 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); | 474 ASSERT_TRUE(root->IsType(Value::TYPE_LIST)); |
475 list = static_cast<ListValue*>(root); | 475 list = static_cast<ListValue*>(root); |
476 ASSERT_EQ(5001U, list->GetSize()); | 476 ASSERT_EQ(5001U, list->GetSize()); |
477 delete root; | 477 delete root; |
478 | 478 |
479 // Test utf8 encoded input | 479 // Test utf8 encoded input |
480 root = NULL; | 480 root = NULL; |
481 ASSERT_TRUE(JSONReader::JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", &root, | 481 ASSERT_TRUE(JSONReader().JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", &root, |
482 false, false)); | 482 false, false)); |
483 ASSERT_TRUE(root); | 483 ASSERT_TRUE(root); |
484 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); | 484 ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
485 str_val.clear(); | 485 str_val.clear(); |
486 ASSERT_TRUE(root->GetAsString(&str_val)); | 486 ASSERT_TRUE(root->GetAsString(&str_val)); |
487 ASSERT_EQ(L"\x7f51\x9875", str_val); | 487 ASSERT_EQ(L"\x7f51\x9875", str_val); |
488 delete root; | 488 delete root; |
489 | 489 |
490 // Test invalid utf8 encoded input | 490 // Test invalid utf8 encoded input |
491 root = NULL; | 491 root = NULL; |
492 ASSERT_FALSE(JSONReader::JsonToValue("\"345\xb0\xa1\xb0\xa2\"", &root, | 492 ASSERT_FALSE(JSONReader().JsonToValue("\"345\xb0\xa1\xb0\xa2\"", &root, |
493 false, false)); | 493 false, false)); |
494 ASSERT_FALSE(JSONReader::JsonToValue("\"123\xc0\x81\"", &root, | 494 ASSERT_FALSE(JSONReader().JsonToValue("\"123\xc0\x81\"", &root, |
495 false, false)); | 495 false, false)); |
496 | 496 |
497 // Test invalid root objects. | 497 // Test invalid root objects. |
498 root = NULL; | 498 root = NULL; |
499 ASSERT_FALSE(JSONReader::Read("null", &root, false)); | 499 ASSERT_FALSE(JSONReader::Read("null", &root, false)); |
500 ASSERT_FALSE(JSONReader::Read("true", &root, false)); | 500 ASSERT_FALSE(JSONReader::Read("true", &root, false)); |
501 ASSERT_FALSE(JSONReader::Read("10", &root, false)); | 501 ASSERT_FALSE(JSONReader::Read("10", &root, false)); |
502 ASSERT_FALSE(JSONReader::Read("\"root\"", &root, false)); | 502 ASSERT_FALSE(JSONReader::Read("\"root\"", &root, false)); |
503 } | 503 } |
| 504 |
| 505 TEST(JSONReaderTest, ErrorMessages) { |
| 506 // Error strings should not be modified in case of success. |
| 507 std::string error_message; |
| 508 Value* root = NULL; |
| 509 ASSERT_TRUE(JSONReader::ReadAndReturnError("[42]", &root, false, |
| 510 &error_message)); |
| 511 ASSERT_TRUE(error_message.empty()); |
| 512 |
| 513 // Test line and column counting |
| 514 const char* big_json = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]"; |
| 515 // error here --------------------------------^ |
| 516 ASSERT_FALSE(JSONReader::ReadAndReturnError(big_json, &root, false, |
| 517 &error_message)); |
| 518 ASSERT_EQ(JSONReader::FormatErrorMessage(5, 9, JSONReader::kSyntaxError), |
| 519 error_message); |
| 520 |
| 521 // Test each of the error conditions |
| 522 ASSERT_FALSE(JSONReader::ReadAndReturnError("{},{}", &root, false, |
| 523 &error_message)); |
| 524 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 3, |
| 525 JSONReader::kUnexpectedDataAfterRoot), error_message); |
| 526 |
| 527 std::string nested_json; |
| 528 for (int i = 0; i < 101; ++i) { |
| 529 nested_json.insert(nested_json.begin(), '['); |
| 530 nested_json.append(1, ']'); |
| 531 } |
| 532 ASSERT_FALSE(JSONReader::ReadAndReturnError(nested_json, &root, false, |
| 533 &error_message)); |
| 534 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 101, JSONReader::kTooMuchNesting), |
| 535 error_message); |
| 536 |
| 537 ASSERT_FALSE(JSONReader::ReadAndReturnError("42", &root, false, |
| 538 &error_message)); |
| 539 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 1, |
| 540 JSONReader::kBadRootElementType), error_message); |
| 541 |
| 542 ASSERT_FALSE(JSONReader::ReadAndReturnError("[1,]", &root, false, |
| 543 &error_message)); |
| 544 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 4, JSONReader::kTrailingComma), |
| 545 error_message); |
| 546 |
| 547 ASSERT_FALSE(JSONReader::ReadAndReturnError("{foo:\"bar\"}", &root, false, |
| 548 &error_message)); |
| 549 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 2, |
| 550 JSONReader::kUnquotedDictionaryKey), error_message); |
| 551 |
| 552 ASSERT_FALSE(JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", &root, |
| 553 false, &error_message)); |
| 554 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 14, JSONReader::kTrailingComma), |
| 555 error_message); |
| 556 |
| 557 ASSERT_FALSE(JSONReader::ReadAndReturnError("[nu]", &root, false, |
| 558 &error_message)); |
| 559 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 2, JSONReader::kSyntaxError), |
| 560 error_message); |
| 561 |
| 562 ASSERT_FALSE(JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", &root, false, |
| 563 &error_message)); |
| 564 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
| 565 error_message); |
| 566 |
| 567 ASSERT_FALSE(JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", &root, false, |
| 568 &error_message)); |
| 569 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
| 570 error_message); |
| 571 |
| 572 ASSERT_FALSE(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", &root, false, |
| 573 &error_message)); |
| 574 ASSERT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
| 575 error_message); |
| 576 } |
OLD | NEW |