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