package com.google.i18n.phonenumbers;
-import junit.framework.TestCase;
-
/**
* Unit tests for AsYouTypeFormatter.java
*
- * Note that these tests use the metadata contained in the files with TEST_META_DATA_FILE_PREFIX,
- * not the normal metadata files, so should not be used for regression test purposes - these tests
- * are illustrative only and test functionality.
+ * Note that these tests use the test metadata, not the normal metadata file, so should not be used
+ * for regression test purposes - these tests are illustrative only and test functionality.
*
* @author Shaopeng Jia
*/
-public class AsYouTypeFormatterTest extends TestCase {
- private PhoneNumberUtil phoneUtil;
-
- public AsYouTypeFormatterTest() {
- phoneUtil = PhoneNumberUtilTest.initializePhoneUtilForTesting();
- }
+public class AsYouTypeFormatterTest extends TestMetadataTestCase {
public void testInvalidRegion() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
}
public void 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.
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.ZZ);
assertEquals("+819012345678901", formatter.inputDigit('1'));
}
+ public void testCountryWithSpaceInNationalPrefixFormattingRule() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.BY);
+ assertEquals("8", formatter.inputDigit('8'));
+ assertEquals("88", formatter.inputDigit('8'));
+ assertEquals("881", formatter.inputDigit('1'));
+ assertEquals("8 819", formatter.inputDigit('9'));
+ assertEquals("8 8190", formatter.inputDigit('0'));
+ // The formatting rule for 5 digit numbers states that no space should be present after the
+ // national prefix.
+ assertEquals("881 901", formatter.inputDigit('1'));
+ assertEquals("8 819 012", formatter.inputDigit('2'));
+ // Too long, no formatting rule applies.
+ assertEquals("88190123", formatter.inputDigit('3'));
+ }
+
+ public void testCountryWithSpaceInNationalPrefixFormattingRuleAndLongNdd() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.BY);
+ assertEquals("9", formatter.inputDigit('9'));
+ assertEquals("99", formatter.inputDigit('9'));
+ assertEquals("999", formatter.inputDigit('9'));
+ assertEquals("9999", formatter.inputDigit('9'));
+ assertEquals("99999 ", formatter.inputDigit('9'));
+ assertEquals("99999 1", formatter.inputDigit('1'));
+ assertEquals("99999 12", formatter.inputDigit('2'));
+ assertEquals("99999 123", formatter.inputDigit('3'));
+ assertEquals("99999 1234", formatter.inputDigit('4'));
+ assertEquals("99999 12 345", formatter.inputDigit('5'));
+ }
+
public void testAYTFUS() {
AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
assertEquals("6", formatter.inputDigit('6'));
}
public void testAYTFLongIDD_AU() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("AU");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AU);
// 0011 1 650 253 2250
assertEquals("0", formatter.inputDigit('0'));
assertEquals("00", formatter.inputDigit('0'));
}
public void testAYTFLongIDD_KR() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
// 00300 1 650 253 2222
assertEquals("0", formatter.inputDigit('0'));
assertEquals("00", formatter.inputDigit('0'));
}
public void testAYTFLongNDD_KR() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("KR");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
// 08811-9876-7890
assertEquals("0", formatter.inputDigit('0'));
assertEquals("08", formatter.inputDigit('8'));
}
public void testAYTFLongNDD_SG() {
- AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter("SG");
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.SG);
// 777777 9876 7890
assertEquals("7", formatter.inputDigit('7'));
assertEquals("77", formatter.inputDigit('7'));
assertEquals("777777 9876 789", formatter.inputDigit('9'));
assertEquals("777777 9876 7890", formatter.inputDigit('0'));
}
+
+ public void testAYTFShortNumberFormattingFix_AU() {
+ // For Australia, the national prefix is not optional when formatting.
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AU);
+
+ // 1234567890 - For leading digit 1, the national prefix formatting rule has first group only.
+ assertEquals("1", formatter.inputDigit('1'));
+ assertEquals("12", formatter.inputDigit('2'));
+ assertEquals("123", formatter.inputDigit('3'));
+ assertEquals("1234", formatter.inputDigit('4'));
+ assertEquals("1234 5", formatter.inputDigit('5'));
+ assertEquals("1234 56", formatter.inputDigit('6'));
+ assertEquals("1234 567", formatter.inputDigit('7'));
+ assertEquals("1234 567 8", formatter.inputDigit('8'));
+ assertEquals("1234 567 89", formatter.inputDigit('9'));
+ assertEquals("1234 567 890", formatter.inputDigit('0'));
+
+ // +61 1234 567 890 - Test the same number, but with the country code.
+ formatter.clear();
+ assertEquals("+", formatter.inputDigit('+'));
+ assertEquals("+6", formatter.inputDigit('6'));
+ assertEquals("+61 ", formatter.inputDigit('1'));
+ assertEquals("+61 1", formatter.inputDigit('1'));
+ assertEquals("+61 12", formatter.inputDigit('2'));
+ assertEquals("+61 123", formatter.inputDigit('3'));
+ assertEquals("+61 1234", formatter.inputDigit('4'));
+ assertEquals("+61 1234 5", formatter.inputDigit('5'));
+ assertEquals("+61 1234 56", formatter.inputDigit('6'));
+ assertEquals("+61 1234 567", formatter.inputDigit('7'));
+ assertEquals("+61 1234 567 8", formatter.inputDigit('8'));
+ assertEquals("+61 1234 567 89", formatter.inputDigit('9'));
+ assertEquals("+61 1234 567 890", formatter.inputDigit('0'));
+
+ // 212345678 - For leading digit 2, the national prefix formatting rule puts the national prefix
+ // before the first group.
+ formatter.clear();
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("02", formatter.inputDigit('2'));
+ assertEquals("021", formatter.inputDigit('1'));
+ assertEquals("02 12", formatter.inputDigit('2'));
+ assertEquals("02 123", formatter.inputDigit('3'));
+ assertEquals("02 1234", formatter.inputDigit('4'));
+ assertEquals("02 1234 5", formatter.inputDigit('5'));
+ assertEquals("02 1234 56", formatter.inputDigit('6'));
+ assertEquals("02 1234 567", formatter.inputDigit('7'));
+ assertEquals("02 1234 5678", formatter.inputDigit('8'));
+
+ // 212345678 - Test the same number, but without the leading 0.
+ formatter.clear();
+ assertEquals("2", formatter.inputDigit('2'));
+ assertEquals("21", formatter.inputDigit('1'));
+ assertEquals("212", formatter.inputDigit('2'));
+ assertEquals("2123", formatter.inputDigit('3'));
+ assertEquals("21234", formatter.inputDigit('4'));
+ assertEquals("212345", formatter.inputDigit('5'));
+ assertEquals("2123456", formatter.inputDigit('6'));
+ assertEquals("21234567", formatter.inputDigit('7'));
+ assertEquals("212345678", formatter.inputDigit('8'));
+
+ // +61 2 1234 5678 - Test the same number, but with the country code.
+ formatter.clear();
+ assertEquals("+", formatter.inputDigit('+'));
+ assertEquals("+6", formatter.inputDigit('6'));
+ assertEquals("+61 ", formatter.inputDigit('1'));
+ assertEquals("+61 2", formatter.inputDigit('2'));
+ assertEquals("+61 21", formatter.inputDigit('1'));
+ assertEquals("+61 2 12", formatter.inputDigit('2'));
+ assertEquals("+61 2 123", formatter.inputDigit('3'));
+ assertEquals("+61 2 1234", formatter.inputDigit('4'));
+ assertEquals("+61 2 1234 5", formatter.inputDigit('5'));
+ assertEquals("+61 2 1234 56", formatter.inputDigit('6'));
+ assertEquals("+61 2 1234 567", formatter.inputDigit('7'));
+ assertEquals("+61 2 1234 5678", formatter.inputDigit('8'));
+ }
+
+ public void 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.
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
+
+ // 111
+ assertEquals("1", formatter.inputDigit('1'));
+ assertEquals("11", formatter.inputDigit('1'));
+ assertEquals("111", formatter.inputDigit('1'));
+
+ // 114
+ formatter.clear();
+ assertEquals("1", formatter.inputDigit('1'));
+ assertEquals("11", formatter.inputDigit('1'));
+ assertEquals("114", formatter.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.
+ formatter.clear();
+ assertEquals("1", formatter.inputDigit('1'));
+ assertEquals("13", formatter.inputDigit('3'));
+ assertEquals("131", formatter.inputDigit('1'));
+ assertEquals("1312", formatter.inputDigit('2'));
+ assertEquals("13121", formatter.inputDigit('1'));
+ assertEquals("131212", formatter.inputDigit('2'));
+ assertEquals("1312123", formatter.inputDigit('3'));
+ assertEquals("13121234", formatter.inputDigit('4'));
+
+ // +82 131-2-1234 - Test the same number, but with the country code.
+ formatter.clear();
+ assertEquals("+", formatter.inputDigit('+'));
+ assertEquals("+8", formatter.inputDigit('8'));
+ assertEquals("+82 ", formatter.inputDigit('2'));
+ assertEquals("+82 1", formatter.inputDigit('1'));
+ assertEquals("+82 13", formatter.inputDigit('3'));
+ assertEquals("+82 131", formatter.inputDigit('1'));
+ assertEquals("+82 131-2", formatter.inputDigit('2'));
+ assertEquals("+82 131-2-1", formatter.inputDigit('1'));
+ assertEquals("+82 131-2-12", formatter.inputDigit('2'));
+ assertEquals("+82 131-2-123", formatter.inputDigit('3'));
+ assertEquals("+82 131-2-1234", formatter.inputDigit('4'));
+ }
+
+ public void testAYTFShortNumberFormattingFix_MX() {
+ // For Mexico, the national prefix is optional when formatting.
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.MX);
+
+ // 911
+ assertEquals("9", formatter.inputDigit('9'));
+ assertEquals("91", formatter.inputDigit('1'));
+ assertEquals("911", formatter.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.
+ formatter.clear();
+ assertEquals("8", formatter.inputDigit('8'));
+ assertEquals("80", formatter.inputDigit('0'));
+ assertEquals("800", formatter.inputDigit('0'));
+ assertEquals("800 1", formatter.inputDigit('1'));
+ assertEquals("800 12", formatter.inputDigit('2'));
+ assertEquals("800 123", formatter.inputDigit('3'));
+ assertEquals("800 123 4", formatter.inputDigit('4'));
+ assertEquals("800 123 45", formatter.inputDigit('5'));
+ assertEquals("800 123 456", formatter.inputDigit('6'));
+ assertEquals("800 123 4567", formatter.inputDigit('7'));
+
+ // +52 800 123 4567 - Test the same number, but with the country code.
+ formatter.clear();
+ assertEquals("+", formatter.inputDigit('+'));
+ assertEquals("+5", formatter.inputDigit('5'));
+ assertEquals("+52 ", formatter.inputDigit('2'));
+ assertEquals("+52 8", formatter.inputDigit('8'));
+ assertEquals("+52 80", formatter.inputDigit('0'));
+ assertEquals("+52 800", formatter.inputDigit('0'));
+ assertEquals("+52 800 1", formatter.inputDigit('1'));
+ assertEquals("+52 800 12", formatter.inputDigit('2'));
+ assertEquals("+52 800 123", formatter.inputDigit('3'));
+ assertEquals("+52 800 123 4", formatter.inputDigit('4'));
+ assertEquals("+52 800 123 45", formatter.inputDigit('5'));
+ assertEquals("+52 800 123 456", formatter.inputDigit('6'));
+ assertEquals("+52 800 123 4567", formatter.inputDigit('7'));
+ }
+
+ public void testAYTFNoNationalPrefix() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.IT);
+
+ assertEquals("3", formatter.inputDigit('3'));
+ assertEquals("33", formatter.inputDigit('3'));
+ assertEquals("333", formatter.inputDigit('3'));
+ assertEquals("333 3", formatter.inputDigit('3'));
+ assertEquals("333 33", formatter.inputDigit('3'));
+ assertEquals("333 333", formatter.inputDigit('3'));
+ }
+
+ public void testAYTFNoNationalPrefixFormattingRule() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.AO);
+
+ assertEquals("3", formatter.inputDigit('3'));
+ assertEquals("33", formatter.inputDigit('3'));
+ assertEquals("333", formatter.inputDigit('3'));
+ assertEquals("333 3", formatter.inputDigit('3'));
+ assertEquals("333 33", formatter.inputDigit('3'));
+ assertEquals("333 333", formatter.inputDigit('3'));
+ }
+
+ public void testAYTFShortNumberFormattingFix_US() {
+ // For the US, an initial 1 is treated specially.
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.US);
+
+ // 101 - Test that the initial 1 is not treated as a national prefix.
+ assertEquals("1", formatter.inputDigit('1'));
+ assertEquals("10", formatter.inputDigit('0'));
+ assertEquals("101", formatter.inputDigit('1'));
+
+ // 112 - Test that the initial 1 is not treated as a national prefix.
+ formatter.clear();
+ assertEquals("1", formatter.inputDigit('1'));
+ assertEquals("11", formatter.inputDigit('1'));
+ assertEquals("112", formatter.inputDigit('2'));
+
+ // 122 - Test that the initial 1 is treated as a national prefix.
+ formatter.clear();
+ assertEquals("1", formatter.inputDigit('1'));
+ assertEquals("12", formatter.inputDigit('2'));
+ assertEquals("1 22", formatter.inputDigit('2'));
+ }
+
+ public void testAYTFClearNDDAfterIDDExtraction() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.KR);
+
+ // Check that when we have successfully extracted an IDD, the previously extracted NDD is
+ // cleared since it is no longer valid.
+ assertEquals("0", formatter.inputDigit('0'));
+ assertEquals("00", formatter.inputDigit('0'));
+ assertEquals("007", formatter.inputDigit('7'));
+ assertEquals("0070", formatter.inputDigit('0'));
+ assertEquals("00700", formatter.inputDigit('0'));
+ assertEquals("0", formatter.getExtractedNationalPrefix());
+
+ // Once the IDD "00700" has been extracted, it no longer makes sense for the initial "0" to be
+ // treated as an NDD.
+ assertEquals("00700 1 ", formatter.inputDigit('1'));
+ assertEquals("", formatter.getExtractedNationalPrefix());
+
+ assertEquals("00700 1 2", formatter.inputDigit('2'));
+ assertEquals("00700 1 23", formatter.inputDigit('3'));
+ assertEquals("00700 1 234", formatter.inputDigit('4'));
+ assertEquals("00700 1 234 5", formatter.inputDigit('5'));
+ assertEquals("00700 1 234 56", formatter.inputDigit('6'));
+ assertEquals("00700 1 234 567", formatter.inputDigit('7'));
+ assertEquals("00700 1 234 567 8", formatter.inputDigit('8'));
+ assertEquals("00700 1 234 567 89", formatter.inputDigit('9'));
+ assertEquals("00700 1 234 567 890", formatter.inputDigit('0'));
+ assertEquals("00700 1 234 567 8901", formatter.inputDigit('1'));
+ assertEquals("00700123456789012", formatter.inputDigit('2'));
+ assertEquals("007001234567890123", formatter.inputDigit('3'));
+ assertEquals("0070012345678901234", formatter.inputDigit('4'));
+ assertEquals("00700123456789012345", formatter.inputDigit('5'));
+ assertEquals("007001234567890123456", formatter.inputDigit('6'));
+ assertEquals("0070012345678901234567", formatter.inputDigit('7'));
+ }
+
+ public void testAYTFNumberPatternsBecomingInvalidShouldNotResultInDigitLoss() {
+ AsYouTypeFormatter formatter = phoneUtil.getAsYouTypeFormatter(RegionCode.CN);
+
+ assertEquals("+", formatter.inputDigit('+'));
+ assertEquals("+8", formatter.inputDigit('8'));
+ assertEquals("+86 ", formatter.inputDigit('6'));
+ assertEquals("+86 9", formatter.inputDigit('9'));
+ assertEquals("+86 98", formatter.inputDigit('8'));
+ assertEquals("+86 988", formatter.inputDigit('8'));
+ assertEquals("+86 988 1", formatter.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", formatter.inputDigit('2'));
+ assertEquals("+86988123", formatter.inputDigit('3'));
+ assertEquals("+869881234", formatter.inputDigit('4'));
+ assertEquals("+8698812345", formatter.inputDigit('5'));
+ }
}