tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_nameUtils.js (6642B)


      1 /**
      2 * Tests FormAutofillNameUtils object.
      3 */
      4 
      5 "use strict";
      6 
      7 var FormAutofillNameUtils;
      8 add_task(async function () {
      9  ({ FormAutofillNameUtils } = ChromeUtils.importESModule(
     10    "resource://gre/modules/shared/FormAutofillNameUtils.sys.mjs"
     11  ));
     12 });
     13 
     14 // Test cases initially copied from
     15 // https://cs.chromium.org/chromium/src/components/autofill/core/browser/autofill_data_util_unittest.cc
     16 const TESTCASES = [
     17  {
     18    description: "Full name including given, middle and family names",
     19    fullName: "Homer Jay Simpson",
     20    nameParts: {
     21      given: "Homer",
     22      middle: "Jay",
     23      family: "Simpson",
     24    },
     25  },
     26  {
     27    description: "No middle name",
     28    fullName: "Moe Szyslak",
     29    nameParts: {
     30      given: "Moe",
     31      middle: "",
     32      family: "Szyslak",
     33    },
     34  },
     35  {
     36    description: "Common name prefixes removed",
     37    fullName: "Reverend Timothy Lovejoy",
     38    nameParts: {
     39      given: "Timothy",
     40      middle: "",
     41      family: "Lovejoy",
     42    },
     43    expectedFullName: "Timothy Lovejoy",
     44  },
     45  {
     46    description: "Common name suffixes removed",
     47    fullName: "John Frink Phd",
     48    nameParts: {
     49      given: "John",
     50      middle: "",
     51      family: "Frink",
     52    },
     53    expectedFullName: "John Frink",
     54  },
     55  {
     56    description: "Exception to the name suffix removal",
     57    fullName: "John Ma",
     58    nameParts: {
     59      given: "John",
     60      middle: "",
     61      family: "Ma",
     62    },
     63  },
     64  {
     65    description: "Common family name prefixes not considered a middle name",
     66    fullName: "Milhouse Van Houten",
     67    nameParts: {
     68      given: "Milhouse",
     69      middle: "",
     70      family: "Van Houten",
     71    },
     72  },
     73 
     74  // CJK names have reverse order (surname goes first, given name goes second).
     75  {
     76    description: "Chinese name, Unihan",
     77    fullName: "孫 德明",
     78    nameParts: {
     79      given: "德明",
     80      middle: "",
     81      family: "孫",
     82    },
     83    expectedFullName: "孫德明",
     84  },
     85  {
     86    description: 'Chinese name, Unihan, "IDEOGRAPHIC SPACE"',
     87    fullName: "孫 德明",
     88    nameParts: {
     89      given: "德明",
     90      middle: "",
     91      family: "孫",
     92    },
     93    expectedFullName: "孫德明",
     94  },
     95  {
     96    description: "Korean name, Hangul",
     97    fullName: "홍 길동",
     98    nameParts: {
     99      given: "길동",
    100      middle: "",
    101      family: "홍",
    102    },
    103    expectedFullName: "홍길동",
    104  },
    105  {
    106    description: "Japanese name, Unihan",
    107    fullName: "山田 貴洋",
    108    nameParts: {
    109      given: "貴洋",
    110      middle: "",
    111      family: "山田",
    112    },
    113    expectedFullName: "山田貴洋",
    114  },
    115 
    116  // In Japanese, foreign names use 'KATAKANA MIDDLE DOT' (U+30FB) as a
    117  // separator. There is no consensus for the ordering. For now, we use the same
    118  // ordering as regular Japanese names ("last・first").
    119  {
    120    description: "Foreign name in Japanese, Katakana",
    121    fullName: "ゲイツ・ビル",
    122    nameParts: {
    123      given: "ビル",
    124      middle: "",
    125      family: "ゲイツ",
    126    },
    127    expectedFullName: "ゲイツビル",
    128  },
    129 
    130  // 'KATAKANA MIDDLE DOT' is occasionally typoed as 'MIDDLE DOT' (U+00B7).
    131  {
    132    description: "Foreign name in Japanese, Katakana",
    133    fullName: "ゲイツ·ビル",
    134    nameParts: {
    135      given: "ビル",
    136      middle: "",
    137      family: "ゲイツ",
    138    },
    139    expectedFullName: "ゲイツビル",
    140  },
    141 
    142  // CJK names don't usually have a space in the middle, but most of the time,
    143  // the surname is only one character (in Chinese & Korean).
    144  {
    145    description: "Korean name, Hangul",
    146    fullName: "최성훈",
    147    nameParts: {
    148      given: "성훈",
    149      middle: "",
    150      family: "최",
    151    },
    152  },
    153  {
    154    description: "(Simplified) Chinese name, Unihan",
    155    fullName: "刘翔",
    156    nameParts: {
    157      given: "翔",
    158      middle: "",
    159      family: "刘",
    160    },
    161  },
    162  {
    163    description: "(Traditional) Chinese name, Unihan",
    164    fullName: "劉翔",
    165    nameParts: {
    166      given: "翔",
    167      middle: "",
    168      family: "劉",
    169    },
    170  },
    171 
    172  // There are a few exceptions. Occasionally, the surname has two characters.
    173  {
    174    description: "Korean name, Hangul",
    175    fullName: "남궁도",
    176    nameParts: {
    177      given: "도",
    178      middle: "",
    179      family: "남궁",
    180    },
    181  },
    182  {
    183    description: "Korean name, Hangul",
    184    fullName: "황보혜정",
    185    nameParts: {
    186      given: "혜정",
    187      middle: "",
    188      family: "황보",
    189    },
    190  },
    191  {
    192    description: "(Traditional) Chinese name, Unihan",
    193    fullName: "歐陽靖",
    194    nameParts: {
    195      given: "靖",
    196      middle: "",
    197      family: "歐陽",
    198    },
    199  },
    200 
    201  // In Korean, some 2-character surnames are rare/ambiguous, like "강전": "강"
    202  // is a common surname, and "전" can be part of a given name. In those cases,
    203  // we assume it's 1/2 for 3-character names, or 2/2 for 4-character names.
    204  {
    205    description: "Korean name, Hangul",
    206    fullName: "강전희",
    207    nameParts: {
    208      given: "전희",
    209      middle: "",
    210      family: "강",
    211    },
    212  },
    213  {
    214    description: "Korean name, Hangul",
    215    fullName: "황목치승",
    216    nameParts: {
    217      given: "치승",
    218      middle: "",
    219      family: "황목",
    220    },
    221  },
    222 
    223  // It occasionally happens that a full name is 2 characters, 1/1.
    224  {
    225    description: "Korean name, Hangul",
    226    fullName: "이도",
    227    nameParts: {
    228      given: "도",
    229      middle: "",
    230      family: "이",
    231    },
    232  },
    233  {
    234    description: "Korean name, Hangul",
    235    fullName: "孫文",
    236    nameParts: {
    237      given: "文",
    238      middle: "",
    239      family: "孫",
    240    },
    241  },
    242 
    243  // These are no CJK names for us, they're just bogus.
    244  {
    245    description: "Bogus",
    246    fullName: "Homer シンプソン",
    247    nameParts: {
    248      given: "Homer",
    249      middle: "",
    250      family: "シンプソン",
    251    },
    252  },
    253  {
    254    description: "Bogus",
    255    fullName: "ホーマー Simpson",
    256    nameParts: {
    257      given: "ホーマー",
    258      middle: "",
    259      family: "Simpson",
    260    },
    261  },
    262  {
    263    description: "CJK has a middle-name, too unusual",
    264    fullName: "반 기 문",
    265    nameParts: {
    266      given: "반",
    267      middle: "기",
    268      family: "문",
    269    },
    270  },
    271 ];
    272 
    273 add_task(async function test_splitName() {
    274  TESTCASES.forEach(testcase => {
    275    if (testcase.fullName) {
    276      info("Starting testcase: " + testcase.description);
    277      let nameParts = FormAutofillNameUtils.splitName(testcase.fullName);
    278      Assert.deepEqual(nameParts, testcase.nameParts);
    279    }
    280  });
    281 });
    282 
    283 add_task(async function test_joinName() {
    284  TESTCASES.forEach(testcase => {
    285    info("Starting testcase: " + testcase.description);
    286    let name = FormAutofillNameUtils.joinNameParts(testcase.nameParts);
    287    Assert.equal(name, testcase.expectedFullName || testcase.fullName);
    288  });
    289 });