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_code governing permissions and
13// limitations under the License.
14
15#include <libaddressinput/address_formatter.h>
16
17#include <libaddressinput/address_data.h>
18
19#include <string>
20#include <vector>
21
22#include <gtest/gtest.h>
23
24namespace {
25
26using i18n::addressinput::AddressData;
27using i18n::addressinput::GetFormattedNationalAddress;
28using i18n::addressinput::GetFormattedNationalAddressLine;
29using i18n::addressinput::GetStreetAddressLinesAsSingleLine;
30
31TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_EmptyAddress) {
32  AddressData address;
33  std::string result;
34  GetStreetAddressLinesAsSingleLine(address, &result);
35  EXPECT_TRUE(result.empty());
36}
37
38TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_1Line) {
39  AddressData address;
40  address.region_code = "US";  // Not used.
41  address.address_line.push_back("Line 1");
42
43  std::string result;
44  GetStreetAddressLinesAsSingleLine(address, &result);
45  EXPECT_EQ("Line 1", result);
46
47  // Setting the language_code, with one line, shouldn't affect anything.
48  address.language_code = "en";
49  GetStreetAddressLinesAsSingleLine(address, &result);
50  EXPECT_EQ("Line 1", result);
51
52  address.language_code = "zh-Hans";
53  GetStreetAddressLinesAsSingleLine(address, &result);
54  EXPECT_EQ("Line 1", result);
55}
56
57TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_2Lines) {
58  AddressData address;
59  address.region_code = "US";  // Not used.
60  address.address_line.push_back("Line 1");
61  address.address_line.push_back("Line 2");
62
63  std::string result;
64  GetStreetAddressLinesAsSingleLine(address, &result);
65  // Default separator if no language_code specified: ", "
66  EXPECT_EQ("Line 1, Line 2", result);
67
68  address.language_code = "en";
69  GetStreetAddressLinesAsSingleLine(address, &result);
70  EXPECT_EQ("Line 1, Line 2", result);
71
72  address.language_code = "zh-Hans";
73  GetStreetAddressLinesAsSingleLine(address, &result);
74  // Chinese has no separator.
75  EXPECT_EQ("Line 1Line 2", result);
76
77  address.language_code = "ko";
78  GetStreetAddressLinesAsSingleLine(address, &result);
79  EXPECT_EQ("Line 1 Line 2", result);
80
81  address.language_code = "ar";
82  GetStreetAddressLinesAsSingleLine(address, &result);
83  EXPECT_EQ("Line 1\xD8\x8C" " Line 2", result);  // Arabic comma.
84}
85
86TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_5Lines) {
87  AddressData address;
88  address.region_code = "US";  // Not used.
89  address.address_line.push_back("Line 1");
90  address.address_line.push_back("Line 2");
91  address.address_line.push_back("Line 3");
92  address.address_line.push_back("Line 4");
93  address.address_line.push_back("Line 5");
94  address.language_code = "fr";
95
96  std::string result;
97  GetStreetAddressLinesAsSingleLine(address, &result);
98  EXPECT_EQ(result, "Line 1, Line 2, Line 3, Line 4, Line 5");
99}
100
101TEST(AddressFormatterTest, GetFormattedNationalAddressLocalLanguage) {
102  AddressData address;
103  address.region_code = "NZ";
104  address.address_line.push_back("Rotopapa");
105  address.address_line.push_back("Irwell 3RD");
106  address.postal_code = "8704";
107  address.locality = "Leeston";
108
109  std::vector<std::string> expected;
110  expected.push_back("Rotopapa");
111  expected.push_back("Irwell 3RD");
112  expected.push_back("Leeston 8704");
113
114  std::vector<std::string> lines;
115  GetFormattedNationalAddress(address, &lines);
116  EXPECT_EQ(expected, lines);
117
118  // Should be the same result no matter what the language_code is. We choose an
119  // unlikely language_code code to illustrate this.
120  address.language_code = "en-Latn-CN";
121
122  lines.clear();
123  GetFormattedNationalAddress(address, &lines);
124  EXPECT_EQ(expected, lines);
125
126  std::string one_line;
127  GetFormattedNationalAddressLine(address, &one_line);
128  EXPECT_EQ("Rotopapa, Irwell 3RD, Leeston 8704", one_line);
129}
130
131TEST(AddressFormatterTest, GetFormattedNationalAddressLatinFormat) {
132  /* 大安區 */
133  static const char kTaiwanCity[] = "\xE5\xA4\xA7\xE5\xAE\x89\xE5\x8D\x80";
134  /* 台北市 */
135  static const char kTaiwanAdmin[] = "\xE5\x8F\xB0\xE5\x8C\x97\xE5\xB8\x82";
136  /* 台灣信義路三段33號 */
137  static const char kTaiwanStreetLine[]= "\xE5\x8F\xB0\xE7\x81\xA3\xE4\xBF\xA1"
138    "\xE7\xBE\xA9\xE8\xB7\xAF\xE4\xB8\x89\xE6\xAE\xB5" "33" "\xE8\x99\x9F";
139  static const char kPostalCode[] = "106";
140
141  AddressData address;
142  address.region_code = "TW";
143  address.address_line.push_back(kTaiwanStreetLine);
144  address.postal_code = kPostalCode;
145  address.locality = kTaiwanCity;
146  address.administrative_area = kTaiwanAdmin;
147  address.language_code = "zh-Hant";
148
149  std::vector<std::string> expected;
150  expected.push_back(kPostalCode);
151  expected.push_back(std::string(kTaiwanAdmin).append(kTaiwanCity));
152  expected.push_back(kTaiwanStreetLine);
153
154  std::vector<std::string> lines;
155  GetFormattedNationalAddress(address, &lines);
156  EXPECT_EQ(expected, lines);
157
158  std::string one_line;
159  GetFormattedNationalAddressLine(address, &one_line);
160  // No separators expected for Chinese.
161  EXPECT_EQ(std::string(kPostalCode).append(kTaiwanAdmin).append(kTaiwanCity)
162            .append(kTaiwanStreetLine),
163            one_line);
164
165  // Changing to the latin variant will change the output.
166  AddressData latin_address;
167  latin_address.region_code = "TW";
168  latin_address.address_line.push_back("No. 33, Section 3 Xinyi Rd");
169  latin_address.postal_code = kPostalCode;
170  latin_address.locality = "Da-an District";
171  latin_address.administrative_area = "Taipei City";
172  latin_address.language_code = "zh-Latn";
173
174  std::vector<std::string> expected_latin;
175  expected_latin.push_back("No. 33, Section 3 Xinyi Rd");
176  expected_latin.push_back("Da-an District, Taipei City 106");
177
178  lines.clear();
179  GetFormattedNationalAddress(latin_address, &lines);
180  EXPECT_EQ(expected_latin, lines);
181
182  GetFormattedNationalAddressLine(latin_address, &one_line);
183  // We expect ", " as the new-line replacements for zh-Latn.
184  EXPECT_EQ("No. 33, Section 3 Xinyi Rd, Da-an District, Taipei City 106",
185            one_line);
186}
187
188TEST(AddressFormatterTest, GetFormattedNationalAddressMultilingualCountry) {
189  AddressData address;
190  address.region_code = "CA";
191  address.address_line.push_back("5 Rue du Tresor");
192  address.address_line.push_back("Apt. 4");
193  address.administrative_area = "QC";
194  address.postal_code = "G1R 123";
195  address.locality = "Montmagny";
196  address.language_code = "fr";
197
198  std::vector<std::string> expected;
199  expected.push_back("5 Rue du Tresor");
200  expected.push_back("Apt. 4");
201  expected.push_back("Montmagny QC G1R 123");
202
203  std::vector<std::string> lines;
204  GetFormattedNationalAddress(address, &lines);
205  EXPECT_EQ(expected, lines);
206}
207
208TEST(AddressFormatterTest, GetFormattedNationalAddress_InlineStreetAddress) {
209  AddressData address;
210  address.region_code = "CI";
211  address.address_line.push_back("32 Boulevard Carde");
212  address.locality = "Abidjan";
213  address.sorting_code = "64";
214
215  std::vector<std::string> expected;
216  expected.push_back("64 32 Boulevard Carde Abidjan 64");
217
218  std::vector<std::string> lines;
219  GetFormattedNationalAddress(address, &lines);
220  EXPECT_EQ(expected, lines);
221}
222
223TEST(AddressFormatterTest,
224     GetFormattedNationalAddressMissingFields_LiteralsAroundField) {
225  AddressData address;
226  address.region_code = "CH";
227  std::vector<std::string> expected;
228  std::vector<std::string> lines;
229  GetFormattedNationalAddress(address, &lines);
230  EXPECT_EQ(expected, lines);
231
232  address.locality = "Zurich";
233  expected.push_back("Zurich");
234  GetFormattedNationalAddress(address, &lines);
235  EXPECT_EQ(expected, lines);
236
237  address.postal_code = "8001";
238  expected.back().assign("CH-8001 Zurich");
239  GetFormattedNationalAddress(address, &lines);
240  EXPECT_EQ(expected, lines);
241
242  address.locality.clear();
243  expected.back().assign("CH-8001");
244  GetFormattedNationalAddress(address, &lines);
245  EXPECT_EQ(expected, lines);
246}
247
248TEST(AddressFormatterTest,
249     GetFormattedNationalAddressMissingFields_LiteralsBetweenFields) {
250  AddressData address;
251  address.region_code = "US";
252  std::vector<std::string> expected;
253  std::vector<std::string> lines;
254  GetFormattedNationalAddress(address, &lines);
255  EXPECT_EQ(expected, lines);
256
257  address.administrative_area = "CA";
258  expected.push_back("CA");
259  GetFormattedNationalAddress(address, &lines);
260  EXPECT_EQ(expected, lines);
261
262  address.locality = "Los Angeles";
263  expected.back().assign("Los Angeles, CA");
264  GetFormattedNationalAddress(address, &lines);
265  EXPECT_EQ(expected, lines);
266
267  address.postal_code = "90291";
268  expected.back().assign("Los Angeles, CA 90291");
269  GetFormattedNationalAddress(address, &lines);
270  EXPECT_EQ(expected, lines);
271
272  address.administrative_area.clear();
273  expected.back().assign("Los Angeles 90291");
274  GetFormattedNationalAddress(address, &lines);
275  EXPECT_EQ(expected, lines);
276
277  address.locality.clear();
278  address.administrative_area = "CA";
279  expected.back().assign("CA 90291");
280  GetFormattedNationalAddress(address, &lines);
281  EXPECT_EQ(expected, lines);
282}
283
284TEST(AddressFormatterTest,
285     GetFormattedNationalAddressMissingFields_LiteralOnSeparateLine) {
286  AddressData address;
287  address.region_code = "AX";
288  std::vector<std::string> expected;
289  expected.push_back("\xC3\x85LAND");  /* ÅLAND */
290  std::vector<std::string> lines;
291  GetFormattedNationalAddress(address, &lines);
292  EXPECT_EQ(expected, lines);
293
294  address.locality = "City";
295  expected.insert(expected.begin(), "City");
296  GetFormattedNationalAddress(address, &lines);
297  EXPECT_EQ(expected, lines);
298
299  address.postal_code = "123";
300  expected.front().assign("AX-123 City");
301  GetFormattedNationalAddress(address, &lines);
302  EXPECT_EQ(expected, lines);
303}
304
305TEST(AddressFormatterTest,
306     GetFormattedNationalAddressMissingFields_LiteralBeforeField) {
307  AddressData address;
308  address.region_code = "JP";
309  address.language_code = "ja";
310  std::vector<std::string> expected;
311  std::vector<std::string> lines;
312  GetFormattedNationalAddress(address, &lines);
313  EXPECT_EQ(expected, lines);
314
315  address.postal_code = "123";
316  expected.push_back("\xE3\x80\x92" "123");  /* 〒123 */
317  GetFormattedNationalAddress(address, &lines);
318  EXPECT_EQ(expected, lines);
319
320  address.administrative_area = "Prefecture";
321  expected.push_back("Prefecture");
322  GetFormattedNationalAddress(address, &lines);
323  EXPECT_EQ(expected, lines);
324
325  address.postal_code.clear();
326  expected.erase(expected.begin());
327  GetFormattedNationalAddress(address, &lines);
328  EXPECT_EQ(expected, lines);
329}
330
331TEST(AddressFormatterTest,
332     GetFormattedNationalAddressMissingFields_DuplicateField) {
333  AddressData address;
334  address.region_code = "CI";
335  std::vector<std::string> expected;
336  std::vector<std::string> lines;
337  GetFormattedNationalAddress(address, &lines);
338  EXPECT_EQ(expected, lines);
339
340  address.sorting_code = "123";
341  expected.push_back("123 123");
342  GetFormattedNationalAddress(address, &lines);
343  EXPECT_EQ(expected, lines);
344
345  address.address_line.push_back("456 Main St");
346  expected.back().assign("123 456 Main St 123");
347  GetFormattedNationalAddress(address, &lines);
348  EXPECT_EQ(expected, lines);
349
350  address.locality = "Yamoussoukro";
351  expected.back().assign("123 456 Main St Yamoussoukro 123");
352  GetFormattedNationalAddress(address, &lines);
353  EXPECT_EQ(expected, lines);
354
355  address.sorting_code.erase();
356  expected.back().assign("456 Main St Yamoussoukro");
357  GetFormattedNationalAddress(address, &lines);
358  EXPECT_EQ(expected, lines);
359
360  address.address_line.clear();
361  expected.back().assign("Yamoussoukro");
362  GetFormattedNationalAddress(address, &lines);
363  EXPECT_EQ(expected, lines);
364}
365
366
367}  // namespace
368