Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright 2018 The Android Open Source Project
      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 androidx.core.text.util;
     18 
     19 import android.support.test.filters.SmallTest;
     20 import android.support.test.runner.AndroidJUnit4;
     21 
     22 import org.junit.Assert;
     23 import org.junit.Test;
     24 import org.junit.runner.RunWith;
     25 
     26 import java.util.regex.MatchResult;
     27 
     28 /**
     29  * Tests for FindAddress implementation.
     30  *
     31  * https://cs.chromium.org/chromium/src/android_webview/javatests/src/org/chromium
     32  * /android_webview/test/FindAddressTest.java
     33  */
     34 @SmallTest
     35 @RunWith(AndroidJUnit4.class)
     36 public class FindAddressTest {
     37     private void assertExpectedMatch(MatchResult match, String exptectedMatch) {
     38         Assert.assertNotNull(match);
     39         Assert.assertEquals(match.group(0), exptectedMatch);
     40     }
     41 
     42     private void assertIsAddress(String address) {
     43         Assert.assertEquals(address, FindAddress.findAddress(address));
     44     }
     45 
     46     private boolean containsAddress(String address) {
     47         return FindAddress.findAddress(address) != null;
     48     }
     49 
     50     private boolean isAddress(String address) {
     51         return FindAddress.findAddress(address).equals(address);
     52     }
     53 
     54     @Test
     55     public void testFullAddress() {
     56         // Test US Google corporate addresses. Expects a full string match.
     57         assertIsAddress("1600 Amphitheatre Parkway Mountain View, CA 94043");
     58         assertIsAddress("201 S. Division St. Suite 500 Ann Arbor, MI 48104");
     59         Assert.assertTrue(containsAddress(
     60                 "Millennium at Midtown 10 10th Street NE Suite 600 Atlanta, GA 30309"));
     61         assertIsAddress("9606 North MoPac Expressway Suite 400 Austin, TX 78759");
     62         assertIsAddress("2590 Pearl Street Suite 100 Boulder, CO 80302");
     63         assertIsAddress("5 Cambridge Center, Floors 3-6 Cambridge, MA 02142");
     64         assertIsAddress("410 Market St Suite 415 Chapel Hill, NC 27516");
     65         assertIsAddress("20 West Kinzie St. Chicago, IL 60654");
     66         assertIsAddress("114 Willits Street Birmingham, MI 48009");
     67         assertIsAddress("19540 Jamboree Road 2nd Floor Irvine, CA 92612");
     68         assertIsAddress("747 6th Street South, Kirkland, WA 98033");
     69         assertIsAddress("301 S. Blount St. Suite 301 Madison, WI 53703");
     70         assertIsAddress("76 Ninth Avenue 4th Floor New York, NY 10011");
     71         Assert.assertTrue(containsAddress(
     72                 "Chelsea Markset Space, 75 Ninth Avenue 2nd and 4th Floors New York, NY 10011"));
     73         assertIsAddress("6425 Penn Ave. Suite 700 Pittsburgh, PA 15206");
     74         assertIsAddress("1818 Library Street Suite 400 Reston, VA 20190");
     75         assertIsAddress("345 Spear Street Floors 2-4 San Francisco, CA 94105");
     76         assertIsAddress("604 Arizona Avenue Santa Monica, CA 90401");
     77         assertIsAddress("651 N. 34th St. Seattle, WA 98103");
     78         Assert.assertTrue(
     79                 isAddress("1101 New York Avenue, N.W. Second Floor Washington, DC 20005"));
     80 
     81         // Other tests.
     82         assertIsAddress("57th Street and Lake Shore Drive\nChicago, IL 60637");
     83         assertIsAddress("308 Congress Street Boston, MA 02210");
     84         Assert.assertTrue(
     85                 containsAddress("Central Park West at 79th Street, New York, NY, 10024-5192"));
     86         Assert.assertTrue(containsAddress(
     87                 "Lincoln Park | 100 34th Avenue  San Francisco, CA 94121 | 41575036"));
     88 
     89         Assert.assertEquals(
     90                 FindAddress.findAddress(
     91                         "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do "
     92                                 + "1600 Amphitheatre Parkway Mountain View, CA 94043 eiusmod "
     93                                 + "tempor incididunt ut labore et dolore magna aliqua."),
     94                 "1600 Amphitheatre Parkway Mountain View, CA 94043");
     95 
     96         Assert.assertEquals(FindAddress.findAddress("2590 Pearl Street Suite 100 Boulder, CO 80302 "
     97                         + "6425 Penn Ave. Suite 700 Pittsburgh, PA 15206"),
     98                 "2590 Pearl Street Suite 100 Boulder, CO 80302");
     99 
    100         assertIsAddress("5400 Preston Oaks Rd Dallas TX 75254");
    101         assertIsAddress("5400 Preston Oaks Road Dallas TX 75254");
    102         assertIsAddress("5400 Preston Oaks Ave Dallas TX 75254");
    103 
    104         Assert.assertTrue(
    105                 containsAddress(" 1600 Amphitheatre Parkway Mountain View, CA 94043 "));
    106 
    107         Assert.assertFalse(containsAddress("1 st. too-short, CA 90000"));
    108         Assert.assertTrue(containsAddress("1 st. long enough, CA 90000"));
    109 
    110         Assert.assertTrue(containsAddress("1 st. some city in al 35000"));
    111         Assert.assertFalse(containsAddress("1 book st Aquinas et al 35000"));
    112 
    113         Assert.assertFalse(containsAddress("1 this comes too late: street, CA 90000"));
    114         Assert.assertTrue(containsAddress("1 this is ok: street, CA 90000"));
    115 
    116         Assert.assertFalse(
    117                 containsAddress("1 street I love verbosity, so I'm writing an address with "
    118                         + "too many words CA 90000"));
    119         Assert.assertTrue(containsAddress("1 street 2 3 4 5 6 7 8 9 10 11 12, CA 90000"));
    120 
    121         assertIsAddress("79th Street 1st Floor New York City, NY 10024-5192");
    122 
    123         assertIsAddress("79th Street 1st Floor New York 10024-5192");
    124         assertIsAddress("79th Street 1st Floor New  York 10024-5192");
    125         Assert.assertNull(FindAddress.findAddress("79th Street 1st Floor New\nYork 10024-5192"));
    126         Assert.assertNull(FindAddress.findAddress("79th Street 1st Floor New, York 10024-5192"));
    127 
    128         Assert.assertFalse(containsAddress("123 Fake Street, Springfield, Springfield"));
    129         Assert.assertFalse(containsAddress("999 Street Avenue, City, ZZ 98765"));
    130         Assert.assertFalse(containsAddress("76 Here be dragons, CA 94043"));
    131         Assert.assertFalse(containsAddress("1 This, has, too* many, lines, to, be* valid"));
    132         Assert.assertFalse(
    133                 containsAddress("1 Supercalifragilisticexpialidocious is too long, CA 90000"));
    134         Assert.assertFalse(containsAddress(""));
    135     }
    136 
    137     @Test
    138     public void testFullAddressWithoutZipCode() {
    139         assertIsAddress("1600 Amphitheatre Parkway Mountain View, CA");
    140         assertIsAddress("201 S. Division St. Suite 500 Ann Arbor, MI");
    141 
    142         // Check that addresses without a zip code are only accepted at the end of the string.
    143         // This isn't implied by the documentation but was the case in the old implementation
    144         // and fixing this bug creates a lot of false positives while fixing relatively few
    145         // false negatives. In these examples, "one point" is parsed as a street and "as" is a
    146         // state abbreviation (this is taken from a false positive reported in a bug).
    147         Assert.assertTrue(containsAddress("one point I was as"));
    148         Assert.assertTrue(containsAddress("At one point I was as ignorant as"));
    149         Assert.assertFalse(containsAddress("At one point I was as ignorant as them"));
    150     }
    151 
    152     @Test
    153     public void testNumberPrefixCases() {
    154         Assert.assertEquals(
    155                 FindAddress.findAddress("Cafe 21\n750 Fifth Ave. San Diego, California 92101"),
    156                 "750 Fifth Ave. San Diego, California 92101");
    157         Assert.assertEquals(
    158                 FindAddress.findAddress(
    159                         "Century City 15\n 10250 Santa Monica Boulevard Los Angeles, CA 90067"),
    160                 "10250 Santa Monica Boulevard Los Angeles, CA 90067");
    161         Assert.assertEquals(FindAddress.findAddress("123 45\n67 My Street, Somewhere, NY 10000"),
    162                 "67 My Street, Somewhere, NY 10000");
    163         assertIsAddress("123 4th Avenue, Somewhere in NY 10000");
    164     }
    165 
    166     @Test
    167     public void testLocationName() {
    168         Assert.assertFalse(FindAddress.isValidLocationName("str-eet"));
    169         Assert.assertFalse(FindAddress.isValidLocationName("somewhere"));
    170 
    171         // Test all supported street names and expected plural cases.
    172         Assert.assertTrue(FindAddress.isValidLocationName("alley"));
    173         Assert.assertTrue(FindAddress.isValidLocationName("annex"));
    174         Assert.assertTrue(FindAddress.isValidLocationName("arcade"));
    175         Assert.assertTrue(FindAddress.isValidLocationName("ave."));
    176         Assert.assertTrue(FindAddress.isValidLocationName("avenue"));
    177         Assert.assertTrue(FindAddress.isValidLocationName("alameda"));
    178         Assert.assertTrue(FindAddress.isValidLocationName("bayou"));
    179         Assert.assertTrue(FindAddress.isValidLocationName("beach"));
    180         Assert.assertTrue(FindAddress.isValidLocationName("bend"));
    181         Assert.assertTrue(FindAddress.isValidLocationName("bluff"));
    182         Assert.assertTrue(FindAddress.isValidLocationName("bluffs"));
    183         Assert.assertTrue(FindAddress.isValidLocationName("bottom"));
    184         Assert.assertTrue(FindAddress.isValidLocationName("boulevard"));
    185         Assert.assertTrue(FindAddress.isValidLocationName("branch"));
    186         Assert.assertTrue(FindAddress.isValidLocationName("bridge"));
    187         Assert.assertTrue(FindAddress.isValidLocationName("brook"));
    188         Assert.assertTrue(FindAddress.isValidLocationName("brooks"));
    189         Assert.assertTrue(FindAddress.isValidLocationName("burg"));
    190         Assert.assertTrue(FindAddress.isValidLocationName("burgs"));
    191         Assert.assertTrue(FindAddress.isValidLocationName("bypass"));
    192         Assert.assertTrue(FindAddress.isValidLocationName("broadway"));
    193         Assert.assertTrue(FindAddress.isValidLocationName("camino"));
    194         Assert.assertTrue(FindAddress.isValidLocationName("camp"));
    195         Assert.assertTrue(FindAddress.isValidLocationName("canyon"));
    196         Assert.assertTrue(FindAddress.isValidLocationName("cape"));
    197         Assert.assertTrue(FindAddress.isValidLocationName("causeway"));
    198         Assert.assertTrue(FindAddress.isValidLocationName("center"));
    199         Assert.assertTrue(FindAddress.isValidLocationName("centers"));
    200         Assert.assertTrue(FindAddress.isValidLocationName("circle"));
    201         Assert.assertTrue(FindAddress.isValidLocationName("circles"));
    202         Assert.assertTrue(FindAddress.isValidLocationName("cliff"));
    203         Assert.assertTrue(FindAddress.isValidLocationName("cliffs"));
    204         Assert.assertTrue(FindAddress.isValidLocationName("club"));
    205         Assert.assertTrue(FindAddress.isValidLocationName("common"));
    206         Assert.assertTrue(FindAddress.isValidLocationName("corner"));
    207         Assert.assertTrue(FindAddress.isValidLocationName("corners"));
    208         Assert.assertTrue(FindAddress.isValidLocationName("course"));
    209         Assert.assertTrue(FindAddress.isValidLocationName("court"));
    210         Assert.assertTrue(FindAddress.isValidLocationName("courts"));
    211         Assert.assertTrue(FindAddress.isValidLocationName("cove"));
    212         Assert.assertTrue(FindAddress.isValidLocationName("coves"));
    213         Assert.assertTrue(FindAddress.isValidLocationName("creek"));
    214         Assert.assertTrue(FindAddress.isValidLocationName("crescent"));
    215         Assert.assertTrue(FindAddress.isValidLocationName("crest"));
    216         Assert.assertTrue(FindAddress.isValidLocationName("crossing"));
    217         Assert.assertTrue(FindAddress.isValidLocationName("crossroad"));
    218         Assert.assertTrue(FindAddress.isValidLocationName("curve"));
    219         Assert.assertTrue(FindAddress.isValidLocationName("circulo"));
    220         Assert.assertTrue(FindAddress.isValidLocationName("dale"));
    221         Assert.assertTrue(FindAddress.isValidLocationName("dam"));
    222         Assert.assertTrue(FindAddress.isValidLocationName("divide"));
    223         Assert.assertTrue(FindAddress.isValidLocationName("drive"));
    224         Assert.assertTrue(FindAddress.isValidLocationName("drives"));
    225         Assert.assertTrue(FindAddress.isValidLocationName("estate"));
    226         Assert.assertTrue(FindAddress.isValidLocationName("estates"));
    227         Assert.assertTrue(FindAddress.isValidLocationName("expressway"));
    228         Assert.assertTrue(FindAddress.isValidLocationName("extension"));
    229         Assert.assertTrue(FindAddress.isValidLocationName("extensions"));
    230         Assert.assertTrue(FindAddress.isValidLocationName("fall"));
    231         Assert.assertTrue(FindAddress.isValidLocationName("falls"));
    232         Assert.assertTrue(FindAddress.isValidLocationName("ferry"));
    233         Assert.assertTrue(FindAddress.isValidLocationName("field"));
    234         Assert.assertTrue(FindAddress.isValidLocationName("fields"));
    235         Assert.assertTrue(FindAddress.isValidLocationName("flat"));
    236         Assert.assertTrue(FindAddress.isValidLocationName("flats"));
    237         Assert.assertTrue(FindAddress.isValidLocationName("ford"));
    238         Assert.assertTrue(FindAddress.isValidLocationName("fords"));
    239         Assert.assertTrue(FindAddress.isValidLocationName("forest"));
    240         Assert.assertTrue(FindAddress.isValidLocationName("forge"));
    241         Assert.assertTrue(FindAddress.isValidLocationName("forges"));
    242         Assert.assertTrue(FindAddress.isValidLocationName("fork"));
    243         Assert.assertTrue(FindAddress.isValidLocationName("forks"));
    244         Assert.assertTrue(FindAddress.isValidLocationName("fort"));
    245         Assert.assertTrue(FindAddress.isValidLocationName("freeway"));
    246         Assert.assertTrue(FindAddress.isValidLocationName("garden"));
    247         Assert.assertTrue(FindAddress.isValidLocationName("gardens"));
    248         Assert.assertTrue(FindAddress.isValidLocationName("gateway"));
    249         Assert.assertTrue(FindAddress.isValidLocationName("glen"));
    250         Assert.assertTrue(FindAddress.isValidLocationName("glens"));
    251         Assert.assertTrue(FindAddress.isValidLocationName("green"));
    252         Assert.assertTrue(FindAddress.isValidLocationName("greens"));
    253         Assert.assertTrue(FindAddress.isValidLocationName("grove"));
    254         Assert.assertTrue(FindAddress.isValidLocationName("groves"));
    255         Assert.assertTrue(FindAddress.isValidLocationName("harbor"));
    256         Assert.assertTrue(FindAddress.isValidLocationName("harbors"));
    257         Assert.assertTrue(FindAddress.isValidLocationName("haven"));
    258         Assert.assertTrue(FindAddress.isValidLocationName("heights"));
    259         Assert.assertTrue(FindAddress.isValidLocationName("highway"));
    260         Assert.assertTrue(FindAddress.isValidLocationName("hill"));
    261         Assert.assertTrue(FindAddress.isValidLocationName("hills"));
    262         Assert.assertTrue(FindAddress.isValidLocationName("hollow"));
    263         Assert.assertTrue(FindAddress.isValidLocationName("inlet"));
    264         Assert.assertTrue(FindAddress.isValidLocationName("island"));
    265         Assert.assertTrue(FindAddress.isValidLocationName("islands"));
    266         Assert.assertTrue(FindAddress.isValidLocationName("isle"));
    267         Assert.assertTrue(FindAddress.isValidLocationName("junction"));
    268         Assert.assertTrue(FindAddress.isValidLocationName("junctions"));
    269         Assert.assertTrue(FindAddress.isValidLocationName("key"));
    270         Assert.assertTrue(FindAddress.isValidLocationName("keys"));
    271         Assert.assertTrue(FindAddress.isValidLocationName("knoll"));
    272         Assert.assertTrue(FindAddress.isValidLocationName("knolls"));
    273         Assert.assertTrue(FindAddress.isValidLocationName("lake"));
    274         Assert.assertTrue(FindAddress.isValidLocationName("lakes"));
    275         Assert.assertTrue(FindAddress.isValidLocationName("land"));
    276         Assert.assertTrue(FindAddress.isValidLocationName("landing"));
    277         Assert.assertTrue(FindAddress.isValidLocationName("lane"));
    278         Assert.assertTrue(FindAddress.isValidLocationName("light"));
    279         Assert.assertTrue(FindAddress.isValidLocationName("lights"));
    280         Assert.assertTrue(FindAddress.isValidLocationName("loaf"));
    281         Assert.assertTrue(FindAddress.isValidLocationName("lock"));
    282         Assert.assertTrue(FindAddress.isValidLocationName("locks"));
    283         Assert.assertTrue(FindAddress.isValidLocationName("lodge"));
    284         Assert.assertTrue(FindAddress.isValidLocationName("loop"));
    285         Assert.assertTrue(FindAddress.isValidLocationName("mall"));
    286         Assert.assertTrue(FindAddress.isValidLocationName("manor"));
    287         Assert.assertTrue(FindAddress.isValidLocationName("manors"));
    288         Assert.assertTrue(FindAddress.isValidLocationName("meadow"));
    289         Assert.assertTrue(FindAddress.isValidLocationName("meadows"));
    290         Assert.assertTrue(FindAddress.isValidLocationName("mews"));
    291         Assert.assertTrue(FindAddress.isValidLocationName("mill"));
    292         Assert.assertTrue(FindAddress.isValidLocationName("mills"));
    293         Assert.assertTrue(FindAddress.isValidLocationName("mission"));
    294         Assert.assertTrue(FindAddress.isValidLocationName("motorway"));
    295         Assert.assertTrue(FindAddress.isValidLocationName("mount"));
    296         Assert.assertTrue(FindAddress.isValidLocationName("mountain"));
    297         Assert.assertTrue(FindAddress.isValidLocationName("mountains"));
    298         Assert.assertTrue(FindAddress.isValidLocationName("neck"));
    299         Assert.assertTrue(FindAddress.isValidLocationName("orchard"));
    300         Assert.assertTrue(FindAddress.isValidLocationName("oval"));
    301         Assert.assertTrue(FindAddress.isValidLocationName("overpass"));
    302         Assert.assertTrue(FindAddress.isValidLocationName("park"));
    303         Assert.assertTrue(FindAddress.isValidLocationName("parks"));
    304         Assert.assertTrue(FindAddress.isValidLocationName("parkway"));
    305         Assert.assertTrue(FindAddress.isValidLocationName("parkways"));
    306         Assert.assertTrue(FindAddress.isValidLocationName("pass"));
    307         Assert.assertTrue(FindAddress.isValidLocationName("passage"));
    308         Assert.assertTrue(FindAddress.isValidLocationName("path"));
    309         Assert.assertTrue(FindAddress.isValidLocationName("pike"));
    310         Assert.assertTrue(FindAddress.isValidLocationName("pine"));
    311         Assert.assertTrue(FindAddress.isValidLocationName("pines"));
    312         Assert.assertTrue(FindAddress.isValidLocationName("plain"));
    313         Assert.assertTrue(FindAddress.isValidLocationName("plains"));
    314         Assert.assertTrue(FindAddress.isValidLocationName("plaza"));
    315         Assert.assertTrue(FindAddress.isValidLocationName("point"));
    316         Assert.assertTrue(FindAddress.isValidLocationName("points"));
    317         Assert.assertTrue(FindAddress.isValidLocationName("port"));
    318         Assert.assertTrue(FindAddress.isValidLocationName("ports"));
    319         Assert.assertTrue(FindAddress.isValidLocationName("prairie"));
    320         Assert.assertTrue(FindAddress.isValidLocationName("privada"));
    321         Assert.assertTrue(FindAddress.isValidLocationName("radial"));
    322         Assert.assertTrue(FindAddress.isValidLocationName("ramp"));
    323         Assert.assertTrue(FindAddress.isValidLocationName("ranch"));
    324         Assert.assertTrue(FindAddress.isValidLocationName("rapid"));
    325         Assert.assertTrue(FindAddress.isValidLocationName("rapids"));
    326         Assert.assertTrue(FindAddress.isValidLocationName("rd"));
    327         Assert.assertTrue(FindAddress.isValidLocationName("rd."));
    328         Assert.assertTrue(FindAddress.isValidLocationName("rest"));
    329         Assert.assertTrue(FindAddress.isValidLocationName("ridge"));
    330         Assert.assertTrue(FindAddress.isValidLocationName("ridges"));
    331         Assert.assertTrue(FindAddress.isValidLocationName("river"));
    332         Assert.assertTrue(FindAddress.isValidLocationName("road"));
    333         Assert.assertTrue(FindAddress.isValidLocationName("roads"));
    334         Assert.assertTrue(FindAddress.isValidLocationName("route"));
    335         Assert.assertTrue(FindAddress.isValidLocationName("row"));
    336         Assert.assertTrue(FindAddress.isValidLocationName("rue"));
    337         Assert.assertTrue(FindAddress.isValidLocationName("run"));
    338         Assert.assertTrue(FindAddress.isValidLocationName("shoal"));
    339         Assert.assertTrue(FindAddress.isValidLocationName("shoals"));
    340         Assert.assertTrue(FindAddress.isValidLocationName("shore"));
    341         Assert.assertTrue(FindAddress.isValidLocationName("shores"));
    342         Assert.assertTrue(FindAddress.isValidLocationName("skyway"));
    343         Assert.assertTrue(FindAddress.isValidLocationName("spring"));
    344         Assert.assertTrue(FindAddress.isValidLocationName("springs"));
    345         Assert.assertTrue(FindAddress.isValidLocationName("spur"));
    346         Assert.assertTrue(FindAddress.isValidLocationName("spurs"));
    347         Assert.assertTrue(FindAddress.isValidLocationName("square"));
    348         Assert.assertTrue(FindAddress.isValidLocationName("squares"));
    349         Assert.assertTrue(FindAddress.isValidLocationName("station"));
    350         Assert.assertTrue(FindAddress.isValidLocationName("stravenue"));
    351         Assert.assertTrue(FindAddress.isValidLocationName("stream"));
    352         Assert.assertTrue(FindAddress.isValidLocationName("st."));
    353         Assert.assertTrue(FindAddress.isValidLocationName("street"));
    354         Assert.assertTrue(FindAddress.isValidLocationName("streets"));
    355         Assert.assertTrue(FindAddress.isValidLocationName("summit"));
    356         Assert.assertTrue(FindAddress.isValidLocationName("speedway"));
    357         Assert.assertTrue(FindAddress.isValidLocationName("terrace"));
    358         Assert.assertTrue(FindAddress.isValidLocationName("throughway"));
    359         Assert.assertTrue(FindAddress.isValidLocationName("trace"));
    360         Assert.assertTrue(FindAddress.isValidLocationName("track"));
    361         Assert.assertTrue(FindAddress.isValidLocationName("trafficway"));
    362         Assert.assertTrue(FindAddress.isValidLocationName("trail"));
    363         Assert.assertTrue(FindAddress.isValidLocationName("tunnel"));
    364         Assert.assertTrue(FindAddress.isValidLocationName("turnpike"));
    365         Assert.assertTrue(FindAddress.isValidLocationName("underpass"));
    366         Assert.assertTrue(FindAddress.isValidLocationName("union"));
    367         Assert.assertTrue(FindAddress.isValidLocationName("unions"));
    368         Assert.assertTrue(FindAddress.isValidLocationName("valley"));
    369         Assert.assertTrue(FindAddress.isValidLocationName("valleys"));
    370         Assert.assertTrue(FindAddress.isValidLocationName("viaduct"));
    371         Assert.assertTrue(FindAddress.isValidLocationName("view"));
    372         Assert.assertTrue(FindAddress.isValidLocationName("views"));
    373         Assert.assertTrue(FindAddress.isValidLocationName("village"));
    374         Assert.assertTrue(FindAddress.isValidLocationName("villages"));
    375         Assert.assertTrue(FindAddress.isValidLocationName("ville"));
    376         Assert.assertTrue(FindAddress.isValidLocationName("vista"));
    377         Assert.assertTrue(FindAddress.isValidLocationName("walk"));
    378         Assert.assertTrue(FindAddress.isValidLocationName("walks"));
    379         Assert.assertTrue(FindAddress.isValidLocationName("wall"));
    380         Assert.assertTrue(FindAddress.isValidLocationName("way"));
    381         Assert.assertTrue(FindAddress.isValidLocationName("ways"));
    382         Assert.assertTrue(FindAddress.isValidLocationName("well"));
    383         Assert.assertTrue(FindAddress.isValidLocationName("wells"));
    384         Assert.assertTrue(FindAddress.isValidLocationName("xing"));
    385         Assert.assertTrue(FindAddress.isValidLocationName("xrd"));
    386     }
    387 
    388     @Test
    389     public void testZipCode() {
    390         Assert.assertTrue(FindAddress.isValidZipCode("90000"));
    391         Assert.assertTrue(FindAddress.isValidZipCode("01234"));
    392         Assert.assertTrue(FindAddress.isValidZipCode("99999-9999"));
    393 
    394         Assert.assertFalse(FindAddress.isValidZipCode("999999999"));
    395         Assert.assertFalse(FindAddress.isValidZipCode("9999-99999"));
    396         Assert.assertFalse(FindAddress.isValidZipCode("999999999-"));
    397         Assert.assertFalse(FindAddress.isValidZipCode("99999-999a"));
    398         Assert.assertFalse(FindAddress.isValidZipCode("99999--9999"));
    399         Assert.assertFalse(FindAddress.isValidZipCode("90000o"));
    400         Assert.assertFalse(FindAddress.isValidZipCode("90000-"));
    401 
    402         // Test the state index against the zip range table.
    403         Assert.assertTrue(FindAddress.isValidZipCode("99000", "AK"));
    404         Assert.assertTrue(FindAddress.isValidZipCode("99000", "Alaska"));
    405         Assert.assertTrue(FindAddress.isValidZipCode("35000", "AL"));
    406         Assert.assertTrue(FindAddress.isValidZipCode("36000", "Alabama"));
    407         Assert.assertTrue(FindAddress.isValidZipCode("71000", "AR"));
    408         Assert.assertTrue(FindAddress.isValidZipCode("72000", "Arkansas"));
    409         Assert.assertTrue(FindAddress.isValidZipCode("96000", "AS"));
    410         Assert.assertTrue(FindAddress.isValidZipCode("96000", "American Samoa"));
    411         Assert.assertTrue(FindAddress.isValidZipCode("85000", "AZ"));
    412         Assert.assertTrue(FindAddress.isValidZipCode("86000", "Arizona"));
    413         Assert.assertTrue(FindAddress.isValidZipCode("90000", "CA"));
    414         Assert.assertTrue(FindAddress.isValidZipCode("96000", "California"));
    415         Assert.assertTrue(FindAddress.isValidZipCode("80000", "CO"));
    416         Assert.assertTrue(FindAddress.isValidZipCode("81000", "Colorado"));
    417         Assert.assertTrue(FindAddress.isValidZipCode("06000", "CT"));
    418         Assert.assertTrue(FindAddress.isValidZipCode("06000", "Connecticut"));
    419         Assert.assertTrue(FindAddress.isValidZipCode("20000", "DC"));
    420         Assert.assertTrue(FindAddress.isValidZipCode("20000", "District of Columbia"));
    421         Assert.assertTrue(FindAddress.isValidZipCode("19000", "DE"));
    422         Assert.assertTrue(FindAddress.isValidZipCode("19000", "Delaware"));
    423         Assert.assertTrue(FindAddress.isValidZipCode("32000", "FL"));
    424         Assert.assertTrue(FindAddress.isValidZipCode("34000", "Florida"));
    425         Assert.assertTrue(FindAddress.isValidZipCode("96000", "FM"));
    426         Assert.assertTrue(FindAddress.isValidZipCode("96000", "Federated States of Micronesia"));
    427         Assert.assertTrue(FindAddress.isValidZipCode("30000", "GA"));
    428         Assert.assertTrue(FindAddress.isValidZipCode("31000", "Georgia"));
    429         Assert.assertTrue(FindAddress.isValidZipCode("96000", "GU"));
    430         Assert.assertTrue(FindAddress.isValidZipCode("96000", "Guam"));
    431         Assert.assertTrue(FindAddress.isValidZipCode("96000", "HI"));
    432         Assert.assertTrue(FindAddress.isValidZipCode("96000", "Hawaii"));
    433         Assert.assertTrue(FindAddress.isValidZipCode("50000", "IA"));
    434         Assert.assertTrue(FindAddress.isValidZipCode("52000", "Iowa"));
    435         Assert.assertTrue(FindAddress.isValidZipCode("83000", "ID"));
    436         Assert.assertTrue(FindAddress.isValidZipCode("83000", "Idaho"));
    437         Assert.assertTrue(FindAddress.isValidZipCode("60000", "IL"));
    438         Assert.assertTrue(FindAddress.isValidZipCode("62000", "Illinois"));
    439         Assert.assertTrue(FindAddress.isValidZipCode("46000", "IN"));
    440         Assert.assertTrue(FindAddress.isValidZipCode("47000", "Indiana"));
    441         Assert.assertTrue(FindAddress.isValidZipCode("66000", "KS"));
    442         Assert.assertTrue(FindAddress.isValidZipCode("67000", "Kansas"));
    443         Assert.assertTrue(FindAddress.isValidZipCode("40000", "KY"));
    444         Assert.assertTrue(FindAddress.isValidZipCode("42000", "Kentucky"));
    445         Assert.assertTrue(FindAddress.isValidZipCode("70000", "LA"));
    446         Assert.assertTrue(FindAddress.isValidZipCode("71000", "Louisiana"));
    447         Assert.assertTrue(FindAddress.isValidZipCode("01000", "MA"));
    448         Assert.assertTrue(FindAddress.isValidZipCode("02000", "Massachusetts"));
    449         Assert.assertTrue(FindAddress.isValidZipCode("20000", "MD"));
    450         Assert.assertTrue(FindAddress.isValidZipCode("21000", "Maryland"));
    451         Assert.assertTrue(FindAddress.isValidZipCode("03000", "ME"));
    452         Assert.assertTrue(FindAddress.isValidZipCode("04000", "Maine"));
    453         Assert.assertTrue(FindAddress.isValidZipCode("96000", "MH"));
    454         Assert.assertTrue(FindAddress.isValidZipCode("96000", "Marshall Islands"));
    455         Assert.assertTrue(FindAddress.isValidZipCode("48000", "MI"));
    456         Assert.assertTrue(FindAddress.isValidZipCode("49000", "Michigan"));
    457         Assert.assertTrue(FindAddress.isValidZipCode("55000", "MN"));
    458         Assert.assertTrue(FindAddress.isValidZipCode("56000", "Minnesota"));
    459         Assert.assertTrue(FindAddress.isValidZipCode("63000", "MO"));
    460         Assert.assertTrue(FindAddress.isValidZipCode("65000", "Missouri"));
    461         Assert.assertTrue(FindAddress.isValidZipCode("96000", "MP"));
    462         Assert.assertTrue(FindAddress.isValidZipCode("96000", "Northern Mariana Islands"));
    463         Assert.assertTrue(FindAddress.isValidZipCode("38000", "MS"));
    464         Assert.assertTrue(FindAddress.isValidZipCode("39000", "Mississippi"));
    465         Assert.assertTrue(FindAddress.isValidZipCode("55000", "MT"));
    466         Assert.assertTrue(FindAddress.isValidZipCode("56000", "Montana"));
    467         Assert.assertTrue(FindAddress.isValidZipCode("27000", "NC"));
    468         Assert.assertTrue(FindAddress.isValidZipCode("28000", "North Carolina"));
    469         Assert.assertTrue(FindAddress.isValidZipCode("58000", "ND"));
    470         Assert.assertTrue(FindAddress.isValidZipCode("58000", "North Dakota"));
    471         Assert.assertTrue(FindAddress.isValidZipCode("68000", "NE"));
    472         Assert.assertTrue(FindAddress.isValidZipCode("69000", "Nebraska"));
    473         Assert.assertTrue(FindAddress.isValidZipCode("03000", "NH"));
    474         Assert.assertTrue(FindAddress.isValidZipCode("04000", "New Hampshire"));
    475         Assert.assertTrue(FindAddress.isValidZipCode("07000", "NJ"));
    476         Assert.assertTrue(FindAddress.isValidZipCode("08000", "New Jersey"));
    477         Assert.assertTrue(FindAddress.isValidZipCode("87000", "NM"));
    478         Assert.assertTrue(FindAddress.isValidZipCode("88000", "New Mexico"));
    479         Assert.assertTrue(FindAddress.isValidZipCode("88000", "NV"));
    480         Assert.assertTrue(FindAddress.isValidZipCode("89000", "Nevada"));
    481         Assert.assertTrue(FindAddress.isValidZipCode("10000", "NY"));
    482         Assert.assertTrue(FindAddress.isValidZipCode("14000", "New York"));
    483         Assert.assertTrue(FindAddress.isValidZipCode("43000", "OH"));
    484         Assert.assertTrue(FindAddress.isValidZipCode("45000", "Ohio"));
    485         Assert.assertTrue(FindAddress.isValidZipCode("73000", "OK"));
    486         Assert.assertTrue(FindAddress.isValidZipCode("74000", "Oklahoma"));
    487         Assert.assertTrue(FindAddress.isValidZipCode("97000", "OR"));
    488         Assert.assertTrue(FindAddress.isValidZipCode("97000", "Oregon"));
    489         Assert.assertTrue(FindAddress.isValidZipCode("15000", "PA"));
    490         Assert.assertTrue(FindAddress.isValidZipCode("19000", "Pennsylvania"));
    491         Assert.assertTrue(FindAddress.isValidZipCode("06000", "PR"));
    492         Assert.assertTrue(FindAddress.isValidZipCode("06000", "Puerto Rico"));
    493         Assert.assertTrue(FindAddress.isValidZipCode("96000", "PW"));
    494         Assert.assertTrue(FindAddress.isValidZipCode("96000", "Palau"));
    495         Assert.assertTrue(FindAddress.isValidZipCode("02000", "RI"));
    496         Assert.assertTrue(FindAddress.isValidZipCode("02000", "Rhode Island"));
    497         Assert.assertTrue(FindAddress.isValidZipCode("29000", "SC"));
    498         Assert.assertTrue(FindAddress.isValidZipCode("29000", "South Carolina"));
    499         Assert.assertTrue(FindAddress.isValidZipCode("57000", "SD"));
    500         Assert.assertTrue(FindAddress.isValidZipCode("57000", "South Dakota"));
    501         Assert.assertTrue(FindAddress.isValidZipCode("37000", "TN"));
    502         Assert.assertTrue(FindAddress.isValidZipCode("38000", "Tennessee"));
    503         Assert.assertTrue(FindAddress.isValidZipCode("75000", "TX"));
    504         Assert.assertTrue(FindAddress.isValidZipCode("79000", "Texas"));
    505         Assert.assertTrue(FindAddress.isValidZipCode("84000", "UT"));
    506         Assert.assertTrue(FindAddress.isValidZipCode("84000", "Utah"));
    507         Assert.assertTrue(FindAddress.isValidZipCode("22000", "VA"));
    508         Assert.assertTrue(FindAddress.isValidZipCode("24000", "Virginia"));
    509         Assert.assertTrue(FindAddress.isValidZipCode("06000", "VI"));
    510         Assert.assertTrue(FindAddress.isValidZipCode("09000", "Virgin Islands"));
    511         Assert.assertTrue(FindAddress.isValidZipCode("05000", "VT"));
    512         Assert.assertTrue(FindAddress.isValidZipCode("05000", "Vermont"));
    513         Assert.assertTrue(FindAddress.isValidZipCode("98000", "WA"));
    514         Assert.assertTrue(FindAddress.isValidZipCode("99000", "Washington"));
    515         Assert.assertTrue(FindAddress.isValidZipCode("53000", "WI"));
    516         Assert.assertTrue(FindAddress.isValidZipCode("54000", "Wisconsin"));
    517         Assert.assertTrue(FindAddress.isValidZipCode("24000", "WV"));
    518         Assert.assertTrue(FindAddress.isValidZipCode("26000", "West Virginia"));
    519         Assert.assertTrue(FindAddress.isValidZipCode("82000", "WY"));
    520         Assert.assertTrue(FindAddress.isValidZipCode("83000", "Wyoming"));
    521     }
    522 
    523     @Test
    524     public void testMatchState() {
    525         // The complete set of state codes and names is tested together
    526         // with their returned state indices in the zip code test.
    527         assertExpectedMatch(FindAddress.matchState("CALIFORNIA", 0), "CALIFORNIA");
    528         assertExpectedMatch(FindAddress.matchState("ca", 0), "ca");
    529 
    530         assertExpectedMatch(FindAddress.matchState(" CALIFORNIA", 1), "CALIFORNIA");
    531         assertExpectedMatch(FindAddress.matchState(" ca", 1), "ca");
    532 
    533         Assert.assertNull(FindAddress.matchState("notcalifornia", 3));
    534         Assert.assertNull(FindAddress.matchState("californi", 0));
    535         Assert.assertNull(FindAddress.matchState("northern mariana", 0));
    536         Assert.assertNull(FindAddress.matchState("northern mariana island", 0));
    537         Assert.assertNull(FindAddress.matchState("zz", 0));
    538     }
    539 
    540     @Test
    541     public void testGetHouseNumber() {
    542         assertExpectedMatch(FindAddress.matchHouseNumber("4", 0), "4");
    543 
    544         // Matches not at the start of the string should be preceded by a valid delimiter.
    545         assertExpectedMatch(FindAddress.matchHouseNumber(" 4", 1), "4");
    546         assertExpectedMatch(FindAddress.matchHouseNumber(",4", 1), "4");
    547         Assert.assertNull(FindAddress.matchHouseNumber("x4", 1));
    548 
    549         // Matches should be followed by a valid delimiter.
    550         assertExpectedMatch(FindAddress.matchHouseNumber("4,5", 0), "4");
    551         Assert.assertNull(FindAddress.matchHouseNumber("4?", 0));
    552         Assert.assertNull(FindAddress.matchHouseNumber("4:", 0));
    553 
    554         // Quotes are valid delimiters.
    555         assertExpectedMatch(FindAddress.matchHouseNumber("\"4\"", 1), "4");
    556         assertExpectedMatch(FindAddress.matchHouseNumber("'4'", 1), "4");
    557 
    558         // Matches shouldn't include the delimiter, or anything after it.
    559         assertExpectedMatch(FindAddress.matchHouseNumber("4 my house", 0), "4");
    560 
    561         // One is a valid house number.
    562         assertExpectedMatch(FindAddress.matchHouseNumber("one", 0), "one");
    563 
    564         // One can't be an ordinal though.
    565         Assert.assertNull(FindAddress.matchHouseNumber("oneth", 0));
    566 
    567         // House numbers can be followed by a single letter.
    568         assertExpectedMatch(FindAddress.matchHouseNumber("1A", 0), "1A");
    569 
    570         // But not two.
    571         Assert.assertNull(FindAddress.matchHouseNumber("1AA", 0));
    572 
    573         // Except if it's a valid ordinal.
    574         assertExpectedMatch(FindAddress.matchHouseNumber("1st", 0), "1st");
    575         assertExpectedMatch(FindAddress.matchHouseNumber("1ST", 0), "1ST");
    576         assertExpectedMatch(FindAddress.matchHouseNumber("11th", 0), "11th");
    577         assertExpectedMatch(FindAddress.matchHouseNumber("21st", 0), "21st");
    578 
    579         assertExpectedMatch(FindAddress.matchHouseNumber("2nd", 0), "2nd");
    580         assertExpectedMatch(FindAddress.matchHouseNumber("12th", 0), "12th");
    581         assertExpectedMatch(FindAddress.matchHouseNumber("22nd", 0), "22nd");
    582 
    583         assertExpectedMatch(FindAddress.matchHouseNumber("3rd", 0), "3rd");
    584         assertExpectedMatch(FindAddress.matchHouseNumber("13th", 0), "13th");
    585         assertExpectedMatch(FindAddress.matchHouseNumber("23rd", 0), "23rd");
    586 
    587         Assert.assertNull(FindAddress.matchHouseNumber("11st", 0));
    588         Assert.assertNull(FindAddress.matchHouseNumber("21th", 0));
    589         Assert.assertNull(FindAddress.matchHouseNumber("1nd", 0));
    590 
    591         // These two cases are different from the original C++
    592         // implementation (which didn't match numbers in these cases).
    593         assertExpectedMatch(FindAddress.matchHouseNumber("111th", 0), "111th");
    594         assertExpectedMatch(FindAddress.matchHouseNumber("011th", 0), "011th");
    595 
    596         // This case used to match, but now doesn't.
    597         Assert.assertNull(FindAddress.matchHouseNumber("211st", 0));
    598 
    599         // Hypenated numbers are OK.
    600         assertExpectedMatch(FindAddress.matchHouseNumber("1-201", 0), "1-201");
    601         assertExpectedMatch(FindAddress.matchHouseNumber("1-one", 0), "1-one");
    602 
    603         // But a trailing hypen isn't valid.
    604         Assert.assertNull(FindAddress.matchHouseNumber("1- ", 0));
    605         Assert.assertNull(FindAddress.matchHouseNumber("1-word", 0));
    606 
    607         // Ordinals can be part of a hyphenated number.
    608         assertExpectedMatch(FindAddress.matchHouseNumber("1-1st", 0), "1-1st");
    609 
    610         // Limit of 5 digits at most.
    611         assertExpectedMatch(FindAddress.matchHouseNumber("12345", 0), "12345");
    612         Assert.assertNull(FindAddress.matchHouseNumber("123456", 0));
    613 
    614         // Limit applies to the whole match, not the components.
    615         Assert.assertNull(FindAddress.matchHouseNumber("123-456", 0));
    616     }
    617 }
    618