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