test_unitConversion.js (20298B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 "use strict"; 6 7 /** 8 * Unit test for unit conversion module. 9 */ 10 11 ChromeUtils.defineESModuleGetters(this, { 12 UrlbarProviderUnitConversion: 13 "moz-src:///browser/components/urlbar/UrlbarProviderUnitConversion.sys.mjs", 14 }); 15 16 const TEST_DATA = [ 17 { 18 category: "angle", 19 cases: [ 20 { queryString: "1 d to d", expected: "1 deg" }, 21 { queryString: "-1 d to d", expected: "-1 deg" }, 22 { queryString: "1 d in d", expected: "1 deg" }, 23 { queryString: "1 d = d", expected: "1 deg" }, 24 { queryString: "1 D=D", expected: "1 deg" }, 25 { queryString: "1 d to degree", expected: "1 deg" }, 26 { queryString: "2 d to degree", expected: "2 deg" }, 27 { 28 queryString: "1 d to radian", 29 expected: "0.01745329252 radian", 30 }, 31 { 32 queryString: "2 d to radian", 33 expected: "0.03490658504 radian", 34 }, 35 { 36 queryString: "1 d to rad", 37 expected: "0.01745329252 radian", 38 }, 39 { queryString: "1 d to r", expected: "0.01745329252 radian" }, 40 { queryString: "1 d to gradian", expected: "1.1111111111 gradian" }, 41 { queryString: "1 d to g", expected: "1.1111111111 gradian" }, 42 { queryString: "1 d to minute", expected: "60 min" }, 43 { queryString: "1 d to min", expected: "60 min" }, 44 { queryString: "1 d to m", expected: "60 min" }, 45 { queryString: "1 d to second", expected: "3,600 sec" }, 46 { queryString: "1 d to sec", expected: "3,600 sec" }, 47 { queryString: "1 d to s", expected: "3,600 sec" }, 48 { queryString: "1 d to sign", expected: "0.03333333333 sign" }, 49 { queryString: "1 d to mil", expected: "17.7777777778 mil" }, 50 { 51 queryString: "1 d to revolution", 52 expected: "0.002777777778 revolution", 53 }, 54 { queryString: "1 d to circle", expected: "0.002777777778 circle" }, 55 { queryString: "1 d to turn", expected: "0.002777777778 turn" }, 56 { 57 queryString: "1 d to quadrant", 58 expected: "0.01111111111 quadrant", 59 }, 60 { 61 queryString: "1 d to rightangle", 62 expected: "0.01111111111 rightangle", 63 }, 64 { queryString: "1 d to sextant", expected: "0.01666666667 sextant" }, 65 { queryString: "1 degree to d", expected: "1 deg" }, 66 { 67 queryString: "1 radian to d", 68 expected: "57.2957795131 deg", 69 }, 70 { 71 queryString: "1 r to g", 72 expected: "63.6619772368 gradian", 73 }, 74 ], 75 }, 76 { 77 category: "force", 78 cases: [ 79 { queryString: "1 n to n", expected: "1 newton" }, 80 { queryString: "-1 n to n", expected: "-1 newton" }, 81 { queryString: "1 n in n", expected: "1 newton" }, 82 { queryString: "1 n = n", expected: "1 newton" }, 83 { queryString: "1 N=N", expected: "1 newton" }, 84 { queryString: "1 n to newton", expected: "1 newton" }, 85 { queryString: "1 n to kilonewton", expected: "0.001 kilonewton" }, 86 { queryString: "1 n to kn", expected: "0.001 kilonewton" }, 87 { 88 queryString: "1 n to gram-force", 89 expected: "101.9716213 gram-force", 90 }, 91 { 92 queryString: "1 n to gf", 93 expected: "101.9716213 gram-force", 94 }, 95 { 96 queryString: "1 n to kilogram-force", 97 expected: "0.1019716213 kilogram-force", 98 }, 99 { 100 queryString: "1 n to kgf", 101 expected: "0.1019716213 kilogram-force", 102 }, 103 { 104 queryString: "1 n to ton-force", 105 expected: "0.0001019716213 ton-force", 106 }, 107 { 108 queryString: "1 n to tf", 109 expected: "0.0001019716213 ton-force", 110 }, 111 { 112 queryString: "1 n to exanewton", 113 expected: "1.0e-18 exanewton", 114 }, 115 { queryString: "1 n to en", expected: "1.0e-18 exanewton" }, 116 { 117 queryString: "1 n to petanewton", 118 expected: "1.0e-15 petanewton", 119 }, 120 { queryString: "1 n to PN", expected: "1.0e-15 petanewton" }, 121 { queryString: "1 n to Pn", expected: "1.0e-15 petanewton" }, 122 { 123 queryString: "1 n to teranewton", 124 expected: "1.0e-12 teranewton", 125 }, 126 { queryString: "1 n to tn", expected: "1.0e-12 teranewton" }, 127 { 128 queryString: "1 n to giganewton", 129 expected: "1.0e-9 giganewton", 130 }, 131 { queryString: "1 n to gn", expected: "1.0e-9 giganewton" }, 132 { 133 queryString: "1 n to meganewton", 134 expected: "1.0e-6 meganewton", 135 }, 136 { queryString: "1 n to MN", expected: "1.0e-6 meganewton" }, 137 { queryString: "1 n to Mn", expected: "1.0e-6 meganewton" }, 138 { queryString: "1 n to hectonewton", expected: "0.01 hectonewton" }, 139 { queryString: "1 n to hn", expected: "0.01 hectonewton" }, 140 { queryString: "1 n to dekanewton", expected: "0.1 dekanewton" }, 141 { queryString: "1 n to dan", expected: "0.1 dekanewton" }, 142 { queryString: "1 n to decinewton", expected: "10 decinewton" }, 143 { queryString: "1 n to dn", expected: "10 decinewton" }, 144 { queryString: "1 n to centinewton", expected: "100 centinewton" }, 145 { queryString: "1 n to cn", expected: "100 centinewton" }, 146 { queryString: "1 n to millinewton", expected: "1,000 millinewton" }, 147 { queryString: "1 n to mn", expected: "1,000 millinewton" }, 148 { queryString: "1 n to micronewton", expected: "1,000,000 micronewton" }, 149 { queryString: "1 n to µn", expected: "1,000,000 micronewton" }, 150 { 151 queryString: "1 n to nanonewton", 152 expected: "1,000,000,000 nanonewton", 153 }, 154 { 155 queryString: "1 n to nn", 156 expected: "1,000,000,000 nanonewton", 157 }, 158 { 159 queryString: "1 n to piconewton", 160 expected: "1.0e12 piconewton", 161 }, 162 { 163 queryString: "1 n to pn", 164 expected: "1.0e12 piconewton", 165 }, 166 { 167 queryString: "1 n to femtonewton", 168 expected: "1.0e15 femtonewton", 169 }, 170 { 171 queryString: "1 n to fn", 172 expected: "1.0e15 femtonewton", 173 }, 174 { 175 queryString: "1 n to attonewton", 176 expected: "1.0e18 attonewton", 177 }, 178 { 179 queryString: "1 n to an", 180 expected: "1.0e18 attonewton", 181 }, 182 { queryString: "1 n to dyne", expected: "100,000 dyne" }, 183 { queryString: "1 n to dyn", expected: "100,000 dyne" }, 184 { queryString: "1 n to joule/meter", expected: "1 joule/meter" }, 185 { queryString: "1 n to j/m", expected: "1 joule/meter" }, 186 { 187 queryString: "1 n to joule/centimeter", 188 expected: "100 joule/centimeter", 189 }, 190 { queryString: "1 n to j/cm", expected: "100 joule/centimeter" }, 191 { 192 queryString: "1 n to ton-force-short", 193 expected: "0.0001124045 ton-force-short", 194 }, 195 { 196 queryString: "1 n to short", 197 expected: "0.0001124045 ton-force-short", 198 }, 199 { 200 queryString: "1 n to ton-force-long", 201 expected: "0.0001003611 ton-force-long", 202 }, 203 { 204 queryString: "1 n to tonf", 205 expected: "0.0001003611 ton-force-long", 206 }, 207 { 208 queryString: "1 n to kip-force", 209 expected: "0.0002248089 kip-force", 210 }, 211 { 212 queryString: "1 n to kipf", 213 expected: "0.0002248089 kip-force", 214 }, 215 { 216 queryString: "1 n to pound-force", 217 expected: "0.2248089431 pound-force", 218 }, 219 { 220 queryString: "1 n to lbf", 221 expected: "0.2248089431 pound-force", 222 }, 223 { 224 queryString: "1 n to ounce-force", 225 expected: "3.5969430896 ounce-force", 226 }, 227 { 228 queryString: "1 n to ozf", 229 expected: "3.5969430896 ounce-force", 230 }, 231 { 232 queryString: "1 n to poundal", 233 expected: "7.2330138512 poundal", 234 }, 235 { 236 queryString: "1 n to pdl", 237 expected: "7.2330138512 poundal", 238 }, 239 { queryString: "1 n to pond", expected: "101.9716213 pond" }, 240 { queryString: "1 n to p", expected: "101.9716213 pond" }, 241 { 242 queryString: "1 n to kilopond", 243 expected: "0.1019716213 kilopond", 244 }, 245 { 246 queryString: "1 n to kp", 247 expected: "0.1019716213 kilopond", 248 }, 249 { queryString: "1 kilonewton to n", expected: "1,000 newton" }, 250 ], 251 }, 252 { 253 category: "length", 254 cases: [ 255 { queryString: "1 meter to meter", expected: "1 m" }, 256 { queryString: "-1 meter to meter", expected: "-1 m" }, 257 { queryString: "1 meter in meter", expected: "1 m" }, 258 { queryString: "1 meter = meter", expected: "1 m" }, 259 { queryString: "1 METER=METER", expected: "1 m" }, 260 { queryString: "1 m to meter", expected: "1 m" }, 261 { queryString: "1 m to nanometer", expected: "1,000,000,000 nanometer" }, 262 { queryString: "1 m to micrometer", expected: "1,000,000 micrometer" }, 263 { queryString: "1 m to millimeter", expected: "1,000 mm" }, 264 { queryString: "1 m to mm", expected: "1,000 mm" }, 265 { queryString: "1 m to centimeter", expected: "100 cm" }, 266 { queryString: "1 m to cm", expected: "100 cm" }, 267 { queryString: "1 m to kilometer", expected: "0.001 km" }, 268 { queryString: "1 m to km", expected: "0.001 km" }, 269 { queryString: "1 m to mile", expected: "0.0006213689 mi" }, 270 { queryString: "1 m to mi", expected: "0.0006213689 mi" }, 271 { queryString: "1 m to yard", expected: "1.0936132983 yd" }, 272 { queryString: "1 m to yd", expected: "1.0936132983 yd" }, 273 { queryString: "1 m to foot", expected: "3.280839895 ft" }, 274 { queryString: "1 m to ft", expected: "3.280839895 ft" }, 275 { queryString: "1 m to inch", expected: "39.37007874 in" }, 276 { queryString: "1 inch to m", expected: "0.0254 m" }, 277 ], 278 }, 279 { 280 category: "mass", 281 cases: [ 282 { queryString: "1 kg to kg", expected: "1 kg" }, 283 { queryString: "-1 kg to kg", expected: "-1 kg" }, 284 { queryString: "1 kg in kg", expected: "1 kg" }, 285 { queryString: "1 kg = kg", expected: "1 kg" }, 286 { queryString: "1 KG=KG", expected: "1 kg" }, 287 { queryString: "1 kg to kilogram", expected: "1 kg" }, 288 { queryString: "1 kg to gram", expected: "1,000 g" }, 289 { queryString: "1 kg to g", expected: "1,000 g" }, 290 { queryString: "1 kg to milligram", expected: "1,000,000 milligram" }, 291 { queryString: "1 kg to mg", expected: "1,000,000 milligram" }, 292 { queryString: "1 kg to ton", expected: "0.001 ton" }, 293 { queryString: "1 kg to t", expected: "0.001 ton" }, 294 { 295 queryString: "1 kg to longton", 296 expected: "0.0009842073 longton", 297 }, 298 { 299 queryString: "1 kg to l.t.", 300 expected: "0.0009842073 longton", 301 }, 302 { 303 queryString: "1 kg to l/t", 304 expected: "0.0009842073 longton", 305 }, 306 { 307 queryString: "1 kg to shortton", 308 expected: "0.0011023122 shortton", 309 }, 310 { 311 queryString: "1 kg to s.t.", 312 expected: "0.0011023122 shortton", 313 }, 314 { 315 queryString: "1 kg to s/t", 316 expected: "0.0011023122 shortton", 317 }, 318 { 319 queryString: "1 kg to pound", 320 expected: "2.2046244202 lb", 321 }, 322 { queryString: "1 kg to lbs", expected: "2.2046244202 lb" }, 323 { 324 queryString: "1 kg to lb", 325 expected: "2.2046244202 lb", 326 }, 327 { 328 queryString: "1 kg to ounce", 329 expected: "35.273990723 oz", 330 }, 331 { queryString: "1 kg to oz", expected: "35.273990723 oz" }, 332 { queryString: "1 kg to carat", expected: "5,000 carat" }, 333 { queryString: "1 kg to ffd", expected: "5,000 ffd" }, 334 { queryString: "1 ffd to kg", expected: "0.0002 kg" }, 335 ], 336 }, 337 { 338 category: "temperature", 339 cases: [ 340 { queryString: "0 c to c", expected: "0°C" }, 341 { queryString: "0 c in c", expected: "0°C" }, 342 { queryString: "0 c = c", expected: "0°C" }, 343 { queryString: "0 C=C", expected: "0°C" }, 344 { queryString: "0 c to celsius", expected: "0°C" }, 345 { queryString: "0 c to kelvin", expected: "273.15 kelvin" }, 346 { queryString: "0 c to k", expected: "273.15 kelvin" }, 347 { queryString: "10 c to k", expected: "283.15 kelvin" }, 348 { queryString: "0 c to fahrenheit", expected: "32°F" }, 349 { queryString: "0 c to f", expected: "32°F" }, 350 { queryString: "10 c to f", expected: "50°F" }, 351 { 352 queryString: "10 f to kelvin", 353 expected: `260.9277777778 kelvin`, 354 }, 355 { queryString: "-10 c to f", expected: "14°F" }, 356 ], 357 }, 358 { 359 category: "timezone", 360 cases: [ 361 { queryString: "0 utc to utc", expected: "00:00 UTC" }, 362 { queryString: "0 utc in utc", expected: "00:00 UTC" }, 363 { queryString: "0 utc = utc", expected: "00:00 UTC" }, 364 { queryString: "0 UTC=UTC", expected: "00:00 UTC" }, 365 { queryString: "11 pm utc to utc", expected: "11:00 PM UTC" }, 366 { queryString: "11 am utc to utc", expected: "11:00 AM UTC" }, 367 { queryString: "11:30 utc to utc", expected: "11:30 UTC" }, 368 { queryString: "11:30 PM utc to utc", expected: "11:30 PM UTC" }, 369 { queryString: "1 utc to idlw", expected: "13:00 IDLW" }, 370 { queryString: "1 pm utc to idlw", expected: "1:00 AM IDLW" }, 371 { queryString: "1 am utc to idlw", expected: "1:00 PM IDLW" }, 372 { queryString: "1 utc to idlw", expected: "13:00 IDLW" }, 373 { queryString: "1 PM utc to idlw", expected: "1:00 AM IDLW" }, 374 { queryString: "0 utc to nt", expected: "13:00 NT" }, 375 { queryString: "0 utc to hst", expected: "14:00 HST" }, 376 { queryString: "0 utc to akst", expected: "15:00 AKST" }, 377 { queryString: "0 utc to pst", expected: "16:00 PST" }, 378 { queryString: "0 utc to akdt", expected: "16:00 AKDT" }, 379 { queryString: "0 utc to mst", expected: "17:00 MST" }, 380 { queryString: "0 utc to pdt", expected: "17:00 PDT" }, 381 { queryString: "0 utc to cst", expected: "18:00 CST" }, 382 { queryString: "0 utc to mdt", expected: "18:00 MDT" }, 383 { queryString: "0 utc to est", expected: "19:00 EST" }, 384 { queryString: "0 utc to cdt", expected: "19:00 CDT" }, 385 { queryString: "0 utc to edt", expected: "20:00 EDT" }, 386 { queryString: "0 utc to ast", expected: "20:00 AST" }, 387 { queryString: "0 utc to guy", expected: "21:00 GUY" }, 388 { queryString: "0 utc to adt", expected: "21:00 ADT" }, 389 { queryString: "0 utc to at", expected: "22:00 AT" }, 390 { queryString: "0 utc to gmt", expected: "00:00 GMT" }, 391 { queryString: "0 utc to z", expected: "00:00 Z" }, 392 { queryString: "0 utc to wet", expected: "00:00 WET" }, 393 { queryString: "0 utc to west", expected: "01:00 WEST" }, 394 { queryString: "0 utc to cet", expected: "01:00 CET" }, 395 { queryString: "0 utc to bst", expected: "01:00 BST" }, 396 { queryString: "0 utc to ist", expected: "01:00 IST" }, 397 { queryString: "0 utc to cest", expected: "02:00 CEST" }, 398 { queryString: "0 utc to eet", expected: "02:00 EET" }, 399 { queryString: "0 utc to eest", expected: "03:00 EEST" }, 400 { queryString: "0 utc to msk", expected: "03:00 MSK" }, 401 { queryString: "0 utc to msd", expected: "04:00 MSD" }, 402 { queryString: "0 utc to zp4", expected: "04:00 ZP4" }, 403 { queryString: "0 utc to zp5", expected: "05:00 ZP5" }, 404 { queryString: "0 utc to zp6", expected: "06:00 ZP6" }, 405 { queryString: "0 utc to wast", expected: "07:00 WAST" }, 406 { queryString: "0 utc to awst", expected: "08:00 AWST" }, 407 { queryString: "0 utc to wst", expected: "08:00 WST" }, 408 { queryString: "0 utc to jst", expected: "09:00 JST" }, 409 { queryString: "0 utc to acst", expected: "09:30 ACST" }, 410 { queryString: "0 utc to aest", expected: "10:00 AEST" }, 411 { queryString: "0 utc to acdt", expected: "10:30 ACDT" }, 412 { queryString: "0 utc to aedt", expected: "11:00 AEDT" }, 413 { queryString: "0 utc to nzst", expected: "12:00 NZST" }, 414 { queryString: "0 utc to idle", expected: "12:00 IDLE" }, 415 { queryString: "0 utc to nzd", expected: "13:00 NZD" }, 416 { queryString: "9:00 jst to utc", expected: "00:00 UTC" }, 417 { queryString: "8:00 jst to utc", expected: "23:00 UTC" }, 418 { queryString: "8:00 am jst to utc", expected: "11:00 PM UTC" }, 419 { queryString: "9:00 jst to pdt", expected: "17:00 PDT" }, 420 { queryString: "12 pm pst to cet", expected: "9:00 PM CET" }, 421 { queryString: "12 am pst to cet", expected: "9:00 AM CET" }, 422 { queryString: "12:30 pm pst to cet", expected: "9:30 PM CET" }, 423 { queryString: "12:30 am pst to cet", expected: "9:30 AM CET" }, 424 { queryString: "23 pm pst to cet", expected: "8:00 AM CET" }, 425 { queryString: "23:30 pm pst to cet", expected: "8:30 AM CET" }, 426 { 427 queryString: "10:00 JST to here", 428 timezone: "UTC", 429 expected: "01:00 UTC-000", 430 }, 431 { 432 queryString: "1:00 to JST", 433 timezone: "UTC", 434 expected: "10:00 JST", 435 }, 436 { 437 queryString: "1 am to JST", 438 timezone: "UTC", 439 expected: "10:00 AM JST", 440 }, 441 { 442 queryString: "now to JST", 443 timezone: "UTC", 444 assertResult: output => { 445 const outputRegexResult = /([0-9]+):([0-9]+)/.exec(output); 446 const outputMinutes = 447 parseInt(outputRegexResult[1]) * 60 + 448 parseInt(outputRegexResult[2]); 449 const nowDate = new Date(); 450 // Apply JST time difference. 451 nowDate.setHours(nowDate.getHours() + 9); 452 let nowMinutes = nowDate.getHours() * 60 + nowDate.getMinutes(); 453 // When we cross the day between the unit converter calculation and the 454 // assertion here. 455 nowMinutes = 456 outputMinutes > nowMinutes ? nowMinutes + 1440 : nowMinutes; 457 Assert.lessOrEqual(nowMinutes - outputMinutes, 1); 458 }, 459 }, 460 { 461 queryString: "now to here", 462 timezone: "UTC", 463 assertResult: output => { 464 const outputRegexResult = /([0-9]+):([0-9]+)/.exec(output); 465 const outputMinutes = 466 parseInt(outputRegexResult[1]) * 60 + 467 parseInt(outputRegexResult[2]); 468 const nowDate = new Date(); 469 let nowMinutes = nowDate.getHours() * 60 + nowDate.getMinutes(); 470 nowMinutes = 471 outputMinutes > nowMinutes ? nowMinutes + 1440 : nowMinutes; 472 Assert.lessOrEqual(nowMinutes - outputMinutes, 1); 473 }, 474 }, 475 ], 476 }, 477 { 478 category: "invalid", 479 cases: [ 480 { queryString: "1 to cm" }, 481 { queryString: "1cm to newton" }, 482 { queryString: "1cm to foo" }, 483 { queryString: "0:00:00 utc to jst" }, 484 ], 485 }, 486 ]; 487 488 add_task(async function () { 489 // Enable unit conversion. 490 Services.prefs.setBoolPref("browser.urlbar.unitConversion.enabled", true); 491 registerCleanupFunction(() => { 492 Services.prefs.clearUserPref("browser.urlbar.unitConversion.enabled"); 493 }); 494 let provider = new UrlbarProviderUnitConversion(); 495 496 for (const { category, cases } of TEST_DATA) { 497 for (const { queryString, timezone, expected, assertResult } of cases) { 498 info(`Test "${queryString}" in ${category}`); 499 500 if (timezone) { 501 info(`Set timezone ${timezone}`); 502 Cu.getJSTestingFunctions().setTimeZone(timezone); 503 } 504 505 const context = createContext(queryString); 506 const isActive = await provider.isActive(context); 507 Assert.equal(isActive, !!expected || !!assertResult); 508 509 if (isActive) { 510 provider.startQuery(context, (module, result) => { 511 Assert.equal(result.type, UrlbarUtils.RESULT_TYPE.DYNAMIC); 512 Assert.equal(result.source, UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL); 513 Assert.equal(result.suggestedIndex, 1); 514 Assert.equal(result.payload.input, queryString); 515 516 if (expected) { 517 Assert.equal(result.payload.output, expected); 518 } else { 519 assertResult(result.payload.output); 520 } 521 }); 522 } 523 524 if (timezone) { 525 // Reset timezone to default 526 Cu.getJSTestingFunctions().setTimeZone(undefined); 527 } 528 } 529 } 530 });