1 // Copyright (C) 2014 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.
15 #include "validation_task.h"
17 #include <libaddressinput/address_data.h>
18 #include <libaddressinput/address_field.h>
19 #include <libaddressinput/address_problem.h>
20 #include <libaddressinput/address_validator.h>
21 #include <libaddressinput/callback.h>
22 #include <libaddressinput/supplier.h>
23 #include <libaddressinput/util/basictypes.h>
24 #include <libaddressinput/util/scoped_ptr.h>
29 #include <gtest/gtest.h>
31 #include "lookup_key.h"
35 namespace addressinput {
37 class ValidationTaskTest : public testing::Test {
49 validated_(BuildCallback(this, &ValidationTaskTest::Validated)) {
50 // Add all problems to the filter except those affected by the metadata
51 // in region_data_constants.cc.
52 static const AddressField kFields[] = {
64 static const AddressProblem kProblems[] = {
65 // UNEXPECTED_FIELD is validated using IsFieldUsed().
66 // MISSING_REQUIRED_FIELD is validated using IsFieldRequired().
73 for (size_t i = 0; i < arraysize(kFields); ++i) {
74 AddressField field = kFields[i];
75 for (size_t j = 0; j < arraysize(kProblems); ++j) {
76 AddressProblem problem = kProblems[j];
77 filter_.insert(std::make_pair(field, problem));
81 filter_.insert(std::make_pair(COUNTRY, UNEXPECTED_FIELD));
82 filter_.insert(std::make_pair(COUNTRY, MISSING_REQUIRED_FIELD));
83 filter_.insert(std::make_pair(RECIPIENT, UNEXPECTED_FIELD));
84 filter_.insert(std::make_pair(RECIPIENT, MISSING_REQUIRED_FIELD));
88 Rule rule[arraysize(json_)];
90 ValidationTask* task = new ValidationTask(
98 Supplier::RuleHierarchy hierarchy;
100 for (size_t i = 0; i < arraysize(json_) && json_[i] != NULL; ++i) {
101 ASSERT_TRUE(rule[i].ParseSerializedRule(json_[i]));
102 hierarchy.rule[i] = &rule[i];
105 (*task->supplied_)(success_, *task->lookup_key_, hierarchy);
108 const char* json_[arraysize(LookupKey::kHierarchy)];
110 AddressData address_;
113 FieldProblemMap filter_;
114 FieldProblemMap problems_;
115 FieldProblemMap expected_;
119 void Validated(bool success,
120 const AddressData& address,
121 const FieldProblemMap& problems) {
122 ASSERT_EQ(success_, success);
123 ASSERT_EQ(&address_, &address);
124 ASSERT_EQ(&problems_, &problems);
128 const scoped_ptr<const AddressValidator::Callback> validated_;
130 DISALLOW_COPY_AND_ASSIGN(ValidationTaskTest);
135 TEST_F(ValidationTaskTest, FailureCountryRuleNull) {
138 ASSERT_NO_FATAL_FAILURE(Validate());
139 ASSERT_TRUE(called_);
140 EXPECT_EQ(expected_, problems_);
143 TEST_F(ValidationTaskTest, FailureCountryRuleEmpty) {
147 ASSERT_NO_FATAL_FAILURE(Validate());
148 ASSERT_TRUE(called_);
149 EXPECT_EQ(expected_, problems_);
152 TEST_F(ValidationTaskTest, SuccessCountryRuleNullNameEmpty) {
153 expected_.insert(std::make_pair(COUNTRY, MISSING_REQUIRED_FIELD));
155 ASSERT_NO_FATAL_FAILURE(Validate());
156 ASSERT_TRUE(called_);
157 EXPECT_EQ(expected_, problems_);
160 TEST_F(ValidationTaskTest, SuccessCountryRuleNullNameNotEmpty) {
161 address_.region_code = "rrr";
163 expected_.insert(std::make_pair(COUNTRY, UNKNOWN_VALUE));
165 ASSERT_NO_FATAL_FAILURE(Validate());
166 ASSERT_TRUE(called_);
167 EXPECT_EQ(expected_, problems_);
170 TEST_F(ValidationTaskTest, SuccessCountryRuleEmptyNameEmpty) {
173 expected_.insert(std::make_pair(COUNTRY, MISSING_REQUIRED_FIELD));
175 ASSERT_NO_FATAL_FAILURE(Validate());
176 ASSERT_TRUE(called_);
177 EXPECT_EQ(expected_, problems_);
180 TEST_F(ValidationTaskTest, SuccessCountryRuleEmptyNameNotEmpty) {
183 address_.region_code = "rrr";
185 ASSERT_NO_FATAL_FAILURE(Validate());
186 ASSERT_TRUE(called_);
187 EXPECT_EQ(expected_, problems_);
190 TEST_F(ValidationTaskTest, MissingRequiredFieldsUS) {
193 address_.region_code = "US";
195 filter_.insert(std::make_pair(ADMIN_AREA, MISSING_REQUIRED_FIELD));
196 filter_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
197 filter_.insert(std::make_pair(POSTAL_CODE, MISSING_REQUIRED_FIELD));
198 filter_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
199 expected_.insert(std::make_pair(ADMIN_AREA, MISSING_REQUIRED_FIELD));
200 expected_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
201 expected_.insert(std::make_pair(POSTAL_CODE, MISSING_REQUIRED_FIELD));
202 expected_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
204 ASSERT_NO_FATAL_FAILURE(Validate());
205 ASSERT_TRUE(called_);
206 EXPECT_EQ(expected_, problems_);
209 TEST_F(ValidationTaskTest, MissingNoRequiredFieldsUS) {
212 address_.region_code = "US";
213 address_.administrative_area = "sss";
214 address_.locality = "ccc";
215 address_.postal_code = "zzz";
216 address_.address_line.push_back("aaa");
217 address_.organization = "ooo";
218 address_.recipient = "nnn";
220 filter_.insert(std::make_pair(ADMIN_AREA, MISSING_REQUIRED_FIELD));
221 filter_.insert(std::make_pair(LOCALITY, MISSING_REQUIRED_FIELD));
222 filter_.insert(std::make_pair(POSTAL_CODE, MISSING_REQUIRED_FIELD));
223 filter_.insert(std::make_pair(STREET_ADDRESS, MISSING_REQUIRED_FIELD));
224 filter_.insert(std::make_pair(ORGANIZATION, MISSING_REQUIRED_FIELD));
226 ASSERT_NO_FATAL_FAILURE(Validate());
227 ASSERT_TRUE(called_);
228 EXPECT_EQ(expected_, problems_);
231 TEST_F(ValidationTaskTest, UnexpectedFieldUS) {
234 address_.region_code = "US";
235 address_.dependent_locality = "ddd";
237 filter_.insert(std::make_pair(DEPENDENT_LOCALITY, UNEXPECTED_FIELD));
238 expected_.insert(std::make_pair(DEPENDENT_LOCALITY, UNEXPECTED_FIELD));
240 ASSERT_NO_FATAL_FAILURE(Validate());
241 ASSERT_TRUE(called_);
242 EXPECT_EQ(expected_, problems_);
245 TEST_F(ValidationTaskTest, MissingRequiredFieldRequireName) {
248 address_.region_code = "rrr";
250 require_name_ = true;
252 expected_.insert(std::make_pair(RECIPIENT, MISSING_REQUIRED_FIELD));
254 ASSERT_NO_FATAL_FAILURE(Validate());
255 ASSERT_TRUE(called_);
256 EXPECT_EQ(expected_, problems_);
259 TEST_F(ValidationTaskTest, UnknownValueRuleNull) {
260 json_[0] = "{\"fmt\":\"%R%S\",\"require\":\"RS\",\"sub_keys\":\"aa~bb\"}";
262 address_.region_code = "rrr";
263 address_.administrative_area = "sss";
265 expected_.insert(std::make_pair(ADMIN_AREA, UNKNOWN_VALUE));
267 ASSERT_NO_FATAL_FAILURE(Validate());
268 ASSERT_TRUE(called_);
269 EXPECT_EQ(expected_, problems_);
272 TEST_F(ValidationTaskTest, NoUnknownValueRuleNotNull) {
273 json_[0] = "{\"fmt\":\"%R%S\",\"require\":\"RS\",\"sub_keys\":\"aa~bb\"}";
276 address_.region_code = "rrr";
277 address_.administrative_area = "sss";
279 ASSERT_NO_FATAL_FAILURE(Validate());
280 ASSERT_TRUE(called_);
281 EXPECT_EQ(expected_, problems_);
284 TEST_F(ValidationTaskTest, PostalCodeUnrecognizedFormatTooShort) {
285 json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
287 address_.region_code = "rrr";
288 address_.postal_code = "12";
290 expected_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
292 ASSERT_NO_FATAL_FAILURE(Validate());
293 ASSERT_TRUE(called_);
294 EXPECT_EQ(expected_, problems_);
297 TEST_F(ValidationTaskTest, PostalCodeUnrecognizedFormatTooLong) {
298 json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
300 address_.region_code = "rrr";
301 address_.postal_code = "1234";
303 expected_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
305 ASSERT_NO_FATAL_FAILURE(Validate());
306 ASSERT_TRUE(called_);
307 EXPECT_EQ(expected_, problems_);
310 TEST_F(ValidationTaskTest, PostalCodeRecognizedFormat) {
311 json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
313 address_.region_code = "rrr";
314 address_.postal_code = "123";
316 ASSERT_NO_FATAL_FAILURE(Validate());
317 ASSERT_TRUE(called_);
318 EXPECT_EQ(expected_, problems_);
321 TEST_F(ValidationTaskTest, PostalCodeMismatchingValue1) {
322 json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
323 json_[1] = "{\"zip\":\"1\"}";
325 address_.region_code = "rrr";
326 address_.postal_code = "000";
328 expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
330 ASSERT_NO_FATAL_FAILURE(Validate());
331 ASSERT_TRUE(called_);
332 EXPECT_EQ(expected_, problems_);
335 TEST_F(ValidationTaskTest, PostalCodeMismatchingValue2) {
336 json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
337 json_[1] = "{\"zip\":\"1\"}";
338 json_[2] = "{\"zip\":\"12\"}";
340 address_.region_code = "rrr";
341 address_.postal_code = "100";
343 expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
345 ASSERT_NO_FATAL_FAILURE(Validate());
346 ASSERT_TRUE(called_);
347 EXPECT_EQ(expected_, problems_);
350 TEST_F(ValidationTaskTest, PostalCodeMismatchingValue3) {
351 json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
352 json_[1] = "{\"zip\":\"1\"}";
353 json_[2] = "{\"zip\":\"12\"}";
354 json_[3] = "{\"zip\":\"123\"}";
356 address_.region_code = "rrr";
357 address_.postal_code = "120";
359 expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
361 ASSERT_NO_FATAL_FAILURE(Validate());
362 ASSERT_TRUE(called_);
363 EXPECT_EQ(expected_, problems_);
366 TEST_F(ValidationTaskTest, PostalCodeMatchingValue) {
367 json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{3}\"}";
368 json_[1] = "{\"zip\":\"1\"}";
369 json_[2] = "{\"zip\":\"12\"}";
370 json_[3] = "{\"zip\":\"123\"}";
372 address_.region_code = "rrr";
373 address_.postal_code = "123";
375 ASSERT_NO_FATAL_FAILURE(Validate());
376 ASSERT_TRUE(called_);
377 EXPECT_EQ(expected_, problems_);
380 TEST_F(ValidationTaskTest, PostalCodePrefixMismatchingValue) {
381 json_[0] = "{\"fmt\":\"%Z\",\"zip\":\"\\\\d{5}\"}";
382 json_[1] = "{\"zip\":\"9[0-5]|96[01]\"}";
384 address_.region_code = "rrr";
385 address_.postal_code = "10960";
387 expected_.insert(std::make_pair(POSTAL_CODE, MISMATCHING_VALUE));
389 ASSERT_NO_FATAL_FAILURE(Validate());
390 ASSERT_TRUE(called_);
391 EXPECT_EQ(expected_, problems_);
394 TEST_F(ValidationTaskTest, PostalCodeFilterIgnoresMismatching) {
395 json_[0] = "{\"zip\":\"\\\\d{3}\"}";
396 json_[1] = "{\"zip\":\"1\"}";
398 address_.region_code = "rrr";
399 address_.postal_code = "000";
401 filter_.erase(POSTAL_CODE);
402 filter_.insert(std::make_pair(POSTAL_CODE, INVALID_FORMAT));
404 // (POSTAL_CODE, MISMATCHING_VALUE) should not be reported.
406 ASSERT_NO_FATAL_FAILURE(Validate());
407 ASSERT_TRUE(called_);
408 EXPECT_EQ(expected_, problems_);
411 TEST_F(ValidationTaskTest, UsesPoBoxLanguageUnd) {
412 json_[0] = "{\"fmt\":\"%A\"}";
414 address_.region_code = "rrr";
415 address_.address_line.push_back("aaa");
416 address_.address_line.push_back("P.O. Box");
417 address_.address_line.push_back("aaa");
419 expected_.insert(std::make_pair(STREET_ADDRESS, USES_P_O_BOX));
421 ASSERT_NO_FATAL_FAILURE(Validate());
422 ASSERT_TRUE(called_);
423 EXPECT_EQ(expected_, problems_);
426 TEST_F(ValidationTaskTest, UsesPoBoxLanguageDa) {
427 json_[0] = "{\"fmt\":\"%A\",\"languages\":\"da\"}";
429 address_.region_code = "rrr";
430 address_.address_line.push_back("aaa");
431 address_.address_line.push_back("Postboks");
432 address_.address_line.push_back("aaa");
434 expected_.insert(std::make_pair(STREET_ADDRESS, USES_P_O_BOX));
436 ASSERT_NO_FATAL_FAILURE(Validate());
437 ASSERT_TRUE(called_);
438 EXPECT_EQ(expected_, problems_);
441 TEST_F(ValidationTaskTest, UsesPoBoxLanguageDaNotMatchDe) {
442 json_[0] = "{\"fmt\":\"%A\",\"languages\":\"da\"}";
444 address_.region_code = "rrr";
445 address_.address_line.push_back("aaa");
446 address_.address_line.push_back("Postfach");
447 address_.address_line.push_back("aaa");
449 ASSERT_NO_FATAL_FAILURE(Validate());
450 ASSERT_TRUE(called_);
451 EXPECT_EQ(expected_, problems_);
454 TEST_F(ValidationTaskTest, UsesPoBoxAllowPostal) {
455 json_[0] = "{\"fmt\":\"%A\"}";
457 address_.region_code = "rrr";
458 address_.address_line.push_back("aaa");
459 address_.address_line.push_back("P.O. Box");
460 address_.address_line.push_back("aaa");
462 allow_postal_ = true;
464 ASSERT_NO_FATAL_FAILURE(Validate());
465 ASSERT_TRUE(called_);
466 EXPECT_EQ(expected_, problems_);
470 } // namespace addressinput