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