17764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// Copyright (C) 2014 Google Inc.
27764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com//
37764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// Licensed under the Apache License, Version 2.0 (the "License");
47764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// you may not use this file except in compliance with the License.
57764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// You may obtain a copy of the License at
67764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com//
77764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// http://www.apache.org/licenses/LICENSE-2.0
87764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com//
97764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// Unless required by applicable law or agreed to in writing, software
107764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// distributed under the License is distributed on an "AS IS" BASIS,
117764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// See the License for the specific language governing permissions and
137764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com// limitations under the License.
147764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
157764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com#include "lookup_key.h"
167764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
177764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com#include <libaddressinput/address_data.h>
187764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com#include <libaddressinput/util/basictypes.h>
197764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
209f47fe3ed525accac995b095d408a825673a2ee1roubert@google.com#include <cstddef>
219f47fe3ed525accac995b095d408a825673a2ee1roubert@google.com
227764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com#include <gtest/gtest.h>
237764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
247764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comnamespace {
257764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
267764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comusing i18n::addressinput::AddressData;
277764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comusing i18n::addressinput::LookupKey;
287764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
297764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comconst size_t kMaxDepth = arraysize(LookupKey::kHierarchy) - 1;
307764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
317764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, Empty) {
327764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
337764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
347764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
357764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/ZZ", lookup_key.ToKeyString(kMaxDepth));
367764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
377764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
387764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, AddressDepth1) {
397764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
407764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.region_code = "111";
417764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
427764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
437764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ(0, lookup_key.GetDepth());
447764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111", lookup_key.ToKeyString(kMaxDepth));
457764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
467764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
477764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, AddressDepth2) {
487764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
497764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.region_code = "111";
507764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.administrative_area = "222";
517764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
527764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
537764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ(1, lookup_key.GetDepth());
547764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
557764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
567764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
577764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, AddressDepth3) {
587764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
597764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.region_code = "111";
607764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.administrative_area = "222";
617764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.locality = "333";
627764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
637764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
647764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ(2, lookup_key.GetDepth());
657764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111/222/333", lookup_key.ToKeyString(kMaxDepth));
667764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
677764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
687764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, AddressDepth4) {
697764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
707764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.region_code = "111";
717764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.administrative_area = "222";
727764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.locality = "333";
737764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.dependent_locality = "444";
747764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
757764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
767764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ(3, lookup_key.GetDepth());
777764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111/222/333/444", lookup_key.ToKeyString(kMaxDepth));
787764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
797764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
807764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, AddressDepthNonContiguous) {
817764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
827764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.region_code = "111";
837764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.administrative_area = "222";
847764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  // No LOCALITY specified.
857764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.dependent_locality = "444";
867764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
877764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
887764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ(1, lookup_key.GetDepth());
897764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
907764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
917764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
927764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, RequestDepth) {
937764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
947764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.region_code = "111";
957764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.administrative_area = "222";
967764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.locality = "333";
977764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.dependent_locality = "444";
987764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
997764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
1007764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111", lookup_key.ToKeyString(0));
1017764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111/222", lookup_key.ToKeyString(1));
1027764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111/222/333", lookup_key.ToKeyString(2));
1037764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111/222/333/444", lookup_key.ToKeyString(3));
1047764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
1057764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
106242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.comTEST(LookupKeyTest, WithLanguageCodeDefaultLanguage) {
107242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  AddressData address;
108242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  // Use real data here as the choice of adding a language requires metadata.
109242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.region_code = "CA";
110242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.administrative_area = "ON";
111242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.language_code = "en";
112242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  LookupKey lookup_key;
113242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  lookup_key.FromAddress(address);
114242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  EXPECT_EQ("data/CA", lookup_key.ToKeyString(0));
115242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  EXPECT_EQ("data/CA/ON", lookup_key.ToKeyString(1));
116242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com}
117242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com
118242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.comTEST(LookupKeyTest, WithLanguageCodeAlternateLanguage) {
119242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  AddressData address;
120242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  // Use real data here as the choice of adding a language requires metadata.
121242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.region_code = "CA";
122242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.administrative_area = "ON";
123242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.language_code = "fr";
124242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  LookupKey lookup_key;
125242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  lookup_key.FromAddress(address);
126242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  EXPECT_EQ("data/CA--fr", lookup_key.ToKeyString(0));
127242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  EXPECT_EQ("data/CA/ON--fr", lookup_key.ToKeyString(1));
128242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com}
129242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com
130242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.comTEST(LookupKeyTest, WithLanguageCodeInvalidLanguage) {
131242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  AddressData address;
132242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  // Use real data here as the choice of adding a language requires metadata.
133242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.region_code = "CA";
134242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.administrative_area = "ON";
135242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.language_code = "de";
136242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  LookupKey lookup_key;
137242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  lookup_key.FromAddress(address);
138242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  EXPECT_EQ("data/CA", lookup_key.ToKeyString(0));
139242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  EXPECT_EQ("data/CA/ON", lookup_key.ToKeyString(1));
140242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com}
141242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com
142242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.comTEST(LookupKeyTest, WithLanguageCodeAlternateLanguageNoState) {
143242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  AddressData address;
144242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  // Use real data here as the choice of adding a language requires metadata.
145242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  // Afgahnistan has multiple languages (including Pashto as an alternative)
146242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  // but no subregions.
147242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.region_code = "AF";
148242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  address.language_code = "ps";
149242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  LookupKey lookup_key;
150242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  lookup_key.FromAddress(address);
151242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com  EXPECT_EQ("data/AF", lookup_key.ToKeyString(0));
152242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com}
153242431d78c2191494ebeb268e4dc9f22910cddfcdbeaumont@google.com
1547764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, GetRegionCode) {
1557764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
1567764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.region_code = "rrr";
1577764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
1587764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
1597764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ(address.region_code, lookup_key.GetRegionCode());
1607764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
1617764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
1627764218473f33ca749ca4a3cc66d1118793481ddroubert@google.comTEST(LookupKeyTest, FromAddressClearsExistingNodes) {
1637764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  AddressData address;
1647764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.region_code = "111";
1657764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.administrative_area = "222";
1667764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  LookupKey lookup_key;
1677764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
1687764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
1697764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  address.administrative_area.clear();
1707764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  lookup_key.FromAddress(address);
1717764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com  EXPECT_EQ("data/111", lookup_key.ToKeyString(kMaxDepth));
1727764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}
1737764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com
1747764218473f33ca749ca4a3cc66d1118793481ddroubert@google.com}  // namespace
175