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 });