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