1// Copyright (C) 2013 Google Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "util/json.h"
16
17#include <string>
18#include <vector>
19
20#include <gtest/gtest.h>
21
22namespace {
23
24using i18n::addressinput::Json;
25
26TEST(JsonTest, EmptyStringIsNotValid) {
27  Json json;
28  EXPECT_FALSE(json.ParseObject(std::string()));
29}
30
31TEST(JsonTest, EmptyDictionaryContainsNoKeys) {
32  Json json;
33  ASSERT_TRUE(json.ParseObject("{}"));
34  std::string not_checked;
35  EXPECT_FALSE(json.GetStringValueForKey("key", &not_checked));
36  EXPECT_FALSE(json.GetStringValueForKey(std::string(), &not_checked));
37}
38
39TEST(JsonTest, InvalidJsonIsNotValid) {
40  Json json;
41  EXPECT_FALSE(json.ParseObject("{"));
42}
43
44TEST(JsonTest, OneKeyIsValid) {
45  Json json;
46  ASSERT_TRUE(json.ParseObject("{\"key\": \"value\"}"));
47  std::string value;
48  EXPECT_TRUE(json.GetStringValueForKey("key", &value));
49  EXPECT_EQ("value", value);
50}
51
52TEST(JsonTest, EmptyStringKeyIsNotInObject) {
53  Json json;
54  ASSERT_TRUE(json.ParseObject("{\"key\": \"value\"}"));
55  std::string not_checked;
56  EXPECT_FALSE(json.GetStringValueForKey(std::string(), &not_checked));
57}
58
59TEST(JsonTest, EmptyKeyIsValid) {
60  Json json;
61  ASSERT_TRUE(json.ParseObject("{\"\": \"value\"}"));
62  std::string value;
63  EXPECT_TRUE(json.GetStringValueForKey(std::string(), &value));
64  EXPECT_EQ("value", value);
65}
66
67TEST(JsonTest, EmptyValueIsValid) {
68  Json json;
69  ASSERT_TRUE(json.ParseObject("{\"key\": \"\"}"));
70  std::string value;
71  EXPECT_TRUE(json.GetStringValueForKey("key", &value));
72  EXPECT_TRUE(value.empty());
73}
74
75TEST(JsonTest, Utf8EncodingIsValid) {
76  Json json;
77  ASSERT_TRUE(json.ParseObject("{\"key\": \"\xC3\x9C\"}"));  /* "Ü" */
78  std::string value;
79  EXPECT_TRUE(json.GetStringValueForKey("key", &value));
80  EXPECT_EQ("\xC3\x9C", value);  /* "Ü" */
81}
82
83TEST(JsonTest, InvalidUtf8IsNotValid) {
84  Json json;
85  EXPECT_FALSE(json.ParseObject("{\"key\": \"\xC3\x28\"}"));
86}
87
88TEST(JsonTest, NullInMiddleIsNotValid) {
89  Json json;
90  static const char kJson[] = "{\"key\": \"val\0ue\"}";
91  EXPECT_FALSE(json.ParseObject(std::string(kJson, sizeof kJson - 1)));
92}
93
94TEST(JsonTest, TwoKeysAreValid) {
95  Json json;
96  ASSERT_TRUE(json.ParseObject("{\"key1\": \"value1\", \"key2\": \"value2\"}"));
97  std::string value;
98  EXPECT_TRUE(json.GetStringValueForKey("key1", &value));
99  EXPECT_EQ("value1", value);
100
101  EXPECT_TRUE(json.GetStringValueForKey("key2", &value));
102  EXPECT_EQ("value2", value);
103}
104
105TEST(JsonTest, ListIsNotValid) {
106  Json json;
107  EXPECT_FALSE(json.ParseObject("[]"));
108}
109
110TEST(JsonTest, StringIsNotValid) {
111  Json json;
112  EXPECT_FALSE(json.ParseObject("\"value\""));
113}
114
115TEST(JsonTest, NumberIsNotValid) {
116  Json json;
117  EXPECT_FALSE(json.ParseObject("3"));
118}
119
120TEST(JsonTest, NoDictionaryFound) {
121  Json json;
122  ASSERT_TRUE(json.ParseObject("{\"key\":\"value\"}"));
123  EXPECT_TRUE(json.GetSubDictionaries().empty());
124}
125
126TEST(JsonTest, DictionaryFound) {
127  Json json;
128  ASSERT_TRUE(json.ParseObject("{\"key\":{\"inner_key\":\"value\"}}"));
129  const std::vector<const Json*>& sub_dicts = json.GetSubDictionaries();
130  ASSERT_EQ(1U, sub_dicts.size());
131
132  std::string value;
133  EXPECT_TRUE(sub_dicts.front()->GetStringValueForKey("inner_key", &value));
134  EXPECT_EQ("value", value);
135}
136
137TEST(JsonTest, DictionariesHaveSubDictionaries) {
138  Json json;
139  ASSERT_TRUE(json.ParseObject(
140      "{\"key\":{\"inner_key\":{\"inner_inner_key\":\"value\"}}}"));
141  const std::vector<const Json*>& sub_dicts = json.GetSubDictionaries();
142  ASSERT_EQ(1U, sub_dicts.size());
143
144  const std::vector<const Json*>& sub_sub_dicts =
145      sub_dicts.front()->GetSubDictionaries();
146  ASSERT_EQ(1U, sub_sub_dicts.size());
147
148  std::string value;
149  EXPECT_TRUE(
150      sub_sub_dicts.front()->GetStringValueForKey("inner_inner_key", &value));
151  EXPECT_EQ("value", value);
152}
153
154}  // namespace
155