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