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