blob: c5a75588dea39bb56107af12353ce122573834f3 [file] [log] [blame]
/*
* Copyright (C) 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.i18n.addressinput;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
/**
* Spot check the standard data set for various cases of interest. This is not an exhaustive test.
*/
public class StandardAddressVerifierTest extends TestCase {
private AddressProblems problems = new AddressProblems();
private StandardAddressVerifier verifier;
@Override
protected void setUp() {
problems.clear();
verifier = new StandardAddressVerifier(new FieldVerifier(new ClientData(new CacheData())),
StandardChecks.PROBLEM_MAP);
}
public void testCustomProblemMapRespected() {
AddressData usAddress = new AddressData.Builder().setCountry("US")
.setAdminArea("Fake")
.setAddress("1234 Somewhere")
.setPostalCode("9402")
.build();
verifier.verify(usAddress, problems);
assertFalse(problems.toString(), problems.isEmpty());
assertEquals(AddressProblemType.UNRECOGNIZED_FORMAT,
problems.getProblem(AddressField.POSTAL_CODE));
assertEquals(AddressProblemType.UNKNOWN_VALUE,
problems.getProblem(AddressField.ADMIN_AREA));
// TODO: The standard address verifier fails to properly validate lower-level fields if a
// higher-level field is of the wrong value. This is incorrect, and needs to be fixed.
// assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
// problems.getProblem(AddressField.LOCALITY));
// Now pass in a custom problem map.
Map<AddressField, List<AddressProblemType>> customProblems =
new HashMap<AddressField, List<AddressProblemType>>();
StandardAddressVerifier emptyProblemVerifier = new StandardAddressVerifier(
new FieldVerifier(new ClientData(new CacheData())), customProblems);
problems.clear();
emptyProblemVerifier.verify(usAddress, problems);
// We aren't looking for any problems, so shouldn't find any.
assertTrue(problems.toString(), problems.isEmpty());
// Lastly try with a map that only looks for postal code problems.
List<AddressProblemType> postalCodeProblems = new ArrayList<AddressProblemType>();
postalCodeProblems.add(AddressProblemType.UNRECOGNIZED_FORMAT);
postalCodeProblems.add(AddressProblemType.MISSING_REQUIRED_FIELD);
customProblems.put(AddressField.POSTAL_CODE, postalCodeProblems);
StandardAddressVerifier postalCodeProblemVerifier = new StandardAddressVerifier(
new FieldVerifier(new ClientData(new CacheData())), customProblems);
problems.clear();
postalCodeProblemVerifier.verify(usAddress, problems);
assertFalse(problems.toString(), problems.isEmpty());
assertEquals(AddressProblemType.UNRECOGNIZED_FORMAT,
problems.getProblem(AddressField.POSTAL_CODE));
assertNull(problems.getProblem(AddressField.ADMIN_AREA));
}
public void testUnitedStatesOk() {
AddressData addr = new AddressData.Builder().setCountry("US")
.setAdminArea("CA")
.setLocality("Mountain View")
.setAddress("1234 Somewhere")
.setPostalCode("94025")
.build();
verifier.verify(addr, problems);
assertTrue(problems.toString(), problems.isEmpty()); // no mismatch
}
public void testUnitedStatesZipMismatch() {
AddressData addr = new AddressData.Builder().setCountry("US")
.setAdminArea("CA")
.setLocality("Mountain View")
.setPostalCode("12345")
.build();
verifier.verify(addr, problems);
assertEquals(AddressProblemType.MISMATCHING_VALUE,
problems.getProblem(AddressField.POSTAL_CODE));
}
public void testUnitedStatesNotOk() {
AddressData addr = new AddressData.Builder().setCountry("US")
.setAdminArea("CA")
.setLocality(null)
.setDependentLocality("Foo Bar")
.setPostalCode("12345")
.build();
verifier.verify(addr, problems);
assertEquals(AddressProblemType.MISMATCHING_VALUE,
problems.getProblem(AddressField.POSTAL_CODE));
assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
problems.getProblem(AddressField.LOCALITY));
}
public void testChinaOk() {
AddressData addr = new AddressData.Builder().setCountry("CN")
.setAdminArea("Beijing Shi")
.setLocality("Xicheng Qu")
.setAddress("Yitiao Lu")
.setPostalCode("123456")
.build();
verifier.verify(addr, problems);
assertTrue(problems.toString(), problems.isEmpty());
}
public void testGermanAddress() {
AddressData addr = new AddressData.Builder().setCountry("DE")
.setLocality("Berlin")
.setAddress("Huttenstr. 50")
.setPostalCode("10553")
.setOrganization("BMW AG Niederkassung Berlin")
.setRecipient("Herr Diefendorf")
.build();
verifier.verify(addr, problems);
assertTrue(problems.toString(), problems.isEmpty());
// Clones address but leave city empty.
addr = new AddressData.Builder().set(addr).setLocality(null).build();
verifier.verify(addr, problems);
assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
problems.getProblem(AddressField.LOCALITY));
}
public void testIrishAddress() {
AddressData addr = new AddressData.Builder().setCountry("IE")
.setLocality("Dublin")
.setAdminArea("Co. Dublin")
.setAddress("7424 118 Avenue NW")
.setRecipient("Conan O'Brien")
.build();
verifier.verify(addr, problems);
assertTrue(problems.toString(), problems.isEmpty());
// Clones address but leave county empty. This address should be valid
// since county is not required.
addr = new AddressData.Builder().set(addr).setAdminArea(null).build();
verifier.verify(addr, problems);
assertTrue(problems.toString(), problems.isEmpty());
}
public void testChinaPostalCodeBadFormat() {
AddressData addr = new AddressData.Builder().setCountry("CN")
.setAdminArea("Beijing Shi")
.setLocality("Xicheng Qu")
.setPostalCode("12345")
.build();
verifier.verify(addr, problems);
// ensure problem is unrecognized format and problem is in POSTAL_CODE
assertEquals(AddressProblemType.UNRECOGNIZED_FORMAT,
problems.getProblem(AddressField.POSTAL_CODE));
}
/**
* If there is a postal code pattern for a certain country, and the input postal code is empty,
* it should not be reported as bad postal code format. Whether an empty postal code is ok
* should be determined by checks for required fields.
*/
public void testEmptyPostalCodeReportedAsGoodFormat() {
// Chilean address has a postal code format pattern, but does not require
// postal code. The following address is valid.
AddressData addr = new AddressData.Builder().setCountry("CL")
.setAddressLine1("GUSTAVO LE PAIGE ST #159")
.setAdminArea("Atacama")
.setLocality("Alto del Carmen")
.setPostalCode("")
.build();
verifier.verify(addr, problems);
assertTrue(problems.toString(), problems.isEmpty());
problems.clear();
// Now checks for US addresses, which requires postal code. The following
// address's postal code is wrong because it misses required field, not
// because it mismatches expected postal code pattern.
addr = new AddressData.Builder().setCountry("US").setPostalCode("").build();
problems.clear();
verifier.verify(addr, problems);
assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
problems.getProblem(AddressField.POSTAL_CODE));
}
public void testChinaTaiwanOk() {
AddressData addr = new AddressData.Builder().setCountry("CN")
.setAdminArea("Taiwan")
.setLocality("Taichung City")
.setDependentLocality("Situn District")
.setAddress("12345 Yitiao Lu")
.setPostalCode("407")
.build();
verifier.verify(addr, problems);
assertTrue(problems.toString(), problems.isEmpty());
}
public void testChinaTaiwanUnknownDistrict() {
AddressData addr = new AddressData.Builder().setCountry("CN")
.setAdminArea("Taiwan")
.setLocality("Taichung City")
.setDependentLocality("Foo Bar")
.setPostalCode("400")
.build();
verifier.verify(addr, problems);
assertEquals(AddressProblemType.UNKNOWN_VALUE,
problems.getProblem(AddressField.DEPENDENT_LOCALITY));
}
public void testStreetVerification() {
// missing street address
AddressData addr = new AddressData.Builder().setCountry("US")
.setAdminArea("CA")
.setLocality("Mountain View")
.setPostalCode("94025")
.build();
assertNull(addr.getAddressLine1());
assertNull(addr.getAddressLine2());
verifier.verify(addr, problems);
assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD,
problems.getProblem(AddressField.STREET_ADDRESS));
}
// Tests The Bahamas' address
public void failingtestBahamas() {
final AddressData address =
new AddressData.Builder().setAddress("Abaco Beach Resort & Boat Habour")
.setLocality("Treasure Cay")
.setAdminArea("Abaco")
.setCountry("BS")
.build();
verifier.verify(address, problems);
assertTrue(problems.toString(), problems.isEmpty());
}
public void testJapan() {
// added AdminArea since address verification can't infer it from Kyoto City
// commented out dependent locality since address verification doesn't use it
// TODO: support inference of higher levels from lower ones
// TODO: add dependent locality support for japan addresses
final AddressData address =
new AddressData.Builder()
.setRecipient("\u5BAE\u672C \u8302") // SHIGERU_MIYAMOTO
.setAddress("\u4E0A\u9CE5\u7FBD\u927E\u7ACB\u753A11\u756A\u5730")
.setAdminArea("\u4eac\u90fd\u5e9c") // Kyoto prefecture, added
.setLocality("\u4EAC\u90FD\u5E02") // Kyoto city
// .setDependentLocality("\u5357\u533A")
.setCountry("JP")
.setPostalCode("601-8501")
.build();
verifier.verify(address, problems);
assertTrue(problems.toString(), problems.isEmpty());
}
public void testJapanLatin() {
// added AdminArea since address verification can't infer it from Kyoto City
// commented out dependent locality since address verification doesn't use it
final AddressData address =
new AddressData.Builder()
.setRecipient("Shigeru Miyamoto") // SHIGERU_MIYAMOTO_ENGLISH
.setAddress("11-1 Kamitoba-hokotate-cho")
.setAdminArea("KYOTO") // Kyoto prefecture, added
.setLocality("Kyoto") // Kyoto city
// .setDependentLocality("Minami-ku")
.setLanguageCode("ja_Latn")
.setCountry("JP")
.setPostalCode("601-8501")
.build();
verifier.verify(address, problems);
assertTrue(problems.toString(), problems.isEmpty());
}
}