15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (C) 2013 Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Licensed under the Apache License, Version 2.0 (the "License");
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you may not use this file except in compliance with the License.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// You may obtain a copy of the License at
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://www.apache.org/licenses/LICENSE-2.0
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Unless required by applicable law or agreed to in writing, software
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distributed under the License is distributed on an "AS IS" BASIS,
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See the License for the specific language governing permissions and
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// limitations under the License.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/json.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <string>
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtest/gtest.h>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using i18n::addressinput::Json;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JsonTest, EmptyStringIsNotValid) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Json json;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(json.ParseObject(std::string()));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JsonTest, EmptyDictionaryContainsNoKeys) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Json json;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(json.ParseObject("{}"));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string not_checked;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(json.GetStringValueForKey("key", &not_checked));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(json.GetStringValueForKey(std::string(), &not_checked));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JsonTest, InvalidJsonIsNotValid) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Json json;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(json.ParseObject("{"));
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JsonTest, OneKeyIsValid) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Json json;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(json.ParseObject("{\"key\": \"value\"}"));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(json.GetStringValueForKey("key", &value));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value", value);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JsonTest, EmptyStringKeyIsNotInObject) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Json json;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(json.ParseObject("{\"key\": \"value\"}"));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string not_checked;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(json.GetStringValueForKey(std::string(), &not_checked));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JsonTest, EmptyKeyIsValid) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Json json;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(json.ParseObject("{\"\": \"value\"}"));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(json.GetStringValueForKey(std::string(), &value));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("value", value);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JsonTest, EmptyValueIsValid) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Json json;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(json.ParseObject("{\"key\": \"\"}"));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string value;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(json.GetStringValueForKey("key", &value));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(value.empty());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(JsonTest, Utf8EncodingIsValid) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  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