From 39c190d1781128867b5a918fe15738d7490f8e20 Mon Sep 17 00:00:00 2001 From: Shaopeng Jia Date: Tue, 14 Jun 2011 13:28:57 +0000 Subject: [PATCH] JAVA: Adding unittests for offline geocoding. Also modified build file to produce separate jars. --- java/build.xml | 23 ++++ .../phonenumbers/GenerateAreaCodeData.java | 5 +- .../google/i18n/phonenumbers/AreaCodeMap.java | 14 +- .../PhoneNumberOfflineGeocoder.java | 2 +- .../geocoding_data/{82_zh_Hans => 82_zh} | Bin .../geocoding_data/{86_zh_Hans => 86_zh} | Bin .../i18n/phonenumbers/geocoding_data/config | Bin 181 -> 171 bytes .../i18n/phonenumbers/AreaCodeMapTest.java | 125 ++++++++++++++++++ .../phonenumbers/MappingFileProviderTest.java | 93 +++++++++++++ .../PhoneNumberOfflineGeocoderTest.java | 52 +++++++- .../phonenumbers/geocoding_testing_data/82_en | Bin 0 -> 226 bytes .../phonenumbers/geocoding_testing_data/82_ko | Bin 0 -> 214 bytes .../geocoding_testing_data/config | Bin 52 -> 38 bytes resources/geocoding/{zh_Hans => zh}/82.txt | 0 resources/geocoding/{zh_Hans => zh}/86.txt | 0 .../geocoding/{zh_Hans/86.txt => en/82.txt} | 21 ++- .../test/geocoding/{en/86.txt => ko/82.txt} | 22 ++- resources/test/geocoding/zh_Hant/86.txt | 19 --- 18 files changed, 335 insertions(+), 41 deletions(-) rename java/src/com/google/i18n/phonenumbers/geocoding_data/{82_zh_Hans => 82_zh} (100%) rename java/src/com/google/i18n/phonenumbers/geocoding_data/{86_zh_Hans => 86_zh} (100%) create mode 100644 java/test/com/google/i18n/phonenumbers/AreaCodeMapTest.java create mode 100644 java/test/com/google/i18n/phonenumbers/MappingFileProviderTest.java create mode 100644 java/test/com/google/i18n/phonenumbers/geocoding_testing_data/82_en create mode 100644 java/test/com/google/i18n/phonenumbers/geocoding_testing_data/82_ko rename resources/geocoding/{zh_Hans => zh}/82.txt (100%) rename resources/geocoding/{zh_Hans => zh}/86.txt (100%) rename resources/test/geocoding/{zh_Hans/86.txt => en/82.txt} (73%) rename resources/test/geocoding/{en/86.txt => ko/82.txt} (75%) delete mode 100644 resources/test/geocoding/zh_Hant/86.txt diff --git a/java/build.xml b/java/build.xml index f8692118e..b5fc72734 100644 --- a/java/build.xml +++ b/java/build.xml @@ -35,13 +35,33 @@ + + + + + + + + + + + + + + + + + + + + @@ -61,6 +81,9 @@ + + + diff --git a/java/resources/com/google/i18n/phonenumbers/GenerateAreaCodeData.java b/java/resources/com/google/i18n/phonenumbers/GenerateAreaCodeData.java index f29f699c9..b424cb547 100644 --- a/java/resources/com/google/i18n/phonenumbers/GenerateAreaCodeData.java +++ b/java/resources/com/google/i18n/phonenumbers/GenerateAreaCodeData.java @@ -183,12 +183,15 @@ public class GenerateAreaCodeData { File[] languageDirectories = inputPath.listFiles(); for (File languageDirectory : languageDirectories) { - if (!languageDirectory.isDirectory()) { + if (!languageDirectory.isDirectory() || languageDirectory.isHidden()) { continue; } File[] countryCodeFiles = languageDirectory.listFiles(); for (File countryCodeFile : countryCodeFiles) { + if (countryCodeFile.isHidden()) { + continue; + } String countryCodeFileName = countryCodeFile.getName(); int indexOfDot = countryCodeFileName.indexOf('.'); if (indexOfDot == -1) { diff --git a/java/src/com/google/i18n/phonenumbers/AreaCodeMap.java b/java/src/com/google/i18n/phonenumbers/AreaCodeMap.java index e212fc8b4..1358b924c 100644 --- a/java/src/com/google/i18n/phonenumbers/AreaCodeMap.java +++ b/java/src/com/google/i18n/phonenumbers/AreaCodeMap.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.SortedMap; +import java.util.SortedSet; import java.util.TreeSet; /** @@ -36,7 +37,7 @@ public class AreaCodeMap implements Externalizable { private TreeSet possibleLengths = new TreeSet(); private int[] phoneNumberPrefixes; private String[] descriptions; - private PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); + private PhoneNumberUtil phoneUtil; /** * Creates an empty {@link AreaCodeMap}. The default constructor is necessary for implementing @@ -44,6 +45,12 @@ public class AreaCodeMap implements Externalizable { * {@link #readAreaCodeMap(java.util.SortedMap)} or {@link #readExternal(java.io.ObjectInput)}. */ public AreaCodeMap() { + phoneUtil = PhoneNumberUtil.getInstance(); + } + + // @VisibleForTesting + AreaCodeMap(PhoneNumberUtil phoneUtil) { + this.phoneUtil = phoneUtil; } /** @@ -115,7 +122,9 @@ public class AreaCodeMap implements Externalizable { long phonePrefix = Long.parseLong(number.getCountryCode() + phoneUtil.getNationalSignificantNumber(number)); int currentIndex = numOfEntries - 1; - for (Integer possibleLength : possibleLengths.descendingSet()) { + SortedSet currentSetOfLengths = possibleLengths; + while (currentSetOfLengths.size() > 0) { + Integer possibleLength = currentSetOfLengths.last(); String phonePrefixStr = String.valueOf(phonePrefix); if (phonePrefixStr.length() > possibleLength) { phonePrefix = Long.parseLong(phonePrefixStr.substring(0, possibleLength)); @@ -127,6 +136,7 @@ public class AreaCodeMap implements Externalizable { if (phonePrefix == phoneNumberPrefixes[currentIndex]) { return descriptions[currentIndex]; } + currentSetOfLengths = possibleLengths.headSet(possibleLength); } return ""; } diff --git a/java/src/com/google/i18n/phonenumbers/PhoneNumberOfflineGeocoder.java b/java/src/com/google/i18n/phonenumbers/PhoneNumberOfflineGeocoder.java index 9e4d2e144..b4a9628cd 100644 --- a/java/src/com/google/i18n/phonenumbers/PhoneNumberOfflineGeocoder.java +++ b/java/src/com/google/i18n/phonenumbers/PhoneNumberOfflineGeocoder.java @@ -90,7 +90,7 @@ public class PhoneNumberOfflineGeocoder { ObjectInputStream in; try { in = new ObjectInputStream(source); - AreaCodeMap map = new AreaCodeMap(); + AreaCodeMap map = new AreaCodeMap(phoneUtil); map.readExternal(in); availablePhonePrefixMaps.put(fileName, map); } catch (IOException e) { diff --git a/java/src/com/google/i18n/phonenumbers/geocoding_data/82_zh_Hans b/java/src/com/google/i18n/phonenumbers/geocoding_data/82_zh similarity index 100% rename from java/src/com/google/i18n/phonenumbers/geocoding_data/82_zh_Hans rename to java/src/com/google/i18n/phonenumbers/geocoding_data/82_zh diff --git a/java/src/com/google/i18n/phonenumbers/geocoding_data/86_zh_Hans b/java/src/com/google/i18n/phonenumbers/geocoding_data/86_zh similarity index 100% rename from java/src/com/google/i18n/phonenumbers/geocoding_data/86_zh_Hans rename to java/src/com/google/i18n/phonenumbers/geocoding_data/86_zh diff --git a/java/src/com/google/i18n/phonenumbers/geocoding_data/config b/java/src/com/google/i18n/phonenumbers/geocoding_data/config index d1601e05f3ee90280b7fe45a108dbe21ced9b278..ab7f8818504312995dcfab1973b6f1aa6fe8c07a 100644 GIT binary patch delta 37 rcmdnWxSEk|&07Z6@}(2m`o*d;7?`s28JJS@7#JABfS8eisVV~i)KUp8 delta 47 ucmZ3@xRsG@&07Z6^7Rwh`W3SC8JJS@7}%>a;yn`ciWwLf!ho0&E&u>nKn)!L diff --git a/java/test/com/google/i18n/phonenumbers/AreaCodeMapTest.java b/java/test/com/google/i18n/phonenumbers/AreaCodeMapTest.java new file mode 100644 index 000000000..c393c8919 --- /dev/null +++ b/java/test/com/google/i18n/phonenumbers/AreaCodeMapTest.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2011 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.google.i18n.phonenumbers; + +import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; +import junit.framework.TestCase; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Unittests for AreaCodeMap.java + * + * @author Shaopeng Jia + */ +public class AreaCodeMapTest extends TestCase { + private final AreaCodeMap areaCodeMap; + private PhoneNumber number = new PhoneNumber(); + private static final Logger LOGGER = Logger.getLogger(AreaCodeMapTest.class.getName()); + static final String TEST_META_DATA_FILE_PREFIX = + "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting"; + + public AreaCodeMapTest() { + PhoneNumberUtil.resetInstance(); + PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance( + TEST_META_DATA_FILE_PREFIX, + CountryCodeToRegionCodeMapForTesting.getCountryCodeToRegionCodeMap()); + areaCodeMap = new AreaCodeMap(phoneUtil); + + SortedMap sortedMap = new TreeMap(); + sortedMap.put(1212, "New York"); + sortedMap.put(1480, "Arizona"); + sortedMap.put(1650, "California"); + sortedMap.put(1907, "Alaska"); + sortedMap.put(1201664, "Westwood, NJ"); + sortedMap.put(1480893, "Phoenix, AZ"); + sortedMap.put(1501372, "Little Rock, AR"); + sortedMap.put(1626308, "Alhambra, CA"); + sortedMap.put(1650345, "San Mateo, CA"); + sortedMap.put(1867993, "Dawson, YT"); + sortedMap.put(1972480, "Richardson, TX"); + + areaCodeMap.readAreaCodeMap(sortedMap); + } + + public void testLookupInvalidNumber_US() { + // central office code cannot start with 1. + number.setCountryCode(1).setNationalNumber(2121234567L); + assertEquals("New York", areaCodeMap.lookup(number)); + } + + public void testLookupNumber_NJ() { + number.setCountryCode(1).setNationalNumber(2016641234L); + assertEquals("Westwood, NJ", areaCodeMap.lookup(number)); + } + + public void testLookupNumber_NY() { + number.setCountryCode(1).setNationalNumber(2126641234L); + assertEquals("New York", areaCodeMap.lookup(number)); + } + + public void testLookupNumber_CA_1() { + number.setCountryCode(1).setNationalNumber(6503451234L); + assertEquals("San Mateo, CA", areaCodeMap.lookup(number)); + } + + public void testLookupNumber_CA_2() { + number.setCountryCode(1).setNationalNumber(6502531234L); + assertEquals("California", areaCodeMap.lookup(number)); + } + + public void testLookupNumberFound_TX() { + number.setCountryCode(1).setNationalNumber(9724801234L); + assertEquals("Richardson, TX", areaCodeMap.lookup(number)); + } + + public void testLookupNumberNotFound_TX() { + number.setCountryCode(1).setNationalNumber(9724811234L); + assertEquals("", areaCodeMap.lookup(number)); + } + + public void testLookupNumber_CH() { + number.setCountryCode(41).setNationalNumber(446681300L); + assertEquals("", areaCodeMap.lookup(number)); + } + + public void testReadWriteExternal() { + try { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); + areaCodeMap.writeExternal(objectOutputStream); + objectOutputStream.flush(); + + AreaCodeMap newAreaCodeMap = new AreaCodeMap(); + newAreaCodeMap.readExternal( + new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()))); + + assertEquals(areaCodeMap.toString(), newAreaCodeMap.toString()); + } catch (IOException e) { + LOGGER.log(Level.SEVERE, e.getMessage()); + fail(); + } + } +} diff --git a/java/test/com/google/i18n/phonenumbers/MappingFileProviderTest.java b/java/test/com/google/i18n/phonenumbers/MappingFileProviderTest.java new file mode 100644 index 000000000..a35bc227e --- /dev/null +++ b/java/test/com/google/i18n/phonenumbers/MappingFileProviderTest.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2011 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.google.i18n.phonenumbers; + +import junit.framework.TestCase; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Unittests for MappingFileProvider.java + * + * @author Shaopeng Jia + */ +public class MappingFileProviderTest extends TestCase { + private final MappingFileProvider mappingProvider = new MappingFileProvider(); + private static final Logger LOGGER = Logger.getLogger(MappingFileProviderTest.class.getName()); + + public MappingFileProviderTest() { + SortedMap> mapping = new TreeMap>(); + mapping.put(1, newHashSet("en")); + mapping.put(86, newHashSet("zh", "en", "zh_Hant")); + mapping.put(41, newHashSet("de", "fr", "it", "rm")); + mapping.put(65, newHashSet("en", "zh_Hans", "ms", "ta")); + + mappingProvider.readFileConfigs(mapping); + } + + private static HashSet newHashSet(String... strings) { + HashSet set = new HashSet(); + set.addAll(Arrays.asList(strings)); + return set; + } + + public void testReadWriteExternal() { + try { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); + mappingProvider.writeExternal(objectOutputStream); + objectOutputStream.flush(); + + MappingFileProvider newMappingProvider = new MappingFileProvider(); + newMappingProvider.readExternal( + new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()))); + assertEquals(mappingProvider.toString(), newMappingProvider.toString()); + } catch (IOException e) { + LOGGER.log(Level.SEVERE, e.getMessage()); + fail(); + } + } + + public void testGetFileName() { + assertEquals("1_en", mappingProvider.getFileName(1, "en", "", "")); + assertEquals("1_en", mappingProvider.getFileName(1, "en", "", "US")); + assertEquals("1_en", mappingProvider.getFileName(1, "en", "", "GB")); + assertEquals("41_de", mappingProvider.getFileName(41, "de", "", "CH")); + assertEquals("", mappingProvider.getFileName(44, "en", "", "GB")); + assertEquals("86_zh", mappingProvider.getFileName(86, "zh", "", "")); + assertEquals("86_zh", mappingProvider.getFileName(86, "zh", "Hans", "")); + assertEquals("86_zh", mappingProvider.getFileName(86, "zh", "", "CN")); + assertEquals("", mappingProvider.getFileName(86, "", "", "CN")); + assertEquals("86_zh", mappingProvider.getFileName(86, "zh", "Hans", "CN")); + assertEquals("86_zh", mappingProvider.getFileName(86, "zh", "Hans", "SG")); + assertEquals("86_zh", mappingProvider.getFileName(86, "zh", "", "SG")); + assertEquals("86_zh_Hant", mappingProvider.getFileName(86, "zh", "", "TW")); + assertEquals("86_zh_Hant", mappingProvider.getFileName(86, "zh", "", "HK")); + assertEquals("86_zh_Hant", mappingProvider.getFileName(86, "zh", "Hant", "TW")); + } +} diff --git a/java/test/com/google/i18n/phonenumbers/PhoneNumberOfflineGeocoderTest.java b/java/test/com/google/i18n/phonenumbers/PhoneNumberOfflineGeocoderTest.java index facd3c4ac..b577e849a 100644 --- a/java/test/com/google/i18n/phonenumbers/PhoneNumberOfflineGeocoderTest.java +++ b/java/test/com/google/i18n/phonenumbers/PhoneNumberOfflineGeocoderTest.java @@ -30,10 +30,22 @@ public class PhoneNumberOfflineGeocoderTest extends TestCase { private PhoneNumberOfflineGeocoder geocoder; static final String TEST_META_DATA_FILE_PREFIX = "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting"; + private static final String TEST_MAPPING_DATA_DIRECTORY = + "/com/google/i18n/phonenumbers/geocoding_testing_data/"; // Set up some test numbers to re-use. + private static final PhoneNumber KO_NUMBER1 = + new PhoneNumber().setCountryCode(82).setNationalNumber(22123456L); + private static final PhoneNumber KO_NUMBER2 = + new PhoneNumber().setCountryCode(82).setNationalNumber(322123456L); + private static final PhoneNumber KO_NUMBER3 = + new PhoneNumber().setCountryCode(82).setNationalNumber(6421234567L); private static final PhoneNumber US_NUMBER1 = new PhoneNumber().setCountryCode(1).setNationalNumber(6502530000L); + private static final PhoneNumber US_NUMBER2 = + new PhoneNumber().setCountryCode(1).setNationalNumber(6509600000L); + private static final PhoneNumber US_NUMBER3 = + new PhoneNumber().setCountryCode(1).setNationalNumber(2128120000L); private static final PhoneNumber BS_NUMBER1 = new PhoneNumber().setCountryCode(1).setNationalNumber(2423651234L); private static final PhoneNumber AU_NUMBER = @@ -46,19 +58,45 @@ public class PhoneNumberOfflineGeocoderTest extends TestCase { PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance( TEST_META_DATA_FILE_PREFIX, CountryCodeToRegionCodeMapForTesting.getCountryCodeToRegionCodeMap()); - geocoder = new PhoneNumberOfflineGeocoder(phoneUtil); + geocoder = new PhoneNumberOfflineGeocoder(TEST_MAPPING_DATA_DIRECTORY, phoneUtil); } - public void testGetCompactDescriptionForNumber() { - assertEquals("United States", - geocoder.getDescriptionForNumber(US_NUMBER1, Locale.ENGLISH)); + public void testGetDescriptionForNumberWithNoDataFile() { + // No data file containing mappings for US numbers is available in Chinese for the unittests. As + // a result, the country name of United States in simplified Chinese is returned. + assertEquals("\u7F8E\u56FD", + geocoder.getDescriptionForNumber(US_NUMBER1, Locale.SIMPLIFIED_CHINESE)); assertEquals("Stati Uniti", geocoder.getDescriptionForNumber(US_NUMBER1, Locale.ITALIAN)); assertEquals("Bahamas", - geocoder.getDescriptionForNumber(BS_NUMBER1, Locale.ENGLISH)); + geocoder.getDescriptionForNumber(BS_NUMBER1, new Locale("en", "US"))); assertEquals("Australia", - geocoder.getDescriptionForNumber(AU_NUMBER, Locale.ENGLISH)); + geocoder.getDescriptionForNumber(AU_NUMBER, new Locale("en", "US"))); assertEquals("", geocoder.getDescriptionForNumber(NUMBER_WITH_INVALID_COUNTRY_CODE, - Locale.ENGLISH)); + new Locale("en", "US"))); + } + + public void testGetDescriptionForNumber_en_US() { + assertEquals("CA", + geocoder.getDescriptionForNumber(US_NUMBER1, new Locale("en", "US"))); + assertEquals("Mountain View, CA", + geocoder.getDescriptionForNumber(US_NUMBER2, new Locale("en", "US"))); + assertEquals("New York, NY", + geocoder.getDescriptionForNumber(US_NUMBER3, new Locale("en", "US"))); + } + + public void testGetDescriptionForKoreanNumber() { + assertEquals("Seoul", + geocoder.getDescriptionForNumber(KO_NUMBER1, Locale.ENGLISH)); + assertEquals("Incheon", + geocoder.getDescriptionForNumber(KO_NUMBER2, Locale.ENGLISH)); + assertEquals("Jeju", + geocoder.getDescriptionForNumber(KO_NUMBER3, Locale.ENGLISH)); + assertEquals("\uC11C\uC6B8", + geocoder.getDescriptionForNumber(KO_NUMBER1, Locale.KOREAN)); + assertEquals("\uC778\uCC9C", + geocoder.getDescriptionForNumber(KO_NUMBER2, Locale.KOREAN)); + assertEquals("\uC81C\uC8FC", + geocoder.getDescriptionForNumber(KO_NUMBER3, Locale.KOREAN)); } } diff --git a/java/test/com/google/i18n/phonenumbers/geocoding_testing_data/82_en b/java/test/com/google/i18n/phonenumbers/geocoding_testing_data/82_en new file mode 100644 index 0000000000000000000000000000000000000000..964e02644b55159b4ce3a18fa023e0495fb1cf93 GIT binary patch literal 226 zcmXwzOAf*?3`9q?QOb@ZumhHW#D<^5FVJnp0RoCrN=X+eintR;;tJdW2gAaWpT{%y z^9>PR06IW2fhbJlYoOahrXHqo)?SGEkOy}zi3tXfN;@0AFhsU4y|Yf=NE$(Iw5fP+ z{F6@pO41Z!HUx@qTlu)HxE