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_1Line) {
32  AddressData address;
33  address.region_code = "US";  // Not used.
34  address.address_line.push_back("Line 1");
35
36  std::string result;
37  GetStreetAddressLinesAsSingleLine(address, &result);
38  EXPECT_EQ("Line 1", result);
39
40  // Setting the language_code, with one line, shouldn't affect anything.
41  address.language_code = "en";
42  GetStreetAddressLinesAsSingleLine(address, &result);
43  EXPECT_EQ("Line 1", result);
44
45  address.language_code = "zh-Hans";
46  GetStreetAddressLinesAsSingleLine(address, &result);
47  EXPECT_EQ("Line 1", result);
48}
49
50TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_2Lines) {
51  AddressData address;
52  address.region_code = "US";  // Not used.
53  address.address_line.push_back("Line 1");
54  address.address_line.push_back("Line 2");
55
56  std::string result;
57  GetStreetAddressLinesAsSingleLine(address, &result);
58  // Default separator if no language_code specified: ", "
59  EXPECT_EQ("Line 1, Line 2", result);
60
61  address.language_code = "en";
62  GetStreetAddressLinesAsSingleLine(address, &result);
63  EXPECT_EQ("Line 1, Line 2", result);
64
65  address.language_code = "zh-Hans";
66  GetStreetAddressLinesAsSingleLine(address, &result);
67  // Chinese has no separator.
68  EXPECT_EQ("Line 1Line 2", result);
69
70  address.language_code = "ko";
71  GetStreetAddressLinesAsSingleLine(address, &result);
72  EXPECT_EQ("Line 1 Line 2", result);
73
74  address.language_code = "ar";
75  GetStreetAddressLinesAsSingleLine(address, &result);
76  EXPECT_EQ("Line 1\xD8\x8C" " Line 2", result);  // Arabic comma.
77}
78
79TEST(AddressFormatterTest, GetStreetAddressLinesAsSingleLine_5Lines) {
80  AddressData address;
81  address.region_code = "US";  // Not used.
82  address.address_line.push_back("Line 1");
83  address.address_line.push_back("Line 2");
84  address.address_line.push_back("Line 3");
85  address.address_line.push_back("Line 4");
86  address.address_line.push_back("Line 5");
87  address.language_code = "fr";
88
89  std::string result;
90  GetStreetAddressLinesAsSingleLine(address, &result);
91  EXPECT_EQ(result, "Line 1, Line 2, Line 3, Line 4, Line 5");
92}
93
94TEST(AddressFormatterTest, GetFormattedNationalAddressLocalLanguage) {
95  AddressData address;
96  address.region_code = "NZ";
97  address.address_line.push_back("Rotopapa");
98  address.address_line.push_back("Irwell 3RD");
99  address.postal_code = "8704";
100  address.locality = "Leeston";
101
102  std::vector<std::string> expected;
103  expected.push_back("Rotopapa");
104  expected.push_back("Irwell 3RD");
105  expected.push_back("Leeston 8704");
106
107  std::vector<std::string> lines;
108  GetFormattedNationalAddress(address, &lines);
109  EXPECT_EQ(expected, lines);
110
111  // Should be the same result no matter what the language_code is. We choose an
112  // unlikely language_code code to illustrate this.
113  address.language_code = "en-Latn-CN";
114
115  lines.clear();
116  GetFormattedNationalAddress(address, &lines);
117  EXPECT_EQ(expected, lines);
118
119  std::string one_line;
120  GetFormattedNationalAddressLine(address, &one_line);
121  EXPECT_EQ("Rotopapa, Irwell 3RD, Leeston 8704", one_line);
122}
123
124TEST(AddressFormatterTest, GetFormattedNationalAddressLatinFormat) {
125  /* 大安區 */
126  static const char kTaiwanCity[] = "\xE5\xA4\xA7\xE5\xAE\x89\xE5\x8D\x80";
127  /* 台北市 */
128  static const char kTaiwanAdmin[] = "\xE5\x8F\xB0\xE5\x8C\x97\xE5\xB8\x82";
129  /* 台灣信義路三段33號 */
130  static const char kTaiwanStreetLine[]= "\xE5\x8F\xB0\xE7\x81\xA3\xE4\xBF\xA1"
131    "\xE7\xBE\xA9\xE8\xB7\xAF\xE4\xB8\x89\xE6\xAE\xB5" "33" "\xE8\x99\x9F";
132  static const char kPostalCode[] = "106";
133
134  AddressData address;
135  address.region_code = "TW";
136  address.address_line.push_back(kTaiwanStreetLine);
137  address.postal_code = kPostalCode;
138  address.locality = kTaiwanCity;
139  address.administrative_area = kTaiwanAdmin;
140  address.language_code = "zh-Hant";
141
142  std::vector<std::string> expected;
143  expected.push_back(kPostalCode);
144  expected.push_back(std::string(kTaiwanAdmin).append(kTaiwanCity));
145  expected.push_back(kTaiwanStreetLine);
146
147  std::vector<std::string> lines;
148  GetFormattedNationalAddress(address, &lines);
149  EXPECT_EQ(expected, lines);
150
151  std::string one_line;
152  GetFormattedNationalAddressLine(address, &one_line);
153  // No separators expected for Chinese.
154  EXPECT_EQ(std::string(kPostalCode).append(kTaiwanAdmin).append(kTaiwanCity)
155            .append(kTaiwanStreetLine),
156            one_line);
157
158  // Changing to the latin variant will change the output.
159  AddressData latin_address;
160  latin_address.region_code = "TW";
161  latin_address.address_line.push_back("No. 33, Section 3 Xinyi Rd");
162  latin_address.postal_code = kPostalCode;
163  latin_address.locality = "Da-an District";
164  latin_address.administrative_area = "Taipei City";
165  latin_address.language_code = "zh-Latn";
166
167  std::vector<std::string> expected_latin;
168  expected_latin.push_back("No. 33, Section 3 Xinyi Rd");
169  expected_latin.push_back("Da-an District, Taipei City 106");
170
171  lines.clear();
172  GetFormattedNationalAddress(latin_address, &lines);
173  EXPECT_EQ(expected_latin, lines);
174
175  GetFormattedNationalAddressLine(latin_address, &one_line);
176  // We expect ", " as the new-line replacements for zh-Latn.
177  EXPECT_EQ("No. 33, Section 3 Xinyi Rd, Da-an District, Taipei City 106",
178            one_line);
179}
180
181TEST(AddressFormatterTest, GetFormattedNationalAddressMultilingualCountry) {
182  AddressData address;
183  address.region_code = "CA";
184  address.address_line.push_back("5 Rue du Tresor");
185  address.address_line.push_back("Apt. 4");
186  address.administrative_area = "QC";
187  address.postal_code = "G1R 123";
188  address.locality = "Montmagny";
189  address.language_code = "fr";
190
191  std::vector<std::string> expected;
192  expected.push_back("5 Rue du Tresor");
193  expected.push_back("Apt. 4");
194  expected.push_back("Montmagny QC G1R 123");
195
196  std::vector<std::string> lines;
197  GetFormattedNationalAddress(address, &lines);
198  EXPECT_EQ(expected, lines);
199}
200
201}  // namespace
202