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