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