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