Bug 1352324 - (Part 5) Add unit tests for PhoneNumber.jsm and PhoneNumberNormalizer.jsm. r=MattN draft
authorLuke Chang <lchang@mozilla.com>
Tue, 13 Jun 2017 16:31:05 +0800
changeset 609617 3b70c07592943df74ed58aa85e51d573ebb7d99b
parent 609616 d642a87ac21cc063ce7f609159300f8ec9f3c2c2
child 609618 3289b1abdb0804160cf84873ebc7c0d554290024
push id68602
push userbmo:lchang@mozilla.com
push dateMon, 17 Jul 2017 03:27:15 +0000
reviewersMattN
bugs1352324
milestone56.0a1
Bug 1352324 - (Part 5) Add unit tests for PhoneNumber.jsm and PhoneNumberNormalizer.jsm. r=MattN MozReview-Commit-ID: 2S8MR4pmbSp
browser/extensions/formautofill/test/unit/test_phoneNumber.js
browser/extensions/formautofill/test/unit/xpcshell.ini
new file mode 100644
--- /dev/null
+++ b/browser/extensions/formautofill/test/unit/test_phoneNumber.js
@@ -0,0 +1,246 @@
+/**
+ * Tests PhoneNumber.jsm and PhoneNumberNormalizer.jsm.
+ */
+
+"use strict";
+
+Cu.import("resource://formautofill/phonenumberutils/PhoneNumber.jsm");
+Cu.import("resource://formautofill/phonenumberutils/PhoneNumberNormalizer.jsm");
+
+function IsPlain(dial, expected) {
+  let result = PhoneNumber.IsPlain(dial);
+  do_check_eq(result, expected);
+}
+
+function Normalize(dial, expected) {
+  let result = PhoneNumberNormalizer.Normalize(dial);
+  do_check_eq(result, expected);
+}
+
+function CantParse(dial, currentRegion) {
+  let result = PhoneNumber.Parse(dial, currentRegion);
+  do_check_null(result);
+}
+
+function Parse(dial, currentRegion) {
+  let result = PhoneNumber.Parse(dial, currentRegion);
+  do_check_neq(result, null);
+  return result;
+}
+
+function Test(dial, currentRegion, nationalNumber, region) {
+  let result = Parse(dial, currentRegion);
+  do_check_eq(result.nationalNumber, nationalNumber);
+  do_check_eq(result.region, region);
+  return result;
+}
+
+function TestProperties(dial, currentRegion) {
+  let result = Parse(dial, currentRegion);
+  do_check_true(result.internationalFormat);
+  do_check_true(result.internationalNumber);
+  do_check_true(result.nationalFormat);
+  do_check_true(result.nationalNumber);
+  do_check_true(result.countryName);
+  do_check_true(result.countryCode);
+}
+
+function Format(dial, currentRegion, nationalNumber, region, nationalFormat, internationalFormat) {
+  let result = Test(dial, currentRegion, nationalNumber, region);
+  do_check_eq(result.nationalFormat, nationalFormat);
+  do_check_eq(result.internationalFormat, internationalFormat);
+  return result;
+}
+
+function AllEqual(list, currentRegion) {
+  let parsedList = list.map(item => Parse(item, currentRegion));
+  let firstItem = parsedList.shift();
+  for (let item of parsedList) {
+    Assert.deepEqual(item, firstItem);
+  }
+}
+
+add_task(async function test_phoneNumber() {
+  // Test whether could a string be a phone number.
+  IsPlain(null, false);
+  IsPlain("", false);
+  IsPlain("1", true);
+  IsPlain("*2", true); // Real number used in Venezuela
+  IsPlain("*8", true); // Real number used in Venezuela
+  IsPlain("12", true);
+  IsPlain("123", true);
+  IsPlain("1a2", false);
+  IsPlain("12a", false);
+  IsPlain("1234", true);
+  IsPlain("123a", false);
+  IsPlain("+", true);
+  IsPlain("+1", true);
+  IsPlain("+12", true);
+  IsPlain("+123", true);
+  IsPlain("()123", false);
+  IsPlain("(1)23", false);
+  IsPlain("(12)3", false);
+  IsPlain("(123)", false);
+  IsPlain("(123)4", false);
+  IsPlain("(123)4", false);
+  IsPlain("123;ext=", false);
+  IsPlain("123;ext=1", false);
+  IsPlain("123;ext=1234567", false);
+  IsPlain("123;ext=12345678", false);
+  IsPlain("123 ext:1", false);
+  IsPlain("123 ext:1#", false);
+  IsPlain("123-1#", false);
+  IsPlain("123 1#", false);
+  IsPlain("123 12345#", false);
+  IsPlain("123 +123456#", false);
+
+  // Getting international number back from intl number.
+  TestProperties("+19497262896");
+
+  // Test parsing national numbers.
+  Parse("033316005", "NZ");
+  Parse("03-331 6005", "NZ");
+  Parse("03 331 6005", "NZ");
+  // Testing international prefixes.
+  // Should strip country code.
+  Parse("0064 3 331 6005", "NZ");
+
+  // Test CA before US because CA has to import meta-information for US.
+  Parse("4031234567", "CA");
+  Parse("(416) 585-4319", "CA");
+  Parse("647-967-4357", "CA");
+  Parse("416-716-8768", "CA");
+  Parse("18002684646", "CA");
+  Parse("416-445-9119", "CA");
+  Parse("1-800-668-6866", "CA");
+  Parse("(416) 453-6486", "CA");
+  Parse("(647) 268-4778", "CA");
+  Parse("647-218-1313", "CA");
+  Parse("+1 647-209-4642", "CA");
+  Parse("416-559-0133", "CA");
+  Parse("+1 647-639-4118", "CA");
+  Parse("+12898803664", "CA");
+  Parse("780-901-4687", "CA");
+  Parse("+14167070550", "CA");
+  Parse("+1-647-522-6487", "CA");
+  Parse("(416) 877-0880", "CA");
+
+  // Try again, but this time we have an international number with region rode US. It should
+  // recognize the country code and parse accordingly.
+  Parse("01164 3 331 6005", "US");
+  Parse("+64 3 331 6005", "US");
+  Parse("64(0)64123456", "NZ");
+  // Check that using a "/" is fine in a phone number.
+  Parse("123/45678", "DE");
+  Parse("123-456-7890", "US");
+
+  // Test parsing international numbers.
+  Parse("+1 (650) 333-6000", "NZ");
+  Parse("1-650-333-6000", "US");
+  // Calling the US number from Singapore by using different service providers
+  // 1st test: calling using SingTel IDD service (IDD is 001)
+  Parse("0011-650-333-6000", "SG");
+  // 2nd test: calling using StarHub IDD service (IDD is 008)
+  Parse("0081-650-333-6000", "SG");
+  // 3rd test: calling using SingTel V019 service (IDD is 019)
+  Parse("0191-650-333-6000", "SG");
+  // Calling the US number from Poland
+  Parse("0~01-650-333-6000", "PL");
+  // Using "++" at the start.
+  Parse("++1 (650) 333-6000", "PL");
+  // Using a full-width plus sign.
+  Parse("\uFF0B1 (650) 333-6000", "SG");
+  // The whole number, including punctuation, is here represented in full-width form.
+  Parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
+        "\u3000\uFF13\uFF13\uFF13\uFF0D\uFF16\uFF10\uFF10\uFF10",
+        "SG");
+
+  // Test parsing with leading zeros.
+  Parse("+39 02-36618 300", "NZ");
+  Parse("02-36618 300", "IT");
+  Parse("312 345 678", "IT");
+
+  // Test parsing numbers in Argentina.
+  Parse("+54 9 343 555 1212", "AR");
+  Parse("0343 15 555 1212", "AR");
+  Parse("+54 9 3715 65 4320", "AR");
+  Parse("03715 15 65 4320", "AR");
+  Parse("+54 11 3797 0000", "AR");
+  Parse("011 3797 0000", "AR");
+  Parse("+54 3715 65 4321", "AR");
+  Parse("03715 65 4321", "AR");
+  Parse("+54 23 1234 0000", "AR");
+  Parse("023 1234 0000", "AR");
+
+  // Test numbers in Mexico
+  Parse("+52 (449)978-0001", "MX");
+  Parse("01 (449)978-0001", "MX");
+  Parse("(449)978-0001", "MX");
+  Parse("+52 1 33 1234-5678", "MX");
+  Parse("044 (33) 1234-5678", "MX");
+  Parse("045 33 1234-5678", "MX");
+
+  // Test that lots of spaces are ok.
+  Parse("0 3   3 3 1   6 0 0 5", "NZ");
+
+  // Test omitting the current region. This is only valid when the number starts
+  // with a '+'.
+  Parse("+64 3 331 6005");
+  Parse("+64 3 331 6005", null);
+
+  // US numbers
+  Format("19497261234", "US", "9497261234", "US", "(949) 726-1234", "+1 949-726-1234");
+
+  // Try a couple german numbers from the US with various access codes.
+  Format("49451491934", "US", "0451491934", "DE", "0451 491934", "+49 451 491934");
+  Format("+49451491934", "US", "0451491934", "DE", "0451 491934", "+49 451 491934");
+  Format("01149451491934", "US", "0451491934", "DE", "0451 491934", "+49 451 491934");
+
+  // Now try dialing the same number from within the German region.
+  Format("451491934", "DE", "0451491934", "DE", "0451 491934", "+49 451 491934");
+  Format("0451491934", "DE", "0451491934", "DE", "0451 491934", "+49 451 491934");
+
+  // Numbers in italy keep the leading 0 in the city code when dialing internationally.
+  Format("0577-555-555", "IT", "0577555555", "IT", "05 7755 5555", "+39 05 7755 5555");
+
+  // Colombian international number without the leading "+"
+  Format("5712234567", "CO", "12234567", "CO", "(1) 2234567", "+57 1 2234567");
+
+  // Telefonica tests
+  Format("612123123", "ES", "612123123", "ES", "612 12 31 23", "+34 612 12 31 23");
+
+  // Chile mobile number from a landline
+  Format("0997654321", "CL", "997654321", "CL", "(99) 765 4321", "+56 99 765 4321");
+
+  // Chile mobile number from another mobile number
+  Format("997654321", "CL", "997654321", "CL", "(99) 765 4321", "+56 99 765 4321");
+
+  // Dialing 911 in the US. This is not a national number.
+  CantParse("911", "US");
+
+  // China mobile number with a 0 in it
+  Format("15955042864", "CN", "015955042864", "CN", "0159 5504 2864", "+86 159 5504 2864");
+
+  // Testing international region numbers.
+  CantParse("883510000000091", "001");
+  Format("+883510000000092", "001", "510000000092", "001", "510 000 000 092", "+883 510 000 000 092");
+  Format("883510000000093", "FR", "510000000093", "001", "510 000 000 093", "+883 510 000 000 093");
+  Format("+883510000000094", "FR", "510000000094", "001", "510 000 000 094", "+883 510 000 000 094");
+  Format("883510000000095", "US", "510000000095", "001", "510 000 000 095", "+883 510 000 000 095");
+  Format("+883510000000096", "US", "510000000096", "001", "510 000 000 096", "+883 510 000 000 096");
+  CantParse("979510000012", "001");
+  Format("+979510000012", "001", "510000012", "001", "5 1000 0012", "+979 5 1000 0012");
+
+  // Test normalizing numbers. Only 0-9,#* are valid in a phone number.
+  Normalize("+ABC # * , 9 _ 1 _0", "+222#*,910");
+  Normalize("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "22233344455566677778889999");
+  Normalize("abcdefghijklmnopqrstuvwxyz", "22233344455566677778889999");
+
+  // 8 and 9 digit numbers with area code in Brazil with collect call prefix (90)
+  AllEqual(["01187654321", "0411187654321", "551187654321", "90411187654321", "+551187654321"], "BR");
+  AllEqual(["011987654321", "04111987654321", "5511987654321", "904111987654321", "+5511987654321"], "BR");
+
+  do_check_eq(PhoneNumberNormalizer.Normalize("123abc", true), "123");
+  do_check_eq(PhoneNumberNormalizer.Normalize("12345", true), "12345");
+  do_check_eq(PhoneNumberNormalizer.Normalize("1abcd", false), "12223");
+});
--- a/browser/extensions/formautofill/test/unit/xpcshell.ini
+++ b/browser/extensions/formautofill/test/unit/xpcshell.ini
@@ -29,12 +29,13 @@ support-files =
 [test_getInfo.js]
 [test_isCJKName.js]
 [test_isFieldEligibleForAutofill.js]
 [test_markAsAutofillField.js]
 [test_migrateRecords.js]
 [test_nameUtils.js]
 [test_onFormSubmitted.js]
 [test_profileAutocompleteResult.js]
+[test_phoneNumber.js]
 [test_savedFieldNames.js]
 [test_toOneLineAddress.js]
 [test_storage_tombstones.js]
 [test_transformFields.js]