1/*
2 * Copyright (C) 2009 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
17package com.android.i18n.phonenumbers;
18
19/**
20 * Unit tests for AsYouTypeFormatter.java
21 *
22 * Note that these tests use the test metadata, not the normal metadata file, so should not be used
23 * for regression test purposes - these tests are illustrative only and test functionality.
24 *
25 * @author Shaopeng Jia
26 */
27public class AsYouTypeFormatterTest extends TestMetadataTestCase {
28
29  public void testInvalidRegion() {
30    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
31    assertEquals("+", formatter.inputDigit('+'));
32    assertEquals("+4", formatter.inputDigit('4'));
33    assertEquals("+48 ", formatter.inputDigit('8'));
34    assertEquals("+48 8", formatter.inputDigit('8'));
35    assertEquals("+48 88", formatter.inputDigit('8'));
36    assertEquals("+48 88 1", formatter.inputDigit('1'));
37    assertEquals("+48 88 12", formatter.inputDigit('2'));
38    assertEquals("+48 88 123", formatter.inputDigit('3'));
39    assertEquals("+48 88 123 1", formatter.inputDigit('1'));
40    assertEquals("+48 88 123 12", formatter.inputDigit('2'));
41
42    formatter.clear();
43    assertEquals("6", formatter.inputDigit('6'));
44    assertEquals("65", formatter.inputDigit('5'));
45    assertEquals("650", formatter.inputDigit('0'));
46    assertEquals("6502", formatter.inputDigit('2'));
47    assertEquals("65025", formatter.inputDigit('5'));
48    assertEquals("650253", formatter.inputDigit('3'));
49  }
50
51  public void testInvalidPlusSign() {
52    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
53    assertEquals("+", formatter.inputDigit('+'));
54    assertEquals("+4", formatter.inputDigit('4'));
55    assertEquals("+48 ", formatter.inputDigit('8'));
56    assertEquals("+48 8", formatter.inputDigit('8'));
57    assertEquals("+48 88", formatter.inputDigit('8'));
58    assertEquals("+48 88 1", formatter.inputDigit('1'));
59    assertEquals("+48 88 12", formatter.inputDigit('2'));
60    assertEquals("+48 88 123", formatter.inputDigit('3'));
61    assertEquals("+48 88 123 1", formatter.inputDigit('1'));
62    // A plus sign can only appear at the beginning of the number; otherwise, no formatting is
63    // applied.
64    assertEquals("+48881231+", formatter.inputDigit('+'));
65    assertEquals("+48881231+2", formatter.inputDigit('2'));
66  }
67
68  public void testTooLongNumberMatchingMultipleLeadingDigits() {
69    // See http://code.google.com/p/libphonenumber/issues/detail?id=36
70    // The bug occurred last time for countries which have two formatting rules with exactly the
71    // same leading digits pattern but differ in length.
72    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
73    assertEquals("+", formatter.inputDigit('+'));
74    assertEquals("+8", formatter.inputDigit('8'));
75    assertEquals("+81 ", formatter.inputDigit('1'));
76    assertEquals("+81 9", formatter.inputDigit('9'));
77    assertEquals("+81 90", formatter.inputDigit('0'));
78    assertEquals("+81 90 1", formatter.inputDigit('1'));
79    assertEquals("+81 90 12", formatter.inputDigit('2'));
80    assertEquals("+81 90 123", formatter.inputDigit('3'));
81    assertEquals("+81 90 1234", formatter.inputDigit('4'));
82    assertEquals("+81 90 1234 5", formatter.inputDigit('5'));
83    assertEquals("+81 90 1234 56", formatter.inputDigit('6'));
84    assertEquals("+81 90 1234 567", formatter.inputDigit('7'));
85    assertEquals("+81 90 1234 5678", formatter.inputDigit('8'));
86    assertEquals("+81 90 12 345 6789", formatter.inputDigit('9'));
87    assertEquals("+81901234567890", formatter.inputDigit('0'));
88    assertEquals("+819012345678901", formatter.inputDigit('1'));
89  }
90
91  public void testCountryWithSpaceInNationalPrefixFormattingRule() {
92    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.BY);
93    assertEquals("8", formatter.inputDigit('8'));
94    assertEquals("88", formatter.inputDigit('8'));
95    assertEquals("881", formatter.inputDigit('1'));
96    assertEquals("8 819", formatter.inputDigit('9'));
97    assertEquals("8 8190", formatter.inputDigit('0'));
98    // The formatting rule for 5 digit numbers states that no space should be present after the
99    // national prefix.
100    assertEquals("881 901", formatter.inputDigit('1'));
101    assertEquals("8 819 012", formatter.inputDigit('2'));
102    // Too long, no formatting rule applies.
103    assertEquals("88190123", formatter.inputDigit('3'));
104  }
105
106  public void testCountryWithSpaceInNationalPrefixFormattingRuleAndLongNdd() {
107    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.BY);
108    assertEquals("9", formatter.inputDigit('9'));
109    assertEquals("99", formatter.inputDigit('9'));
110    assertEquals("999", formatter.inputDigit('9'));
111    assertEquals("9999", formatter.inputDigit('9'));
112    assertEquals("99999 ", formatter.inputDigit('9'));
113    assertEquals("99999 1", formatter.inputDigit('1'));
114    assertEquals("99999 12", formatter.inputDigit('2'));
115    assertEquals("99999 123", formatter.inputDigit('3'));
116    assertEquals("99999 1234", formatter.inputDigit('4'));
117    assertEquals("99999 12 345", formatter.inputDigit('5'));
118  }
119
120  public void testAYTFUS() {
121    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
122    assertEquals("6", formatter.inputDigit('6'));
123    assertEquals("65", formatter.inputDigit('5'));
124    assertEquals("650", formatter.inputDigit('0'));
125    assertEquals("650 2", formatter.inputDigit('2'));
126    assertEquals("650 25", formatter.inputDigit('5'));
127    assertEquals("650 253", formatter.inputDigit('3'));
128    // Note this is how a US local number (without area code) should be formatted.
129    assertEquals("650 2532", formatter.inputDigit('2'));
130    assertEquals("650 253 22", formatter.inputDigit('2'));
131    assertEquals("650 253 222", formatter.inputDigit('2'));
132    assertEquals("650 253 2222", formatter.inputDigit('2'));
133
134    formatter.clear();
135    assertEquals("1", formatter.inputDigit('1'));
136    assertEquals("16", formatter.inputDigit('6'));
137    assertEquals("1 65", formatter.inputDigit('5'));
138    assertEquals("1 650", formatter.inputDigit('0'));
139    assertEquals("1 650 2", formatter.inputDigit('2'));
140    assertEquals("1 650 25", formatter.inputDigit('5'));
141    assertEquals("1 650 253", formatter.inputDigit('3'));
142    assertEquals("1 650 253 2", formatter.inputDigit('2'));
143    assertEquals("1 650 253 22", formatter.inputDigit('2'));
144    assertEquals("1 650 253 222", formatter.inputDigit('2'));
145    assertEquals("1 650 253 2222", formatter.inputDigit('2'));
146
147    formatter.clear();
148    assertEquals("0", formatter.inputDigit('0'));
149    assertEquals("01", formatter.inputDigit('1'));
150    assertEquals("011 ", formatter.inputDigit('1'));
151    assertEquals("011 4", formatter.inputDigit('4'));
152    assertEquals("011 44 ", formatter.inputDigit('4'));
153    assertEquals("011 44 6", formatter.inputDigit('6'));
154    assertEquals("011 44 61", formatter.inputDigit('1'));
155    assertEquals("011 44 6 12", formatter.inputDigit('2'));
156    assertEquals("011 44 6 123", formatter.inputDigit('3'));
157    assertEquals("011 44 6 123 1", formatter.inputDigit('1'));
158    assertEquals("011 44 6 123 12", formatter.inputDigit('2'));
159    assertEquals("011 44 6 123 123", formatter.inputDigit('3'));
160    assertEquals("011 44 6 123 123 1", formatter.inputDigit('1'));
161    assertEquals("011 44 6 123 123 12", formatter.inputDigit('2'));
162    assertEquals("011 44 6 123 123 123", formatter.inputDigit('3'));
163
164    formatter.clear();
165    assertEquals("0", formatter.inputDigit('0'));
166    assertEquals("01", formatter.inputDigit('1'));
167    assertEquals("011 ", formatter.inputDigit('1'));
168    assertEquals("011 5", formatter.inputDigit('5'));
169    assertEquals("011 54 ", formatter.inputDigit('4'));
170    assertEquals("011 54 9", formatter.inputDigit('9'));
171    assertEquals("011 54 91", formatter.inputDigit('1'));
172    assertEquals("011 54 9 11", formatter.inputDigit('1'));
173    assertEquals("011 54 9 11 2", formatter.inputDigit('2'));
174    assertEquals("011 54 9 11 23", formatter.inputDigit('3'));
175    assertEquals("011 54 9 11 231", formatter.inputDigit('1'));
176    assertEquals("011 54 9 11 2312", formatter.inputDigit('2'));
177    assertEquals("011 54 9 11 2312 1", formatter.inputDigit('1'));
178    assertEquals("011 54 9 11 2312 12", formatter.inputDigit('2'));
179    assertEquals("011 54 9 11 2312 123", formatter.inputDigit('3'));
180    assertEquals("011 54 9 11 2312 1234", formatter.inputDigit('4'));
181
182    formatter.clear();
183    assertEquals("0", formatter.inputDigit('0'));
184    assertEquals("01", formatter.inputDigit('1'));
185    assertEquals("011 ", formatter.inputDigit('1'));
186    assertEquals("011 2", formatter.inputDigit('2'));
187    assertEquals("011 24", formatter.inputDigit('4'));
188    assertEquals("011 244 ", formatter.inputDigit('4'));
189    assertEquals("011 244 2", formatter.inputDigit('2'));
190    assertEquals("011 244 28", formatter.inputDigit('8'));
191    assertEquals("011 244 280", formatter.inputDigit('0'));
192    assertEquals("011 244 280 0", formatter.inputDigit('0'));
193    assertEquals("011 244 280 00", formatter.inputDigit('0'));
194    assertEquals("011 244 280 000", formatter.inputDigit('0'));
195    assertEquals("011 244 280 000 0", formatter.inputDigit('0'));
196    assertEquals("011 244 280 000 00", formatter.inputDigit('0'));
197    assertEquals("011 244 280 000 000", formatter.inputDigit('0'));
198
199    formatter.clear();
200    assertEquals("+", formatter.inputDigit('+'));
201    assertEquals("+4", formatter.inputDigit('4'));
202    assertEquals("+48 ", formatter.inputDigit('8'));
203    assertEquals("+48 8", formatter.inputDigit('8'));
204    assertEquals("+48 88", formatter.inputDigit('8'));
205    assertEquals("+48 88 1", formatter.inputDigit('1'));
206    assertEquals("+48 88 12", formatter.inputDigit('2'));
207    assertEquals("+48 88 123", formatter.inputDigit('3'));
208    assertEquals("+48 88 123 1", formatter.inputDigit('1'));
209    assertEquals("+48 88 123 12", formatter.inputDigit('2'));
210    assertEquals("+48 88 123 12 1", formatter.inputDigit('1'));
211    assertEquals("+48 88 123 12 12", formatter.inputDigit('2'));
212  }
213
214  public void testAYTFUSFullWidthCharacters() {
215    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
216    assertEquals("\uFF16", formatter.inputDigit('\uFF16'));
217    assertEquals("\uFF16\uFF15", formatter.inputDigit('\uFF15'));
218    assertEquals("650", formatter.inputDigit('\uFF10'));
219    assertEquals("650 2", formatter.inputDigit('\uFF12'));
220    assertEquals("650 25", formatter.inputDigit('\uFF15'));
221    assertEquals("650 253", formatter.inputDigit('\uFF13'));
222    assertEquals("650 2532", formatter.inputDigit('\uFF12'));
223    assertEquals("650 253 22", formatter.inputDigit('\uFF12'));
224    assertEquals("650 253 222", formatter.inputDigit('\uFF12'));
225    assertEquals("650 253 2222", formatter.inputDigit('\uFF12'));
226  }
227
228  public void testAYTFUSMobileShortCode() {
229    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
230    assertEquals("*", formatter.inputDigit('*'));
231    assertEquals("*1", formatter.inputDigit('1'));
232    assertEquals("*12", formatter.inputDigit('2'));
233    assertEquals("*121", formatter.inputDigit('1'));
234    assertEquals("*121#", formatter.inputDigit('#'));
235  }
236
237  public void testAYTFUSVanityNumber() {
238    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
239    assertEquals("8", formatter.inputDigit('8'));
240    assertEquals("80", formatter.inputDigit('0'));
241    assertEquals("800", formatter.inputDigit('0'));
242    assertEquals("800 ", formatter.inputDigit(' '));
243    assertEquals("800 M", formatter.inputDigit('M'));
244    assertEquals("800 MY", formatter.inputDigit('Y'));
245    assertEquals("800 MY ", formatter.inputDigit(' '));
246    assertEquals("800 MY A", formatter.inputDigit('A'));
247    assertEquals("800 MY AP", formatter.inputDigit('P'));
248    assertEquals("800 MY APP", formatter.inputDigit('P'));
249    assertEquals("800 MY APPL", formatter.inputDigit('L'));
250    assertEquals("800 MY APPLE", formatter.inputDigit('E'));
251  }
252
253  public void testAYTFAndRememberPositionUS() {
254    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
255    assertEquals("1", formatter.inputDigitAndRememberPosition('1'));
256    assertEquals(1, formatter.getRememberedPosition());
257    assertEquals("16", formatter.inputDigit('6'));
258    assertEquals("1 65", formatter.inputDigit('5'));
259    assertEquals(1, formatter.getRememberedPosition());
260    assertEquals("1 650", formatter.inputDigitAndRememberPosition('0'));
261    assertEquals(5, formatter.getRememberedPosition());
262    assertEquals("1 650 2", formatter.inputDigit('2'));
263    assertEquals("1 650 25", formatter.inputDigit('5'));
264    // Note the remembered position for digit "0" changes from 4 to 5, because a space is now
265    // inserted in the front.
266    assertEquals(5, formatter.getRememberedPosition());
267    assertEquals("1 650 253", formatter.inputDigit('3'));
268    assertEquals("1 650 253 2", formatter.inputDigit('2'));
269    assertEquals("1 650 253 22", formatter.inputDigit('2'));
270    assertEquals(5, formatter.getRememberedPosition());
271    assertEquals("1 650 253 222", formatter.inputDigitAndRememberPosition('2'));
272    assertEquals(13, formatter.getRememberedPosition());
273    assertEquals("1 650 253 2222", formatter.inputDigit('2'));
274    assertEquals(13, formatter.getRememberedPosition());
275    assertEquals("165025322222", formatter.inputDigit('2'));
276    assertEquals(10, formatter.getRememberedPosition());
277    assertEquals("1650253222222", formatter.inputDigit('2'));
278    assertEquals(10, formatter.getRememberedPosition());
279
280    formatter.clear();
281    assertEquals("1", formatter.inputDigit('1'));
282    assertEquals("16", formatter.inputDigitAndRememberPosition('6'));
283    assertEquals(2, formatter.getRememberedPosition());
284    assertEquals("1 65", formatter.inputDigit('5'));
285    assertEquals("1 650", formatter.inputDigit('0'));
286    assertEquals(3, formatter.getRememberedPosition());
287    assertEquals("1 650 2", formatter.inputDigit('2'));
288    assertEquals("1 650 25", formatter.inputDigit('5'));
289    assertEquals(3, formatter.getRememberedPosition());
290    assertEquals("1 650 253", formatter.inputDigit('3'));
291    assertEquals("1 650 253 2", formatter.inputDigit('2'));
292    assertEquals("1 650 253 22", formatter.inputDigit('2'));
293    assertEquals(3, formatter.getRememberedPosition());
294    assertEquals("1 650 253 222", formatter.inputDigit('2'));
295    assertEquals("1 650 253 2222", formatter.inputDigit('2'));
296    assertEquals("165025322222", formatter.inputDigit('2'));
297    assertEquals(2, formatter.getRememberedPosition());
298    assertEquals("1650253222222", formatter.inputDigit('2'));
299    assertEquals(2, formatter.getRememberedPosition());
300
301    formatter.clear();
302    assertEquals("6", formatter.inputDigit('6'));
303    assertEquals("65", formatter.inputDigit('5'));
304    assertEquals("650", formatter.inputDigit('0'));
305    assertEquals("650 2", formatter.inputDigit('2'));
306    assertEquals("650 25", formatter.inputDigit('5'));
307    assertEquals("650 253", formatter.inputDigit('3'));
308    assertEquals("650 2532", formatter.inputDigitAndRememberPosition('2'));
309    assertEquals(8, formatter.getRememberedPosition());
310    assertEquals("650 253 22", formatter.inputDigit('2'));
311    assertEquals(9, formatter.getRememberedPosition());
312    assertEquals("650 253 222", formatter.inputDigit('2'));
313    // No more formatting when semicolon is entered.
314    assertEquals("650253222;", formatter.inputDigit(';'));
315    assertEquals(7, formatter.getRememberedPosition());
316    assertEquals("650253222;2", formatter.inputDigit('2'));
317
318    formatter.clear();
319    assertEquals("6", formatter.inputDigit('6'));
320    assertEquals("65", formatter.inputDigit('5'));
321    assertEquals("650", formatter.inputDigit('0'));
322    // No more formatting when users choose to do their own formatting.
323    assertEquals("650-", formatter.inputDigit('-'));
324    assertEquals("650-2", formatter.inputDigitAndRememberPosition('2'));
325    assertEquals(5, formatter.getRememberedPosition());
326    assertEquals("650-25", formatter.inputDigit('5'));
327    assertEquals(5, formatter.getRememberedPosition());
328    assertEquals("650-253", formatter.inputDigit('3'));
329    assertEquals(5, formatter.getRememberedPosition());
330    assertEquals("650-253-", formatter.inputDigit('-'));
331    assertEquals("650-253-2", formatter.inputDigit('2'));
332    assertEquals("650-253-22", formatter.inputDigit('2'));
333    assertEquals("650-253-222", formatter.inputDigit('2'));
334    assertEquals("650-253-2222", formatter.inputDigit('2'));
335
336    formatter.clear();
337    assertEquals("0", formatter.inputDigit('0'));
338    assertEquals("01", formatter.inputDigit('1'));
339    assertEquals("011 ", formatter.inputDigit('1'));
340    assertEquals("011 4", formatter.inputDigitAndRememberPosition('4'));
341    assertEquals("011 48 ", formatter.inputDigit('8'));
342    assertEquals(5, formatter.getRememberedPosition());
343    assertEquals("011 48 8", formatter.inputDigit('8'));
344    assertEquals(5, formatter.getRememberedPosition());
345    assertEquals("011 48 88", formatter.inputDigit('8'));
346    assertEquals("011 48 88 1", formatter.inputDigit('1'));
347    assertEquals("011 48 88 12", formatter.inputDigit('2'));
348    assertEquals(5, formatter.getRememberedPosition());
349    assertEquals("011 48 88 123", formatter.inputDigit('3'));
350    assertEquals("011 48 88 123 1", formatter.inputDigit('1'));
351    assertEquals("011 48 88 123 12", formatter.inputDigit('2'));
352    assertEquals("011 48 88 123 12 1", formatter.inputDigit('1'));
353    assertEquals("011 48 88 123 12 12", formatter.inputDigit('2'));
354
355    formatter.clear();
356    assertEquals("+", formatter.inputDigit('+'));
357    assertEquals("+1", formatter.inputDigit('1'));
358    assertEquals("+1 6", formatter.inputDigitAndRememberPosition('6'));
359    assertEquals("+1 65", formatter.inputDigit('5'));
360    assertEquals("+1 650", formatter.inputDigit('0'));
361    assertEquals(4, formatter.getRememberedPosition());
362    assertEquals("+1 650 2", formatter.inputDigit('2'));
363    assertEquals(4, formatter.getRememberedPosition());
364    assertEquals("+1 650 25", formatter.inputDigit('5'));
365    assertEquals("+1 650 253", formatter.inputDigitAndRememberPosition('3'));
366    assertEquals("+1 650 253 2", formatter.inputDigit('2'));
367    assertEquals("+1 650 253 22", formatter.inputDigit('2'));
368    assertEquals("+1 650 253 222", formatter.inputDigit('2'));
369    assertEquals(10, formatter.getRememberedPosition());
370
371    formatter.clear();
372    assertEquals("+", formatter.inputDigit('+'));
373    assertEquals("+1", formatter.inputDigit('1'));
374    assertEquals("+1 6", formatter.inputDigitAndRememberPosition('6'));
375    assertEquals("+1 65", formatter.inputDigit('5'));
376    assertEquals("+1 650", formatter.inputDigit('0'));
377    assertEquals(4, formatter.getRememberedPosition());
378    assertEquals("+1 650 2", formatter.inputDigit('2'));
379    assertEquals(4, formatter.getRememberedPosition());
380    assertEquals("+1 650 25", formatter.inputDigit('5'));
381    assertEquals("+1 650 253", formatter.inputDigit('3'));
382    assertEquals("+1 650 253 2", formatter.inputDigit('2'));
383    assertEquals("+1 650 253 22", formatter.inputDigit('2'));
384    assertEquals("+1 650 253 222", formatter.inputDigit('2'));
385    assertEquals("+1650253222;", formatter.inputDigit(';'));
386    assertEquals(3, formatter.getRememberedPosition());
387  }
388
389  public void testAYTFGBFixedLine() {
390    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
391    assertEquals("0", formatter.inputDigit('0'));
392    assertEquals("02", formatter.inputDigit('2'));
393    assertEquals("020", formatter.inputDigit('0'));
394    assertEquals("020 7", formatter.inputDigitAndRememberPosition('7'));
395    assertEquals(5, formatter.getRememberedPosition());
396    assertEquals("020 70", formatter.inputDigit('0'));
397    assertEquals("020 703", formatter.inputDigit('3'));
398    assertEquals(5, formatter.getRememberedPosition());
399    assertEquals("020 7031", formatter.inputDigit('1'));
400    assertEquals("020 7031 3", formatter.inputDigit('3'));
401    assertEquals("020 7031 30", formatter.inputDigit('0'));
402    assertEquals("020 7031 300", formatter.inputDigit('0'));
403    assertEquals("020 7031 3000", formatter.inputDigit('0'));
404  }
405
406  public void testAYTFGBTollFree() {
407    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
408    assertEquals("0", formatter.inputDigit('0'));
409    assertEquals("08", formatter.inputDigit('8'));
410    assertEquals("080", formatter.inputDigit('0'));
411    assertEquals("080 7", formatter.inputDigit('7'));
412    assertEquals("080 70", formatter.inputDigit('0'));
413    assertEquals("080 703", formatter.inputDigit('3'));
414    assertEquals("080 7031", formatter.inputDigit('1'));
415    assertEquals("080 7031 3", formatter.inputDigit('3'));
416    assertEquals("080 7031 30", formatter.inputDigit('0'));
417    assertEquals("080 7031 300", formatter.inputDigit('0'));
418    assertEquals("080 7031 3000", formatter.inputDigit('0'));
419  }
420
421  public void testAYTFGBPremiumRate() {
422    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.GB);
423    assertEquals("0", formatter.inputDigit('0'));
424    assertEquals("09", formatter.inputDigit('9'));
425    assertEquals("090", formatter.inputDigit('0'));
426    assertEquals("090 7", formatter.inputDigit('7'));
427    assertEquals("090 70", formatter.inputDigit('0'));
428    assertEquals("090 703", formatter.inputDigit('3'));
429    assertEquals("090 7031", formatter.inputDigit('1'));
430    assertEquals("090 7031 3", formatter.inputDigit('3'));
431    assertEquals("090 7031 30", formatter.inputDigit('0'));
432    assertEquals("090 7031 300", formatter.inputDigit('0'));
433    assertEquals("090 7031 3000", formatter.inputDigit('0'));
434  }
435
436  public void testAYTFNZMobile() {
437    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.NZ);
438    assertEquals("0", formatter.inputDigit('0'));
439    assertEquals("02", formatter.inputDigit('2'));
440    assertEquals("021", formatter.inputDigit('1'));
441    assertEquals("02-11", formatter.inputDigit('1'));
442    assertEquals("02-112", formatter.inputDigit('2'));
443    // Note the unittest is using fake metadata which might produce non-ideal results.
444    assertEquals("02-112 3", formatter.inputDigit('3'));
445    assertEquals("02-112 34", formatter.inputDigit('4'));
446    assertEquals("02-112 345", formatter.inputDigit('5'));
447    assertEquals("02-112 3456", formatter.inputDigit('6'));
448  }
449
450  public void testAYTFDE() {
451    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.DE);
452    assertEquals("0", formatter.inputDigit('0'));
453    assertEquals("03", formatter.inputDigit('3'));
454    assertEquals("030", formatter.inputDigit('0'));
455    assertEquals("030/1", formatter.inputDigit('1'));
456    assertEquals("030/12", formatter.inputDigit('2'));
457    assertEquals("030/123", formatter.inputDigit('3'));
458    assertEquals("030/1234", formatter.inputDigit('4'));
459
460    // 04134 1234
461    formatter.clear();
462    assertEquals("0", formatter.inputDigit('0'));
463    assertEquals("04", formatter.inputDigit('4'));
464    assertEquals("041", formatter.inputDigit('1'));
465    assertEquals("041 3", formatter.inputDigit('3'));
466    assertEquals("041 34", formatter.inputDigit('4'));
467    assertEquals("04134 1", formatter.inputDigit('1'));
468    assertEquals("04134 12", formatter.inputDigit('2'));
469    assertEquals("04134 123", formatter.inputDigit('3'));
470    assertEquals("04134 1234", formatter.inputDigit('4'));
471
472    // 08021 2345
473    formatter.clear();
474    assertEquals("0", formatter.inputDigit('0'));
475    assertEquals("08", formatter.inputDigit('8'));
476    assertEquals("080", formatter.inputDigit('0'));
477    assertEquals("080 2", formatter.inputDigit('2'));
478    assertEquals("080 21", formatter.inputDigit('1'));
479    assertEquals("08021 2", formatter.inputDigit('2'));
480    assertEquals("08021 23", formatter.inputDigit('3'));
481    assertEquals("08021 234", formatter.inputDigit('4'));
482    assertEquals("08021 2345", formatter.inputDigit('5'));
483
484    // 00 1 650 253 2250
485    formatter.clear();
486    assertEquals("0", formatter.inputDigit('0'));
487    assertEquals("00", formatter.inputDigit('0'));
488    assertEquals("00 1 ", formatter.inputDigit('1'));
489    assertEquals("00 1 6", formatter.inputDigit('6'));
490    assertEquals("00 1 65", formatter.inputDigit('5'));
491    assertEquals("00 1 650", formatter.inputDigit('0'));
492    assertEquals("00 1 650 2", formatter.inputDigit('2'));
493    assertEquals("00 1 650 25", formatter.inputDigit('5'));
494    assertEquals("00 1 650 253", formatter.inputDigit('3'));
495    assertEquals("00 1 650 253 2", formatter.inputDigit('2'));
496    assertEquals("00 1 650 253 22", formatter.inputDigit('2'));
497    assertEquals("00 1 650 253 222", formatter.inputDigit('2'));
498    assertEquals("00 1 650 253 2222", formatter.inputDigit('2'));
499  }
500
501  public void testAYTFAR() {
502    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AR);
503    assertEquals("0", formatter.inputDigit('0'));
504    assertEquals("01", formatter.inputDigit('1'));
505    assertEquals("011", formatter.inputDigit('1'));
506    assertEquals("011 7", formatter.inputDigit('7'));
507    assertEquals("011 70", formatter.inputDigit('0'));
508    assertEquals("011 703", formatter.inputDigit('3'));
509    assertEquals("011 7031", formatter.inputDigit('1'));
510    assertEquals("011 7031-3", formatter.inputDigit('3'));
511    assertEquals("011 7031-30", formatter.inputDigit('0'));
512    assertEquals("011 7031-300", formatter.inputDigit('0'));
513    assertEquals("011 7031-3000", formatter.inputDigit('0'));
514  }
515
516  public void testAYTFARMobile() {
517    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AR);
518    assertEquals("+", formatter.inputDigit('+'));
519    assertEquals("+5", formatter.inputDigit('5'));
520    assertEquals("+54 ", formatter.inputDigit('4'));
521    assertEquals("+54 9", formatter.inputDigit('9'));
522    assertEquals("+54 91", formatter.inputDigit('1'));
523    assertEquals("+54 9 11", formatter.inputDigit('1'));
524    assertEquals("+54 9 11 2", formatter.inputDigit('2'));
525    assertEquals("+54 9 11 23", formatter.inputDigit('3'));
526    assertEquals("+54 9 11 231", formatter.inputDigit('1'));
527    assertEquals("+54 9 11 2312", formatter.inputDigit('2'));
528    assertEquals("+54 9 11 2312 1", formatter.inputDigit('1'));
529    assertEquals("+54 9 11 2312 12", formatter.inputDigit('2'));
530    assertEquals("+54 9 11 2312 123", formatter.inputDigit('3'));
531    assertEquals("+54 9 11 2312 1234", formatter.inputDigit('4'));
532  }
533
534  public void testAYTFKR() {
535    // +82 51 234 5678
536    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
537    assertEquals("+", formatter.inputDigit('+'));
538    assertEquals("+8", formatter.inputDigit('8'));
539    assertEquals("+82 ", formatter.inputDigit('2'));
540    assertEquals("+82 5", formatter.inputDigit('5'));
541    assertEquals("+82 51", formatter.inputDigit('1'));
542    assertEquals("+82 51-2", formatter.inputDigit('2'));
543    assertEquals("+82 51-23", formatter.inputDigit('3'));
544    assertEquals("+82 51-234", formatter.inputDigit('4'));
545    assertEquals("+82 51-234-5", formatter.inputDigit('5'));
546    assertEquals("+82 51-234-56", formatter.inputDigit('6'));
547    assertEquals("+82 51-234-567", formatter.inputDigit('7'));
548    assertEquals("+82 51-234-5678", formatter.inputDigit('8'));
549
550    // +82 2 531 5678
551    formatter.clear();
552    assertEquals("+", formatter.inputDigit('+'));
553    assertEquals("+8", formatter.inputDigit('8'));
554    assertEquals("+82 ", formatter.inputDigit('2'));
555    assertEquals("+82 2", formatter.inputDigit('2'));
556    assertEquals("+82 25", formatter.inputDigit('5'));
557    assertEquals("+82 2-53", formatter.inputDigit('3'));
558    assertEquals("+82 2-531", formatter.inputDigit('1'));
559    assertEquals("+82 2-531-5", formatter.inputDigit('5'));
560    assertEquals("+82 2-531-56", formatter.inputDigit('6'));
561    assertEquals("+82 2-531-567", formatter.inputDigit('7'));
562    assertEquals("+82 2-531-5678", formatter.inputDigit('8'));
563
564    // +82 2 3665 5678
565    formatter.clear();
566    assertEquals("+", formatter.inputDigit('+'));
567    assertEquals("+8", formatter.inputDigit('8'));
568    assertEquals("+82 ", formatter.inputDigit('2'));
569    assertEquals("+82 2", formatter.inputDigit('2'));
570    assertEquals("+82 23", formatter.inputDigit('3'));
571    assertEquals("+82 2-36", formatter.inputDigit('6'));
572    assertEquals("+82 2-366", formatter.inputDigit('6'));
573    assertEquals("+82 2-3665", formatter.inputDigit('5'));
574    assertEquals("+82 2-3665-5", formatter.inputDigit('5'));
575    assertEquals("+82 2-3665-56", formatter.inputDigit('6'));
576    assertEquals("+82 2-3665-567", formatter.inputDigit('7'));
577    assertEquals("+82 2-3665-5678", formatter.inputDigit('8'));
578
579    // 02-114
580    formatter.clear();
581    assertEquals("0", formatter.inputDigit('0'));
582    assertEquals("02", formatter.inputDigit('2'));
583    assertEquals("021", formatter.inputDigit('1'));
584    assertEquals("02-11", formatter.inputDigit('1'));
585    assertEquals("02-114", formatter.inputDigit('4'));
586
587    // 02-1300
588    formatter.clear();
589    assertEquals("0", formatter.inputDigit('0'));
590    assertEquals("02", formatter.inputDigit('2'));
591    assertEquals("021", formatter.inputDigit('1'));
592    assertEquals("02-13", formatter.inputDigit('3'));
593    assertEquals("02-130", formatter.inputDigit('0'));
594    assertEquals("02-1300", formatter.inputDigit('0'));
595
596    // 011-456-7890
597    formatter.clear();
598    assertEquals("0", formatter.inputDigit('0'));
599    assertEquals("01", formatter.inputDigit('1'));
600    assertEquals("011", formatter.inputDigit('1'));
601    assertEquals("011-4", formatter.inputDigit('4'));
602    assertEquals("011-45", formatter.inputDigit('5'));
603    assertEquals("011-456", formatter.inputDigit('6'));
604    assertEquals("011-456-7", formatter.inputDigit('7'));
605    assertEquals("011-456-78", formatter.inputDigit('8'));
606    assertEquals("011-456-789", formatter.inputDigit('9'));
607    assertEquals("011-456-7890", formatter.inputDigit('0'));
608
609    // 011-9876-7890
610    formatter.clear();
611    assertEquals("0", formatter.inputDigit('0'));
612    assertEquals("01", formatter.inputDigit('1'));
613    assertEquals("011", formatter.inputDigit('1'));
614    assertEquals("011-9", formatter.inputDigit('9'));
615    assertEquals("011-98", formatter.inputDigit('8'));
616    assertEquals("011-987", formatter.inputDigit('7'));
617    assertEquals("011-9876", formatter.inputDigit('6'));
618    assertEquals("011-9876-7", formatter.inputDigit('7'));
619    assertEquals("011-9876-78", formatter.inputDigit('8'));
620    assertEquals("011-9876-789", formatter.inputDigit('9'));
621    assertEquals("011-9876-7890", formatter.inputDigit('0'));
622  }
623
624  public void testAYTF_MX() {
625    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.MX);
626
627    // +52 800 123 4567
628    assertEquals("+", formatter.inputDigit('+'));
629    assertEquals("+5", formatter.inputDigit('5'));
630    assertEquals("+52 ", formatter.inputDigit('2'));
631    assertEquals("+52 8", formatter.inputDigit('8'));
632    assertEquals("+52 80", formatter.inputDigit('0'));
633    assertEquals("+52 800", formatter.inputDigit('0'));
634    assertEquals("+52 800 1", formatter.inputDigit('1'));
635    assertEquals("+52 800 12", formatter.inputDigit('2'));
636    assertEquals("+52 800 123", formatter.inputDigit('3'));
637    assertEquals("+52 800 123 4", formatter.inputDigit('4'));
638    assertEquals("+52 800 123 45", formatter.inputDigit('5'));
639    assertEquals("+52 800 123 456", formatter.inputDigit('6'));
640    assertEquals("+52 800 123 4567", formatter.inputDigit('7'));
641
642    // +52 55 1234 5678
643    formatter.clear();
644    assertEquals("+", formatter.inputDigit('+'));
645    assertEquals("+5", formatter.inputDigit('5'));
646    assertEquals("+52 ", formatter.inputDigit('2'));
647    assertEquals("+52 5", formatter.inputDigit('5'));
648    assertEquals("+52 55", formatter.inputDigit('5'));
649    assertEquals("+52 55 1", formatter.inputDigit('1'));
650    assertEquals("+52 55 12", formatter.inputDigit('2'));
651    assertEquals("+52 55 123", formatter.inputDigit('3'));
652    assertEquals("+52 55 1234", formatter.inputDigit('4'));
653    assertEquals("+52 55 1234 5", formatter.inputDigit('5'));
654    assertEquals("+52 55 1234 56", formatter.inputDigit('6'));
655    assertEquals("+52 55 1234 567", formatter.inputDigit('7'));
656    assertEquals("+52 55 1234 5678", formatter.inputDigit('8'));
657
658    // +52 212 345 6789
659    formatter.clear();
660    assertEquals("+", formatter.inputDigit('+'));
661    assertEquals("+5", formatter.inputDigit('5'));
662    assertEquals("+52 ", formatter.inputDigit('2'));
663    assertEquals("+52 2", formatter.inputDigit('2'));
664    assertEquals("+52 21", formatter.inputDigit('1'));
665    assertEquals("+52 212", formatter.inputDigit('2'));
666    assertEquals("+52 212 3", formatter.inputDigit('3'));
667    assertEquals("+52 212 34", formatter.inputDigit('4'));
668    assertEquals("+52 212 345", formatter.inputDigit('5'));
669    assertEquals("+52 212 345 6", formatter.inputDigit('6'));
670    assertEquals("+52 212 345 67", formatter.inputDigit('7'));
671    assertEquals("+52 212 345 678", formatter.inputDigit('8'));
672    assertEquals("+52 212 345 6789", formatter.inputDigit('9'));
673
674    // +52 1 55 1234 5678
675    formatter.clear();
676    assertEquals("+", formatter.inputDigit('+'));
677    assertEquals("+5", formatter.inputDigit('5'));
678    assertEquals("+52 ", formatter.inputDigit('2'));
679    assertEquals("+52 1", formatter.inputDigit('1'));
680    assertEquals("+52 15", formatter.inputDigit('5'));
681    assertEquals("+52 1 55", formatter.inputDigit('5'));
682    assertEquals("+52 1 55 1", formatter.inputDigit('1'));
683    assertEquals("+52 1 55 12", formatter.inputDigit('2'));
684    assertEquals("+52 1 55 123", formatter.inputDigit('3'));
685    assertEquals("+52 1 55 1234", formatter.inputDigit('4'));
686    assertEquals("+52 1 55 1234 5", formatter.inputDigit('5'));
687    assertEquals("+52 1 55 1234 56", formatter.inputDigit('6'));
688    assertEquals("+52 1 55 1234 567", formatter.inputDigit('7'));
689    assertEquals("+52 1 55 1234 5678", formatter.inputDigit('8'));
690
691    // +52 1 541 234 5678
692    formatter.clear();
693    assertEquals("+", formatter.inputDigit('+'));
694    assertEquals("+5", formatter.inputDigit('5'));
695    assertEquals("+52 ", formatter.inputDigit('2'));
696    assertEquals("+52 1", formatter.inputDigit('1'));
697    assertEquals("+52 15", formatter.inputDigit('5'));
698    assertEquals("+52 1 54", formatter.inputDigit('4'));
699    assertEquals("+52 1 541", formatter.inputDigit('1'));
700    assertEquals("+52 1 541 2", formatter.inputDigit('2'));
701    assertEquals("+52 1 541 23", formatter.inputDigit('3'));
702    assertEquals("+52 1 541 234", formatter.inputDigit('4'));
703    assertEquals("+52 1 541 234 5", formatter.inputDigit('5'));
704    assertEquals("+52 1 541 234 56", formatter.inputDigit('6'));
705    assertEquals("+52 1 541 234 567", formatter.inputDigit('7'));
706    assertEquals("+52 1 541 234 5678", formatter.inputDigit('8'));
707  }
708
709  public void testAYTF_International_Toll_Free() {
710    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
711    // +800 1234 5678
712    assertEquals("+", formatter.inputDigit('+'));
713    assertEquals("+8", formatter.inputDigit('8'));
714    assertEquals("+80", formatter.inputDigit('0'));
715    assertEquals("+800 ", formatter.inputDigit('0'));
716    assertEquals("+800 1", formatter.inputDigit('1'));
717    assertEquals("+800 12", formatter.inputDigit('2'));
718    assertEquals("+800 123", formatter.inputDigit('3'));
719    assertEquals("+800 1234", formatter.inputDigit('4'));
720    assertEquals("+800 1234 5", formatter.inputDigit('5'));
721    assertEquals("+800 1234 56", formatter.inputDigit('6'));
722    assertEquals("+800 1234 567", formatter.inputDigit('7'));
723    assertEquals("+800 1234 5678", formatter.inputDigit('8'));
724    assertEquals("+800123456789", formatter.inputDigit('9'));
725  }
726
727  public void testAYTFMultipleLeadingDigitPatterns() {
728    // +81 50 2345 6789
729    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.JP);
730    assertEquals("+", formatter.inputDigit('+'));
731    assertEquals("+8", formatter.inputDigit('8'));
732    assertEquals("+81 ", formatter.inputDigit('1'));
733    assertEquals("+81 5", formatter.inputDigit('5'));
734    assertEquals("+81 50", formatter.inputDigit('0'));
735    assertEquals("+81 50 2", formatter.inputDigit('2'));
736    assertEquals("+81 50 23", formatter.inputDigit('3'));
737    assertEquals("+81 50 234", formatter.inputDigit('4'));
738    assertEquals("+81 50 2345", formatter.inputDigit('5'));
739    assertEquals("+81 50 2345 6", formatter.inputDigit('6'));
740    assertEquals("+81 50 2345 67", formatter.inputDigit('7'));
741    assertEquals("+81 50 2345 678", formatter.inputDigit('8'));
742    assertEquals("+81 50 2345 6789", formatter.inputDigit('9'));
743
744    // +81 222 12 5678
745    formatter.clear();
746    assertEquals("+", formatter.inputDigit('+'));
747    assertEquals("+8", formatter.inputDigit('8'));
748    assertEquals("+81 ", formatter.inputDigit('1'));
749    assertEquals("+81 2", formatter.inputDigit('2'));
750    assertEquals("+81 22", formatter.inputDigit('2'));
751    assertEquals("+81 22 2", formatter.inputDigit('2'));
752    assertEquals("+81 22 21", formatter.inputDigit('1'));
753    assertEquals("+81 2221 2", formatter.inputDigit('2'));
754    assertEquals("+81 222 12 5", formatter.inputDigit('5'));
755    assertEquals("+81 222 12 56", formatter.inputDigit('6'));
756    assertEquals("+81 222 12 567", formatter.inputDigit('7'));
757    assertEquals("+81 222 12 5678", formatter.inputDigit('8'));
758
759    // 011113
760    formatter.clear();
761    assertEquals("0", formatter.inputDigit('0'));
762    assertEquals("01", formatter.inputDigit('1'));
763    assertEquals("011", formatter.inputDigit('1'));
764    assertEquals("011 1", formatter.inputDigit('1'));
765    assertEquals("011 11", formatter.inputDigit('1'));
766    assertEquals("011113", formatter.inputDigit('3'));
767
768    // +81 3332 2 5678
769    formatter.clear();
770    assertEquals("+", formatter.inputDigit('+'));
771    assertEquals("+8", formatter.inputDigit('8'));
772    assertEquals("+81 ", formatter.inputDigit('1'));
773    assertEquals("+81 3", formatter.inputDigit('3'));
774    assertEquals("+81 33", formatter.inputDigit('3'));
775    assertEquals("+81 33 3", formatter.inputDigit('3'));
776    assertEquals("+81 3332", formatter.inputDigit('2'));
777    assertEquals("+81 3332 2", formatter.inputDigit('2'));
778    assertEquals("+81 3332 2 5", formatter.inputDigit('5'));
779    assertEquals("+81 3332 2 56", formatter.inputDigit('6'));
780    assertEquals("+81 3332 2 567", formatter.inputDigit('7'));
781    assertEquals("+81 3332 2 5678", formatter.inputDigit('8'));
782  }
783
784  public void testAYTFLongIDD_AU() {
785    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AU);
786    // 0011 1 650 253 2250
787    assertEquals("0", formatter.inputDigit('0'));
788    assertEquals("00", formatter.inputDigit('0'));
789    assertEquals("001", formatter.inputDigit('1'));
790    assertEquals("0011", formatter.inputDigit('1'));
791    assertEquals("0011 1 ", formatter.inputDigit('1'));
792    assertEquals("0011 1 6", formatter.inputDigit('6'));
793    assertEquals("0011 1 65", formatter.inputDigit('5'));
794    assertEquals("0011 1 650", formatter.inputDigit('0'));
795    assertEquals("0011 1 650 2", formatter.inputDigit('2'));
796    assertEquals("0011 1 650 25", formatter.inputDigit('5'));
797    assertEquals("0011 1 650 253", formatter.inputDigit('3'));
798    assertEquals("0011 1 650 253 2", formatter.inputDigit('2'));
799    assertEquals("0011 1 650 253 22", formatter.inputDigit('2'));
800    assertEquals("0011 1 650 253 222", formatter.inputDigit('2'));
801    assertEquals("0011 1 650 253 2222", formatter.inputDigit('2'));
802
803    // 0011 81 3332 2 5678
804    formatter.clear();
805    assertEquals("0", formatter.inputDigit('0'));
806    assertEquals("00", formatter.inputDigit('0'));
807    assertEquals("001", formatter.inputDigit('1'));
808    assertEquals("0011", formatter.inputDigit('1'));
809    assertEquals("00118", formatter.inputDigit('8'));
810    assertEquals("0011 81 ", formatter.inputDigit('1'));
811    assertEquals("0011 81 3", formatter.inputDigit('3'));
812    assertEquals("0011 81 33", formatter.inputDigit('3'));
813    assertEquals("0011 81 33 3", formatter.inputDigit('3'));
814    assertEquals("0011 81 3332", formatter.inputDigit('2'));
815    assertEquals("0011 81 3332 2", formatter.inputDigit('2'));
816    assertEquals("0011 81 3332 2 5", formatter.inputDigit('5'));
817    assertEquals("0011 81 3332 2 56", formatter.inputDigit('6'));
818    assertEquals("0011 81 3332 2 567", formatter.inputDigit('7'));
819    assertEquals("0011 81 3332 2 5678", formatter.inputDigit('8'));
820
821    // 0011 244 250 253 222
822    formatter.clear();
823    assertEquals("0", formatter.inputDigit('0'));
824    assertEquals("00", formatter.inputDigit('0'));
825    assertEquals("001", formatter.inputDigit('1'));
826    assertEquals("0011", formatter.inputDigit('1'));
827    assertEquals("00112", formatter.inputDigit('2'));
828    assertEquals("001124", formatter.inputDigit('4'));
829    assertEquals("0011 244 ", formatter.inputDigit('4'));
830    assertEquals("0011 244 2", formatter.inputDigit('2'));
831    assertEquals("0011 244 25", formatter.inputDigit('5'));
832    assertEquals("0011 244 250", formatter.inputDigit('0'));
833    assertEquals("0011 244 250 2", formatter.inputDigit('2'));
834    assertEquals("0011 244 250 25", formatter.inputDigit('5'));
835    assertEquals("0011 244 250 253", formatter.inputDigit('3'));
836    assertEquals("0011 244 250 253 2", formatter.inputDigit('2'));
837    assertEquals("0011 244 250 253 22", formatter.inputDigit('2'));
838    assertEquals("0011 244 250 253 222", formatter.inputDigit('2'));
839  }
840
841  public void testAYTFLongIDD_KR() {
842    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
843    // 00300 1 650 253 2222
844    assertEquals("0", formatter.inputDigit('0'));
845    assertEquals("00", formatter.inputDigit('0'));
846    assertEquals("003", formatter.inputDigit('3'));
847    assertEquals("0030", formatter.inputDigit('0'));
848    assertEquals("00300", formatter.inputDigit('0'));
849    assertEquals("00300 1 ", formatter.inputDigit('1'));
850    assertEquals("00300 1 6", formatter.inputDigit('6'));
851    assertEquals("00300 1 65", formatter.inputDigit('5'));
852    assertEquals("00300 1 650", formatter.inputDigit('0'));
853    assertEquals("00300 1 650 2", formatter.inputDigit('2'));
854    assertEquals("00300 1 650 25", formatter.inputDigit('5'));
855    assertEquals("00300 1 650 253", formatter.inputDigit('3'));
856    assertEquals("00300 1 650 253 2", formatter.inputDigit('2'));
857    assertEquals("00300 1 650 253 22", formatter.inputDigit('2'));
858    assertEquals("00300 1 650 253 222", formatter.inputDigit('2'));
859    assertEquals("00300 1 650 253 2222", formatter.inputDigit('2'));
860  }
861
862  public void testAYTFLongNDD_KR() {
863    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
864    // 08811-9876-7890
865    assertEquals("0", formatter.inputDigit('0'));
866    assertEquals("08", formatter.inputDigit('8'));
867    assertEquals("088", formatter.inputDigit('8'));
868    assertEquals("0881", formatter.inputDigit('1'));
869    assertEquals("08811", formatter.inputDigit('1'));
870    assertEquals("08811-9", formatter.inputDigit('9'));
871    assertEquals("08811-98", formatter.inputDigit('8'));
872    assertEquals("08811-987", formatter.inputDigit('7'));
873    assertEquals("08811-9876", formatter.inputDigit('6'));
874    assertEquals("08811-9876-7", formatter.inputDigit('7'));
875    assertEquals("08811-9876-78", formatter.inputDigit('8'));
876    assertEquals("08811-9876-789", formatter.inputDigit('9'));
877    assertEquals("08811-9876-7890", formatter.inputDigit('0'));
878
879    // 08500 11-9876-7890
880    formatter.clear();
881    assertEquals("0", formatter.inputDigit('0'));
882    assertEquals("08", formatter.inputDigit('8'));
883    assertEquals("085", formatter.inputDigit('5'));
884    assertEquals("0850", formatter.inputDigit('0'));
885    assertEquals("08500 ", formatter.inputDigit('0'));
886    assertEquals("08500 1", formatter.inputDigit('1'));
887    assertEquals("08500 11", formatter.inputDigit('1'));
888    assertEquals("08500 11-9", formatter.inputDigit('9'));
889    assertEquals("08500 11-98", formatter.inputDigit('8'));
890    assertEquals("08500 11-987", formatter.inputDigit('7'));
891    assertEquals("08500 11-9876", formatter.inputDigit('6'));
892    assertEquals("08500 11-9876-7", formatter.inputDigit('7'));
893    assertEquals("08500 11-9876-78", formatter.inputDigit('8'));
894    assertEquals("08500 11-9876-789", formatter.inputDigit('9'));
895    assertEquals("08500 11-9876-7890", formatter.inputDigit('0'));
896  }
897
898  public void testAYTFLongNDD_SG() {
899    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.SG);
900    // 777777 9876 7890
901    assertEquals("7", formatter.inputDigit('7'));
902    assertEquals("77", formatter.inputDigit('7'));
903    assertEquals("777", formatter.inputDigit('7'));
904    assertEquals("7777", formatter.inputDigit('7'));
905    assertEquals("77777", formatter.inputDigit('7'));
906    assertEquals("777777 ", formatter.inputDigit('7'));
907    assertEquals("777777 9", formatter.inputDigit('9'));
908    assertEquals("777777 98", formatter.inputDigit('8'));
909    assertEquals("777777 987", formatter.inputDigit('7'));
910    assertEquals("777777 9876", formatter.inputDigit('6'));
911    assertEquals("777777 9876 7", formatter.inputDigit('7'));
912    assertEquals("777777 9876 78", formatter.inputDigit('8'));
913    assertEquals("777777 9876 789", formatter.inputDigit('9'));
914    assertEquals("777777 9876 7890", formatter.inputDigit('0'));
915  }
916
917  public void testAYTFShortNumberFormattingFix_AU() {
918    // For Australia, the national prefix is not optional when formatting.
919    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AU);
920
921    // 1234567890 - For leading digit 1, the national prefix formatting rule has first group only.
922    assertEquals("1", formatter.inputDigit('1'));
923    assertEquals("12", formatter.inputDigit('2'));
924    assertEquals("123", formatter.inputDigit('3'));
925    assertEquals("1234", formatter.inputDigit('4'));
926    assertEquals("1234 5", formatter.inputDigit('5'));
927    assertEquals("1234 56", formatter.inputDigit('6'));
928    assertEquals("1234 567", formatter.inputDigit('7'));
929    assertEquals("1234 567 8", formatter.inputDigit('8'));
930    assertEquals("1234 567 89", formatter.inputDigit('9'));
931    assertEquals("1234 567 890", formatter.inputDigit('0'));
932
933    // +61 1234 567 890 - Test the same number, but with the country code.
934    formatter.clear();
935    assertEquals("+", formatter.inputDigit('+'));
936    assertEquals("+6", formatter.inputDigit('6'));
937    assertEquals("+61 ", formatter.inputDigit('1'));
938    assertEquals("+61 1", formatter.inputDigit('1'));
939    assertEquals("+61 12", formatter.inputDigit('2'));
940    assertEquals("+61 123", formatter.inputDigit('3'));
941    assertEquals("+61 1234", formatter.inputDigit('4'));
942    assertEquals("+61 1234 5", formatter.inputDigit('5'));
943    assertEquals("+61 1234 56", formatter.inputDigit('6'));
944    assertEquals("+61 1234 567", formatter.inputDigit('7'));
945    assertEquals("+61 1234 567 8", formatter.inputDigit('8'));
946    assertEquals("+61 1234 567 89", formatter.inputDigit('9'));
947    assertEquals("+61 1234 567 890", formatter.inputDigit('0'));
948
949    // 212345678 - For leading digit 2, the national prefix formatting rule puts the national prefix
950    // before the first group.
951    formatter.clear();
952    assertEquals("0", formatter.inputDigit('0'));
953    assertEquals("02", formatter.inputDigit('2'));
954    assertEquals("021", formatter.inputDigit('1'));
955    assertEquals("02 12", formatter.inputDigit('2'));
956    assertEquals("02 123", formatter.inputDigit('3'));
957    assertEquals("02 1234", formatter.inputDigit('4'));
958    assertEquals("02 1234 5", formatter.inputDigit('5'));
959    assertEquals("02 1234 56", formatter.inputDigit('6'));
960    assertEquals("02 1234 567", formatter.inputDigit('7'));
961    assertEquals("02 1234 5678", formatter.inputDigit('8'));
962
963    // 212345678 - Test the same number, but without the leading 0.
964    formatter.clear();
965    assertEquals("2", formatter.inputDigit('2'));
966    assertEquals("21", formatter.inputDigit('1'));
967    assertEquals("212", formatter.inputDigit('2'));
968    assertEquals("2123", formatter.inputDigit('3'));
969    assertEquals("21234", formatter.inputDigit('4'));
970    assertEquals("212345", formatter.inputDigit('5'));
971    assertEquals("2123456", formatter.inputDigit('6'));
972    assertEquals("21234567", formatter.inputDigit('7'));
973    assertEquals("212345678", formatter.inputDigit('8'));
974
975    // +61 2 1234 5678 - Test the same number, but with the country code.
976    formatter.clear();
977    assertEquals("+", formatter.inputDigit('+'));
978    assertEquals("+6", formatter.inputDigit('6'));
979    assertEquals("+61 ", formatter.inputDigit('1'));
980    assertEquals("+61 2", formatter.inputDigit('2'));
981    assertEquals("+61 21", formatter.inputDigit('1'));
982    assertEquals("+61 2 12", formatter.inputDigit('2'));
983    assertEquals("+61 2 123", formatter.inputDigit('3'));
984    assertEquals("+61 2 1234", formatter.inputDigit('4'));
985    assertEquals("+61 2 1234 5", formatter.inputDigit('5'));
986    assertEquals("+61 2 1234 56", formatter.inputDigit('6'));
987    assertEquals("+61 2 1234 567", formatter.inputDigit('7'));
988    assertEquals("+61 2 1234 5678", formatter.inputDigit('8'));
989  }
990
991  public void testAYTFShortNumberFormattingFix_KR() {
992    // For Korea, the national prefix is not optional when formatting, and the national prefix
993    // formatting rule doesn't consist of only the first group.
994    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
995
996    // 111
997    assertEquals("1", formatter.inputDigit('1'));
998    assertEquals("11", formatter.inputDigit('1'));
999    assertEquals("111", formatter.inputDigit('1'));
1000
1001    // 114
1002    formatter.clear();
1003    assertEquals("1", formatter.inputDigit('1'));
1004    assertEquals("11", formatter.inputDigit('1'));
1005    assertEquals("114", formatter.inputDigit('4'));
1006
1007    // 13121234 - Test a mobile number without the national prefix. Even though it is not an
1008    // emergency number, it should be formatted as a block.
1009    formatter.clear();
1010    assertEquals("1", formatter.inputDigit('1'));
1011    assertEquals("13", formatter.inputDigit('3'));
1012    assertEquals("131", formatter.inputDigit('1'));
1013    assertEquals("1312", formatter.inputDigit('2'));
1014    assertEquals("13121", formatter.inputDigit('1'));
1015    assertEquals("131212", formatter.inputDigit('2'));
1016    assertEquals("1312123", formatter.inputDigit('3'));
1017    assertEquals("13121234", formatter.inputDigit('4'));
1018
1019    // +82 131-2-1234 - Test the same number, but with the country code.
1020    formatter.clear();
1021    assertEquals("+", formatter.inputDigit('+'));
1022    assertEquals("+8", formatter.inputDigit('8'));
1023    assertEquals("+82 ", formatter.inputDigit('2'));
1024    assertEquals("+82 1", formatter.inputDigit('1'));
1025    assertEquals("+82 13", formatter.inputDigit('3'));
1026    assertEquals("+82 131", formatter.inputDigit('1'));
1027    assertEquals("+82 131-2", formatter.inputDigit('2'));
1028    assertEquals("+82 131-2-1", formatter.inputDigit('1'));
1029    assertEquals("+82 131-2-12", formatter.inputDigit('2'));
1030    assertEquals("+82 131-2-123", formatter.inputDigit('3'));
1031    assertEquals("+82 131-2-1234", formatter.inputDigit('4'));
1032  }
1033
1034  public void testAYTFShortNumberFormattingFix_MX() {
1035    // For Mexico, the national prefix is optional when formatting.
1036    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.MX);
1037
1038    // 911
1039    assertEquals("9", formatter.inputDigit('9'));
1040    assertEquals("91", formatter.inputDigit('1'));
1041    assertEquals("911", formatter.inputDigit('1'));
1042
1043    // 800 123 4567 - Test a toll-free number, which should have a formatting rule applied to it
1044    // even though it doesn't begin with the national prefix.
1045    formatter.clear();
1046    assertEquals("8", formatter.inputDigit('8'));
1047    assertEquals("80", formatter.inputDigit('0'));
1048    assertEquals("800", formatter.inputDigit('0'));
1049    assertEquals("800 1", formatter.inputDigit('1'));
1050    assertEquals("800 12", formatter.inputDigit('2'));
1051    assertEquals("800 123", formatter.inputDigit('3'));
1052    assertEquals("800 123 4", formatter.inputDigit('4'));
1053    assertEquals("800 123 45", formatter.inputDigit('5'));
1054    assertEquals("800 123 456", formatter.inputDigit('6'));
1055    assertEquals("800 123 4567", formatter.inputDigit('7'));
1056
1057    // +52 800 123 4567 - Test the same number, but with the country code.
1058    formatter.clear();
1059    assertEquals("+", formatter.inputDigit('+'));
1060    assertEquals("+5", formatter.inputDigit('5'));
1061    assertEquals("+52 ", formatter.inputDigit('2'));
1062    assertEquals("+52 8", formatter.inputDigit('8'));
1063    assertEquals("+52 80", formatter.inputDigit('0'));
1064    assertEquals("+52 800", formatter.inputDigit('0'));
1065    assertEquals("+52 800 1", formatter.inputDigit('1'));
1066    assertEquals("+52 800 12", formatter.inputDigit('2'));
1067    assertEquals("+52 800 123", formatter.inputDigit('3'));
1068    assertEquals("+52 800 123 4", formatter.inputDigit('4'));
1069    assertEquals("+52 800 123 45", formatter.inputDigit('5'));
1070    assertEquals("+52 800 123 456", formatter.inputDigit('6'));
1071    assertEquals("+52 800 123 4567", formatter.inputDigit('7'));
1072  }
1073
1074  public void testAYTFNoNationalPrefix() {
1075    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.IT);
1076
1077    assertEquals("3", formatter.inputDigit('3'));
1078    assertEquals("33", formatter.inputDigit('3'));
1079    assertEquals("333", formatter.inputDigit('3'));
1080    assertEquals("333 3", formatter.inputDigit('3'));
1081    assertEquals("333 33", formatter.inputDigit('3'));
1082    assertEquals("333 333", formatter.inputDigit('3'));
1083  }
1084
1085  public void testAYTFShortNumberFormattingFix_US() {
1086    // For the US, an initial 1 is treated specially.
1087    AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
1088
1089    // 101 - Test that the initial 1 is not treated as a national prefix.
1090    assertEquals("1", formatter.inputDigit('1'));
1091    assertEquals("10", formatter.inputDigit('0'));
1092    assertEquals("101", formatter.inputDigit('1'));
1093
1094    // 112 - Test that the initial 1 is not treated as a national prefix.
1095    formatter.clear();
1096    assertEquals("1", formatter.inputDigit('1'));
1097    assertEquals("11", formatter.inputDigit('1'));
1098    assertEquals("112", formatter.inputDigit('2'));
1099
1100    // 122 - Test that the initial 1 is treated as a national prefix.
1101    formatter.clear();
1102    assertEquals("1", formatter.inputDigit('1'));
1103    assertEquals("12", formatter.inputDigit('2'));
1104    assertEquals("1 22", formatter.inputDigit('2'));
1105  }
1106}
1107