Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(688)

Side by Side Diff: third_party/libaddressinput/chromium/cpp/test/rule_test.cc

Issue 106763007: [rac] Parse postal code formats and required fields in libaddressinput. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Test that parsing empty data does not overwrite a rule. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (C) 2013 Google Inc. 1 // Copyright (C) 2013 Google Inc.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with 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 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and 12 // See the License for the specific language governing permissions and
13 // limitations under the License. 13 // limitations under the License.
14 14
15 #include "rule.h" 15 #include "rule.h"
16 16
17 #include <libaddressinput/address_field.h> 17 #include <libaddressinput/address_field.h>
18 18
19 #include <string> 19 #include <string>
20 #include <utility> 20 #include <utility>
21 #include <vector> 21 #include <vector>
22 22
23 #include <gtest/gtest.h> 23 #include <gtest/gtest.h>
24 24
25 #include "address_field_util.h"
26 #include "messages.h" 25 #include "messages.h"
27 #include "region_data_constants.h" 26 #include "region_data_constants.h"
28 27
29 namespace { 28 namespace {
30 29
31 using i18n::addressinput::AddressField; 30 using i18n::addressinput::AddressField;
32 using i18n::addressinput::ADMIN_AREA; 31 using i18n::addressinput::ADMIN_AREA;
32 using i18n::addressinput::COUNTRY;
33 using i18n::addressinput::LOCALITY; 33 using i18n::addressinput::LOCALITY;
34 using i18n::addressinput::NEWLINE;
35 using i18n::addressinput::ORGANIZATION; 34 using i18n::addressinput::ORGANIZATION;
36 using i18n::addressinput::POSTAL_CODE; 35 using i18n::addressinput::POSTAL_CODE;
37 using i18n::addressinput::RECIPIENT; 36 using i18n::addressinput::RECIPIENT;
38 using i18n::addressinput::RegionDataConstants; 37 using i18n::addressinput::RegionDataConstants;
39 using i18n::addressinput::Rule; 38 using i18n::addressinput::Rule;
40 using i18n::addressinput::STREET_ADDRESS; 39 using i18n::addressinput::STREET_ADDRESS;
41 40
41 bool IsFormatEmpty(const std::vector<std::vector<AddressField> >& format) {
42 for (std::vector<std::vector<AddressField> >::const_iterator
43 it = format.begin(); it != format.end(); ++it) {
44 if (!it->empty()) {
45 return false;
46 }
47 }
48 return true;
49 }
50
42 TEST(RuleTest, CopyOverwritesRule) { 51 TEST(RuleTest, CopyOverwritesRule) {
43 Rule rule; 52 Rule rule;
44 ASSERT_TRUE(rule.ParseSerializedRule("{" 53 ASSERT_TRUE(rule.ParseSerializedRule(
45 "\"fmt\":\"%S%Z\"," 54 "{"
46 "\"state_name_type\":\"area\"," 55 "\"fmt\":\"%S%Z\","
47 "\"zip_name_type\":\"postal\"," 56 "\"require\":\"SZ\","
48 "\"sub_keys\":\"CA~NY~TX\"," 57 "\"state_name_type\":\"area\","
49 "\"lang\":\"en\"," 58 "\"zip_name_type\":\"postal\","
50 "\"languages\":\"en~fr\"" 59 "\"sub_keys\":\"CA~NY~TX\","
51 "}")); 60 "\"lang\":\"en\","
61 "\"languages\":\"en~fr\","
62 "\"zip\":\"\\\\d{5}([ \\\\-]\\\\d{4})?\""
63 "}"));
52 64
53 Rule copy; 65 Rule copy;
54 EXPECT_NE(rule.GetFormat(), copy.GetFormat()); 66 EXPECT_NE(rule.GetFormat(), copy.GetFormat());
67 EXPECT_NE(rule.GetRequired(), copy.GetRequired());
55 EXPECT_NE(rule.GetSubKeys(), copy.GetSubKeys()); 68 EXPECT_NE(rule.GetSubKeys(), copy.GetSubKeys());
56 EXPECT_NE(rule.GetLanguages(), copy.GetLanguages()); 69 EXPECT_NE(rule.GetLanguages(), copy.GetLanguages());
57 EXPECT_NE(rule.GetLanguage(), copy.GetLanguage()); 70 EXPECT_NE(rule.GetLanguage(), copy.GetLanguage());
71 EXPECT_NE(rule.GetPostalCodeFormat(), copy.GetPostalCodeFormat());
58 EXPECT_NE(rule.GetAdminAreaNameMessageId(), 72 EXPECT_NE(rule.GetAdminAreaNameMessageId(),
59 copy.GetAdminAreaNameMessageId()); 73 copy.GetAdminAreaNameMessageId());
60 EXPECT_NE(rule.GetPostalCodeNameMessageId(), 74 EXPECT_NE(rule.GetPostalCodeNameMessageId(),
61 copy.GetPostalCodeNameMessageId()); 75 copy.GetPostalCodeNameMessageId());
62 76
63 copy.CopyFrom(rule); 77 copy.CopyFrom(rule);
64 EXPECT_EQ(rule.GetFormat(), copy.GetFormat()); 78 EXPECT_EQ(rule.GetFormat(), copy.GetFormat());
79 EXPECT_EQ(rule.GetRequired(), copy.GetRequired());
65 EXPECT_EQ(rule.GetSubKeys(), copy.GetSubKeys()); 80 EXPECT_EQ(rule.GetSubKeys(), copy.GetSubKeys());
66 EXPECT_EQ(rule.GetLanguages(), copy.GetLanguages()); 81 EXPECT_EQ(rule.GetLanguages(), copy.GetLanguages());
67 EXPECT_EQ(rule.GetLanguage(), copy.GetLanguage()); 82 EXPECT_EQ(rule.GetLanguage(), copy.GetLanguage());
83 EXPECT_EQ(rule.GetPostalCodeFormat(), copy.GetPostalCodeFormat());
68 EXPECT_EQ(rule.GetAdminAreaNameMessageId(), 84 EXPECT_EQ(rule.GetAdminAreaNameMessageId(),
69 copy.GetAdminAreaNameMessageId()); 85 copy.GetAdminAreaNameMessageId());
70 EXPECT_EQ(rule.GetPostalCodeNameMessageId(), 86 EXPECT_EQ(rule.GetPostalCodeNameMessageId(),
71 copy.GetPostalCodeNameMessageId()); 87 copy.GetPostalCodeNameMessageId());
72 } 88 }
73 89
74 TEST(RuleTest, ParseOverwritesRule) { 90 TEST(RuleTest, ParseOverwritesRule) {
75 Rule rule; 91 Rule rule;
76 ASSERT_TRUE(rule.ParseSerializedRule("{" 92 ASSERT_TRUE(rule.ParseSerializedRule(
77 "\"fmt\":\"%S%Z\"," 93 "{"
78 "\"state_name_type\":\"area\"," 94 "\"fmt\":\"%S%Z\","
79 "\"zip_name_type\":\"postal\"," 95 "\"require\":\"SZ\","
80 "\"sub_keys\":\"CA~NY~TX\"," 96 "\"state_name_type\":\"area\","
81 "\"lang\":\"en\"," 97 "\"zip_name_type\":\"postal\","
82 "\"languages\":\"en~fr\"" 98 "\"sub_keys\":\"CA~NY~TX\","
83 "}")); 99 "\"lang\":\"en\","
84 EXPECT_FALSE(rule.GetFormat().empty()); 100 "\"languages\":\"en~fr\","
101 "\"zip\":\"\\\\d{5}([ \\\\-]\\\\d{4})?\""
102 "}"));
103 EXPECT_FALSE(IsFormatEmpty(rule.GetFormat()));
104 EXPECT_FALSE(rule.GetRequired().empty());
85 EXPECT_FALSE(rule.GetSubKeys().empty()); 105 EXPECT_FALSE(rule.GetSubKeys().empty());
86 EXPECT_FALSE(rule.GetLanguages().empty()); 106 EXPECT_FALSE(rule.GetLanguages().empty());
87 EXPECT_FALSE(rule.GetLanguage().empty()); 107 EXPECT_FALSE(rule.GetLanguage().empty());
108 EXPECT_FALSE(rule.GetPostalCodeFormat().empty());
88 EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_AREA, 109 EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_AREA,
89 rule.GetAdminAreaNameMessageId()); 110 rule.GetAdminAreaNameMessageId());
90 EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_POSTAL_CODE_LABEL, 111 EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_POSTAL_CODE_LABEL,
91 rule.GetPostalCodeNameMessageId()); 112 rule.GetPostalCodeNameMessageId());
92 113
93 ASSERT_TRUE(rule.ParseSerializedRule("{" 114 ASSERT_TRUE(rule.ParseSerializedRule(
94 "\"fmt\":\"\"," 115 "{"
95 "\"state_name_type\":\"do_si\"," 116 "\"fmt\":\"\","
96 "\"zip_name_type\":\"zip\"," 117 "\"require\":\"\","
97 "\"sub_keys\":\"\"," 118 "\"state_name_type\":\"do_si\","
98 "\"lang\":\"\"," 119 "\"zip_name_type\":\"zip\","
99 "\"languages\":\"\"" 120 "\"sub_keys\":\"\","
100 "}")); 121 "\"lang\":\"\","
101 EXPECT_TRUE(rule.GetFormat().empty()); 122 "\"languages\":\"\","
123 "\"zip\":\"\""
124 "}"));
125 EXPECT_TRUE(IsFormatEmpty(rule.GetFormat()));
126 EXPECT_TRUE(rule.GetRequired().empty());
102 EXPECT_TRUE(rule.GetSubKeys().empty()); 127 EXPECT_TRUE(rule.GetSubKeys().empty());
103 EXPECT_TRUE(rule.GetLanguages().empty()); 128 EXPECT_TRUE(rule.GetLanguages().empty());
104 EXPECT_TRUE(rule.GetLanguage().empty()); 129 EXPECT_TRUE(rule.GetLanguage().empty());
130 EXPECT_TRUE(rule.GetPostalCodeFormat().empty());
105 EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_DO_SI, 131 EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_DO_SI,
106 rule.GetAdminAreaNameMessageId()); 132 rule.GetAdminAreaNameMessageId());
107 EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_ZIP_CODE_LABEL, 133 EXPECT_EQ(IDS_LIBADDRESSINPUT_I18N_ZIP_CODE_LABEL,
108 rule.GetPostalCodeNameMessageId()); 134 rule.GetPostalCodeNameMessageId());
109 } 135 }
110 136
111 TEST(RuleTest, ParsesFormatCorrectly) { 137 TEST(RuleTest, ParseEmptyDataDoesNotOverwriteRule) {
112 Rule rule; 138 Rule rule;
113 ASSERT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%S\"}")); 139 ASSERT_TRUE(rule.ParseSerializedRule(
114 ASSERT_EQ(1, rule.GetFormat().size()); 140 "{"
115 EXPECT_EQ(ADMIN_AREA, rule.GetFormat()[0]); 141 "\"fmt\":\"%S%Z\","
142 "\"require\":\"SZ\","
143 "\"state_name_type\":\"area\","
144 "\"zip_name_type\":\"postal\","
145 "\"sub_keys\":\"CA~NY~TX\","
146 "\"lang\":\"en\","
147 "\"languages\":\"en~fr\","
148 "\"zip\":\"\\\\d{5}([ \\\\-]\\\\d{4})?\""
149 "}"));
150
151 Rule copy;
152 copy.CopyFrom(rule);
153 ASSERT_TRUE(copy.ParseSerializedRule("{}"));
154
155 EXPECT_EQ(rule.GetFormat(), copy.GetFormat());
156 EXPECT_EQ(rule.GetRequired(), copy.GetRequired());
157 EXPECT_EQ(rule.GetSubKeys(), copy.GetSubKeys());
158 EXPECT_EQ(rule.GetLanguages(), copy.GetLanguages());
159 EXPECT_EQ(rule.GetLanguage(), copy.GetLanguage());
160 EXPECT_EQ(rule.GetPostalCodeFormat(), copy.GetPostalCodeFormat());
161 EXPECT_EQ(rule.GetAdminAreaNameMessageId(),
162 copy.GetAdminAreaNameMessageId());
163 EXPECT_EQ(rule.GetPostalCodeNameMessageId(),
164 copy.GetPostalCodeNameMessageId());
165 }
166
167 TEST(RuleTest, ParseFormatWithNewLines) {
168 Rule rule;
169 ASSERT_TRUE(
170 rule.ParseSerializedRule("{\"fmt\":\"%O%n%N%n%A%nAX-%Z %C%nĂ…LAND\"}"));
171 std::vector<std::vector<AddressField> > expected_format;
172 expected_format.push_back(std::vector<AddressField>(1, ORGANIZATION));
173 expected_format.push_back(std::vector<AddressField>(1, RECIPIENT));
174 expected_format.push_back(std::vector<AddressField>(1, STREET_ADDRESS));
175 expected_format.push_back(std::vector<AddressField>(1, POSTAL_CODE));
176 expected_format.back().push_back(LOCALITY);
177 expected_format.push_back(std::vector<AddressField>());
178 EXPECT_EQ(expected_format, rule.GetFormat());
179 }
180
181 TEST(RuleTest, DoubleTokenPrefixDoesNotCrash) {
182 Rule rule;
183 EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%%R\"}"));
184 }
185
186 TEST(RuleTest, DoubleNewlineFormatDoesNotCrash) {
187 Rule rule;
188 EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%n%n\"}"));
189 }
190
191 TEST(RuleTest, FormatTokenWithoutPrefixDoesNotCrash) {
192 Rule rule;
193 ASSERT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"R\"}"));
194 }
195
196 TEST(RuleTest, ParseDuplicateTokenInFormatDoesNotCrash) {
197 Rule rule;
198 EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%R%R\"}"));
199 }
200
201 TEST(RuleTest, ParseInvalidFormatFieldsDoesNotCrash) {
202 Rule rule;
203 EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%K%L\"}"));
204 }
205
206 TEST(RuleTest, PrefixWithoutTokenFormatDoesNotCrash) {
207 Rule rule;
208 EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"%\"}"));
209 }
210
211 TEST(RuleTest, EmptyStringFormatDoesNotCrash) {
212 Rule rule;
213 EXPECT_TRUE(rule.ParseSerializedRule("{\"fmt\":\"\"}"));
214 }
215
216 TEST(RuleTest, ParseRequiredFields) {
217 Rule rule;
218 ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"ONAZC\"}"));
219 std::vector<AddressField> expected;
220 expected.push_back(ORGANIZATION);
221 expected.push_back(RECIPIENT);
222 expected.push_back(STREET_ADDRESS);
223 expected.push_back(POSTAL_CODE);
224 expected.push_back(LOCALITY);
225 EXPECT_EQ(expected, rule.GetRequired());
226 }
227
228 TEST(RuleTest, ParseEmptyStringRequiredFields) {
229 Rule rule;
230 ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"\"}"));
231 EXPECT_TRUE(rule.GetRequired().empty());
232 }
233
234 TEST(RuleTest, ParseInvalidRequiredFields) {
235 Rule rule;
236 ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"garbage\"}"));
237 EXPECT_TRUE(rule.GetRequired().empty());
238 }
239
240 TEST(RuleTest, ParseDuplicateRequiredFields) {
241 Rule rule;
242 ASSERT_TRUE(rule.ParseSerializedRule("{\"require\":\"SSS\"}"));
243 EXPECT_EQ(std::vector<AddressField>(3, ADMIN_AREA), rule.GetRequired());
116 } 244 }
117 245
118 TEST(RuleTest, ParsesSubKeysCorrectly) { 246 TEST(RuleTest, ParsesSubKeysCorrectly) {
119 Rule rule; 247 Rule rule;
120 ASSERT_TRUE(rule.ParseSerializedRule("{\"sub_keys\":\"CA~NY~TX\"}")); 248 ASSERT_TRUE(rule.ParseSerializedRule("{\"sub_keys\":\"CA~NY~TX\"}"));
121 std::vector<std::string> expected; 249 std::vector<std::string> expected;
122 expected.push_back("CA"); 250 expected.push_back("CA");
123 expected.push_back("NY"); 251 expected.push_back("NY");
124 expected.push_back("TX"); 252 expected.push_back("TX");
125 EXPECT_EQ(expected, rule.GetSubKeys()); 253 EXPECT_EQ(expected, rule.GetSubKeys());
126 } 254 }
127 255
128 TEST(RuleTest, ParsesLanguageCorrectly) { 256 TEST(RuleTest, ParsesLanguageCorrectly) {
129 Rule rule; 257 Rule rule;
130 ASSERT_TRUE(rule.ParseSerializedRule("{\"lang\":\"en\"}")); 258 ASSERT_TRUE(rule.ParseSerializedRule("{\"lang\":\"en\"}"));
131 EXPECT_EQ("en", rule.GetLanguage()); 259 EXPECT_EQ("en", rule.GetLanguage());
132 } 260 }
133 261
134 TEST(RuleTest, ParsesLanguagesCorrectly) { 262 TEST(RuleTest, ParsesLanguagesCorrectly) {
135 Rule rule; 263 Rule rule;
136 ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"de~fr~it\"}")); 264 ASSERT_TRUE(rule.ParseSerializedRule("{\"languages\":\"de~fr~it\"}"));
137 std::vector<std::string> expected; 265 std::vector<std::string> expected;
138 expected.push_back("de"); 266 expected.push_back("de");
139 expected.push_back("fr"); 267 expected.push_back("fr");
140 expected.push_back("it"); 268 expected.push_back("it");
141 EXPECT_EQ(expected, rule.GetLanguages()); 269 EXPECT_EQ(expected, rule.GetLanguages());
142 } 270 }
143 271
272 TEST(RuleTest, ParsesPostalCodeFormatCorrectly) {
273 Rule rule;
274 ASSERT_TRUE(rule.ParseSerializedRule(
275 "{"
276 "\"zip\":\"\\\\d{5}([ \\\\-]\\\\d{4})?\""
277 "}"));
278 EXPECT_EQ("\\d{5}([ \\-]\\d{4})?", rule.GetPostalCodeFormat());
279 }
280
144 TEST(RuleTest, EmptyStringIsNotValid) { 281 TEST(RuleTest, EmptyStringIsNotValid) {
145 Rule rule; 282 Rule rule;
146 EXPECT_FALSE(rule.ParseSerializedRule(std::string())); 283 EXPECT_FALSE(rule.ParseSerializedRule(std::string()));
147 } 284 }
148 285
149 TEST(RuleTest, EmptyDictionaryIsValid) { 286 TEST(RuleTest, EmptyDictionaryIsValid) {
150 Rule rule; 287 Rule rule;
151 EXPECT_TRUE(rule.ParseSerializedRule("{}")); 288 EXPECT_TRUE(rule.ParseSerializedRule("{}"));
152 } 289 }
153 290
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
209 std::make_pair("{\"state_name_type\":\"prefecture\"}", 346 std::make_pair("{\"state_name_type\":\"prefecture\"}",
210 IDS_LIBADDRESSINPUT_I18N_PREFECTURE), 347 IDS_LIBADDRESSINPUT_I18N_PREFECTURE),
211 std::make_pair("{\"state_name_type\":\"province\"}", 348 std::make_pair("{\"state_name_type\":\"province\"}",
212 IDS_LIBADDRESSINPUT_I18N_PROVINCE), 349 IDS_LIBADDRESSINPUT_I18N_PROVINCE),
213 std::make_pair("{\"state_name_type\":\"state\"}", 350 std::make_pair("{\"state_name_type\":\"state\"}",
214 IDS_LIBADDRESSINPUT_I18N_STATE_LABEL))); 351 IDS_LIBADDRESSINPUT_I18N_STATE_LABEL)));
215 352
216 // Tests for rule parsing. 353 // Tests for rule parsing.
217 class RuleParseTest : public testing::TestWithParam<std::string> { 354 class RuleParseTest : public testing::TestWithParam<std::string> {
218 protected: 355 protected:
356 const std::string& GetData() const {
357 return RegionDataConstants::GetRegionData(GetParam());
358 }
359
219 Rule rule_; 360 Rule rule_;
220 }; 361 };
221 362
222 // Verifies that a region data can be parsed successfully. 363 // Verifies that an address format does not contain consecutive lines with
223 TEST_P(RuleParseTest, RegionDataParsedSuccessfully) { 364 // multiple fields each. Such address format (e.g. {{ELEMENT, ELEMENT},
224 EXPECT_TRUE(rule_.ParseSerializedRule( 365 // {ELEMENT, ELEMENT}}) will result in incorrect behavior of BuildComponents()
225 RegionDataConstants::GetRegionData(GetParam()))); 366 // public API.
367 TEST_P(RuleParseTest, ConsecutiveLinesWithMultipleFields) {
368 ASSERT_TRUE(rule_.ParseSerializedRule(GetData()));
369 bool previous_line_has_single_field = true;
370 for (std::vector<std::vector<AddressField> >::const_iterator
371 line_it = rule_.GetFormat().begin();
372 line_it != rule_.GetFormat().end();
373 ++line_it) {
374 if (line_it->empty()) {
375 continue;
376 }
377 ASSERT_TRUE(line_it->size() == 1 || previous_line_has_single_field)
378 << GetParam() << ": " << GetData();
379 previous_line_has_single_field = line_it->size() == 1;
380 }
226 } 381 }
227 382
228 // Test parsing all region data. 383 // Test parsing all region data.
229 INSTANTIATE_TEST_CASE_P( 384 INSTANTIATE_TEST_CASE_P(
230 AllRulesTest, RuleParseTest, 385 AllRulesTest, RuleParseTest,
231 testing::ValuesIn(RegionDataConstants::GetRegionCodes())); 386 testing::ValuesIn(RegionDataConstants::GetRegionCodes()));
232 387
233 } // namespace 388 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698