16e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// Copyright (C) 2013 Google Inc. 26e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// 36e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// Licensed under the Apache License, Version 2.0 (the "License"); 46e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// you may not use this file except in compliance with the License. 56e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// You may obtain a copy of the License at 66e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// 76e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// http://www.apache.org/licenses/LICENSE-2.0 86e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// 96e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// Unless required by applicable law or agreed to in writing, software 106e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// distributed under the License is distributed on an "AS IS" BASIS, 116e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 126e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// See the License for the specific language governing permissions and 136e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com// limitations under the License. 146e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 156e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <libaddressinput/address_input_helper.h> 166e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 176e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <libaddressinput/address_data.h> 186e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <libaddressinput/callback.h> 196e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <libaddressinput/null_storage.h> 206e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <libaddressinput/preload_supplier.h> 216e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <libaddressinput/util/basictypes.h> 226e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <libaddressinput/util/scoped_ptr.h> 236e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 246e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <string> 25a135825cf2f13931bb067f0f11b6c66dd203e961roubert@google.com#include <utility> 266e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 276e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include <gtest/gtest.h> 286e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 296e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com#include "fake_downloader.h" 30a135825cf2f13931bb067f0f11b6c66dd203e961roubert@google.com#include "mock_downloader.h" 316e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 326e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comnamespace { 336e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 346e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comusing i18n::addressinput::AddressData; 356e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comusing i18n::addressinput::AddressInputHelper; 366e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comusing i18n::addressinput::BuildCallback; 376e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comusing i18n::addressinput::Callback; 386e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comusing i18n::addressinput::FakeDownloader; 39a135825cf2f13931bb067f0f11b6c66dd203e961roubert@google.comusing i18n::addressinput::MockDownloader; 406e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comusing i18n::addressinput::NullStorage; 416e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comusing i18n::addressinput::PreloadSupplier; 426e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comusing i18n::addressinput::scoped_ptr; 436e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 446e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comclass AddressInputHelperTest : public testing::Test { 456e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com protected: 466e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressInputHelperTest() 476e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Our PreloadSupplier loads all data for a country at a time. 486e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com : supplier_(FakeDownloader::kFakeAggregateDataUrl, 496e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com new FakeDownloader, 506e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com new NullStorage), 516e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address_input_helper_(&supplier_), 526e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com loaded_(BuildCallback(this, &AddressInputHelperTest::Loaded)) {} 536e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 546e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com ~AddressInputHelperTest() {} 556e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 566e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Helper method to test FillAddress that ensures the PreloadSupplier has the 576e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // necessary data preloaded. 586e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com void FillAddress(AddressData* address) { 596e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com const std::string& region_code = address->region_code; 606e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com if (!region_code.empty()) { 616e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com supplier_.LoadRules(region_code, *loaded_); 626e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com } 636e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address_input_helper_.FillAddress(address); 646e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com } 656e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 666e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com private: 676e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Used to preload data that we need. 688c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com void Loaded(bool success, const std::string&, int) { 696e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com ASSERT_TRUE(success); 706e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com } 716e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 726e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com PreloadSupplier supplier_; 736e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com const AddressInputHelper address_input_helper_; 746e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com const scoped_ptr<const PreloadSupplier::Callback> loaded_; 756e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com DISALLOW_COPY_AND_ASSIGN(AddressInputHelperTest); 766e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com}; 776e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 786e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithMissingPostalCode) { 796e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 806e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "CX"; 816e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.administrative_area = "WA"; 826e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 836e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // There is only one postal code for Christmas Island 846e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 856e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.postal_code = "6798"; 866e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 876e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 886e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 896e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 906e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingAdmin) { 916e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 926e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "US"; 936e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "58098"; 946e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Other data should be left alone. 956e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.address_line.push_back("10 High St"); 966e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 976e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // North Dakota has post codes starting with 58. 986e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 996e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "ND"; 1006e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 1016e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 1026e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1036e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.administrative_area = "CA"; // Override the admin area. 1046e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Now, since the admin area was already filled in, we don't fix it, even 1056e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // though it was correct. 1066e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "CA"; 1076e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 1086e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 1096e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 1106e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1116e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingLowerLevel) { 1126e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 1136e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "TW"; 1146e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "53012"; 1156e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1166e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* This matches 二水鄉 - Ershuei Township. */ 1176e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 1186e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* This locality is in 彰化縣 - Changhua County. */ 1196e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "\xE5\xBD\xB0\xE5\x8C\x96\xE7\xB8\xA3"; 1206e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.locality = "\xE4\xBA\x8C\xE6\xB0\xB4\xE9\x84\x89"; 1216e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 1226e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 1236e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1246e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Override the admin area. 1256e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.administrative_area = "Already filled in"; 1266e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "Already filled in"; 1276e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.locality = ""; 1286e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // However, the locality will still be filled in. 1296e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 1306e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 1316e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 1326e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1336e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingLowerLevelLatin) { 1346e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 1356e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "TW"; 1366e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "53012"; 1376e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.language_code = "zh-Latn"; 1386e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1396e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* This matches 二水鄉 - Ershuei Township. */ 1406e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 1416e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* This locality is in 彰化縣 - Changhua County. */ 1426e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.locality = "Ershuei Township"; 1436e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "Changhua County"; 1446e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 1456e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 1466e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1476e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Override the admin area. 1486e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.administrative_area = "Already filled in"; 1496e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "Already filled in"; 1506e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.locality = ""; 1516e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // However, the locality will still be filled in. 1526e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 1536e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 1546e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 1556e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1566e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingDependentLocality) { 1576e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 1586e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "KR"; 1596e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // This matches Danwon-gu district. 1606e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "425-111"; 1616e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1626e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 1636e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* The province is Gyeonggi - 경기도. */ 1646e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "\xEA\xB2\xBD\xEA\xB8\xB0\xEB\x8F\x84"; 1656e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* The city is Ansan-si - 안산시. */ 1666e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.locality = "\xEC\x95\x88\xEC\x82\xB0\xEC\x8B\x9C"; 1676e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* The district is Danwon-gu - 단원구 */ 1686e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.dependent_locality = "\xEB\x8B\xA8\xEC\x9B\x90\xEA\xB5\xAC"; 1696e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1706e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 1716e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 1726e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1736e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address_ko_latn; 1746e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address_ko_latn.region_code = "KR"; 1756e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address_ko_latn.postal_code = "425-111"; 1766e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address_ko_latn.language_code = "ko-latn"; 1776e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1786e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected = address_ko_latn; 1796e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* The province is Gyeonggi - 경기도. */ 1806e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "Gyeonggi"; 1816e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* The city is Ansan-si - 안산시. */ 1826e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.locality = "Ansan-si"; 1836e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* The district is Danwon-gu - 단원구 */ 1846e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.dependent_locality = "Danwon-gu"; 1856e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1866e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address_ko_latn); 1876e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address_ko_latn); 1886e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 1896e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1906e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithPostalCodeMatchingMultipleValues) { 1916e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 1926e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "KR"; 1936e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // This matches Wando-gun and Ganjin-gun, both in Jeonnam province. 1946e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "527-111"; 1956e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 1966e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 1976e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com /* The province, Jeonnam - 전라남도 - is known, but we have several locality 1986e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com * matches so none of them are populated. */ 1996e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = 2006e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\xEC\xA0\x84\xEB\x9D\xBC\xEB\x82\xA8\xEB\x8F\x84"; 2016e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 2026e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 2036e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 2046e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2056e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithInvalidPostalCode) { 2066e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 2076e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "970"; 2086e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "US"; 2096e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2106e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // We don't expect any changes, since the postal code couldn't be determined 2116e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // as valid. 2126e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 2136e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 2146e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 2156e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 2166e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2176e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithNoPostalCodeValidation) { 2186e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 2196e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "123"; 2206e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "GA"; 2216e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2226e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // We don't expect any changes, since the postal code couldn't be determined 2236e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // as valid - we have no information about postal codes in Gabon (or even that 2246e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // they are in use). 2256e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 2266e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 2276e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 2286e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 2296e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2306e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperTest, AddressWithInvalidOrMissingRegionCode) { 2316e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 2326e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "XXX"; 2336e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.administrative_area = "YYY"; 2346e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2356e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // We don't expect any changes, since there was no region code. 2366e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 2376e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 2386e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 2396e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2406e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "XXXX"; 2416e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.region_code = "XXXX"; 2426e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Again, nothing should change. 2436e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 2446e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 2456e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 2466e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2476e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comclass AddressInputHelperMockDataTest : public testing::Test { 2486e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com protected: 2496e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressInputHelperMockDataTest() 2506e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com : downloader_(new MockDownloader), 2516e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Our PreloadSupplier loads all data for a country at a time. 252a135825cf2f13931bb067f0f11b6c66dd203e961roubert@google.com supplier_(MockDownloader::kMockDataUrl, 2536e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com downloader_, 2546e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com new NullStorage), 2556e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address_input_helper_(&supplier_), 2566e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com loaded_(BuildCallback(this, &AddressInputHelperMockDataTest::Loaded)) {} 2576e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2586e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com ~AddressInputHelperMockDataTest() {} 2596e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2606e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Helper method to test FillAddress that ensures the PreloadSupplier has the 2616e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // necessary data preloaded. 2626e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com void FillAddress(AddressData* address) { 2636e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com const std::string& region_code = address->region_code; 2646e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com if (!region_code.empty()) { 2656e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com supplier_.LoadRules(region_code, *loaded_); 2666e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com } 2676e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address_input_helper_.FillAddress(address); 2686e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com } 2696e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2706e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com MockDownloader* const downloader_; 2716e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2726e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com private: 2736e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Our mock downloader we assume will always succeed. 2748c9b0e35847b85f4cc7434058e4e4ec5d5560c40roubert@google.com void Loaded(bool success, const std::string&, int) { 2756e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com ASSERT_TRUE(success); 2766e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com } 2776e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2786e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com PreloadSupplier supplier_; 2796e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com const AddressInputHelper address_input_helper_; 2806e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com const scoped_ptr<const PreloadSupplier::Callback> loaded_; 2816e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com DISALLOW_COPY_AND_ASSIGN(AddressInputHelperMockDataTest); 2826e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com}; 2836e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 2846e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperMockDataTest, 2856e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com PostalCodeSharedAcrossDifferentHierarchies) { 2866e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Note that this data is in the format of data that would be returned from 2876e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // the aggregate server. 2886e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com downloader_->data_.insert(std::make_pair( 2896e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // We use KR since we need a country where we format all fields down to 2906e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // dependent locality, or the hierarchy won't be loaded. 2916e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "data/KR", 2926e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"data/KR\": " 2936e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // The top-level ZIP expression must be present for sub-key matches to be 2946e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // evaluated. 2956e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR\", \"sub_keys\":\"A~B\", \"zip\":\"\\\\d{5}\"}, " 2966e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/A\": " 2976e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/A\", \"sub_keys\":\"A1\"}, " 2986e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/A/A1\": " 2996e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/A/A1\", \"zip\":\"1\"}, " 3006e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/B\": " 3016e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/B\", \"sub_keys\":\"B1\"}, " 3026e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/B/B1\": " 3036e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/B/B1\", \"zip\":\"12\"}}")); 3046e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 3056e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 3066e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "KR"; 3076e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "12345"; 3086e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.administrative_area = ""; 3096e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 3106e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 3116e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 3126e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Nothing should have changed, since the ZIP code matches both of the cities, 3136e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // and they aren't even in the same state. 3146e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 3156e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 3166e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 3176e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.comTEST_F(AddressInputHelperMockDataTest, 3186e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com PostalCodeSharedAcrossDifferentHierarchiesSameState) { 3196e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // Create data where one state matches the ZIP code, but the other doesn't: 3206e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // within the state which does, multiple cities and sub-cities match. The only 3216e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // thing we can be certain of is therefore the state. 3226e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com downloader_->data_.insert(std::make_pair( 3236e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // We use KR since we need a country where we format all fields down to 3246e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // dependent locality, or the hierarchy won't be loaded. 3256e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "data/KR", 3266e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"data/KR\": " 3276e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // The top-level ZIP expression must be present for sub-key matches to be 3286e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // evaluated. 3296e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR\", \"sub_keys\":\"A~B\", \"zip\":\"\\\\d\{5}\"}, " 3306e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/A\": " 3316e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/A\", \"sub_keys\":\"A1~A2\"}, " 3326e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/A/A1\": " 3336e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/A/A1\", \"sub_keys\":\"A1a\", \"zip\":\"1\"}, " 3346e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // This key matches the ZIP code. 3356e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/A/A1/A1a\": " 3366e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/A/A1/A1a\", \"zip\":\"12\"}, " 3376e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/A/A2\": " 3386e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/A/A2\", \"sub_keys\":\"A2a\", \"zip\":\"1\"}, " 3396e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // This key, also in state A, but in city A2, matches the ZIP code. 3406e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/A/A2/A2a\": " 3416e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/A/A2/A2a\", \"zip\":\"123\"}, " 3426e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // This key, in state B, does not match the ZIP code. 3436e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "\"data/KR/B\": " 3446e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com "{\"id\":\"data/KR/B\", \"zip\":\"2\"}}")); 3456e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 3466e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData address; 3476e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.region_code = "KR"; 3486e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.postal_code = "12345"; 3496e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com address.administrative_area = ""; 3506e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 3516e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com AddressData expected = address; 3526e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com expected.administrative_area = "A"; 3536e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com FillAddress(&address); 3546e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // The ZIP code matches multiple city districts and cities; but only one 3556e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com // state, so we fill this in. 3566e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com EXPECT_EQ(expected, address); 3576e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} 3586e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com 3596e459a252dbfcce8411911ee38e68884c9e96887lararennie@google.com} // namespace 360