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