1 /* 2 * Copyright (C) 2010 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.i18n.addressinput; 18 19 import com.android.i18n.addressinput.testing.AddressDataMapLoader; 20 21 import junit.framework.TestCase; 22 23 /** 24 * Spot check the standard data set for various cases of interest. This is not an exhaustive test. 25 */ 26 public class FieldVerifierTest extends TestCase { 27 28 private static final StandardAddressVerifier VERIFIER = 29 new StandardAddressVerifier(new FieldVerifier( 30 new AddressVerificationData(AddressDataMapLoader.DATA))); 31 32 private AddressProblems problems = new AddressProblems(); 33 34 @Override 35 protected void setUp() { 36 problems.clear(); 37 } 38 39 public void testUnitedStatesOk() { 40 AddressData addr = new AddressData.Builder().setCountry("US") 41 .setAdminArea("CA") 42 .setLocality("Mountain View") 43 .setAddress("1234 Somewhere") 44 .setPostalCode("94025").build(); 45 VERIFIER.verify(addr, problems); 46 assertTrue(problems.toString(), problems.isEmpty()); // no mismatch 47 } 48 49 public void testUnitedStatesZipMismatch() { 50 AddressData addr = new AddressData.Builder().setCountry("US") 51 .setAdminArea("CA") 52 .setLocality("Mountain View") 53 .setPostalCode("12345").build(); 54 VERIFIER.verify(addr, problems); 55 56 assertEquals(AddressProblemType.MISMATCHING_VALUE, 57 problems.getProblem(AddressField.POSTAL_CODE)); 58 } 59 60 public void testUnitedStatesNotOk() { 61 AddressData addr = new AddressData.Builder().setCountry("US") 62 .setAdminArea("CA") 63 .setLocality(null) 64 .setDependentLocality("Foo Bar") 65 .setPostalCode("12345").build(); 66 VERIFIER.verify(addr, problems); 67 68 assertEquals(AddressProblemType.MISMATCHING_VALUE, 69 problems.getProblem(AddressField.POSTAL_CODE)); 70 assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD, 71 problems.getProblem(AddressField.LOCALITY)); 72 } 73 74 public void testChinaOk() { 75 AddressData addr = new AddressData.Builder().setCountry("CN") 76 .setAdminArea("Beijing Shi") 77 .setLocality("Xicheng Qu") 78 .setAddress("Yitiao Lu") 79 .setPostalCode("123456").build(); 80 VERIFIER.verify(addr, problems); 81 assertTrue(problems.isEmpty()); 82 } 83 84 public void testGermanAddress() { 85 AddressData addr = new AddressData.Builder().setCountry("DE") 86 .setLocality("Berlin") 87 .setAddress("Huttenstr. 50") 88 .setPostalCode("10553") 89 .setOrganization("BMW AG Niederkassung Berlin") 90 .setRecipient("Herr Diefendorf").build(); 91 92 VERIFIER.verify(addr, problems); 93 assertTrue(problems.isEmpty()); 94 95 // Clones address but leave city empty. 96 addr = new AddressData.Builder().set(addr).setLocality(null).build(); 97 98 VERIFIER.verify(addr, problems); 99 assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD, 100 problems.getProblem(AddressField.LOCALITY)); 101 } 102 103 public void testIrishAddress() { 104 AddressData addr = new AddressData.Builder().setCountry("IE") 105 .setLocality("Dublin") 106 .setAdminArea("Co. Dublin") 107 .setAddress("7424 118 Avenue NW") 108 .setRecipient("Conan O'Brien").build(); 109 110 VERIFIER.verify(addr, problems); 111 assertTrue(problems.toString(), problems.isEmpty()); 112 113 // Clones address but leave county empty. This address should be valid 114 // since county is not required. 115 addr = new AddressData.Builder().set(addr).setAdminArea(null).build(); 116 117 VERIFIER.verify(addr, problems); 118 assertTrue(problems.toString(), problems.isEmpty()); 119 } 120 121 public void testChinaPostalCodeBadFormat() { 122 AddressData addr = new AddressData.Builder().setCountry("CN") 123 .setAdminArea("Beijing Shi") 124 .setLocality("Xicheng Qu") 125 .setPostalCode("12345").build(); 126 VERIFIER.verify(addr, problems); 127 128 assertEquals(AddressProblemType.UNRECOGNIZED_FORMAT, 129 problems.getProblem(AddressField.POSTAL_CODE)); 130 } 131 132 /** 133 * If there is a postal code pattern for a certain country, and the input postal code is empty, 134 * it should not be reported as bad postal code format. Whether empty postal code is ok should 135 * be determined by checks for required fields. 136 */ 137 public void testEmptyPostalCodeReportedAsGoodFormat() { 138 // Chilean address has a postal code format pattern, but does not require 139 // postal code. The following address is valid. 140 AddressData addr = new AddressData.Builder().setCountry("CL") 141 .setAddressLine1("GUSTAVO LE PAIGE ST #159") 142 .setAdminArea("Atacama") 143 .setLocality("San Pedro") 144 .setPostalCode("") 145 .build(); 146 VERIFIER.verify(addr, problems); 147 assertTrue(problems.toString(), problems.isEmpty()); 148 149 problems.clear(); 150 151 // Now check for US addresses, which require a postal code. The following 152 // address's postal code is wrong because it is missing a required field, not 153 // because it doesn't match the expected postal code pattern. 154 addr = new AddressData.Builder().setCountry("US").setPostalCode("").build(); 155 problems.clear(); 156 VERIFIER.verify(addr, problems); 157 158 assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD, 159 problems.getProblem(AddressField.POSTAL_CODE)); 160 } 161 162 public void testChinaTaiwanOk() { 163 AddressData addr = new AddressData.Builder().setCountry("CN") 164 .setAdminArea("Taiwan") 165 .setLocality("Taichung City") 166 .setDependentLocality("Situn District") 167 .setAddress("12345 Yitiao Lu") 168 .setPostalCode("407").build(); 169 VERIFIER.verify(addr, problems); 170 assertTrue(problems.isEmpty()); 171 } 172 173 public void testChinaTaiwanUnknownDistrict() { 174 AddressData addr = new AddressData.Builder().setCountry("CN") 175 .setAdminArea("Taiwan") 176 .setLocality("Taichung City") 177 .setDependentLocality("Foo Bar") 178 .setPostalCode("400").build(); 179 VERIFIER.verify(addr, problems); 180 181 assertEquals(AddressProblemType.UNKNOWN_VALUE, 182 problems.getProblem(AddressField.DEPENDENT_LOCALITY)); 183 } 184 185 public void testStreetVerification() { 186 // Missing street address 187 AddressData addr = new AddressData.Builder().setCountry("US") 188 .setAdminArea("CA") 189 .setLocality("Mountain View") 190 .setPostalCode("94025").build(); 191 192 assertNull(addr.getAddressLine1()); 193 assertNull(addr.getAddressLine2()); 194 195 VERIFIER.verify(addr, problems); 196 197 assertEquals(AddressProblemType.MISSING_REQUIRED_FIELD, 198 problems.getProblem(AddressField.STREET_ADDRESS)); 199 } 200 201 // Tests The Bahamas' address 202 public void failingtestBahamas() { 203 final AddressData address = 204 new AddressData.Builder().setAddress("Abaco Beach Resort & Boat Habour") 205 .setLocality("Treasure Cay") 206 .setAdminArea("Abaco") 207 .setCountry("BS").build(); 208 VERIFIER.verify(address, problems); 209 assertTrue(problems.isEmpty()); 210 } 211 212 public void testJapan() { 213 // Added AdminArea since address verification can't infer it from Kyoto City 214 // Commented out dependent locality since we don't have the data for this and in fact say 215 // that it shouldn't be used for Japan. 216 // TODO: support inference of higher levels from lower ones 217 final AddressData address = new AddressData.Builder() 218 .setRecipient("\u5BAE\u672C \u8302") // SHIGERU_MIYAMOTO 219 .setAddress("\u4E0A\u9CE5\u7FBD\u927E\u7ACB\u753A11\u756A\u5730") 220 .setAdminArea("\u4eac\u90fd\u5e9c") // Kyoto prefecture, added 221 .setLocality("\u4EAC\u90FD\u5E02") // Kyoto city 222 // .setDependentLocality("\u5357\u533A") 223 .setCountry("JP") 224 .setPostalCode("601-8501").build(); 225 VERIFIER.verify(address, problems); 226 assertTrue(problems.toString(), problems.isEmpty()); 227 } 228 229 public void testJapanLatin() { 230 // added AdminArea since address verification can't infer it from Kyoto City 231 // commented out dependent locality since address verification doesn't use it 232 final AddressData address = new AddressData.Builder() 233 .setRecipient("Shigeru Miyamoto") // SHIGERU_MIYAMOTO_ENGLISH 234 .setAddress("11-1 Kamitoba-hokotate-cho") 235 .setAdminArea("KYOTO") // added 236 .setLocality("Kyoto") 237 // .setDependentLocality("Minami-ku") 238 .setLanguageCode("ja_Latn") 239 .setCountry("JP") 240 .setPostalCode("601-8501").build(); 241 VERIFIER.verify(address, problems); 242 assertTrue(problems.isEmpty()); 243 } 244 245 public void testJapanLatinInvalidAdmin() { 246 final AddressData address = new AddressData.Builder() 247 .setRecipient("Shigeru Miyamoto") // SHIGERU_MIYAMOTO_ENGLISH 248 .setAddress("11-1 Kamitoba-hokotate-cho") 249 .setAdminArea("Fake Admin") 250 .setLocality("Kyoto") 251 .setLanguageCode("ja_Latn") 252 .setCountry("JP") 253 .setPostalCode("601-8501").build(); 254 VERIFIER.verify(address, problems); 255 assertFalse(problems.isEmpty()); 256 assertEquals(AddressProblemType.UNKNOWN_VALUE, 257 problems.getProblem(AddressField.ADMIN_AREA)); 258 } 259 260 public void testCanadaMixedCasePostcode() { 261 final AddressData address = new AddressData.Builder() 262 .setRecipient("Joe Bloggs") 263 .setAddress("11 East St") 264 .setLocality("Montreal") 265 .setAdminArea("Quebec") 266 .setCountry("CA") 267 .setPostalCode("H2b 2y5").build(); 268 VERIFIER.verify(address, problems); 269 assertTrue(problems.isEmpty()); 270 } 271 } 272