• 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 */
27
28goog.require('goog.testing.jsunit');
29goog.require('i18n.phonenumbers.AsYouTypeFormatter');
30goog.require('i18n.phonenumbers.RegionCode');
31
32var RegionCode = i18n.phonenumbers.RegionCode;
33
34function 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
57function 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
75function testTooLongNumberMatchingMultipleLeadingDigits() {
76  // See https://github.com/google/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
99function 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
115function 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
130function 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
225function 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
240function 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
250function 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
267function 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
404function 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
422function 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
438function 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
454function 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
470function 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
522function 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
538function 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
557function 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
648function 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
734function 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
753function 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
811function 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
869function 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
891function 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
928function 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
948function 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
1024function 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
1068function 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
1108function 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
1119function 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
1130function 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
1153function 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
1187function 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/google/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}
1208