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", ¬_checked)); 36 EXPECT_FALSE(json.GetStringValueForKey(std::string(), ¬_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(), ¬_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