Update asyoutypeformatter_test.js
[platform/upstream/libphonenumber.git] / javascript / i18n / phonenumbers / asyoutypeformatter_test.js
index ee12daf..1b70b28 100644 (file)
@@ -1,6 +1,6 @@
-/*
+/**
  * @license
- * Copyright (C) 2010 Google Inc.
+ * Copyright (C) 2010 The Libphonenumber Authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 /**
  * @fileoverview  Unit tests for the AsYouTypeFormatter.
  *
+ * Note that these tests use the metadata contained in metadatafortesting.js,
+ * not the normal metadata files, so should not be used for regression test
+ * purposes - these tests are illustrative only and test functionality.
+ *
  * @author Nikolaos Trogkanis
  */
 
 goog.require('goog.testing.jsunit');
 goog.require('i18n.phonenumbers.AsYouTypeFormatter');
+goog.require('i18n.phonenumbers.RegionCode');
+
+var RegionCode = i18n.phonenumbers.RegionCode;
 
 function testInvalidRegion() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('ZZ');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.ZZ);
   assertEquals('+', f.inputDigit('+'));
   assertEquals('+4', f.inputDigit('4'));
   assertEquals('+48 ', f.inputDigit('8'));
@@ -47,9 +54,82 @@ function testInvalidRegion() {
   assertEquals('650253', f.inputDigit('3'));
 }
 
+function testInvalidPlusSign() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.ZZ);
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+4', f.inputDigit('4'));
+  assertEquals('+48 ', f.inputDigit('8'));
+  assertEquals('+48 8', f.inputDigit('8'));
+  assertEquals('+48 88', f.inputDigit('8'));
+  assertEquals('+48 88 1', f.inputDigit('1'));
+  assertEquals('+48 88 12', f.inputDigit('2'));
+  assertEquals('+48 88 123', f.inputDigit('3'));
+  assertEquals('+48 88 123 1', f.inputDigit('1'));
+  // A plus sign can only appear at the beginning of the number;
+  // otherwise, no formatting is applied.
+  assertEquals('+48881231+', f.inputDigit('+'));
+  assertEquals('+48881231+2', f.inputDigit('2'));
+}
+
+function testTooLongNumberMatchingMultipleLeadingDigits() {
+  // See https://github.com/googlei18n/libphonenumber/issues/36
+  // The bug occurred last time for countries which have two formatting rules
+  // with exactly the same leading digits pattern but differ in length.
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.ZZ);
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+8', f.inputDigit('8'));
+  assertEquals('+81 ', f.inputDigit('1'));
+  assertEquals('+81 9', f.inputDigit('9'));
+  assertEquals('+81 90', f.inputDigit('0'));
+  assertEquals('+81 90 1', f.inputDigit('1'));
+  assertEquals('+81 90 12', f.inputDigit('2'));
+  assertEquals('+81 90 123', f.inputDigit('3'));
+  assertEquals('+81 90 1234', f.inputDigit('4'));
+  assertEquals('+81 90 1234 5', f.inputDigit('5'));
+  assertEquals('+81 90 1234 56', f.inputDigit('6'));
+  assertEquals('+81 90 1234 567', f.inputDigit('7'));
+  assertEquals('+81 90 1234 5678', f.inputDigit('8'));
+  assertEquals('+81 90 12 345 6789', f.inputDigit('9'));
+  assertEquals('+81901234567890', f.inputDigit('0'));
+  assertEquals('+819012345678901', f.inputDigit('1'));
+}
+
+function testCountryWithSpaceInNationalPrefixFormattingRule() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.BY);
+  assertEquals('8', f.inputDigit('8'));
+  assertEquals('88', f.inputDigit('8'));
+  assertEquals('881', f.inputDigit('1'));
+  assertEquals('8 819', f.inputDigit('9'));
+  assertEquals('8 8190', f.inputDigit('0'));
+  // The formatting rule for 5 digit numbers states that no space should be
+  // present after the national prefix.
+  assertEquals('881 901', f.inputDigit('1'));
+  assertEquals('8 819 012', f.inputDigit('2'));
+  // Too long, no formatting rule applies.
+  assertEquals('88190123', f.inputDigit('3'));
+}
+
+function testCountryWithSpaceInNationalPrefixFormattingRuleAndLongNdd() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.BY);
+  assertEquals('9', f.inputDigit('9'));
+  assertEquals('99', f.inputDigit('9'));
+  assertEquals('999', f.inputDigit('9'));
+  assertEquals('9999', f.inputDigit('9'));
+  assertEquals('99999 ', f.inputDigit('9'));
+  assertEquals('99999 1', f.inputDigit('1'));
+  assertEquals('99999 12', f.inputDigit('2'));
+  assertEquals('99999 123', f.inputDigit('3'));
+  assertEquals('99999 1234', f.inputDigit('4'));
+  assertEquals('99999 12 345', f.inputDigit('5'));
+}
+
 function testAYTFUS() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('US');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
   assertEquals('6', f.inputDigit('6'));
   assertEquals('65', f.inputDigit('5'));
   assertEquals('650', f.inputDigit('0'));
@@ -144,7 +224,7 @@ function testAYTFUS() {
 
 function testAYTFUSFullWidthCharacters() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('US');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
   assertEquals('\uFF16', f.inputDigit('\uFF16'));
   assertEquals('\uFF16\uFF15', f.inputDigit('\uFF15'));
   assertEquals('650', f.inputDigit('\uFF10'));
@@ -159,7 +239,7 @@ function testAYTFUSFullWidthCharacters() {
 
 function testAYTFUSMobileShortCode() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('US');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
   assertEquals('*', f.inputDigit('*'));
   assertEquals('*1', f.inputDigit('1'));
   assertEquals('*12', f.inputDigit('2'));
@@ -169,7 +249,7 @@ function testAYTFUSMobileShortCode() {
 
 function testAYTFUSVanityNumber() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('US');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
   assertEquals('8', f.inputDigit('8'));
   assertEquals('80', f.inputDigit('0'));
   assertEquals('800', f.inputDigit('0'));
@@ -186,7 +266,7 @@ function testAYTFUSVanityNumber() {
 
 function testAYTFAndRememberPositionUS() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('US');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
   assertEquals('1', f.inputDigitAndRememberPosition('1'));
   assertEquals(1, f.getRememberedPosition());
   assertEquals('16', f.inputDigit('6'));
@@ -323,7 +403,7 @@ function testAYTFAndRememberPositionUS() {
 
 function testAYTFGBFixedLine() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('GB');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.GB);
   assertEquals('0', f.inputDigit('0'));
   assertEquals('02', f.inputDigit('2'));
   assertEquals('020', f.inputDigit('0'));
@@ -341,7 +421,7 @@ function testAYTFGBFixedLine() {
 
 function testAYTFGBTollFree() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('gb');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.GB);
   assertEquals('0', f.inputDigit('0'));
   assertEquals('08', f.inputDigit('8'));
   assertEquals('080', f.inputDigit('0'));
@@ -357,7 +437,7 @@ function testAYTFGBTollFree() {
 
 function testAYTFGBPremiumRate() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('GB');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.GB);
   assertEquals('0', f.inputDigit('0'));
   assertEquals('09', f.inputDigit('9'));
   assertEquals('090', f.inputDigit('0'));
@@ -373,7 +453,7 @@ function testAYTFGBPremiumRate() {
 
 function testAYTFNZMobile() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('NZ');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.NZ);
   assertEquals('0', f.inputDigit('0'));
   assertEquals('02', f.inputDigit('2'));
   assertEquals('021', f.inputDigit('1'));
@@ -389,14 +469,14 @@ function testAYTFNZMobile() {
 
 function testAYTFDE() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('DE');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.DE);
   assertEquals('0', f.inputDigit('0'));
   assertEquals('03', f.inputDigit('3'));
   assertEquals('030', f.inputDigit('0'));
-  assertEquals('030 1', f.inputDigit('1'));
-  assertEquals('030 12', f.inputDigit('2'));
-  assertEquals('030 123', f.inputDigit('3'));
-  assertEquals('030 1234', f.inputDigit('4'));
+  assertEquals('030/1', f.inputDigit('1'));
+  assertEquals('030/12', f.inputDigit('2'));
+  assertEquals('030/123', f.inputDigit('3'));
+  assertEquals('030/1234', f.inputDigit('4'));
 
   // 04134 1234
   f.clear();
@@ -441,7 +521,7 @@ function testAYTFDE() {
 
 function testAYTFAR() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('AR');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AR);
   assertEquals('0', f.inputDigit('0'));
   assertEquals('01', f.inputDigit('1'));
   assertEquals('011', f.inputDigit('1'));
@@ -457,7 +537,7 @@ function testAYTFAR() {
 
 function testAYTFARMobile() {
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('AR');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AR);
   assertEquals('+', f.inputDigit('+'));
   assertEquals('+5', f.inputDigit('5'));
   assertEquals('+54 ', f.inputDigit('4'));
@@ -477,7 +557,7 @@ function testAYTFARMobile() {
 function testAYTFKR() {
   // +82 51 234 5678
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('KR');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
   assertEquals('+', f.inputDigit('+'));
   assertEquals('+8', f.inputDigit('8'));
   assertEquals('+82 ', f.inputDigit('2'));
@@ -565,10 +645,115 @@ function testAYTFKR() {
   assertEquals('011-9876-7890', f.inputDigit('0'));
 }
 
+function testAYTF_MX() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.MX);
+
+  // +52 800 123 4567
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+5', f.inputDigit('5'));
+  assertEquals('+52 ', f.inputDigit('2'));
+  assertEquals('+52 8', f.inputDigit('8'));
+  assertEquals('+52 80', f.inputDigit('0'));
+  assertEquals('+52 800', f.inputDigit('0'));
+  assertEquals('+52 800 1', f.inputDigit('1'));
+  assertEquals('+52 800 12', f.inputDigit('2'));
+  assertEquals('+52 800 123', f.inputDigit('3'));
+  assertEquals('+52 800 123 4', f.inputDigit('4'));
+  assertEquals('+52 800 123 45', f.inputDigit('5'));
+  assertEquals('+52 800 123 456', f.inputDigit('6'));
+  assertEquals('+52 800 123 4567', f.inputDigit('7'));
+
+  // +52 55 1234 5678
+  f.clear();
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+5', f.inputDigit('5'));
+  assertEquals('+52 ', f.inputDigit('2'));
+  assertEquals('+52 5', f.inputDigit('5'));
+  assertEquals('+52 55', f.inputDigit('5'));
+  assertEquals('+52 55 1', f.inputDigit('1'));
+  assertEquals('+52 55 12', f.inputDigit('2'));
+  assertEquals('+52 55 123', f.inputDigit('3'));
+  assertEquals('+52 55 1234', f.inputDigit('4'));
+  assertEquals('+52 55 1234 5', f.inputDigit('5'));
+  assertEquals('+52 55 1234 56', f.inputDigit('6'));
+  assertEquals('+52 55 1234 567', f.inputDigit('7'));
+  assertEquals('+52 55 1234 5678', f.inputDigit('8'));
+
+  // +52 212 345 6789
+  f.clear();
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+5', f.inputDigit('5'));
+  assertEquals('+52 ', f.inputDigit('2'));
+  assertEquals('+52 2', f.inputDigit('2'));
+  assertEquals('+52 21', f.inputDigit('1'));
+  assertEquals('+52 212', f.inputDigit('2'));
+  assertEquals('+52 212 3', f.inputDigit('3'));
+  assertEquals('+52 212 34', f.inputDigit('4'));
+  assertEquals('+52 212 345', f.inputDigit('5'));
+  assertEquals('+52 212 345 6', f.inputDigit('6'));
+  assertEquals('+52 212 345 67', f.inputDigit('7'));
+  assertEquals('+52 212 345 678', f.inputDigit('8'));
+  assertEquals('+52 212 345 6789', f.inputDigit('9'));
+
+  // +52 1 55 1234 5678
+  f.clear();
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+5', f.inputDigit('5'));
+  assertEquals('+52 ', f.inputDigit('2'));
+  assertEquals('+52 1', f.inputDigit('1'));
+  assertEquals('+52 15', f.inputDigit('5'));
+  assertEquals('+52 1 55', f.inputDigit('5'));
+  assertEquals('+52 1 55 1', f.inputDigit('1'));
+  assertEquals('+52 1 55 12', f.inputDigit('2'));
+  assertEquals('+52 1 55 123', f.inputDigit('3'));
+  assertEquals('+52 1 55 1234', f.inputDigit('4'));
+  assertEquals('+52 1 55 1234 5', f.inputDigit('5'));
+  assertEquals('+52 1 55 1234 56', f.inputDigit('6'));
+  assertEquals('+52 1 55 1234 567', f.inputDigit('7'));
+  assertEquals('+52 1 55 1234 5678', f.inputDigit('8'));
+
+  // +52 1 541 234 5678
+  f.clear();
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+5', f.inputDigit('5'));
+  assertEquals('+52 ', f.inputDigit('2'));
+  assertEquals('+52 1', f.inputDigit('1'));
+  assertEquals('+52 15', f.inputDigit('5'));
+  assertEquals('+52 1 54', f.inputDigit('4'));
+  assertEquals('+52 1 541', f.inputDigit('1'));
+  assertEquals('+52 1 541 2', f.inputDigit('2'));
+  assertEquals('+52 1 541 23', f.inputDigit('3'));
+  assertEquals('+52 1 541 234', f.inputDigit('4'));
+  assertEquals('+52 1 541 234 5', f.inputDigit('5'));
+  assertEquals('+52 1 541 234 56', f.inputDigit('6'));
+  assertEquals('+52 1 541 234 567', f.inputDigit('7'));
+  assertEquals('+52 1 541 234 5678', f.inputDigit('8'));
+}
+
+function testAYTF_International_Toll_Free() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
+  // +800 1234 5678
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+8', f.inputDigit('8'));
+  assertEquals('+80', f.inputDigit('0'));
+  assertEquals('+800 ', f.inputDigit('0'));
+  assertEquals('+800 1', f.inputDigit('1'));
+  assertEquals('+800 12', f.inputDigit('2'));
+  assertEquals('+800 123', f.inputDigit('3'));
+  assertEquals('+800 1234', f.inputDigit('4'));
+  assertEquals('+800 1234 5', f.inputDigit('5'));
+  assertEquals('+800 1234 56', f.inputDigit('6'));
+  assertEquals('+800 1234 567', f.inputDigit('7'));
+  assertEquals('+800 1234 5678', f.inputDigit('8'));
+  assertEquals('+800123456789', f.inputDigit('9'));
+}
+
 function testAYTFMultipleLeadingDigitPatterns() {
   // +81 50 2345 6789
   /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
-  var f = new i18n.phonenumbers.AsYouTypeFormatter('JP');
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.JP);
   assertEquals('+', f.inputDigit('+'));
   assertEquals('+8', f.inputDigit('8'));
   assertEquals('+81 ', f.inputDigit('1'));
@@ -598,6 +783,15 @@ function testAYTFMultipleLeadingDigitPatterns() {
   assertEquals('+81 222 12 567', f.inputDigit('7'));
   assertEquals('+81 222 12 5678', f.inputDigit('8'));
 
+  // 011113
+  f.clear();
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('01', f.inputDigit('1'));
+  assertEquals('011', f.inputDigit('1'));
+  assertEquals('011 1', f.inputDigit('1'));
+  assertEquals('011 11', f.inputDigit('1'));
+  assertEquals('011113', f.inputDigit('3'));
+
   // +81 3332 2 5678
   f.clear();
   assertEquals('+', f.inputDigit('+'));
@@ -613,3 +807,401 @@ function testAYTFMultipleLeadingDigitPatterns() {
   assertEquals('+81 3332 2 567', f.inputDigit('7'));
   assertEquals('+81 3332 2 5678', f.inputDigit('8'));
 }
+
+function testAYTFLongIDD_AU() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AU);
+  // 0011 1 650 253 2250
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('00', f.inputDigit('0'));
+  assertEquals('001', f.inputDigit('1'));
+  assertEquals('0011', f.inputDigit('1'));
+  assertEquals('0011 1 ', f.inputDigit('1'));
+  assertEquals('0011 1 6', f.inputDigit('6'));
+  assertEquals('0011 1 65', f.inputDigit('5'));
+  assertEquals('0011 1 650', f.inputDigit('0'));
+  assertEquals('0011 1 650 2', f.inputDigit('2'));
+  assertEquals('0011 1 650 25', f.inputDigit('5'));
+  assertEquals('0011 1 650 253', f.inputDigit('3'));
+  assertEquals('0011 1 650 253 2', f.inputDigit('2'));
+  assertEquals('0011 1 650 253 22', f.inputDigit('2'));
+  assertEquals('0011 1 650 253 222', f.inputDigit('2'));
+  assertEquals('0011 1 650 253 2222', f.inputDigit('2'));
+
+  // 0011 81 3332 2 5678
+  f.clear();
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('00', f.inputDigit('0'));
+  assertEquals('001', f.inputDigit('1'));
+  assertEquals('0011', f.inputDigit('1'));
+  assertEquals('00118', f.inputDigit('8'));
+  assertEquals('0011 81 ', f.inputDigit('1'));
+  assertEquals('0011 81 3', f.inputDigit('3'));
+  assertEquals('0011 81 33', f.inputDigit('3'));
+  assertEquals('0011 81 33 3', f.inputDigit('3'));
+  assertEquals('0011 81 3332', f.inputDigit('2'));
+  assertEquals('0011 81 3332 2', f.inputDigit('2'));
+  assertEquals('0011 81 3332 2 5', f.inputDigit('5'));
+  assertEquals('0011 81 3332 2 56', f.inputDigit('6'));
+  assertEquals('0011 81 3332 2 567', f.inputDigit('7'));
+  assertEquals('0011 81 3332 2 5678', f.inputDigit('8'));
+
+  // 0011 244 250 253 222
+  f.clear();
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('00', f.inputDigit('0'));
+  assertEquals('001', f.inputDigit('1'));
+  assertEquals('0011', f.inputDigit('1'));
+  assertEquals('00112', f.inputDigit('2'));
+  assertEquals('001124', f.inputDigit('4'));
+  assertEquals('0011 244 ', f.inputDigit('4'));
+  assertEquals('0011 244 2', f.inputDigit('2'));
+  assertEquals('0011 244 25', f.inputDigit('5'));
+  assertEquals('0011 244 250', f.inputDigit('0'));
+  assertEquals('0011 244 250 2', f.inputDigit('2'));
+  assertEquals('0011 244 250 25', f.inputDigit('5'));
+  assertEquals('0011 244 250 253', f.inputDigit('3'));
+  assertEquals('0011 244 250 253 2', f.inputDigit('2'));
+  assertEquals('0011 244 250 253 22', f.inputDigit('2'));
+  assertEquals('0011 244 250 253 222', f.inputDigit('2'));
+}
+
+function testAYTFLongIDD_KR() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
+  // 00300 1 650 253 2222
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('00', f.inputDigit('0'));
+  assertEquals('003', f.inputDigit('3'));
+  assertEquals('0030', f.inputDigit('0'));
+  assertEquals('00300', f.inputDigit('0'));
+  assertEquals('00300 1 ', f.inputDigit('1'));
+  assertEquals('00300 1 6', f.inputDigit('6'));
+  assertEquals('00300 1 65', f.inputDigit('5'));
+  assertEquals('00300 1 650', f.inputDigit('0'));
+  assertEquals('00300 1 650 2', f.inputDigit('2'));
+  assertEquals('00300 1 650 25', f.inputDigit('5'));
+  assertEquals('00300 1 650 253', f.inputDigit('3'));
+  assertEquals('00300 1 650 253 2', f.inputDigit('2'));
+  assertEquals('00300 1 650 253 22', f.inputDigit('2'));
+  assertEquals('00300 1 650 253 222', f.inputDigit('2'));
+  assertEquals('00300 1 650 253 2222', f.inputDigit('2'));
+}
+
+function testAYTFLongNDD_KR() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
+  // 08811-9876-7890
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('08', f.inputDigit('8'));
+  assertEquals('088', f.inputDigit('8'));
+  assertEquals('0881', f.inputDigit('1'));
+  assertEquals('08811', f.inputDigit('1'));
+  assertEquals('08811-9', f.inputDigit('9'));
+  assertEquals('08811-98', f.inputDigit('8'));
+  assertEquals('08811-987', f.inputDigit('7'));
+  assertEquals('08811-9876', f.inputDigit('6'));
+  assertEquals('08811-9876-7', f.inputDigit('7'));
+  assertEquals('08811-9876-78', f.inputDigit('8'));
+  assertEquals('08811-9876-789', f.inputDigit('9'));
+  assertEquals('08811-9876-7890', f.inputDigit('0'));
+
+  // 08500 11-9876-7890
+  f.clear();
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('08', f.inputDigit('8'));
+  assertEquals('085', f.inputDigit('5'));
+  assertEquals('0850', f.inputDigit('0'));
+  assertEquals('08500 ', f.inputDigit('0'));
+  assertEquals('08500 1', f.inputDigit('1'));
+  assertEquals('08500 11', f.inputDigit('1'));
+  assertEquals('08500 11-9', f.inputDigit('9'));
+  assertEquals('08500 11-98', f.inputDigit('8'));
+  assertEquals('08500 11-987', f.inputDigit('7'));
+  assertEquals('08500 11-9876', f.inputDigit('6'));
+  assertEquals('08500 11-9876-7', f.inputDigit('7'));
+  assertEquals('08500 11-9876-78', f.inputDigit('8'));
+  assertEquals('08500 11-9876-789', f.inputDigit('9'));
+  assertEquals('08500 11-9876-7890', f.inputDigit('0'));
+}
+
+function testAYTFLongNDD_SG() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.SG);
+  // 777777 9876 7890
+  assertEquals('7', f.inputDigit('7'));
+  assertEquals('77', f.inputDigit('7'));
+  assertEquals('777', f.inputDigit('7'));
+  assertEquals('7777', f.inputDigit('7'));
+  assertEquals('77777', f.inputDigit('7'));
+  assertEquals('777777 ', f.inputDigit('7'));
+  assertEquals('777777 9', f.inputDigit('9'));
+  assertEquals('777777 98', f.inputDigit('8'));
+  assertEquals('777777 987', f.inputDigit('7'));
+  assertEquals('777777 9876', f.inputDigit('6'));
+  assertEquals('777777 9876 7', f.inputDigit('7'));
+  assertEquals('777777 9876 78', f.inputDigit('8'));
+  assertEquals('777777 9876 789', f.inputDigit('9'));
+  assertEquals('777777 9876 7890', f.inputDigit('0'));
+}
+
+function testAYTFShortNumberFormattingFix_AU() {
+  // For Australia, the national prefix is not optional when formatting.
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AU);
+
+  // 1234567890 - For leading digit 1, the national prefix formatting rule has
+  // first group only.
+  assertEquals('1', f.inputDigit('1'));
+  assertEquals('12', f.inputDigit('2'));
+  assertEquals('123', f.inputDigit('3'));
+  assertEquals('1234', f.inputDigit('4'));
+  assertEquals('1234 5', f.inputDigit('5'));
+  assertEquals('1234 56', f.inputDigit('6'));
+  assertEquals('1234 567', f.inputDigit('7'));
+  assertEquals('1234 567 8', f.inputDigit('8'));
+  assertEquals('1234 567 89', f.inputDigit('9'));
+  assertEquals('1234 567 890', f.inputDigit('0'));
+
+  // +61 1234 567 890 - Test the same number, but with the country code.
+  f.clear();
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+6', f.inputDigit('6'));
+  assertEquals('+61 ', f.inputDigit('1'));
+  assertEquals('+61 1', f.inputDigit('1'));
+  assertEquals('+61 12', f.inputDigit('2'));
+  assertEquals('+61 123', f.inputDigit('3'));
+  assertEquals('+61 1234', f.inputDigit('4'));
+  assertEquals('+61 1234 5', f.inputDigit('5'));
+  assertEquals('+61 1234 56', f.inputDigit('6'));
+  assertEquals('+61 1234 567', f.inputDigit('7'));
+  assertEquals('+61 1234 567 8', f.inputDigit('8'));
+  assertEquals('+61 1234 567 89', f.inputDigit('9'));
+  assertEquals('+61 1234 567 890', f.inputDigit('0'));
+
+  // 212345678 - For leading digit 2, the national prefix formatting rule puts
+  // the national prefix before the first group.
+  f.clear();
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('02', f.inputDigit('2'));
+  assertEquals('021', f.inputDigit('1'));
+  assertEquals('02 12', f.inputDigit('2'));
+  assertEquals('02 123', f.inputDigit('3'));
+  assertEquals('02 1234', f.inputDigit('4'));
+  assertEquals('02 1234 5', f.inputDigit('5'));
+  assertEquals('02 1234 56', f.inputDigit('6'));
+  assertEquals('02 1234 567', f.inputDigit('7'));
+  assertEquals('02 1234 5678', f.inputDigit('8'));
+
+  // 212345678 - Test the same number, but without the leading 0.
+  f.clear();
+  assertEquals('2', f.inputDigit('2'));
+  assertEquals('21', f.inputDigit('1'));
+  assertEquals('212', f.inputDigit('2'));
+  assertEquals('2123', f.inputDigit('3'));
+  assertEquals('21234', f.inputDigit('4'));
+  assertEquals('212345', f.inputDigit('5'));
+  assertEquals('2123456', f.inputDigit('6'));
+  assertEquals('21234567', f.inputDigit('7'));
+  assertEquals('212345678', f.inputDigit('8'));
+
+  // +61 2 1234 5678 - Test the same number, but with the country code.
+  f.clear();
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+6', f.inputDigit('6'));
+  assertEquals('+61 ', f.inputDigit('1'));
+  assertEquals('+61 2', f.inputDigit('2'));
+  assertEquals('+61 21', f.inputDigit('1'));
+  assertEquals('+61 2 12', f.inputDigit('2'));
+  assertEquals('+61 2 123', f.inputDigit('3'));
+  assertEquals('+61 2 1234', f.inputDigit('4'));
+  assertEquals('+61 2 1234 5', f.inputDigit('5'));
+  assertEquals('+61 2 1234 56', f.inputDigit('6'));
+  assertEquals('+61 2 1234 567', f.inputDigit('7'));
+  assertEquals('+61 2 1234 5678', f.inputDigit('8'));
+}
+
+function testAYTFShortNumberFormattingFix_KR() {
+  // For Korea, the national prefix is not optional when formatting, and the
+  // national prefix formatting rule doesn't consist of only the first group.
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
+
+  // 111
+  assertEquals('1', f.inputDigit('1'));
+  assertEquals('11', f.inputDigit('1'));
+  assertEquals('111', f.inputDigit('1'));
+
+  // 114
+  f.clear();
+  assertEquals('1', f.inputDigit('1'));
+  assertEquals('11', f.inputDigit('1'));
+  assertEquals('114', f.inputDigit('4'));
+
+  // 13121234 - Test a mobile number without the national prefix. Even though it
+  // is not an emergency number, it should be formatted as a block.
+  f.clear();
+  assertEquals('1', f.inputDigit('1'));
+  assertEquals('13', f.inputDigit('3'));
+  assertEquals('131', f.inputDigit('1'));
+  assertEquals('1312', f.inputDigit('2'));
+  assertEquals('13121', f.inputDigit('1'));
+  assertEquals('131212', f.inputDigit('2'));
+  assertEquals('1312123', f.inputDigit('3'));
+  assertEquals('13121234', f.inputDigit('4'));
+
+  // +82 131-2-1234 - Test the same number, but with the country code.
+  f.clear();
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+8', f.inputDigit('8'));
+  assertEquals('+82 ', f.inputDigit('2'));
+  assertEquals('+82 1', f.inputDigit('1'));
+  assertEquals('+82 13', f.inputDigit('3'));
+  assertEquals('+82 131', f.inputDigit('1'));
+  assertEquals('+82 131-2', f.inputDigit('2'));
+  assertEquals('+82 131-2-1', f.inputDigit('1'));
+  assertEquals('+82 131-2-12', f.inputDigit('2'));
+  assertEquals('+82 131-2-123', f.inputDigit('3'));
+  assertEquals('+82 131-2-1234', f.inputDigit('4'));
+}
+
+function testAYTFShortNumberFormattingFix_MX() {
+  // For Mexico, the national prefix is optional when formatting.
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.MX);
+
+  // 911
+  assertEquals('9', f.inputDigit('9'));
+  assertEquals('91', f.inputDigit('1'));
+  assertEquals('911', f.inputDigit('1'));
+
+  // 800 123 4567 - Test a toll-free number, which should have a formatting rule
+  // applied to it even though it doesn't begin with the national prefix.
+  f.clear();
+  assertEquals('8', f.inputDigit('8'));
+  assertEquals('80', f.inputDigit('0'));
+  assertEquals('800', f.inputDigit('0'));
+  assertEquals('800 1', f.inputDigit('1'));
+  assertEquals('800 12', f.inputDigit('2'));
+  assertEquals('800 123', f.inputDigit('3'));
+  assertEquals('800 123 4', f.inputDigit('4'));
+  assertEquals('800 123 45', f.inputDigit('5'));
+  assertEquals('800 123 456', f.inputDigit('6'));
+  assertEquals('800 123 4567', f.inputDigit('7'));
+
+  // +52 800 123 4567 - Test the same number, but with the country code.
+  f.clear();
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+5', f.inputDigit('5'));
+  assertEquals('+52 ', f.inputDigit('2'));
+  assertEquals('+52 8', f.inputDigit('8'));
+  assertEquals('+52 80', f.inputDigit('0'));
+  assertEquals('+52 800', f.inputDigit('0'));
+  assertEquals('+52 800 1', f.inputDigit('1'));
+  assertEquals('+52 800 12', f.inputDigit('2'));
+  assertEquals('+52 800 123', f.inputDigit('3'));
+  assertEquals('+52 800 123 4', f.inputDigit('4'));
+  assertEquals('+52 800 123 45', f.inputDigit('5'));
+  assertEquals('+52 800 123 456', f.inputDigit('6'));
+  assertEquals('+52 800 123 4567', f.inputDigit('7'));
+}
+
+function testAYTFNoNationalPrefix() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.IT);
+  assertEquals('3', f.inputDigit('3'));
+  assertEquals('33', f.inputDigit('3'));
+  assertEquals('333', f.inputDigit('3'));
+  assertEquals('333 3', f.inputDigit('3'));
+  assertEquals('333 33', f.inputDigit('3'));
+  assertEquals('333 333', f.inputDigit('3'));
+}
+
+function testAYTFNoNationalPrefixFormattingRule() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AO);
+  assertEquals('3', f.inputDigit('3'));
+  assertEquals('33', f.inputDigit('3'));
+  assertEquals('333', f.inputDigit('3'));
+  assertEquals('333 3', f.inputDigit('3'));
+  assertEquals('333 33', f.inputDigit('3'));
+  assertEquals('333 333', f.inputDigit('3'));
+}
+
+function testAYTFShortNumberFormattingFix_US() {
+  // For the US, an initial 1 is treated specially.
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.US);
+
+  // 101 - Test that the initial 1 is not treated as a national prefix.
+  assertEquals('1', f.inputDigit('1'));
+  assertEquals('10', f.inputDigit('0'));
+  assertEquals('101', f.inputDigit('1'));
+
+  // 112 - Test that the initial 1 is not treated as a national prefix.
+  f.clear();
+  assertEquals('1', f.inputDigit('1'));
+  assertEquals('11', f.inputDigit('1'));
+  assertEquals('112', f.inputDigit('2'));
+
+  // 122 - Test that the initial 1 is treated as a national prefix.
+  f.clear();
+  assertEquals('1', f.inputDigit('1'));
+  assertEquals('12', f.inputDigit('2'));
+  assertEquals('1 22', f.inputDigit('2'));
+}
+
+function testAYTFClearNDDAfterIddExtraction() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
+
+  assertEquals('0', f.inputDigit('0'));
+  assertEquals('00', f.inputDigit('0'));
+  assertEquals('007', f.inputDigit('7'));
+  assertEquals('0070', f.inputDigit('0'));
+  assertEquals('00700', f.inputDigit('0'));
+  // NDD is '0' at this stage (the first '0' in '00700') because it's not
+  // clear if the number is a national number or using the IDD to dial out.
+  assertEquals('00700 1 ', f.inputDigit('1'));
+  // NDD should be cleared here because IDD '00700' was extracted after the
+  // country calling code '1' (US) was entered.
+  assertEquals('00700 1 2', f.inputDigit('2'));
+  // The remaining long sequence of inputs is because the original bug that
+  // this test if for only triggered after a lot of subsequent inputs.
+  assertEquals('00700 1 23', f.inputDigit('3'));
+  assertEquals('00700 1 234', f.inputDigit('4'));
+  assertEquals('00700 1 234 5', f.inputDigit('5'));
+  assertEquals('00700 1 234 56', f.inputDigit('6'));
+  assertEquals('00700 1 234 567', f.inputDigit('7'));
+  assertEquals('00700 1 234 567 8', f.inputDigit('8'));
+  assertEquals('00700 1 234 567 89', f.inputDigit('9'));
+  assertEquals('00700 1 234 567 890', f.inputDigit('0'));
+  assertEquals('00700 1 234 567 8901', f.inputDigit('1'));
+  assertEquals('00700123456789012', f.inputDigit('2'));
+  assertEquals('007001234567890123', f.inputDigit('3'));
+  assertEquals('0070012345678901234', f.inputDigit('4'));
+  assertEquals('00700123456789012345', f.inputDigit('5'));
+  assertEquals('007001234567890123456', f.inputDigit('6'));
+  assertEquals('0070012345678901234567', f.inputDigit('7'));
+}
+
+function testAYTFNumberPatternsBecomingInvalidShouldNotResultInDigitLoss() {
+  /** @type {i18n.phonenumbers.AsYouTypeFormatter} */
+  var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.CN);
+
+  assertEquals('+', f.inputDigit('+'));
+  assertEquals('+8', f.inputDigit('8'));
+  assertEquals('+86 ', f.inputDigit('6'));
+  assertEquals('+86 9', f.inputDigit('9'));
+  assertEquals('+86 98', f.inputDigit('8'));
+  assertEquals('+86 988', f.inputDigit('8'));
+  assertEquals('+86 988 1', f.inputDigit('1'));
+  // Now the number pattern is no longer valid because there are multiple
+  // leading digit patterns; when we try again to extract a country code we
+  // should ensure we use the last leading digit pattern, rather than the first
+  // one such that it *thinks* it's found a valid formatting rule again.
+  // https://github.com/googlei18n/libphonenumber/issues/437
+  assertEquals('+8698812', f.inputDigit('2'));
+  assertEquals('+86988123', f.inputDigit('3'));
+  assertEquals('+869881234', f.inputDigit('4'));
+  assertEquals('+8698812345', f.inputDigit('5'));
+}