1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/json/json_reader.h"
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_piece.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/values.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "build/build_config.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(JSONReaderTest, Reading) {
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // some whitespace checking
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_ptr<Value> root;
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("   null   ", false, false));
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_NULL));
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid JSON string
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("nu", false, false));
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Simple bool
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("true  ", false, false));
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_BOOLEAN));
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Embedded comment
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("/* comment */null", false, false));
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_NULL));
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("40 /* comment */", false, false));
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER));
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("true // comment", false, false));
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_BOOLEAN));
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("/* comment */\"sample string\"",
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false, false));
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_STRING));
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string value;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->GetAsString(&value));
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ("sample string", value);
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test number formats
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("43", false, false));
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER));
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int int_val = 0;
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->GetAsInteger(&int_val));
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(43, int_val);
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // According to RFC4627, oct, hex, and leading zeros are invalid JSON.
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("043", false, false));
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("0x43", false, false));
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("00", false, false));
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test 0 (which needs to be special cased because of the leading zero
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // clause).
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("0", false, false));
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER));
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int_val = 1;
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->GetAsInteger(&int_val));
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(0, int_val);
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Numbers that overflow ints should succeed, being internally promoted to
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // storage as doubles
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("2147483648", false, false));
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double double_val;
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE));
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->GetAsDouble(&double_val));
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(2147483648.0, double_val);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("-2147483649", false, false));
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE));
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->GetAsDouble(&double_val));
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(-2147483649.0, double_val);
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Parse a double
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("43.1", false, false));
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE));
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->GetAsDouble(&double_val));
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(43.1, double_val);
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("4.3e-1", false, false));
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE));
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->GetAsDouble(&double_val));
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(.43, double_val);
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("2.1e0", false, false));
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE));
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->GetAsDouble(&double_val));
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(2.1, double_val);
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("2.1e+0001", false, false));
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE));
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->GetAsDouble(&double_val));
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(21.0, double_val);
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("0.01", false, false));
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE));
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->GetAsDouble(&double_val));
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(0.01, double_val);
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("1.00", false, false));
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->IsType(Value::TYPE_DOUBLE));
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(root->GetAsDouble(&double_val));
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(1.0, double_val);
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Fractional parts must have a digit before and after the decimal point.
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("1.", false, false));
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue(".1", false, false));
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("1.e10", false, false));
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Exponent must have a digit following the 'e'.
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("1e", false, false));
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("1E", false, false));
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("1e1.", false, false));
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("1e1.0", false, false));
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // INF/-INF/NaN are not valid
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("1e1000", false, false));
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("-1e1000", false, false));
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("NaN", false, false));
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("nan", false, false));
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("inf", false, false));
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid number formats
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("4.3.1", false, false));
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("4e3.1", false, false));
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test string parser
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"hello world\"", false, false));
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_STRING));
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string str_val;
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->GetAsString(&str_val));
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ("hello world", str_val);
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Empty string
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"\"", false, false));
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_STRING));
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  str_val.clear();
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->GetAsString(&str_val));
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ("", str_val);
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test basic string escapes
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"",
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false, false));
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_STRING));
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  str_val.clear();
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->GetAsString(&str_val));
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(" \"\\/\b\f\n\r\t\v", str_val);
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test hex and unicode escapes including the null character.
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"\\x41\\x00\\u1234\"", false,
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false));
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_STRING));
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  str_val.clear();
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->GetAsString(&str_val));
2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(std::wstring(L"A\0\x1234", 3), UTF8ToWide(str_val));
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test invalid strings
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"no closing quote", false, false));
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"\\z invalid escape char\"", false,
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false));
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"\\xAQ invalid hex code\"", false,
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false));
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("not enough hex chars\\x1\"", false,
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false));
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"not enough escape chars\\u123\"",
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false, false));
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"extra backslash at end of input\\\"",
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false, false));
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Basic array
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[true, false, null]", false));
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_LIST));
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ListValue* list = static_cast<ListValue*>(root.get());
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(3U, list->GetSize());
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test with trailing comma.  Should be parsed the same as above.
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_ptr<Value> root2;
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root2.reset(JSONReader::Read("[true, false, null, ]", true));
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(root->Equals(root2.get()));
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Empty array
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[]", false));
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_LIST));
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list = static_cast<ListValue*>(root.get());
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(0U, list->GetSize());
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Nested arrays
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null]",
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              false));
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_LIST));
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list = static_cast<ListValue*>(root.get());
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(4U, list->GetSize());
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Lots of trailing commas.
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root2.reset(JSONReader::Read("[[true], [], [false, [], [null, ]  , ], null,]",
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                               true));
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(root->Equals(root2.get()));
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, missing close brace.
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[[true], [], [false, [], [null]], null", false));
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, too many commas
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[true,, null]", false));
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[true,, null]", true));
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, no commas
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[true null]", false));
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, trailing comma
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[true,]", false));
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Valid if we set |allow_trailing_comma| to true.
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[true,]", true));
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_LIST));
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list = static_cast<ListValue*>(root.get());
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1U, list->GetSize());
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Value* tmp_value = NULL;
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(list->Get(0, &tmp_value));
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(tmp_value->IsType(Value::TYPE_BOOLEAN));
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool bool_value = false;
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(tmp_value->GetAsBoolean(&bool_value));
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(bool_value);
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Don't allow empty elements, even if |allow_trailing_comma| is
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // true.
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[,]", true));
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[true,,]", true));
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[,true,]", true));
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("[true,,false]", true));
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test objects
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{}", false));
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY));
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read(
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }", false));
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY));
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DictionaryValue* dict_val = static_cast<DictionaryValue*>(root.get());
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  double_val = 0.0;
30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(dict_val->GetDouble("number", &double_val));
30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_DOUBLE_EQ(9.87654321, double_val);
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Value* null_val = NULL;
3103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(dict_val->Get("null", &null_val));
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(null_val->IsType(Value::TYPE_NULL));
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  str_val.clear();
3133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(dict_val->GetString("S", &str_val));
3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ("str", str_val);
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root2.reset(JSONReader::Read(
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }", true));
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root2.get());
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(root->Equals(root2.get()));
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test newline equivalence.
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root2.reset(JSONReader::Read(
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "{\n"
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "  \"number\":9.87654321,\n"
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "  \"null\":null,\n"
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "  \"\\x53\":\"str\",\n"
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "}\n", true));
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root2.get());
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(root->Equals(root2.get()));
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root2.reset(JSONReader::Read(
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "{\r\n"
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "  \"number\":9.87654321,\r\n"
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "  \"null\":null,\r\n"
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "  \"\\x53\":\"str\",\r\n"
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "}\r\n", true));
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root2.get());
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(root->Equals(root2.get()));
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test nesting
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read(
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}", false));
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY));
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  dict_val = static_cast<DictionaryValue*>(root.get());
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DictionaryValue* inner_dict = NULL;
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict));
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ListValue* inner_array = NULL;
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(inner_dict->GetList("array", &inner_array));
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(1U, inner_array->GetSize());
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool_value = true;
3523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(dict_val->GetBoolean("false", &bool_value));
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(bool_value);
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  inner_dict = NULL;
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(dict_val->GetDictionary("d", &inner_dict));
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root2.reset(JSONReader::Read(
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}", true));
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(root->Equals(root2.get()));
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test keys with periods
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read(
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      "{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}", false));
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY));
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  dict_val = static_cast<DictionaryValue*>(root.get());
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int integer_value = 0;
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value));
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(3, integer_value);
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value));
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, integer_value);
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  inner_dict = NULL;
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(dict_val->GetDictionaryWithoutPathExpansion("d.e.f",
374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                          &inner_dict));
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(1U, inner_dict->size());
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j",
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                         &integer_value));
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, integer_value);
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}", false));
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY));
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  dict_val = static_cast<DictionaryValue*>(root.get());
3843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value));
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, integer_value);
3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value));
387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, integer_value);
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, no closing brace
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{\"a\": true", false));
391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, keys must be quoted
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{foo:true}", false));
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, trailing comma
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{\"a\":true,}", false));
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, too many commas
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", false));
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", true));
405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, no separator
408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{\"a\" \"b\"}", false));
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Invalid, lone comma.
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{,}", false));
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{,}", true));
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{\"a\":true,,}", true));
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{,\"a\":true}", true));
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("{\"a\":true,,\"b\":false}", true));
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test stack overflow
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string evil(1000000, '[');
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  evil.append(std::string(1000000, ']'));
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read(evil, false));
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // A few thousand adjacent lists is fine.
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string not_evil("[");
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  not_evil.reserve(15010);
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 5000; ++i) {
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    not_evil.append("[],");
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  not_evil.append("[]]");
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read(not_evil, false));
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_LIST));
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  list = static_cast<ListValue*>(root.get());
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(5001U, list->GetSize());
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test utf8 encoded input
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"",
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false, false));
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root.get());
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->IsType(Value::TYPE_STRING));
447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  str_val.clear();
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(root->GetAsString(&str_val));
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val));
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test invalid utf8 encoded input
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"345\xb0\xa1\xb0\xa2\"",
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false, false));
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader().JsonToValue("\"123\xc0\x81\"",
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      false, false));
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test invalid root objects.
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("null", false));
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("true", false));
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("10", false));
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::Read("\"root\"", false));
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(root.get());
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(JSONReaderTest, ErrorMessages) {
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Error strings should not be modified in case of success.
472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string error_message;
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int error_code = 0;
474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_ptr<Value> root;
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  root.reset(JSONReader::ReadAndReturnError("[42]", false,
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(error_message.empty());
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, error_code);
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test line and column counting
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* big_json = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]";
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // error here --------------------------------^
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  root.reset(JSONReader::ReadAndReturnError(big_json, false,
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(5, 9, JSONReader::kSyntaxError),
487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            error_message);
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code);
489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test each of the error conditions
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  root.reset(JSONReader::ReadAndReturnError("{},{}", false,
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 3,
495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      JSONReader::kUnexpectedDataAfterRoot), error_message);
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, error_code);
497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string nested_json;
499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 101; ++i) {
500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    nested_json.insert(nested_json.begin(), '[');
501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    nested_json.append(1, ']');
502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::ReadAndReturnError(nested_json, false,
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 101, JSONReader::kTooMuchNesting),
507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            error_message);
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_TOO_MUCH_NESTING, error_code);
509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  root.reset(JSONReader::ReadAndReturnError("42", false,
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 1,
514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      JSONReader::kBadRootElementType), error_message);
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_BAD_ROOT_ELEMENT_TYPE, error_code);
516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  root.reset(JSONReader::ReadAndReturnError("[1,]", false,
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 4, JSONReader::kTrailingComma),
521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            error_message);
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code);
523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::ReadAndReturnError("{foo:\"bar\"}", false,
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 2,
528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      JSONReader::kUnquotedDictionaryKey), error_message);
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, error_code);
530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", false,
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 14, JSONReader::kTrailingComma),
535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            error_message);
536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  root.reset(JSONReader::ReadAndReturnError("[nu]", false,
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 2, JSONReader::kSyntaxError),
541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            error_message);
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code);
543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", false,
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            error_message);
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", false,
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            error_message);
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  root.reset(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", false,
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &error_code, &error_message));
560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(root.get());
561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            error_message);
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
567