| 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 |