/**
* @license
- * Copyright (C) 2010 The Libphonenumber Authors
+ * 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.
}
function testTooLongNumberMatchingMultipleLeadingDigits() {
- // See http://code.google.com/p/libphonenumber/issues/detail?id=36
+ // 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} */
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() {
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} */
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('+'));
function testAYTFLongIDD_AU() {
/** @type {i18n.phonenumbers.AsYouTypeFormatter} */
- var f = new i18n.phonenumbers.AsYouTypeFormatter('AU');
+ var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.AU);
// 0011 1 650 253 2250
assertEquals('0', f.inputDigit('0'));
assertEquals('00', f.inputDigit('0'));
function testAYTFLongIDD_KR() {
/** @type {i18n.phonenumbers.AsYouTypeFormatter} */
- var f = new i18n.phonenumbers.AsYouTypeFormatter('KR');
+ var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
// 00300 1 650 253 2222
assertEquals('0', f.inputDigit('0'));
assertEquals('00', f.inputDigit('0'));
function testAYTFLongNDD_KR() {
/** @type {i18n.phonenumbers.AsYouTypeFormatter} */
- var f = new i18n.phonenumbers.AsYouTypeFormatter('KR');
+ var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.KR);
// 08811-9876-7890
assertEquals('0', f.inputDigit('0'));
assertEquals('08', f.inputDigit('8'));
function testAYTFLongNDD_SG() {
/** @type {i18n.phonenumbers.AsYouTypeFormatter} */
- var f = new i18n.phonenumbers.AsYouTypeFormatter('SG');
+ var f = new i18n.phonenumbers.AsYouTypeFormatter(RegionCode.SG);
// 777777 9876 7890
assertEquals('7', f.inputDigit('7'));
assertEquals('77', f.inputDigit('7'));
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 should be '0' at this stage.
+ assertEquals('00700 1 ', f.inputDigit('1'));
+ // NDD should be cleared here because IDD '1' was extracted.
+ 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'));
+}