1// Copyright (C) 2014 Google Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "lookup_key.h"
16
17#include <libaddressinput/address_data.h>
18#include <libaddressinput/util/basictypes.h>
19
20#include <cstddef>
21
22#include <gtest/gtest.h>
23
24namespace {
25
26using i18n::addressinput::AddressData;
27using i18n::addressinput::LookupKey;
28
29const size_t kMaxDepth = arraysize(LookupKey::kHierarchy) - 1;
30
31TEST(LookupKeyTest, Empty) {
32  AddressData address;
33  LookupKey lookup_key;
34  lookup_key.FromAddress(address);
35  EXPECT_EQ("data/ZZ", lookup_key.ToKeyString(kMaxDepth));
36}
37
38TEST(LookupKeyTest, AddressDepth1) {
39  AddressData address;
40  address.region_code = "111";
41  LookupKey lookup_key;
42  lookup_key.FromAddress(address);
43  EXPECT_EQ(0, lookup_key.GetDepth());
44  EXPECT_EQ("data/111", lookup_key.ToKeyString(kMaxDepth));
45}
46
47TEST(LookupKeyTest, AddressDepth2) {
48  AddressData address;
49  address.region_code = "111";
50  address.administrative_area = "222";
51  LookupKey lookup_key;
52  lookup_key.FromAddress(address);
53  EXPECT_EQ(1, lookup_key.GetDepth());
54  EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
55}
56
57TEST(LookupKeyTest, AddressDepth3) {
58  AddressData address;
59  address.region_code = "111";
60  address.administrative_area = "222";
61  address.locality = "333";
62  LookupKey lookup_key;
63  lookup_key.FromAddress(address);
64  EXPECT_EQ(2, lookup_key.GetDepth());
65  EXPECT_EQ("data/111/222/333", lookup_key.ToKeyString(kMaxDepth));
66}
67
68TEST(LookupKeyTest, AddressDepth4) {
69  AddressData address;
70  address.region_code = "111";
71  address.administrative_area = "222";
72  address.locality = "333";
73  address.dependent_locality = "444";
74  LookupKey lookup_key;
75  lookup_key.FromAddress(address);
76  EXPECT_EQ(3, lookup_key.GetDepth());
77  EXPECT_EQ("data/111/222/333/444", lookup_key.ToKeyString(kMaxDepth));
78}
79
80TEST(LookupKeyTest, AddressDepthNonContiguous) {
81  AddressData address;
82  address.region_code = "111";
83  address.administrative_area = "222";
84  // No LOCALITY specified.
85  address.dependent_locality = "444";
86  LookupKey lookup_key;
87  lookup_key.FromAddress(address);
88  EXPECT_EQ(1, lookup_key.GetDepth());
89  EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
90}
91
92TEST(LookupKeyTest, RequestDepth) {
93  AddressData address;
94  address.region_code = "111";
95  address.administrative_area = "222";
96  address.locality = "333";
97  address.dependent_locality = "444";
98  LookupKey lookup_key;
99  lookup_key.FromAddress(address);
100  EXPECT_EQ("data/111", lookup_key.ToKeyString(0));
101  EXPECT_EQ("data/111/222", lookup_key.ToKeyString(1));
102  EXPECT_EQ("data/111/222/333", lookup_key.ToKeyString(2));
103  EXPECT_EQ("data/111/222/333/444", lookup_key.ToKeyString(3));
104}
105
106TEST(LookupKeyTest, WithLanguageCodeDefaultLanguage) {
107  AddressData address;
108  // Use real data here as the choice of adding a language requires metadata.
109  address.region_code = "CA";
110  address.administrative_area = "ON";
111  address.language_code = "en";
112  LookupKey lookup_key;
113  lookup_key.FromAddress(address);
114  EXPECT_EQ("data/CA", lookup_key.ToKeyString(0));
115  EXPECT_EQ("data/CA/ON", lookup_key.ToKeyString(1));
116}
117
118TEST(LookupKeyTest, WithLanguageCodeAlternateLanguage) {
119  AddressData address;
120  // Use real data here as the choice of adding a language requires metadata.
121  address.region_code = "CA";
122  address.administrative_area = "ON";
123  address.language_code = "fr";
124  LookupKey lookup_key;
125  lookup_key.FromAddress(address);
126  EXPECT_EQ("data/CA--fr", lookup_key.ToKeyString(0));
127  EXPECT_EQ("data/CA/ON--fr", lookup_key.ToKeyString(1));
128}
129
130TEST(LookupKeyTest, WithLanguageCodeInvalidLanguage) {
131  AddressData address;
132  // Use real data here as the choice of adding a language requires metadata.
133  address.region_code = "CA";
134  address.administrative_area = "ON";
135  address.language_code = "de";
136  LookupKey lookup_key;
137  lookup_key.FromAddress(address);
138  EXPECT_EQ("data/CA", lookup_key.ToKeyString(0));
139  EXPECT_EQ("data/CA/ON", lookup_key.ToKeyString(1));
140}
141
142TEST(LookupKeyTest, WithLanguageCodeAlternateLanguageNoState) {
143  AddressData address;
144  // Use real data here as the choice of adding a language requires metadata.
145  // Afgahnistan has multiple languages (including Pashto as an alternative)
146  // but no subregions.
147  address.region_code = "AF";
148  address.language_code = "ps";
149  LookupKey lookup_key;
150  lookup_key.FromAddress(address);
151  EXPECT_EQ("data/AF", lookup_key.ToKeyString(0));
152}
153
154TEST(LookupKeyTest, GetRegionCode) {
155  AddressData address;
156  address.region_code = "rrr";
157  LookupKey lookup_key;
158  lookup_key.FromAddress(address);
159  EXPECT_EQ(address.region_code, lookup_key.GetRegionCode());
160}
161
162TEST(LookupKeyTest, FromAddressClearsExistingNodes) {
163  AddressData address;
164  address.region_code = "111";
165  address.administrative_area = "222";
166  LookupKey lookup_key;
167  lookup_key.FromAddress(address);
168  EXPECT_EQ("data/111/222", lookup_key.ToKeyString(kMaxDepth));
169  address.administrative_area.clear();
170  lookup_key.FromAddress(address);
171  EXPECT_EQ("data/111", lookup_key.ToKeyString(kMaxDepth));
172}
173
174}  // namespace
175