1 // Copyright (C) 2013 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 <libaddressinput/address_ui.h> 16 17 #include <libaddressinput/address_field.h> 18 #include <libaddressinput/address_ui_component.h> 19 20 #include <set> 21 #include <string> 22 #include <vector> 23 24 #include <gtest/gtest.h> 25 26 #include "grit.h" 27 28 namespace i18n { 29 namespace addressinput { 30 31 namespace { 32 33 // Returns testing::AssertionSuccess if the |components| are valid. 34 testing::AssertionResult ComponentsAreValid( 35 const std::vector<AddressUiComponent>& components) { 36 if (components.empty()) { 37 return testing::AssertionFailure() << "no components"; 38 } 39 40 std::set<AddressField> fields; 41 for (std::vector<AddressUiComponent>::const_iterator 42 component_it = components.begin(); 43 component_it != components.end(); 44 ++component_it) { 45 static const AddressField kMinAddressField = COUNTRY; 46 static const AddressField kMaxAddressField = RECIPIENT; 47 if (component_it->field < kMinAddressField || 48 component_it->field > kMaxAddressField) { 49 return testing::AssertionFailure() << "unexpected input field " 50 << component_it->field; 51 } 52 53 if (fields.find(component_it->field) != fields.end()) { 54 return testing::AssertionFailure() << "duplicate input field " 55 << component_it->field; 56 } 57 fields.insert(component_it->field); 58 59 if (component_it->name_id == INVALID_MESSAGE_ID) { 60 return testing::AssertionFailure() << "invalid field name_id for field " 61 << component_it->field; 62 } 63 } 64 65 return testing::AssertionSuccess(); 66 } 67 68 // 1) Verifies that a region code consists of two characters, for example "TW". 69 // 2) Verifies that BuildComponents() returns valid UI components for a region 70 // code. 71 // 3) Verifies that BuildComponents() returns a non-empty vector for a region 72 // code. 73 TEST(AddressUiTest, RegionsAndComponentsAreValid) { 74 const std::vector<std::string>& region_codes = GetRegionCodes(); 75 for (size_t i = 0; i < region_codes.size(); ++i) { 76 SCOPED_TRACE("Region code: " + region_codes[i]); 77 EXPECT_EQ(2U, region_codes[i].size()); 78 EXPECT_TRUE(ComponentsAreValid( 79 BuildComponents(region_codes[i], std::string(), NULL))); 80 } 81 } 82 83 // Verifies that BuildComponents() returns an empty 84 // vector for an invalid region code. 85 TEST(AddressUiTest, InvalidRegionCodeReturnsEmptyVector) { 86 EXPECT_TRUE( 87 BuildComponents("INVALID-REGION-CODE", std::string(), NULL).empty()); 88 } 89 90 struct SeparatorData { 91 SeparatorData(const std::string& language_code, 92 const std::string& compact_line_separator) 93 : language_code(language_code), 94 compact_line_separator(compact_line_separator) {} 95 96 ~SeparatorData() {} 97 98 std::string language_code; 99 std::string compact_line_separator; 100 }; 101 102 // Tests for compact line separator. 103 class CompactLineSeparatorTest 104 : public testing::TestWithParam<SeparatorData> {}; 105 106 TEST_P(CompactLineSeparatorTest, BasicTest) { 107 EXPECT_EQ(GetParam().compact_line_separator, 108 GetCompactAddressLinesSeparator(GetParam().language_code)); 109 } 110 111 INSTANTIATE_TEST_CASE_P( 112 CompactLineSeparators, CompactLineSeparatorTest, 113 testing::Values( 114 SeparatorData("ja", ""), 115 SeparatorData("zh", ""), 116 SeparatorData("zh-hans", ""), 117 SeparatorData("ar", " "), 118 SeparatorData("ko", " "), 119 SeparatorData("th", " "), 120 SeparatorData("en", ", "))); 121 122 TEST(AddressUiTest, ComponentLanguageCodeTest) { 123 static const struct LanguageCodeData { 124 const char* region_code; 125 const char* ui_language_code; 126 const char* components_language_code; 127 } kLangugeCodes[] = { 128 {"AM", "", "hy"}, 129 {"AM", "hy", "hy"}, 130 {"AM", "en", "hy-latn"}, 131 {"CN", "zh-hans", "zh-hans"}, 132 {"CN", "zh-hant", "zh-hant"}, 133 {"CN", "zh", "zh"}, 134 {"CN", "zh-latn", "zh-latn"}, 135 {"CN", "zh-Latn", "zh-latn"}, 136 {"CN", "zh-latn-US", "zh-latn"}, 137 {"CN", "zh-Latn-US", "zh-latn"}, 138 {"CN", "en", "zh-latn"}, 139 {"CN", "ja", "zh-latn"}, 140 {"CN", "ko", "zh-latn"}, 141 {"HK", "zh", "zh"}, 142 {"HK", "zh-hans", "zh-hans"}, 143 {"HK", "zh-hant", "zh-hant"}, 144 {"HK", "zh-latn", "zh-latn"}, 145 {"HK", "en", "en"}, 146 {"HK", "fr", "zh-latn"}, 147 {"HK", "ja", "zh-latn"}, 148 {"HK", "ko", "zh-latn"}, 149 {"MO", "zh", "zh"}, 150 {"MO", "pt", "pt"}, 151 {"MO", "en", "zh-latn"}, 152 {"AQ", "en", "en"}, 153 {"AQ", "fr", "fr"}, 154 {"AQ", "es", "es"}, 155 {"AQ", "zh", "zh"} 156 }; 157 static const size_t kArraySize = 158 sizeof kLangugeCodes / sizeof (LanguageCodeData); 159 for (size_t i = 0; i < kArraySize; ++i) { 160 SCOPED_TRACE(std::string("region code = ") + 161 kLangugeCodes[i].region_code + ", ui language code = " + 162 kLangugeCodes[i].ui_language_code + ", components language code = " + 163 kLangugeCodes[i].components_language_code); 164 std::string components_language_code; 165 EXPECT_FALSE(BuildComponents(kLangugeCodes[i].region_code, 166 kLangugeCodes[i].ui_language_code, 167 &components_language_code).empty()); 168 EXPECT_EQ( 169 kLangugeCodes[i].components_language_code, components_language_code); 170 } 171 } 172 173 } // namespace 174 175 } // namespace addressinput 176 } // namespace i18n 177