• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Libphonenumber Authors
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.phonenumbers.prefixmapper;
18 
19 import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
20 import junit.framework.TestCase;
21 
22 import java.io.ByteArrayInputStream;
23 import java.io.ByteArrayOutputStream;
24 import java.io.IOException;
25 import java.io.ObjectInputStream;
26 import java.io.ObjectOutputStream;
27 import java.util.SortedMap;
28 import java.util.TreeMap;
29 
30 /**
31  * Unittests for PhonePrefixMap.java
32  *
33  * @author Shaopeng Jia
34  */
35 public class PhonePrefixMapTest extends TestCase {
36   private final PhonePrefixMap phonePrefixMapForUS = new PhonePrefixMap();
37   private final PhonePrefixMap phonePrefixMapForIT = new PhonePrefixMap();
38   private PhoneNumber number = new PhoneNumber();
39 
PhonePrefixMapTest()40   public PhonePrefixMapTest() {
41     SortedMap<Integer, String> sortedMapForUS = new TreeMap<Integer, String>();
42     sortedMapForUS.put(1212, "New York");
43     sortedMapForUS.put(1480, "Arizona");
44     sortedMapForUS.put(1650, "California");
45     sortedMapForUS.put(1907, "Alaska");
46     sortedMapForUS.put(1201664, "Westwood, NJ");
47     sortedMapForUS.put(1480893, "Phoenix, AZ");
48     sortedMapForUS.put(1501372, "Little Rock, AR");
49     sortedMapForUS.put(1626308, "Alhambra, CA");
50     sortedMapForUS.put(1650345, "San Mateo, CA");
51     sortedMapForUS.put(1867993, "Dawson, YT");
52     sortedMapForUS.put(1972480, "Richardson, TX");
53 
54     phonePrefixMapForUS.readPhonePrefixMap(sortedMapForUS);
55 
56     SortedMap<Integer, String> sortedMapForIT = new TreeMap<Integer, String>();
57     sortedMapForIT.put(3902, "Milan");
58     sortedMapForIT.put(3906, "Rome");
59     sortedMapForIT.put(39010, "Genoa");
60     sortedMapForIT.put(390131, "Alessandria");
61     sortedMapForIT.put(390321, "Novara");
62     sortedMapForIT.put(390975, "Potenza");
63 
64     phonePrefixMapForIT.readPhonePrefixMap(sortedMapForIT);
65   }
66 
createDefaultStorageMapCandidate()67   private static SortedMap<Integer, String> createDefaultStorageMapCandidate() {
68     SortedMap<Integer, String> sortedMap = new TreeMap<Integer, String>();
69     // Make the phone prefixs bigger to store them using integer.
70     sortedMap.put(121212345, "New York");
71     sortedMap.put(148034434, "Arizona");
72     return sortedMap;
73   }
74 
createFlyweightStorageMapCandidate()75   private static SortedMap<Integer, String> createFlyweightStorageMapCandidate() {
76     SortedMap<Integer, String> sortedMap = new TreeMap<Integer, String>();
77     sortedMap.put(1212, "New York");
78     sortedMap.put(1213, "New York");
79     sortedMap.put(1214, "New York");
80     sortedMap.put(1480, "Arizona");
81     return sortedMap;
82   }
83 
testGetSmallerMapStorageChoosesDefaultImpl()84   public void testGetSmallerMapStorageChoosesDefaultImpl() {
85     PhonePrefixMapStorageStrategy mapStorage =
86         new PhonePrefixMap().getSmallerMapStorage(createDefaultStorageMapCandidate());
87     assertFalse(mapStorage instanceof FlyweightMapStorage);
88   }
89 
testGetSmallerMapStorageChoosesFlyweightImpl()90   public void testGetSmallerMapStorageChoosesFlyweightImpl() {
91     PhonePrefixMapStorageStrategy mapStorage =
92         new PhonePrefixMap().getSmallerMapStorage(createFlyweightStorageMapCandidate());
93     assertTrue(mapStorage instanceof FlyweightMapStorage);
94   }
95 
testLookupInvalidNumber_US()96   public void testLookupInvalidNumber_US() {
97     // central office code cannot start with 1.
98     number.setCountryCode(1).setNationalNumber(2121234567L);
99     assertEquals("New York", phonePrefixMapForUS.lookup(number));
100   }
101 
testLookupNumber_NJ()102   public void testLookupNumber_NJ() {
103     number.setCountryCode(1).setNationalNumber(2016641234L);
104     assertEquals("Westwood, NJ", phonePrefixMapForUS.lookup(number));
105   }
106 
testLookupNumber_NY()107   public void testLookupNumber_NY() {
108     number.setCountryCode(1).setNationalNumber(2126641234L);
109     assertEquals("New York", phonePrefixMapForUS.lookup(number));
110   }
111 
testLookupNumber_CA_1()112   public void testLookupNumber_CA_1() {
113     number.setCountryCode(1).setNationalNumber(6503451234L);
114     assertEquals("San Mateo, CA", phonePrefixMapForUS.lookup(number));
115   }
116 
testLookupNumber_CA_2()117   public void testLookupNumber_CA_2() {
118     number.setCountryCode(1).setNationalNumber(6502531234L);
119     assertEquals("California", phonePrefixMapForUS.lookup(number));
120   }
121 
testLookupNumberFound_TX()122   public void testLookupNumberFound_TX() {
123     number.setCountryCode(1).setNationalNumber(9724801234L);
124     assertEquals("Richardson, TX", phonePrefixMapForUS.lookup(number));
125   }
126 
testLookupNumberNotFound_TX()127   public void testLookupNumberNotFound_TX() {
128     number.setCountryCode(1).setNationalNumber(9724811234L);
129     assertNull(phonePrefixMapForUS.lookup(number));
130   }
131 
testLookupNumber_CH()132   public void testLookupNumber_CH() {
133     number.setCountryCode(41).setNationalNumber(446681300L);
134     assertNull(phonePrefixMapForUS.lookup(number));
135   }
136 
testLookupNumber_IT()137   public void testLookupNumber_IT() {
138     number.setCountryCode(39).setNationalNumber(212345678L).setItalianLeadingZero(true);
139     assertEquals("Milan", phonePrefixMapForIT.lookup(number));
140 
141     number.setNationalNumber(612345678L);
142     assertEquals("Rome", phonePrefixMapForIT.lookup(number));
143 
144     number.setNationalNumber(3211234L);
145     assertEquals("Novara", phonePrefixMapForIT.lookup(number));
146 
147     // A mobile number
148     number.setNationalNumber(321123456L).setItalianLeadingZero(false);
149     assertNull(phonePrefixMapForIT.lookup(number));
150 
151     // An invalid number (too short)
152     number.setNationalNumber(321123L).setItalianLeadingZero(true);
153     assertEquals("Novara", phonePrefixMapForIT.lookup(number));
154   }
155 
156   /**
157    * Creates a new phone prefix map serializing the provided phone prefix map to a stream and then
158    * reading this stream. The resulting phone prefix map is expected to be strictly equal to the
159    * provided one from which it was generated.
160    */
createNewPhonePrefixMap( PhonePrefixMap phonePrefixMap)161   private static PhonePrefixMap createNewPhonePrefixMap(
162       PhonePrefixMap phonePrefixMap) throws IOException {
163     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
164     ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
165     phonePrefixMap.writeExternal(objectOutputStream);
166     objectOutputStream.flush();
167 
168     PhonePrefixMap newPhonePrefixMap = new PhonePrefixMap();
169     newPhonePrefixMap.readExternal(
170         new ObjectInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())));
171     return newPhonePrefixMap;
172   }
173 
testReadWriteExternalWithDefaultStrategy()174   public void testReadWriteExternalWithDefaultStrategy() throws IOException {
175     PhonePrefixMap localPhonePrefixMap = new PhonePrefixMap();
176     localPhonePrefixMap.readPhonePrefixMap(createDefaultStorageMapCandidate());
177     assertFalse(localPhonePrefixMap.getPhonePrefixMapStorage() instanceof FlyweightMapStorage);
178 
179     PhonePrefixMap newPhonePrefixMap;
180     newPhonePrefixMap = createNewPhonePrefixMap(localPhonePrefixMap);
181     assertEquals(localPhonePrefixMap.toString(), newPhonePrefixMap.toString());
182   }
183 
testReadWriteExternalWithFlyweightStrategy()184   public void testReadWriteExternalWithFlyweightStrategy() throws IOException {
185     PhonePrefixMap localPhonePrefixMap = new PhonePrefixMap();
186     localPhonePrefixMap.readPhonePrefixMap(createFlyweightStorageMapCandidate());
187     assertTrue(localPhonePrefixMap.getPhonePrefixMapStorage() instanceof FlyweightMapStorage);
188 
189     PhonePrefixMap newPhonePrefixMap;
190     newPhonePrefixMap = createNewPhonePrefixMap(localPhonePrefixMap);
191     assertEquals(localPhonePrefixMap.toString(), newPhonePrefixMap.toString());
192   }
193 }
194