update libphonenumber issue links from Google Code to github
[platform/upstream/libphonenumber.git] / java / libphonenumber / test / com / google / i18n / phonenumbers / AsYouTypeFormatterTest.java
index 24eb8d7..75977a0 100644 (file)
 
 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);
@@ -74,7 +66,7 @@ public class AsYouTypeFormatterTest extends TestCase {
   }
 
   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);
@@ -96,6 +88,35 @@ public class AsYouTypeFormatterTest extends TestCase {
     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'));
@@ -761,7 +782,7 @@ public class AsYouTypeFormatterTest extends TestCase {
   }
 
   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'));
@@ -818,7 +839,7 @@ public class AsYouTypeFormatterTest extends TestCase {
   }
 
   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'));
@@ -839,7 +860,7 @@ public class AsYouTypeFormatterTest extends TestCase {
   }
 
   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'));
@@ -875,7 +896,7 @@ public class AsYouTypeFormatterTest extends TestCase {
   }
 
   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'));
@@ -892,4 +913,261 @@ public class AsYouTypeFormatterTest extends TestCase {
     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'));
+  }
 }