Index: base/json_reader_unittest.cc |
=================================================================== |
--- base/json_reader_unittest.cc (revision 6390) |
+++ base/json_reader_unittest.cc (working copy) |
@@ -10,26 +10,26 @@ |
TEST(JSONReaderTest, Reading) { |
// some whitespace checking |
Value* root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue(" null ", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue(" null ", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_NULL)); |
delete root; |
// Invalid JSON string |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("nu", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("nu", &root, false, false)); |
ASSERT_FALSE(root); |
// Simple bool |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("true ", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("true ", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_BOOLEAN)); |
delete root; |
// Test number formats |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("43", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("43", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
int int_val = 0; |
@@ -39,19 +39,19 @@ |
// According to RFC4627, oct, hex, and leading zeros are invalid JSON. |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("043", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("043", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("0x43", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("0x43", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("00", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("00", &root, false, false)); |
ASSERT_FALSE(root); |
// Test 0 (which needs to be special cased because of the leading zero |
// clause). |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("0", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("0", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_INTEGER)); |
int_val = 1; |
@@ -62,7 +62,7 @@ |
// Numbers that overflow ints should succeed, being internally promoted to |
// storage as doubles |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("2147483648", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("2147483648", &root, false, false)); |
ASSERT_TRUE(root); |
double real_val; |
#ifdef ARCH_CPU_32_BITS |
@@ -78,7 +78,7 @@ |
#endif |
delete root; |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("-2147483649", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("-2147483649", &root, false, false)); |
ASSERT_TRUE(root); |
#ifdef ARCH_CPU_32_BITS |
ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
@@ -95,7 +95,7 @@ |
// Parse a double |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("43.1", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("43.1", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
real_val = 0.0; |
@@ -104,7 +104,7 @@ |
delete root; |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("4.3e-1", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("4.3e-1", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
real_val = 0.0; |
@@ -113,7 +113,7 @@ |
delete root; |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("2.1e0", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("2.1e0", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
real_val = 0.0; |
@@ -122,7 +122,7 @@ |
delete root; |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("2.1e+0001", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("2.1e+0001", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
real_val = 0.0; |
@@ -131,7 +131,7 @@ |
delete root; |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("0.01", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("0.01", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
real_val = 0.0; |
@@ -140,7 +140,7 @@ |
delete root; |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("1.00", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("1.00", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_REAL)); |
real_val = 0.0; |
@@ -150,57 +150,57 @@ |
// Fractional parts must have a digit before and after the decimal point. |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("1.", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("1.", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue(".1", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue(".1", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("1.e10", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("1.e10", &root, false, false)); |
ASSERT_FALSE(root); |
// Exponent must have a digit following the 'e'. |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("1e", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("1e", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("1E", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("1E", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("1e1.", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("1e1.", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("1e1.0", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("1e1.0", &root, false, false)); |
ASSERT_FALSE(root); |
// INF/-INF/NaN are not valid |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("1e1000", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("1e1000", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("-1e1000", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("-1e1000", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("NaN", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("NaN", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("nan", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("nan", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("inf", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("inf", &root, false, false)); |
ASSERT_FALSE(root); |
// Invalid number formats |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("4.3.1", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("4.3.1", &root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("4e3.1", &root, false, false)); |
+ ASSERT_FALSE(JSONReader().JsonToValue("4e3.1", &root, false, false)); |
ASSERT_FALSE(root); |
// Test string parser |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("\"hello world\"", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("\"hello world\"", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
std::wstring str_val; |
@@ -210,7 +210,7 @@ |
// Empty string |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("\"\"", &root, false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("\"\"", &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
str_val.clear(); |
@@ -220,8 +220,8 @@ |
// Test basic string escapes |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"", &root, |
- false, false)); |
+ ASSERT_TRUE(JSONReader().JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"", |
+ &root, false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
str_val.clear(); |
@@ -231,7 +231,7 @@ |
// Test hex and unicode escapes including the null character. |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("\"\\x41\\x00\\u1234\"", &root, false, |
+ ASSERT_TRUE(JSONReader().JsonToValue("\"\\x41\\x00\\u1234\"", &root, false, |
false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
@@ -242,27 +242,27 @@ |
// Test invalid strings |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("\"no closing quote", &root, false, |
+ ASSERT_FALSE(JSONReader().JsonToValue("\"no closing quote", &root, false, |
false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("\"\\z invalid escape char\"", &root, |
+ ASSERT_FALSE(JSONReader().JsonToValue("\"\\z invalid escape char\"", &root, |
false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("\"\\xAQ invalid hex code\"", &root, |
+ ASSERT_FALSE(JSONReader().JsonToValue("\"\\xAQ invalid hex code\"", &root, |
false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("not enough hex chars\\x1\"", &root, |
+ ASSERT_FALSE(JSONReader().JsonToValue("not enough hex chars\\x1\"", &root, |
false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("\"not enough escape chars\\u123\"", |
+ ASSERT_FALSE(JSONReader().JsonToValue("\"not enough escape chars\\u123\"", |
&root, false, false)); |
ASSERT_FALSE(root); |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("\"extra backslash at end of input\\\"", |
+ ASSERT_FALSE(JSONReader().JsonToValue("\"extra backslash at end of input\\\"", |
&root, false, false)); |
ASSERT_FALSE(root); |
@@ -478,7 +478,7 @@ |
// Test utf8 encoded input |
root = NULL; |
- ASSERT_TRUE(JSONReader::JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", &root, |
+ ASSERT_TRUE(JSONReader().JsonToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"", &root, |
false, false)); |
ASSERT_TRUE(root); |
ASSERT_TRUE(root->IsType(Value::TYPE_STRING)); |
@@ -489,9 +489,9 @@ |
// Test invalid utf8 encoded input |
root = NULL; |
- ASSERT_FALSE(JSONReader::JsonToValue("\"345\xb0\xa1\xb0\xa2\"", &root, |
+ ASSERT_FALSE(JSONReader().JsonToValue("\"345\xb0\xa1\xb0\xa2\"", &root, |
false, false)); |
- ASSERT_FALSE(JSONReader::JsonToValue("\"123\xc0\x81\"", &root, |
+ ASSERT_FALSE(JSONReader().JsonToValue("\"123\xc0\x81\"", &root, |
false, false)); |
// Test invalid root objects. |
@@ -501,3 +501,76 @@ |
ASSERT_FALSE(JSONReader::Read("10", &root, false)); |
ASSERT_FALSE(JSONReader::Read("\"root\"", &root, false)); |
} |
+ |
+TEST(JSONReaderTest, ErrorMessages) { |
+ // Error strings should not be modified in case of success. |
+ std::string error_message; |
+ Value* root = NULL; |
+ ASSERT_TRUE(JSONReader::ReadAndReturnError("[42]", &root, false, |
+ &error_message)); |
+ ASSERT_TRUE(error_message.empty()); |
+ |
+ // Test line and column counting |
+ const char* big_json = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]"; |
+ // error here --------------------------------^ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError(big_json, &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(5, 9, JSONReader::kSyntaxError), |
+ error_message); |
+ |
+ // Test each of the error conditions |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("{},{}", &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 3, |
+ JSONReader::kUnexpectedDataAfterRoot), error_message); |
+ |
+ std::string nested_json; |
+ for (int i = 0; i < 101; ++i) { |
+ nested_json.insert(nested_json.begin(), '['); |
+ nested_json.append(1, ']'); |
+ } |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError(nested_json, &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 101, JSONReader::kTooMuchNesting), |
+ error_message); |
+ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("42", &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 1, |
+ JSONReader::kBadRootElementType), error_message); |
+ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("[1,]", &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 4, JSONReader::kTrailingComma), |
+ error_message); |
+ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("{foo:\"bar\"}", &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 2, |
+ JSONReader::kUnquotedDictionaryKey), error_message); |
+ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", &root, |
+ false, &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 14, JSONReader::kTrailingComma), |
+ error_message); |
+ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("[nu]", &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 2, JSONReader::kSyntaxError), |
+ error_message); |
+ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
+ error_message); |
+ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
+ error_message); |
+ |
+ ASSERT_FALSE(JSONReader::ReadAndReturnError("[\"xxx\\q\"]", &root, false, |
+ &error_message)); |
+ ASSERT_EQ(JSONReader::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape), |
+ error_message); |
+} |