1 // Copyright (C) 2013 Google Inc.
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
7 // http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include <libaddressinput/address_field.h>
18 #include <libaddressinput/localization.h>
25 #include <gtest/gtest.h>
27 #include "address_field_util.h"
28 #include "format_element.h"
31 #include "region_data_constants.h"
32 #include "util/json.h"
36 using i18n::addressinput::AddressField;
37 using i18n::addressinput::ADMIN_AREA;
38 using i18n::addressinput::FormatElement;
39 using i18n::addressinput::INVALID_MESSAGE_ID;
40 using i18n::addressinput::Json;
41 using i18n::addressinput::LOCALITY;
42 using i18n::addressinput::Localization;
43 using i18n::addressinput::RegionDataConstants;
44 using i18n::addressinput::Rule;
45 using i18n::addressinput::STREET_ADDRESS;
47 TEST(RuleTest, CopyOverwritesRule) {
49 ASSERT_TRUE(rule.ParseSerializedRule("{"
53 "\"name\":\"Le Test\","
54 "\"lname\":\"Testistan\","
56 "\"sub_keys\":\"aa~bb~cc\","
57 "\"languages\":\"en~fr\","
58 "\"zip\":\"\\\\d{3}\","
59 "\"state_name_type\":\"area\","
60 "\"zip_name_type\":\"postal\","
62 "\"posturl\":\"http://www.testpost.com\""
66 EXPECT_NE(rule.GetFormat(), copy.GetFormat());
67 EXPECT_NE(rule.GetLatinFormat(), copy.GetLatinFormat());
68 EXPECT_NE(rule.GetId(), copy.GetId());
69 EXPECT_NE(rule.GetRequired(), copy.GetRequired());
70 EXPECT_NE(rule.GetSubKeys(), copy.GetSubKeys());
71 EXPECT_NE(rule.GetLanguages(), copy.GetLanguages());
72 EXPECT_NE(rule.GetAdminAreaNameMessageId(),
73 copy.GetAdminAreaNameMessageId());
74 EXPECT_NE(rule.GetPostalCodeNameMessageId(),
75 copy.GetPostalCodeNameMessageId());
76 EXPECT_NE(rule.GetName(), copy.GetName());
77 EXPECT_NE(rule.GetLatinName(), copy.GetLatinName());
78 EXPECT_NE(rule.GetPostalCodeExample(), copy.GetPostalCodeExample());
79 EXPECT_NE(rule.GetPostServiceUrl(), copy.GetPostServiceUrl());
81 EXPECT_TRUE(rule.GetPostalCodeMatcher() != NULL);
82 EXPECT_TRUE(copy.GetPostalCodeMatcher() == NULL);
85 EXPECT_EQ(rule.GetFormat(), copy.GetFormat());
86 EXPECT_EQ(rule.GetLatinFormat(), copy.GetLatinFormat());
87 EXPECT_EQ(rule.GetId(), copy.GetId());
88 EXPECT_EQ(rule.GetRequired(), copy.GetRequired());
89 EXPECT_EQ(rule.GetSubKeys(), copy.GetSubKeys());
90 EXPECT_EQ(rule.GetLanguages(), copy.GetLanguages());
91 EXPECT_EQ(rule.GetAdminAreaNameMessageId(),
92 copy.GetAdminAreaNameMessageId());
93 EXPECT_EQ(rule.GetPostalCodeNameMessageId(),
94 copy.GetPostalCodeNameMessageId());
95 EXPECT_EQ(rule.GetName(), copy.GetName());
96 EXPECT_EQ(rule.GetLatinName(), copy.GetLatinName());
97 EXPECT_EQ(rule.GetPostalCodeExample(), copy.GetPostalCodeExample());
98 EXPECT_EQ(rule.GetPostServiceUrl(), copy.GetPostServiceUrl());
100 EXPECT_TRUE(copy.GetPostalCodeMatcher() != NULL);
103 TEST(RuleTest, ParseOverwritesRule) {
105 ASSERT_TRUE(rule.ParseSerializedRule("{"
107 "\"state_name_type\":\"area\","
109 "\"zip_name_type\":\"postal\","
110 "\"zipex\":\"1234\","
111 "\"posturl\":\"http://www.testpost.com\""
113 EXPECT_FALSE(rule.GetFormat().empty());
114 EXPECT_EQ(IDS_LIBADDRESSINPUT_AREA,
115 rule.GetAdminAreaNameMessageId());
116 EXPECT_EQ(IDS_LIBADDRESSINPUT_POSTAL_CODE_LABEL,
117 rule.GetPostalCodeNameMessageId());
118 EXPECT_EQ("1234", rule.GetSolePostalCode());
119 EXPECT_EQ("1234", rule.GetPostalCodeExample());
120 EXPECT_EQ("http://www.testpost.com", rule.GetPostServiceUrl());
122 ASSERT_TRUE(rule.ParseSerializedRule("{"
124 "\"state_name_type\":\"do_si\","
125 "\"zip_name_type\":\"zip\","
126 "\"zipex\":\"5678\","
127 "\"posturl\":\"http://www.fakepost.com\""
129 EXPECT_TRUE(rule.GetFormat().empty());
130 EXPECT_EQ(IDS_LIBADDRESSINPUT_DO_SI,
131 rule.GetAdminAreaNameMessageId());
132 EXPECT_EQ(IDS_LIBADDRESSINPUT_ZIP_CODE_LABEL,
133 rule.GetPostalCodeNameMessageId());
134 EXPECT_TRUE(rule.GetSolePostalCode().empty());
135 EXPECT_EQ("5678", rule.GetPostalCodeExample());
136 EXPECT_EQ("http://www.fakepost.com", rule.GetPostServiceUrl());
139 TEST(RuleTest, ParsesFormatCorrectly) {
140 std::vector<FormatElement> expected;
141 expected.push_back(FormatElement(ADMIN_AREA));
142 expected.push_back(FormatElement(LOCALITY));
144 ASSERT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%S%C\"}"));
145 EXPECT_EQ(expected, rule.GetFormat());
148 TEST(RuleTest, ParsesNameCorrectly) {
150 ASSERT_TRUE(rule.ParseSerializedRule("{\"name\":\"Le Test\"}"));
151 EXPECT_EQ("Le Test", rule.GetName());
154 TEST(RuleTest, ParsesLatinNameCorrectly) {
156 ASSERT_TRUE(rule.ParseSerializedRule("{\"lname\":\"Testistan\"}"));
157 EXPECT_EQ("Testistan", rule.GetLatinName());
160 TEST(RuleTest, ParsesLatinFormatCorrectly) {
161 std::vector<FormatElement> expected;
162 expected.push_back(FormatElement(LOCALITY));
163 expected.push_back(FormatElement(ADMIN_AREA));
165 ASSERT_TRUE(rule.ParseSerializedRule("{\"lfmt\":\"%C%S\"}"));
166 EXPECT_EQ(expected, rule.GetLatinFormat());
169 TEST(RuleTest, ParsesRequiredCorrectly) {
170 std::vector<AddressField> expected;
171 expected.push_back(STREET_ADDRESS);
172 expected.push_back(LOCALITY);
174 ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"AC\"}"));
175 EXPECT_EQ(expected, rule.GetRequired());
178 TEST(RuleTest, ParsesSubKeysCorrectly) {
179 std::vector<std::string> expected;
180 expected.push_back("aa");
181 expected.push_back("bb");
182 expected.push_back("cc");
184 ASSERT_TRUE(rule.ParseSerializedRule("{\"sub_keys\":\"aa~bb~cc\"}"));
185 EXPECT_EQ(expected, rule.GetSubKeys());
188 TEST(RuleTest, ParsesLanguagesCorrectly) {
189 std::vector<std::string> expected;
190 expected.push_back("de");
191 expected.push_back("fr");
192 expected.push_back("it");
194 ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"de~fr~it\"}"));
195 EXPECT_EQ(expected, rule.GetLanguages());
198 TEST(RuleTest, ParsesPostalCodeExampleCorrectly) {
200 ASSERT_TRUE(rule.ParseSerializedRule("{\"zipex\":\"1234,12345-6789\"}"));
201 EXPECT_EQ("1234,12345-6789", rule.GetPostalCodeExample());
204 TEST(RuleTest, ParsesPostServiceUrlCorrectly) {
207 rule.ParseSerializedRule("{\"posturl\":\"http://www.testpost.com\"}"));
208 EXPECT_EQ("http://www.testpost.com", rule.GetPostServiceUrl());
211 TEST(RuleTest, PostalCodeMatcher) {
213 ASSERT_TRUE(rule.ParseSerializedRule("{\"zip\":\"\\\\d{3}\"}"));
214 EXPECT_TRUE(rule.GetPostalCodeMatcher() != NULL);
217 TEST(RuleTest, PostalCodeMatcherInvalidRegExp) {
219 ASSERT_TRUE(rule.ParseSerializedRule("{\"zip\":\"(\"}"));
220 EXPECT_TRUE(rule.GetPostalCodeMatcher() == NULL);
223 TEST(RuleTest, ParsesJsonRuleCorrectly) {
225 ASSERT_TRUE(json.ParseObject("{\"zip\":\"\\\\d{3}\"}"));
227 rule.ParseJsonRule(json);
228 EXPECT_TRUE(rule.GetPostalCodeMatcher() != NULL);
231 TEST(RuleTest, EmptyStringIsNotValid) {
233 EXPECT_FALSE(rule.ParseSerializedRule(std::string()));
236 TEST(RuleTest, EmptyDictionaryIsValid) {
238 EXPECT_TRUE(rule.ParseSerializedRule("{}"));
241 // Tests for parsing the postal code name.
242 class PostalCodeNameParseTest
243 : public testing::TestWithParam<std::pair<std::string, int> > {
248 // Verifies that a postal code name is parsed correctly.
249 TEST_P(PostalCodeNameParseTest, ParsedCorrectly) {
250 ASSERT_TRUE(rule_.ParseSerializedRule(GetParam().first));
251 EXPECT_EQ(GetParam().second, rule_.GetPostalCodeNameMessageId());
254 // Test parsing all postal code names.
255 INSTANTIATE_TEST_CASE_P(
256 AllPostalCodeNames, PostalCodeNameParseTest,
258 std::make_pair("{\"zip_name_type\":\"postal\"}",
259 IDS_LIBADDRESSINPUT_POSTAL_CODE_LABEL),
260 std::make_pair("{\"zip_name_type\":\"zip\"}",
261 IDS_LIBADDRESSINPUT_ZIP_CODE_LABEL)));
263 // Tests for parsing the administrative area name.
264 class AdminAreaNameParseTest
265 : public testing::TestWithParam<std::pair<std::string, int> > {
270 // Verifies that an administrative area name is parsed correctly.
271 TEST_P(AdminAreaNameParseTest, ParsedCorrectly) {
272 ASSERT_TRUE(rule_.ParseSerializedRule(GetParam().first));
273 EXPECT_EQ(GetParam().second, rule_.GetAdminAreaNameMessageId());
276 // Test parsing all administrative area names.
277 INSTANTIATE_TEST_CASE_P(
278 AllAdminAreaNames, AdminAreaNameParseTest,
280 std::make_pair("{\"state_name_type\":\"area\"}",
281 IDS_LIBADDRESSINPUT_AREA),
282 std::make_pair("{\"state_name_type\":\"county\"}",
283 IDS_LIBADDRESSINPUT_COUNTY),
284 std::make_pair("{\"state_name_type\":\"department\"}",
285 IDS_LIBADDRESSINPUT_DEPARTMENT),
286 std::make_pair("{\"state_name_type\":\"district\"}",
287 IDS_LIBADDRESSINPUT_DISTRICT),
288 std::make_pair("{\"state_name_type\":\"do_si\"}",
289 IDS_LIBADDRESSINPUT_DO_SI),
290 std::make_pair("{\"state_name_type\":\"emirate\"}",
291 IDS_LIBADDRESSINPUT_EMIRATE),
292 std::make_pair("{\"state_name_type\":\"island\"}",
293 IDS_LIBADDRESSINPUT_ISLAND),
294 std::make_pair("{\"state_name_type\":\"parish\"}",
295 IDS_LIBADDRESSINPUT_PARISH),
296 std::make_pair("{\"state_name_type\":\"prefecture\"}",
297 IDS_LIBADDRESSINPUT_PREFECTURE),
298 std::make_pair("{\"state_name_type\":\"province\"}",
299 IDS_LIBADDRESSINPUT_PROVINCE),
300 std::make_pair("{\"state_name_type\":\"state\"}",
301 IDS_LIBADDRESSINPUT_STATE)));
303 // Tests for rule parsing.
304 class RuleParseTest : public testing::TestWithParam<std::string> {
306 const std::string& GetRegionData() const {
307 // GetParam() is either a region code or the region data itself.
308 // RegionDataContants::GetRegionData() returns an empty string for anything
309 // that's not a region code.
310 const std::string& data = RegionDataConstants::GetRegionData(GetParam());
311 return !data.empty() ? data : GetParam();
315 Localization localization_;
318 // Verifies that a region data can be parsed successfully.
319 TEST_P(RuleParseTest, RegionDataParsedSuccessfully) {
320 EXPECT_TRUE(rule_.ParseSerializedRule(GetRegionData()));
323 // Verifies that the admin area name type corresponds to a UI string.
324 TEST_P(RuleParseTest, AdminAreaNameTypeHasUiString) {
325 const std::string& region_data = GetRegionData();
326 rule_.ParseSerializedRule(region_data);
327 if (region_data.find("state_name_type") != std::string::npos) {
328 EXPECT_NE(INVALID_MESSAGE_ID, rule_.GetAdminAreaNameMessageId());
330 localization_.GetString(rule_.GetAdminAreaNameMessageId()).empty());
334 // Verifies that the postal code name type corresponds to a UI string.
335 TEST_P(RuleParseTest, PostalCodeNameTypeHasUiString) {
336 const std::string& region_data = GetRegionData();
337 rule_.ParseSerializedRule(region_data);
338 if (region_data.find("zip_name_type") != std::string::npos) {
339 EXPECT_NE(INVALID_MESSAGE_ID, rule_.GetPostalCodeNameMessageId());
341 localization_.GetString(rule_.GetPostalCodeNameMessageId()).empty());
345 // Verifies that the sole postal code is correctly recognised and copied.
346 TEST_P(RuleParseTest, SolePostalCode) {
348 ASSERT_TRUE(rule.ParseSerializedRule("{\"zip\":\"1234\"}"));
349 EXPECT_TRUE(rule.GetPostalCodeMatcher() != NULL);
350 EXPECT_TRUE(rule.GetSolePostalCode() == "1234");
353 EXPECT_TRUE(copy.GetPostalCodeMatcher() == NULL);
354 EXPECT_TRUE(copy.GetSolePostalCode().empty());
357 EXPECT_TRUE(copy.GetPostalCodeMatcher() != NULL);
358 EXPECT_EQ(rule.GetSolePostalCode(), copy.GetSolePostalCode());
361 // Test parsing all region data.
362 INSTANTIATE_TEST_CASE_P(
363 AllRulesTest, RuleParseTest,
364 testing::ValuesIn(RegionDataConstants::GetRegionCodes()));
366 // Test parsing the default rule.
367 INSTANTIATE_TEST_CASE_P(
368 DefaultRuleTest, RuleParseTest,
369 testing::Values(RegionDataConstants::GetDefaultRegionData()));