tor-browser

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

caseFirst.js (7401B)


      1 // |reftest| skip-if(!this.hasOwnProperty("Intl"))
      2 
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 // Locales which use caseFirst=off for the standard (sort) collation type.
      8 const defaultLocales = Intl.Collator.supportedLocalesOf(["en", "de", "es", "sv", "ar", "zh", "ja"]);
      9 
     10 // Locales which use caseFirst=upper for the standard (sort) collation type.
     11 const upperFirstLocales = Intl.Collator.supportedLocalesOf(["cu", "da", "mt"]);
     12 
     13 // Default collation for zh (pinyin) reorders "á" before "a" at secondary strength level.
     14 const accentReordered = ["zh"];
     15 
     16 const allLocales = [...defaultLocales, ...upperFirstLocales];
     17 
     18 
     19 // Check default "caseFirst" option is resolved correctly.
     20 for (let locale of defaultLocales) {
     21    let col = new Intl.Collator(locale, {usage: "sort"});
     22    assertEq(col.resolvedOptions().caseFirst, "false");
     23 }
     24 for (let locale of upperFirstLocales) {
     25    let col = new Intl.Collator(locale, {usage: "sort"});
     26    assertEq(col.resolvedOptions().caseFirst, "upper");
     27 }
     28 for (let locale of allLocales) {
     29    let col = new Intl.Collator(locale, {usage: "search"});
     30    assertEq(col.resolvedOptions().caseFirst, "false");
     31 }
     32 
     33 
     34 const collOptions = {usage: "sort"};
     35 const primary = {sensitivity: "base"};
     36 const secondary = {sensitivity: "accent"};
     37 const tertiary = {sensitivity: "variant"};
     38 const caseLevel = {sensitivity: "case"};
     39 const strengths = [primary, secondary, tertiary, caseLevel];
     40 
     41 // "A" is sorted after "a" when caseFirst=off is the default and strength is tertiary.
     42 for (let locale of defaultLocales) {
     43    let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
     44 
     45    assertEq(col.compare("A", "a"), 1);
     46    assertEq(col.compare("a", "A"), -1);
     47 }
     48 for (let locale of defaultLocales.filter(loc => !accentReordered.includes(loc))) {
     49    let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
     50 
     51    assertEq(col.compare("A", "á"), -1);
     52    assertEq(col.compare("á", "A"), 1);
     53 }
     54 
     55 // Also sorted after "a" with the sensitivity=case collator.
     56 for (let locale of defaultLocales) {
     57    let col = new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
     58 
     59    assertEq(col.compare("A", "a"), 1);
     60    assertEq(col.compare("a", "A"), -1);
     61 
     62    assertEq(col.compare("A", "á"), 1);
     63    assertEq(col.compare("á", "A"), -1);
     64 }
     65 
     66 
     67 // "A" is sorted before "a" when caseFirst=upper is the default and strength is tertiary.
     68 for (let locale of upperFirstLocales) {
     69    let col = new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
     70 
     71    assertEq(col.compare("A", "a"), -1);
     72    assertEq(col.compare("a", "A"), 1);
     73 
     74    assertEq(col.compare("A", "á"), -1);
     75    assertEq(col.compare("á", "A"), 1);
     76 }
     77 
     78 // Also sorted before "a" with the sensitivity=case collator.
     79 for (let locale of upperFirstLocales) {
     80    let col = new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
     81 
     82    assertEq(col.compare("A", "a"), -1);
     83    assertEq(col.compare("a", "A"), 1);
     84 
     85    assertEq(col.compare("A", "á"), -1);
     86    assertEq(col.compare("á", "A"), 1);
     87 }
     88 
     89 
     90 // caseFirst=upper doesn't change the sort order when strength is below tertiary.
     91 for (let locale of allLocales) {
     92    let col = new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
     93 
     94    assertEq(col.compare("A", "a"), 0);
     95    assertEq(col.compare("a", "A"), 0);
     96 }
     97 for (let locale of allLocales.filter(loc => !accentReordered.includes(loc))) {
     98    let col = new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
     99 
    100    assertEq(col.compare("A", "á"), -1);
    101    assertEq(col.compare("á", "A"), 1);
    102 }
    103 
    104 for (let locale of allLocales) {
    105    let col = new Intl.Collator(locale, Object.assign({}, collOptions, primary));
    106 
    107    assertEq(col.compare("A", "a"), 0);
    108    assertEq(col.compare("a", "A"), 0);
    109 
    110    assertEq(col.compare("A", "á"), 0);
    111    assertEq(col.compare("á", "A"), 0);
    112 }
    113 
    114 
    115 // caseFirst=upper doesn't change the sort order when there's a primary difference.
    116 for (let locale of allLocales) {
    117    for (let strength of strengths) {
    118        let col = new Intl.Collator(locale, Object.assign({}, collOptions, strength));
    119 
    120        assertEq(col.compare("A", "b"), -1);
    121        assertEq(col.compare("a", "B"), -1);
    122    }
    123 }
    124 
    125 
    126 // caseFirst set through Unicode extension tag.
    127 for (let locale of allLocales) {
    128    let colKfFalse = new Intl.Collator(locale + "-u-kf-false", {});
    129    let colKfLower = new Intl.Collator(locale + "-u-kf-lower", {});
    130    let colKfUpper = new Intl.Collator(locale + "-u-kf-upper", {});
    131 
    132    assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
    133    assertEq(colKfFalse.compare("A", "a"), 1);
    134    assertEq(colKfFalse.compare("a", "A"), -1);
    135 
    136    assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
    137    assertEq(colKfLower.compare("A", "a"), 1);
    138    assertEq(colKfLower.compare("a", "A"), -1);
    139 
    140    assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
    141    assertEq(colKfUpper.compare("A", "a"), -1);
    142    assertEq(colKfUpper.compare("a", "A"), 1);
    143 }
    144 
    145 
    146 // caseFirst set through options value.
    147 for (let locale of allLocales) {
    148    let colKfFalse = new Intl.Collator(locale, {caseFirst: "false"});
    149    let colKfLower = new Intl.Collator(locale, {caseFirst: "lower"});
    150    let colKfUpper = new Intl.Collator(locale, {caseFirst: "upper"});
    151 
    152    assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
    153    assertEq(colKfFalse.compare("A", "a"), 1);
    154    assertEq(colKfFalse.compare("a", "A"), -1);
    155 
    156    assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
    157    assertEq(colKfLower.compare("A", "a"), 1);
    158    assertEq(colKfLower.compare("a", "A"), -1);
    159 
    160    assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
    161    assertEq(colKfUpper.compare("A", "a"), -1);
    162    assertEq(colKfUpper.compare("a", "A"), 1);
    163 }
    164 
    165 
    166 // Test Unicode extension tag and options value, the latter should win.
    167 for (let locale of allLocales) {
    168    let colKfFalse = new Intl.Collator(locale + "-u-kf-upper", {caseFirst: "false"});
    169    let colKfLower = new Intl.Collator(locale + "-u-kf-upper", {caseFirst: "lower"});
    170    let colKfUpper = new Intl.Collator(locale + "-u-kf-lower", {caseFirst: "upper"});
    171 
    172    assertEq(colKfFalse.resolvedOptions().caseFirst, "false");
    173    assertEq(colKfFalse.compare("A", "a"), 1);
    174    assertEq(colKfFalse.compare("a", "A"), -1);
    175 
    176    assertEq(colKfLower.resolvedOptions().caseFirst, "lower");
    177    assertEq(colKfLower.compare("A", "a"), 1);
    178    assertEq(colKfLower.compare("a", "A"), -1);
    179 
    180    assertEq(colKfUpper.resolvedOptions().caseFirst, "upper");
    181    assertEq(colKfUpper.compare("A", "a"), -1);
    182    assertEq(colKfUpper.compare("a", "A"), 1);
    183 }
    184 
    185 // Ensure languages are properly detected when additional subtags are present.
    186 if (Intl.Collator.supportedLocalesOf("da").length !== 0) {
    187    assertEq(new Intl.Collator("da-DK", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
    188    assertEq(new Intl.Collator("da-Latn-DK", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
    189 }
    190 if (Intl.Collator.supportedLocalesOf("mt").length !== 0) {
    191    assertEq(new Intl.Collator("mt-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
    192    assertEq(new Intl.Collator("mt-Latn-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
    193 }
    194 
    195 
    196 if (typeof reportCompare === "function")
    197    reportCompare(0, 0, "ok");