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