3 * Copyright (C) 2010 The Libphonenumber Authors.
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 * @fileoverview Unit tests for the AsYouTypeFormatter.
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.
25 * @author Nikolaos Trogkanis
28 goog.require('goog.testing.jsunit');
29 goog.require('i18n.phonenumbers.AsYouTypeFormatter');
30 goog.require('i18n.phonenumbers.RegionCode');
32 var RegionCode = i18n.phonenumbers.RegionCode;
34 function testInvalidRegion() {
35 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
36 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.ZZ);
37 assertEquals('+', f.inputDigit('+'));
38 assertEquals('+4', f.inputDigit('4'));
39 assertEquals('+48 ', f.inputDigit('8'));
40 assertEquals('+48 8', f.inputDigit('8'));
41 assertEquals('+48 88', f.inputDigit('8'));
42 assertEquals('+48 88 1', f.inputDigit('1'));
43 assertEquals('+48 88 12', f.inputDigit('2'));
44 assertEquals('+48 88 123', f.inputDigit('3'));
45 assertEquals('+48 88 123 1', f.inputDigit('1'));
46 assertEquals('+48 88 123 12', f.inputDigit('2'));
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'));
57 function testInvalidPlusSign() {
58 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
59 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.ZZ);
60 assertEquals('+', f.inputDigit('+'));
61 assertEquals('+4', f.inputDigit('4'));
62 assertEquals('+48 ', f.inputDigit('8'));
63 assertEquals('+48 8', f.inputDigit('8'));
64 assertEquals('+48 88', f.inputDigit('8'));
65 assertEquals('+48 88 1', f.inputDigit('1'));
66 assertEquals('+48 88 12', f.inputDigit('2'));
67 assertEquals('+48 88 123', f.inputDigit('3'));
68 assertEquals('+48 88 123 1', f.inputDigit('1'));
69 // A plus sign can only appear at the beginning of the number;
70 // otherwise, no formatting is applied.
71 assertEquals('+48881231+', f.inputDigit('+'));
72 assertEquals('+48881231+2', f.inputDigit('2'));
75 function testTooLongNumberMatchingMultipleLeadingDigits() {
76 // See https://github.com/googlei18n/libphonenumber/issues/36
77 // The bug occurred last time for countries which have two formatting rules
78 // with exactly the same leading digits pattern but differ in length.
79 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
80 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.ZZ);
81 assertEquals('+', f.inputDigit('+'));
82 assertEquals('+8', f.inputDigit('8'));
83 assertEquals('+81 ', f.inputDigit('1'));
84 assertEquals('+81 9', f.inputDigit('9'));
85 assertEquals('+81 90', f.inputDigit('0'));
86 assertEquals('+81 90 1', f.inputDigit('1'));
87 assertEquals('+81 90 12', f.inputDigit('2'));
88 assertEquals('+81 90 123', f.inputDigit('3'));
89 assertEquals('+81 90 1234', f.inputDigit('4'));
90 assertEquals('+81 90 1234 5', f.inputDigit('5'));
91 assertEquals('+81 90 1234 56', f.inputDigit('6'));
92 assertEquals('+81 90 1234 567', f.inputDigit('7'));
93 assertEquals('+81 90 1234 5678', f.inputDigit('8'));
94 assertEquals('+81 90 12 345 6789', f.inputDigit('9'));
95 assertEquals('+81901234567890', f.inputDigit('0'));
96 assertEquals('+819012345678901', f.inputDigit('1'));
99 function testCountryWithSpaceInNationalPrefixFormattingRule() {
100 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
101 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.BY);
102 assertEquals('8', f.inputDigit('8'));
103 assertEquals('88', f.inputDigit('8'));
104 assertEquals('881', f.inputDigit('1'));
105 assertEquals('8 819', f.inputDigit('9'));
106 assertEquals('8 8190', f.inputDigit('0'));
107 // The formatting rule for 5 digit numbers states that no space should be
108 // present after the national prefix.
109 assertEquals('881 901', f.inputDigit('1'));
110 assertEquals('8 819 012', f.inputDigit('2'));
111 // Too long, no formatting rule applies.
112 assertEquals('88190123', f.inputDigit('3'));
115 function testCountryWithSpaceInNationalPrefixFormattingRuleAndLongNdd() {
116 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
117 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.BY);
118 assertEquals('9', f.inputDigit('9'));
119 assertEquals('99', f.inputDigit('9'));
120 assertEquals('999', f.inputDigit('9'));
121 assertEquals('9999', f.inputDigit('9'));
122 assertEquals('99999 ', f.inputDigit('9'));
123 assertEquals('99999 1', f.inputDigit('1'));
124 assertEquals('99999 12', f.inputDigit('2'));
125 assertEquals('99999 123', f.inputDigit('3'));
126 assertEquals('99999 1234', f.inputDigit('4'));
127 assertEquals('99999 12 345', f.inputDigit('5'));
130 function testAYTFUS() {
131 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
132 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
133 assertEquals('6', f.inputDigit('6'));
134 assertEquals('65', f.inputDigit('5'));
135 assertEquals('650', f.inputDigit('0'));
136 assertEquals('650 2', f.inputDigit('2'));
137 assertEquals('650 25', f.inputDigit('5'));
138 assertEquals('650 253', f.inputDigit('3'));
139 // Note this is how a US local number (without area code) should be formatted.
140 assertEquals('650 2532', f.inputDigit('2'));
141 assertEquals('650 253 22', f.inputDigit('2'));
142 assertEquals('650 253 222', f.inputDigit('2'));
143 assertEquals('650 253 2222', f.inputDigit('2'));
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'));
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'));
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'));
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'));
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'));
225 function testAYTFUSFullWidthCharacters() {
226 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
227 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
228 assertEquals('\uFF16', f.inputDigit('\uFF16'));
229 assertEquals('\uFF16\uFF15', f.inputDigit('\uFF15'));
230 assertEquals('650', f.inputDigit('\uFF10'));
231 assertEquals('650 2', f.inputDigit('\uFF12'));
232 assertEquals('650 25', f.inputDigit('\uFF15'));
233 assertEquals('650 253', f.inputDigit('\uFF13'));
234 assertEquals('650 2532', f.inputDigit('\uFF12'));
235 assertEquals('650 253 22', f.inputDigit('\uFF12'));
236 assertEquals('650 253 222', f.inputDigit('\uFF12'));
237 assertEquals('650 253 2222', f.inputDigit('\uFF12'));
240 function testAYTFUSMobileShortCode() {
241 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
242 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
243 assertEquals('*', f.inputDigit('*'));
244 assertEquals('*1', f.inputDigit('1'));
245 assertEquals('*12', f.inputDigit('2'));
246 assertEquals('*121', f.inputDigit('1'));
247 assertEquals('*121#', f.inputDigit('#'));
250 function testAYTFUSVanityNumber() {
251 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
252 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
253 assertEquals('8', f.inputDigit('8'));
254 assertEquals('80', f.inputDigit('0'));
255 assertEquals('800', f.inputDigit('0'));
256 assertEquals('800 ', f.inputDigit(' '));
257 assertEquals('800 M', f.inputDigit('M'));
258 assertEquals('800 MY', f.inputDigit('Y'));
259 assertEquals('800 MY ', f.inputDigit(' '));
260 assertEquals('800 MY A', f.inputDigit('A'));
261 assertEquals('800 MY AP', f.inputDigit('P'));
262 assertEquals('800 MY APP', f.inputDigit('P'));
263 assertEquals('800 MY APPL', f.inputDigit('L'));
264 assertEquals('800 MY APPLE', f.inputDigit('E'));
267 function testAYTFAndRememberPositionUS() {
268 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
269 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
270 assertEquals('1', f.inputDigitAndRememberPosition('1'));
271 assertEquals(1, f.getRememberedPosition());
272 assertEquals('16', f.inputDigit('6'));
273 assertEquals('1 65', f.inputDigit('5'));
274 assertEquals(1, f.getRememberedPosition());
275 assertEquals('1 650', f.inputDigitAndRememberPosition('0'));
276 assertEquals(5, f.getRememberedPosition());
277 assertEquals('1 650 2', f.inputDigit('2'));
278 assertEquals('1 650 25', f.inputDigit('5'));
279 // Note the remembered position for digit '0' changes from 4 to 5, because a
280 // space is now inserted in the front.
281 assertEquals(5, f.getRememberedPosition());
282 assertEquals('1 650 253', f.inputDigit('3'));
283 assertEquals('1 650 253 2', f.inputDigit('2'));
284 assertEquals('1 650 253 22', f.inputDigit('2'));
285 assertEquals(5, f.getRememberedPosition());
286 assertEquals('1 650 253 222', f.inputDigitAndRememberPosition('2'));
287 assertEquals(13, f.getRememberedPosition());
288 assertEquals('1 650 253 2222', f.inputDigit('2'));
289 assertEquals(13, f.getRememberedPosition());
290 assertEquals('165025322222', f.inputDigit('2'));
291 assertEquals(10, f.getRememberedPosition());
292 assertEquals('1650253222222', f.inputDigit('2'));
293 assertEquals(10, f.getRememberedPosition());
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());
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'));
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'));
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'));
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());
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());
404 function testAYTFGBFixedLine() {
405 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
406 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.GB);
407 assertEquals('0', f.inputDigit('0'));
408 assertEquals('02', f.inputDigit('2'));
409 assertEquals('020', f.inputDigit('0'));
410 assertEquals('020 7', f.inputDigitAndRememberPosition('7'));
411 assertEquals(5, f.getRememberedPosition());
412 assertEquals('020 70', f.inputDigit('0'));
413 assertEquals('020 703', f.inputDigit('3'));
414 assertEquals(5, f.getRememberedPosition());
415 assertEquals('020 7031', f.inputDigit('1'));
416 assertEquals('020 7031 3', f.inputDigit('3'));
417 assertEquals('020 7031 30', f.inputDigit('0'));
418 assertEquals('020 7031 300', f.inputDigit('0'));
419 assertEquals('020 7031 3000', f.inputDigit('0'));
422 function testAYTFGBTollFree() {
423 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
424 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.GB);
425 assertEquals('0', f.inputDigit('0'));
426 assertEquals('08', f.inputDigit('8'));
427 assertEquals('080', f.inputDigit('0'));
428 assertEquals('080 7', f.inputDigit('7'));
429 assertEquals('080 70', f.inputDigit('0'));
430 assertEquals('080 703', f.inputDigit('3'));
431 assertEquals('080 7031', f.inputDigit('1'));
432 assertEquals('080 7031 3', f.inputDigit('3'));
433 assertEquals('080 7031 30', f.inputDigit('0'));
434 assertEquals('080 7031 300', f.inputDigit('0'));
435 assertEquals('080 7031 3000', f.inputDigit('0'));
438 function testAYTFGBPremiumRate() {
439 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
440 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.GB);
441 assertEquals('0', f.inputDigit('0'));
442 assertEquals('09', f.inputDigit('9'));
443 assertEquals('090', f.inputDigit('0'));
444 assertEquals('090 7', f.inputDigit('7'));
445 assertEquals('090 70', f.inputDigit('0'));
446 assertEquals('090 703', f.inputDigit('3'));
447 assertEquals('090 7031', f.inputDigit('1'));
448 assertEquals('090 7031 3', f.inputDigit('3'));
449 assertEquals('090 7031 30', f.inputDigit('0'));
450 assertEquals('090 7031 300', f.inputDigit('0'));
451 assertEquals('090 7031 3000', f.inputDigit('0'));
454 function testAYTFNZMobile() {
455 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
456 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.NZ);
457 assertEquals('0', f.inputDigit('0'));
458 assertEquals('02', f.inputDigit('2'));
459 assertEquals('021', f.inputDigit('1'));
460 assertEquals('02-11', f.inputDigit('1'));
461 assertEquals('02-112', f.inputDigit('2'));
462 // Note the unittest is using fake metadata which might produce non-ideal
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'));
470 function testAYTFDE() {
471 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
472 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.DE);
473 assertEquals('0', f.inputDigit('0'));
474 assertEquals('03', f.inputDigit('3'));
475 assertEquals('030', f.inputDigit('0'));
476 assertEquals('030/1', f.inputDigit('1'));
477 assertEquals('030/12', f.inputDigit('2'));
478 assertEquals('030/123', f.inputDigit('3'));
479 assertEquals('030/1234', f.inputDigit('4'));
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'));
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'));
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'));
522 function testAYTFAR() {
523 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
524 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AR);
525 assertEquals('0', f.inputDigit('0'));
526 assertEquals('01', f.inputDigit('1'));
527 assertEquals('011', f.inputDigit('1'));
528 assertEquals('011 7', f.inputDigit('7'));
529 assertEquals('011 70', f.inputDigit('0'));
530 assertEquals('011 703', f.inputDigit('3'));
531 assertEquals('011 7031', f.inputDigit('1'));
532 assertEquals('011 7031-3', f.inputDigit('3'));
533 assertEquals('011 7031-30', f.inputDigit('0'));
534 assertEquals('011 7031-300', f.inputDigit('0'));
535 assertEquals('011 7031-3000', f.inputDigit('0'));
538 function testAYTFARMobile() {
539 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
540 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AR);
541 assertEquals('+', f.inputDigit('+'));
542 assertEquals('+5', f.inputDigit('5'));
543 assertEquals('+54 ', f.inputDigit('4'));
544 assertEquals('+54 9', f.inputDigit('9'));
545 assertEquals('+54 91', f.inputDigit('1'));
546 assertEquals('+54 9 11', f.inputDigit('1'));
547 assertEquals('+54 9 11 2', f.inputDigit('2'));
548 assertEquals('+54 9 11 23', f.inputDigit('3'));
549 assertEquals('+54 9 11 231', f.inputDigit('1'));
550 assertEquals('+54 9 11 2312', f.inputDigit('2'));
551 assertEquals('+54 9 11 2312 1', f.inputDigit('1'));
552 assertEquals('+54 9 11 2312 12', f.inputDigit('2'));
553 assertEquals('+54 9 11 2312 123', f.inputDigit('3'));
554 assertEquals('+54 9 11 2312 1234', f.inputDigit('4'));
557 function testAYTFKR() {
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'));
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'));
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'));
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'));
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'));
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'));
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'));
648 function testAYTF_MX() {
649 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
650 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.MX);
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'));
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'));
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'));
699 // +52 1 55 1234 5678
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'));
716 // +52 1 541 234 5678
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'));
734 function testAYTF_International_Toll_Free() {
735 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
736 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
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'));
753 function testAYTFMultipleLeadingDigitPatterns() {
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'));
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'));
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'));
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'));
811 function testAYTFLongIDD_AU() {
812 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
813 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AU);
814 // 0011 1 650 253 2250
815 assertEquals('0', f.inputDigit('0'));
816 assertEquals('00', f.inputDigit('0'));
817 assertEquals('001', f.inputDigit('1'));
818 assertEquals('0011', f.inputDigit('1'));
819 assertEquals('0011 1 ', f.inputDigit('1'));
820 assertEquals('0011 1 6', f.inputDigit('6'));
821 assertEquals('0011 1 65', f.inputDigit('5'));
822 assertEquals('0011 1 650', f.inputDigit('0'));
823 assertEquals('0011 1 650 2', f.inputDigit('2'));
824 assertEquals('0011 1 650 25', f.inputDigit('5'));
825 assertEquals('0011 1 650 253', f.inputDigit('3'));
826 assertEquals('0011 1 650 253 2', f.inputDigit('2'));
827 assertEquals('0011 1 650 253 22', f.inputDigit('2'));
828 assertEquals('0011 1 650 253 222', f.inputDigit('2'));
829 assertEquals('0011 1 650 253 2222', f.inputDigit('2'));
831 // 0011 81 3332 2 5678
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'));
849 // 0011 244 250 253 222
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'));
869 function testAYTFLongIDD_KR() {
870 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
871 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
872 // 00300 1 650 253 2222
873 assertEquals('0', f.inputDigit('0'));
874 assertEquals('00', f.inputDigit('0'));
875 assertEquals('003', f.inputDigit('3'));
876 assertEquals('0030', f.inputDigit('0'));
877 assertEquals('00300', f.inputDigit('0'));
878 assertEquals('00300 1 ', f.inputDigit('1'));
879 assertEquals('00300 1 6', f.inputDigit('6'));
880 assertEquals('00300 1 65', f.inputDigit('5'));
881 assertEquals('00300 1 650', f.inputDigit('0'));
882 assertEquals('00300 1 650 2', f.inputDigit('2'));
883 assertEquals('00300 1 650 25', f.inputDigit('5'));
884 assertEquals('00300 1 650 253', f.inputDigit('3'));
885 assertEquals('00300 1 650 253 2', f.inputDigit('2'));
886 assertEquals('00300 1 650 253 22', f.inputDigit('2'));
887 assertEquals('00300 1 650 253 222', f.inputDigit('2'));
888 assertEquals('00300 1 650 253 2222', f.inputDigit('2'));
891 function testAYTFLongNDD_KR() {
892 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
893 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
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'));
909 // 08500 11-9876-7890
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'));
928 function testAYTFLongNDD_SG() {
929 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
930 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.SG);
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'));
948 function testAYTFShortNumberFormattingFix_AU() {
949 // For Australia, the national prefix is not optional when formatting.
950 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
951 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AU);
953 // 1234567890 - For leading digit 1, the national prefix formatting rule has
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'));
966 // +61 1234 567 890 - Test the same number, but with the country code.
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'));
982 // 212345678 - For leading digit 2, the national prefix formatting rule puts
983 // the national prefix before the first group.
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'));
996 // 212345678 - Test the same number, but without the leading 0.
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'));
1008 // +61 2 1234 5678 - Test the same number, but with the country code.
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'));
1024 function testAYTFShortNumberFormattingFix_KR() {
1025 // For Korea, the national prefix is not optional when formatting, and the
1026 // national prefix formatting rule doesn't consist of only the first group.
1027 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
1028 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
1031 assertEquals('1', f.inputDigit('1'));
1032 assertEquals('11', f.inputDigit('1'));
1033 assertEquals('111', f.inputDigit('1'));
1037 assertEquals('1', f.inputDigit('1'));
1038 assertEquals('11', f.inputDigit('1'));
1039 assertEquals('114', f.inputDigit('4'));
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.
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'));
1053 // +82 131-2-1234 - Test the same number, but with the country code.
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'));
1068 function testAYTFShortNumberFormattingFix_MX() {
1069 // For Mexico, the national prefix is optional when formatting.
1070 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.MX);
1073 assertEquals('9', f.inputDigit('9'));
1074 assertEquals('91', f.inputDigit('1'));
1075 assertEquals('911', f.inputDigit('1'));
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.
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'));
1091 // +52 800 123 4567 - Test the same number, but with the country code.
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'));
1108 function testAYTFNoNationalPrefix() {
1109 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
1110 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.IT);
1111 assertEquals('3', f.inputDigit('3'));
1112 assertEquals('33', f.inputDigit('3'));
1113 assertEquals('333', f.inputDigit('3'));
1114 assertEquals('333 3', f.inputDigit('3'));
1115 assertEquals('333 33', f.inputDigit('3'));
1116 assertEquals('333 333', f.inputDigit('3'));
1119 function testAYTFNoNationalPrefixFormattingRule() {
1120 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
1121 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AO);
1122 assertEquals('3', f.inputDigit('3'));
1123 assertEquals('33', f.inputDigit('3'));
1124 assertEquals('333', f.inputDigit('3'));
1125 assertEquals('333 3', f.inputDigit('3'));
1126 assertEquals('333 33', f.inputDigit('3'));
1127 assertEquals('333 333', f.inputDigit('3'));
1130 function testAYTFShortNumberFormattingFix_US() {
1131 // For the US, an initial 1 is treated specially.
1132 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
1133 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
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'));
1140 // 112 - Test that the initial 1 is not treated as a national prefix.
1142 assertEquals('1', f.inputDigit('1'));
1143 assertEquals('11', f.inputDigit('1'));
1144 assertEquals('112', f.inputDigit('2'));
1146 // 122 - Test that the initial 1 is treated as a national prefix.
1148 assertEquals('1', f.inputDigit('1'));
1149 assertEquals('12', f.inputDigit('2'));
1150 assertEquals('1 22', f.inputDigit('2'));
1153 function testAYTFClearNDDAfterIddExtraction() {
1154 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
1155 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
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'));
1187 function testAYTFNumberPatternsBecomingInvalidShouldNotResultInDigitLoss() {
1188 /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
1189 var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.CN);
1191 assertEquals('+', f.inputDigit('+'));
1192 assertEquals('+8', f.inputDigit('8'));
1193 assertEquals('+86 ', f.inputDigit('6'));
1194 assertEquals('+86 9', f.inputDigit('9'));
1195 assertEquals('+86 98', f.inputDigit('8'));
1196 assertEquals('+86 988', f.inputDigit('8'));
1197 assertEquals('+86 988 1', f.inputDigit('1'));
1198 // Now the number pattern is no longer valid because there are multiple
1199 // leading digit patterns; when we try again to extract a country code we
1200 // should ensure we use the last leading digit pattern, rather than the first
1201 // one such that it *thinks* it's found a valid formatting rule again.
1202 // https://github.com/googlei18n/libphonenumber/issues/437
1203 assertEquals('+8698812', f.inputDigit('2'));
1204 assertEquals('+86988123', f.inputDigit('3'));
1205 assertEquals('+869881234', f.inputDigit('4'));
1206 assertEquals('+8698812345', f.inputDigit('5'));