13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 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 "base/json/json_writer.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/values.h" 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base { 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(JSONWriterTest, Writing) { 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test null 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Value* root = Value::CreateNullValue(); 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott std::string output_js; 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(root, false, &output_js); 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("null", output_js); 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete root; 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test empty dict 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott root = new DictionaryValue; 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(root, false, &output_js); 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("{}", output_js); 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete root; 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test empty list 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott root = new ListValue; 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(root, false, &output_js); 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("[]", output_js); 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete root; 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test Real values should always have a decimal or an 'e'. 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen root = Value::CreateDoubleValue(1.0); 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(root, false, &output_js); 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("1.0", output_js); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete root; 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test Real values in the the range (-1, 1) must have leading zeros 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen root = Value::CreateDoubleValue(0.2); 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(root, false, &output_js); 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("0.2", output_js); 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete root; 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test Real values in the the range (-1, 1) must have leading zeros 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen root = Value::CreateDoubleValue(-0.8); 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(root, false, &output_js); 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("-0.8", output_js); 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott delete root; 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Writer unittests like empty list/dict nesting, 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // list list nesting, etc. 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DictionaryValue root_dict; 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ListValue* list = new ListValue; 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick root_dict.Set("list", list); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DictionaryValue* inner_dict = new DictionaryValue; 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list->Append(inner_dict); 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick inner_dict->SetInteger("inner int", 10); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ListValue* inner_list = new ListValue; 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list->Append(inner_list); 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott list->Append(Value::CreateBooleanValue(true)); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test the pretty-printer. 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(&root_dict, false, &output_js); 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("{\"list\":[{\"inner int\":10},[],true]}", output_js); 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(&root_dict, true, &output_js); 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The pretty-printer uses a different newline style on Windows than on 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // other platforms. 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN) 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define JSON_NEWLINE "\r\n" 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#else 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define JSON_NEWLINE "\n" 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("{" JSON_NEWLINE 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " \"list\": [ {" JSON_NEWLINE 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " \"inner int\": 10" JSON_NEWLINE 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott " }, [ ], true ]" JSON_NEWLINE 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "}" JSON_NEWLINE, 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott output_js); 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#undef JSON_NEWLINE 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test keys with periods 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DictionaryValue period_dict; 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick period_dict.SetWithoutPathExpansion("a.b", Value::CreateIntegerValue(3)); 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick period_dict.SetWithoutPathExpansion("c", Value::CreateIntegerValue(2)); 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DictionaryValue* period_dict2 = new DictionaryValue; 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick period_dict2->SetWithoutPathExpansion("g.h.i.j", 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Value::CreateIntegerValue(1)); 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick period_dict.SetWithoutPathExpansion("d.e.f", period_dict2); 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(&period_dict, false, &output_js); 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}", output_js); 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott DictionaryValue period_dict3; 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick period_dict3.Set("a.b", Value::CreateIntegerValue(2)); 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick period_dict3.SetWithoutPathExpansion("a.b", Value::CreateIntegerValue(1)); 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott JSONWriter::Write(&period_dict3, false, &output_js); 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_EQ("{\"a\":{\"b\":2},\"a.b\":1}", output_js); 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace base 99