| 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "base/json_reader.h" | 7 #include "base/json_reader.h" |
| 8 #include "base/json_writer.h" | 8 #include "base/json_writer.h" |
| 9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "base/values.h" | 11 #include "base/values.h" |
| 12 #include "chrome/common/chrome_paths.h" | 12 #include "chrome/common/chrome_paths.h" |
| 13 #include "chrome/common/json_value_serializer.h" | 13 #include "chrome/common/json_value_serializer.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 TEST(JSONValueSerializerTest, Roundtrip) { | 16 TEST(JSONValueSerializerTest, Roundtrip) { |
| 17 const std::string original_serialization = | 17 const std::string original_serialization = |
| 18 "{\"bool\":true,\"int\":42,\"list\":[1,2],\"null\":null,\"real\":3.14}"; | 18 "{\"bool\":true,\"int\":42,\"list\":[1,2],\"null\":null,\"real\":3.14}"; |
| 19 JSONStringValueSerializer serializer(original_serialization); | 19 JSONStringValueSerializer serializer(original_serialization); |
| 20 scoped_ptr<Value> root(serializer.Deserialize(NULL)); | 20 scoped_ptr<Value> root(serializer.Deserialize(NULL)); |
| 21 ASSERT_TRUE(root.get()); | 21 ASSERT_TRUE(root.get()); |
| 22 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 22 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 23 | 23 |
| 24 DictionaryValue* root_dict = static_cast<DictionaryValue*>(root.get()); | 24 DictionaryValue* root_dict = static_cast<DictionaryValue*>(root.get()); |
| 25 | 25 |
| 26 Value* null_value = NULL; | 26 Value* null_value = NULL; |
| 27 ASSERT_TRUE(root_dict->Get(L"null", &null_value)); | 27 ASSERT_TRUE(root_dict->Get(ASCIIToUTF16("null"), &null_value)); |
| 28 ASSERT_TRUE(null_value); | 28 ASSERT_TRUE(null_value); |
| 29 ASSERT_TRUE(null_value->IsType(Value::TYPE_NULL)); | 29 ASSERT_TRUE(null_value->IsType(Value::TYPE_NULL)); |
| 30 | 30 |
| 31 bool bool_value = false; | 31 bool bool_value = false; |
| 32 ASSERT_TRUE(root_dict->GetBoolean(L"bool", &bool_value)); | 32 ASSERT_TRUE(root_dict->GetBoolean(ASCIIToUTF16("bool"), &bool_value)); |
| 33 ASSERT_TRUE(bool_value); | 33 ASSERT_TRUE(bool_value); |
| 34 | 34 |
| 35 int int_value = 0; | 35 int int_value = 0; |
| 36 ASSERT_TRUE(root_dict->GetInteger(L"int", &int_value)); | 36 ASSERT_TRUE(root_dict->GetInteger(ASCIIToUTF16("int"), &int_value)); |
| 37 ASSERT_EQ(42, int_value); | 37 ASSERT_EQ(42, int_value); |
| 38 | 38 |
| 39 double real_value = 0.0; | 39 double real_value = 0.0; |
| 40 ASSERT_TRUE(root_dict->GetReal(L"real", &real_value)); | 40 ASSERT_TRUE(root_dict->GetReal(ASCIIToUTF16("real"), &real_value)); |
| 41 ASSERT_DOUBLE_EQ(3.14, real_value); | 41 ASSERT_DOUBLE_EQ(3.14, real_value); |
| 42 | 42 |
| 43 // We shouldn't be able to write using this serializer, since it was | 43 // We shouldn't be able to write using this serializer, since it was |
| 44 // initialized with a const string. | 44 // initialized with a const string. |
| 45 ASSERT_FALSE(serializer.Serialize(*root_dict)); | 45 ASSERT_FALSE(serializer.Serialize(*root_dict)); |
| 46 | 46 |
| 47 std::string test_serialization = ""; | 47 std::string test_serialization = ""; |
| 48 JSONStringValueSerializer mutable_serializer(&test_serialization); | 48 JSONStringValueSerializer mutable_serializer(&test_serialization); |
| 49 ASSERT_TRUE(mutable_serializer.Serialize(*root_dict)); | 49 ASSERT_TRUE(mutable_serializer.Serialize(*root_dict)); |
| 50 ASSERT_EQ(original_serialization, test_serialization); | 50 ASSERT_EQ(original_serialization, test_serialization); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 "\\xCC\\xCD\\xCE\\xCF\\xD0\\xD1\\xD2\\xD3\\xD4\\xD5\\xD6\\xD7\\xD8\\xD9" | 85 "\\xCC\\xCD\\xCE\\xCF\\xD0\\xD1\\xD2\\xD3\\xD4\\xD5\\xD6\\xD7\\xD8\\xD9" |
| 86 "\\xDA\\xDB\\xDC\\xDD\\xDE\\xDF\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7" | 86 "\\xDA\\xDB\\xDC\\xDD\\xDE\\xDF\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7" |
| 87 "\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5" | 87 "\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5" |
| 88 "\\xF6\\xF7\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF"; | 88 "\\xF6\\xF7\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF"; |
| 89 | 89 |
| 90 std::string expected_output = "{\"all_chars\":\"" + all_chars_expected + | 90 std::string expected_output = "{\"all_chars\":\"" + all_chars_expected + |
| 91 "\"}"; | 91 "\"}"; |
| 92 // Test JSONWriter interface | 92 // Test JSONWriter interface |
| 93 std::string output_js; | 93 std::string output_js; |
| 94 DictionaryValue valueRoot; | 94 DictionaryValue valueRoot; |
| 95 valueRoot.SetString(L"all_chars", all_chars); | 95 valueRoot.SetString(ASCIIToUTF16("all_chars"), WideToUTF16Hack(all_chars)); |
| 96 JSONWriter::Write(&valueRoot, false, &output_js); | 96 JSONWriter::Write(&valueRoot, false, &output_js); |
| 97 ASSERT_EQ(expected_output, output_js); | 97 ASSERT_EQ(expected_output, output_js); |
| 98 | 98 |
| 99 // Test JSONValueSerializer interface (uses JSONWriter). | 99 // Test JSONValueSerializer interface (uses JSONWriter). |
| 100 JSONStringValueSerializer serializer(&output_js); | 100 JSONStringValueSerializer serializer(&output_js); |
| 101 ASSERT_TRUE(serializer.Serialize(valueRoot)); | 101 ASSERT_TRUE(serializer.Serialize(valueRoot)); |
| 102 ASSERT_EQ(expected_output, output_js); | 102 ASSERT_EQ(expected_output, output_js); |
| 103 } | 103 } |
| 104 | 104 |
| 105 TEST(JSONValueSerializerTest, UnicodeStrings) { | 105 TEST(JSONValueSerializerTest, UnicodeStrings) { |
| 106 // unicode string json -> escaped ascii text | 106 // unicode string json -> escaped ascii text |
| 107 DictionaryValue root; | 107 DictionaryValue root; |
| 108 std::wstring test(L"\x7F51\x9875"); | 108 std::wstring test(L"\x7F51\x9875"); |
| 109 root.SetString(L"web", test); | 109 root.SetString(ASCIIToUTF16("web"), WideToUTF16Hack(test)); |
| 110 | 110 |
| 111 std::string expected = "{\"web\":\"\\u7F51\\u9875\"}"; | 111 std::string expected = "{\"web\":\"\\u7F51\\u9875\"}"; |
| 112 | 112 |
| 113 std::string actual; | 113 std::string actual; |
| 114 JSONStringValueSerializer serializer(&actual); | 114 JSONStringValueSerializer serializer(&actual); |
| 115 ASSERT_TRUE(serializer.Serialize(root)); | 115 ASSERT_TRUE(serializer.Serialize(root)); |
| 116 ASSERT_EQ(expected, actual); | 116 ASSERT_EQ(expected, actual); |
| 117 | 117 |
| 118 // escaped ascii text -> json | 118 // escaped ascii text -> json |
| 119 JSONStringValueSerializer deserializer(expected); | 119 JSONStringValueSerializer deserializer(expected); |
| 120 scoped_ptr<Value> deserial_root(deserializer.Deserialize(NULL)); | 120 scoped_ptr<Value> deserial_root(deserializer.Deserialize(NULL)); |
| 121 ASSERT_TRUE(deserial_root.get()); | 121 ASSERT_TRUE(deserial_root.get()); |
| 122 DictionaryValue* dict_root = | 122 DictionaryValue* dict_root = |
| 123 static_cast<DictionaryValue*>(deserial_root.get()); | 123 static_cast<DictionaryValue*>(deserial_root.get()); |
| 124 std::wstring web_value; | 124 string16 web_value; |
| 125 ASSERT_TRUE(dict_root->GetString(L"web", &web_value)); | 125 ASSERT_TRUE(dict_root->GetString(ASCIIToUTF16("web"), &web_value)); |
| 126 ASSERT_EQ(test, web_value); | 126 ASSERT_EQ(test, UTF16ToWideHack(web_value)); |
| 127 } | 127 } |
| 128 | 128 |
| 129 TEST(JSONValueSerializerTest, HexStrings) { | 129 TEST(JSONValueSerializerTest, HexStrings) { |
| 130 // hex string json -> escaped ascii text | 130 // hex string json -> escaped ascii text |
| 131 DictionaryValue root; | 131 DictionaryValue root; |
| 132 std::wstring test(L"\x01\x02"); | 132 std::wstring test(L"\x01\x02"); |
| 133 root.SetString(L"test", test); | 133 root.SetString(ASCIIToUTF16("test"), WideToUTF16Hack(test)); |
| 134 | 134 |
| 135 std::string expected = "{\"test\":\"\\x01\\x02\"}"; | 135 std::string expected = "{\"test\":\"\\x01\\x02\"}"; |
| 136 | 136 |
| 137 std::string actual; | 137 std::string actual; |
| 138 JSONStringValueSerializer serializer(&actual); | 138 JSONStringValueSerializer serializer(&actual); |
| 139 ASSERT_TRUE(serializer.Serialize(root)); | 139 ASSERT_TRUE(serializer.Serialize(root)); |
| 140 ASSERT_EQ(expected, actual); | 140 ASSERT_EQ(expected, actual); |
| 141 | 141 |
| 142 // escaped ascii text -> json | 142 // escaped ascii text -> json |
| 143 JSONStringValueSerializer deserializer(expected); | 143 JSONStringValueSerializer deserializer(expected); |
| 144 scoped_ptr<Value> deserial_root(deserializer.Deserialize(NULL)); | 144 scoped_ptr<Value> deserial_root(deserializer.Deserialize(NULL)); |
| 145 ASSERT_TRUE(deserial_root.get()); | 145 ASSERT_TRUE(deserial_root.get()); |
| 146 DictionaryValue* dict_root = | 146 DictionaryValue* dict_root = |
| 147 static_cast<DictionaryValue*>(deserial_root.get()); | 147 static_cast<DictionaryValue*>(deserial_root.get()); |
| 148 std::wstring test_value; | 148 string16 test_value; |
| 149 ASSERT_TRUE(dict_root->GetString(L"test", &test_value)); | 149 ASSERT_TRUE(dict_root->GetString(ASCIIToUTF16("test"), &test_value)); |
| 150 ASSERT_EQ(test, test_value); | 150 ASSERT_EQ(test, UTF16ToWideHack(test_value)); |
| 151 | 151 |
| 152 // Test converting escaped regular chars | 152 // Test converting escaped regular chars |
| 153 std::string escaped_chars = "{\"test\":\"\\x67\\x6f\"}"; | 153 std::string escaped_chars = "{\"test\":\"\\x67\\x6f\"}"; |
| 154 JSONStringValueSerializer deserializer2(escaped_chars); | 154 JSONStringValueSerializer deserializer2(escaped_chars); |
| 155 deserial_root.reset(deserializer2.Deserialize(NULL)); | 155 deserial_root.reset(deserializer2.Deserialize(NULL)); |
| 156 ASSERT_TRUE(deserial_root.get()); | 156 ASSERT_TRUE(deserial_root.get()); |
| 157 dict_root = static_cast<DictionaryValue*>(deserial_root.get()); | 157 dict_root = static_cast<DictionaryValue*>(deserial_root.get()); |
| 158 ASSERT_TRUE(dict_root->GetString(L"test", &test_value)); | 158 ASSERT_TRUE(dict_root->GetString(ASCIIToUTF16("test"), &test_value)); |
| 159 ASSERT_EQ(std::wstring(L"go"), test_value); | 159 ASSERT_EQ(L"go", UTF16ToWideHack(test_value)); |
| 160 } | 160 } |
| 161 | 161 |
| 162 TEST(JSONValueSerializerTest, AllowTrailingComma) { | 162 TEST(JSONValueSerializerTest, AllowTrailingComma) { |
| 163 scoped_ptr<Value> root; | 163 scoped_ptr<Value> root; |
| 164 scoped_ptr<Value> root_expected; | 164 scoped_ptr<Value> root_expected; |
| 165 std::string test_with_commas("{\"key\": [true,],}"); | 165 std::string test_with_commas("{\"key\": [true,],}"); |
| 166 std::string test_no_commas("{\"key\": [true]}"); | 166 std::string test_no_commas("{\"key\": [true]}"); |
| 167 | 167 |
| 168 JSONStringValueSerializer serializer(test_with_commas); | 168 JSONStringValueSerializer serializer(test_with_commas); |
| 169 serializer.set_allow_trailing_comma(true); | 169 serializer.set_allow_trailing_comma(true); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 JSONFileValueSerializer deserializer(original_file_path); | 253 JSONFileValueSerializer deserializer(original_file_path); |
| 254 scoped_ptr<Value> root; | 254 scoped_ptr<Value> root; |
| 255 root.reset(deserializer.Deserialize(NULL)); | 255 root.reset(deserializer.Deserialize(NULL)); |
| 256 | 256 |
| 257 ASSERT_TRUE(root.get()); | 257 ASSERT_TRUE(root.get()); |
| 258 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); | 258 ASSERT_TRUE(root->IsType(Value::TYPE_DICTIONARY)); |
| 259 | 259 |
| 260 DictionaryValue* root_dict = static_cast<DictionaryValue*>(root.get()); | 260 DictionaryValue* root_dict = static_cast<DictionaryValue*>(root.get()); |
| 261 | 261 |
| 262 Value* null_value = NULL; | 262 Value* null_value = NULL; |
| 263 ASSERT_TRUE(root_dict->Get(L"null", &null_value)); | 263 ASSERT_TRUE(root_dict->Get(ASCIIToUTF16("null"), &null_value)); |
| 264 ASSERT_TRUE(null_value); | 264 ASSERT_TRUE(null_value); |
| 265 ASSERT_TRUE(null_value->IsType(Value::TYPE_NULL)); | 265 ASSERT_TRUE(null_value->IsType(Value::TYPE_NULL)); |
| 266 | 266 |
| 267 bool bool_value = false; | 267 bool bool_value = false; |
| 268 ASSERT_TRUE(root_dict->GetBoolean(L"bool", &bool_value)); | 268 ASSERT_TRUE(root_dict->GetBoolean(ASCIIToUTF16("bool"), &bool_value)); |
| 269 ASSERT_TRUE(bool_value); | 269 ASSERT_TRUE(bool_value); |
| 270 | 270 |
| 271 int int_value = 0; | 271 int int_value = 0; |
| 272 ASSERT_TRUE(root_dict->GetInteger(L"int", &int_value)); | 272 ASSERT_TRUE(root_dict->GetInteger(ASCIIToUTF16("int"), &int_value)); |
| 273 ASSERT_EQ(42, int_value); | 273 ASSERT_EQ(42, int_value); |
| 274 | 274 |
| 275 std::wstring string_value; | 275 string16 string_value; |
| 276 ASSERT_TRUE(root_dict->GetString(L"string", &string_value)); | 276 ASSERT_TRUE(root_dict->GetString(ASCIIToUTF16("string"), &string_value)); |
| 277 ASSERT_EQ(L"hello", string_value); | 277 ASSERT_EQ(L"hello", UTF16ToWideHack(string_value)); |
| 278 | 278 |
| 279 // Now try writing. | 279 // Now try writing. |
| 280 std::wstring written_file_path = test_dir_; | 280 std::wstring written_file_path = test_dir_; |
| 281 file_util::AppendToPath(&written_file_path, L"test_output.js"); | 281 file_util::AppendToPath(&written_file_path, L"test_output.js"); |
| 282 | 282 |
| 283 ASSERT_FALSE(file_util::PathExists(written_file_path)); | 283 ASSERT_FALSE(file_util::PathExists(written_file_path)); |
| 284 JSONFileValueSerializer serializer(written_file_path); | 284 JSONFileValueSerializer serializer(written_file_path); |
| 285 ASSERT_TRUE(serializer.Serialize(*root)); | 285 ASSERT_TRUE(serializer.Serialize(*root)); |
| 286 ASSERT_TRUE(file_util::PathExists(written_file_path)); | 286 ASSERT_TRUE(file_util::PathExists(written_file_path)); |
| 287 | 287 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 std::wstring source_file_path; | 321 std::wstring source_file_path; |
| 322 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &source_file_path)); | 322 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &source_file_path)); |
| 323 file_util::AppendToPath(&source_file_path, | 323 file_util::AppendToPath(&source_file_path, |
| 324 L"serializer_test_nowhitespace.js"); | 324 L"serializer_test_nowhitespace.js"); |
| 325 ASSERT_TRUE(file_util::PathExists(source_file_path)); | 325 ASSERT_TRUE(file_util::PathExists(source_file_path)); |
| 326 JSONFileValueSerializer serializer(source_file_path); | 326 JSONFileValueSerializer serializer(source_file_path); |
| 327 scoped_ptr<Value> root; | 327 scoped_ptr<Value> root; |
| 328 root.reset(serializer.Deserialize(NULL)); | 328 root.reset(serializer.Deserialize(NULL)); |
| 329 ASSERT_TRUE(root.get()); | 329 ASSERT_TRUE(root.get()); |
| 330 } | 330 } |
| OLD | NEW |