// |reftest| skip-if(!this.hasOwnProperty("Intl"))
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// Locales which use caseFirst=off for the standard (sort) collation type.
const defaultLocales = Intl.Collator.supportedLocalesOf([
"en",
"de",
"es",
"sv",
"ar",
"zh",
"ja"]);
// Locales which use caseFirst=upper for the standard (sort) collation type.
const upperFirstLocales = Intl.Collator.supportedLocalesOf([
"cu",
"da",
"mt"]);
// Default collation for zh (pinyin) reorders "á" before "a" at secondary strength level.
const accentReordered = [
"zh"];
const allLocales = [...defaultLocales, ...upperFirstLocales];
// Check default "caseFirst" option is resolved correctly.
for (let locale of defaultLocales) {
let col =
new Intl.Collator(locale, {usage:
"sort"});
assertEq(col.resolvedOptions().caseFirst,
"false");
}
for (let locale of upperFirstLocales) {
let col =
new Intl.Collator(locale, {usage:
"sort"});
assertEq(col.resolvedOptions().caseFirst,
"upper");
}
for (let locale of allLocales) {
let col =
new Intl.Collator(locale, {usage:
"search"});
assertEq(col.resolvedOptions().caseFirst,
"false");
}
const collOptions = {usage:
"sort"};
const primary = {sensitivity:
"base"};
const secondary = {sensitivity:
"accent"};
const tertiary = {sensitivity:
"variant"};
const caseLevel = {sensitivity:
"case"};
const strengths = [primary, secondary, tertiary, caseLevel];
// "A" is sorted after "a" when caseFirst=off is the default and strength is tertiary.
for (let locale of defaultLocales) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
assertEq(col.compare(
"A",
"a"), 1);
assertEq(col.compare(
"a",
"A"), -1);
}
for (let locale of defaultLocales.filter(loc => !accentReordered.includes(loc))) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
assertEq(col.compare(
"A",
"á"), -1);
assertEq(col.compare(
"á",
"A"), 1);
}
// Also sorted after "a" with the sensitivity=case collator.
for (let locale of defaultLocales) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
assertEq(col.compare(
"A",
"a"), 1);
assertEq(col.compare(
"a",
"A"), -1);
assertEq(col.compare(
"A",
"á"), 1);
assertEq(col.compare(
"á",
"A"), -1);
}
// "A" is sorted before "a" when caseFirst=upper is the default and strength is tertiary.
for (let locale of upperFirstLocales) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, tertiary));
assertEq(col.compare(
"A",
"a"), -1);
assertEq(col.compare(
"a",
"A"), 1);
assertEq(col.compare(
"A",
"á"), -1);
assertEq(col.compare(
"á",
"A"), 1);
}
// Also sorted before "a" with the sensitivity=case collator.
for (let locale of upperFirstLocales) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, caseLevel));
assertEq(col.compare(
"A",
"a"), -1);
assertEq(col.compare(
"a",
"A"), 1);
assertEq(col.compare(
"A",
"á"), -1);
assertEq(col.compare(
"á",
"A"), 1);
}
// caseFirst=upper doesn't change the sort order when strength is below tertiary.
for (let locale of allLocales) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
assertEq(col.compare(
"A",
"a"), 0);
assertEq(col.compare(
"a",
"A"), 0);
}
for (let locale of allLocales.filter(loc => !accentReordered.includes(loc))) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, secondary));
assertEq(col.compare(
"A",
"á"), -1);
assertEq(col.compare(
"á",
"A"), 1);
}
for (let locale of allLocales) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, primary));
assertEq(col.compare(
"A",
"a"), 0);
assertEq(col.compare(
"a",
"A"), 0);
assertEq(col.compare(
"A",
"á"), 0);
assertEq(col.compare(
"á",
"A"), 0);
}
// caseFirst=upper doesn't change the sort order when there's a primary difference.
for (let locale of allLocales) {
for (let strength of strengths) {
let col =
new Intl.Collator(locale, Object.assign({}, collOptions, strength));
assertEq(col.compare(
"A",
"b"), -1);
assertEq(col.compare(
"a",
"B"), -1);
}
}
// caseFirst set through Unicode extension tag.
for (let locale of allLocales) {
let colKfFalse =
new Intl.Collator(locale +
"-u-kf-false", {});
let colKfLower =
new Intl.Collator(locale +
"-u-kf-lower", {});
let colKfUpper =
new Intl.Collator(locale +
"-u-kf-upper", {});
assertEq(colKfFalse.resolvedOptions().caseFirst,
"false");
assertEq(colKfFalse.compare(
"A",
"a"), 1);
assertEq(colKfFalse.compare(
"a",
"A"), -1);
assertEq(colKfLower.resolvedOptions().caseFirst,
"lower");
assertEq(colKfLower.compare(
"A",
"a"), 1);
assertEq(colKfLower.compare(
"a",
"A"), -1);
assertEq(colKfUpper.resolvedOptions().caseFirst,
"upper");
assertEq(colKfUpper.compare(
"A",
"a"), -1);
assertEq(colKfUpper.compare(
"a",
"A"), 1);
}
// caseFirst set through options value.
for (let locale of allLocales) {
let colKfFalse =
new Intl.Collator(locale, {caseFirst:
"false"});
let colKfLower =
new Intl.Collator(locale, {caseFirst:
"lower"});
let colKfUpper =
new Intl.Collator(locale, {caseFirst:
"upper"});
assertEq(colKfFalse.resolvedOptions().caseFirst,
"false");
assertEq(colKfFalse.compare(
"A",
"a"), 1);
assertEq(colKfFalse.compare(
"a",
"A"), -1);
assertEq(colKfLower.resolvedOptions().caseFirst,
"lower");
assertEq(colKfLower.compare(
"A",
"a"), 1);
assertEq(colKfLower.compare(
"a",
"A"), -1);
assertEq(colKfUpper.resolvedOptions().caseFirst,
"upper");
assertEq(colKfUpper.compare(
"A",
"a"), -1);
assertEq(colKfUpper.compare(
"a",
"A"), 1);
}
// Test Unicode extension tag and options value, the latter should win.
for (let locale of allLocales) {
let colKfFalse =
new Intl.Collator(locale +
"-u-kf-upper", {caseFirst:
"false"});
let colKfLower =
new Intl.Collator(locale +
"-u-kf-upper", {caseFirst:
"lower"});
let colKfUpper =
new Intl.Collator(locale +
"-u-kf-lower", {caseFirst:
"upper"});
assertEq(colKfFalse.resolvedOptions().caseFirst,
"false");
assertEq(colKfFalse.compare(
"A",
"a"), 1);
assertEq(colKfFalse.compare(
"a",
"A"), -1);
assertEq(colKfLower.resolvedOptions().caseFirst,
"lower");
assertEq(colKfLower.compare(
"A",
"a"), 1);
assertEq(colKfLower.compare(
"a",
"A"), -1);
assertEq(colKfUpper.resolvedOptions().caseFirst,
"upper");
assertEq(colKfUpper.compare(
"A",
"a"), -1);
assertEq(colKfUpper.compare(
"a",
"A"), 1);
}
// Ensure languages are properly detected when additional subtags are present.
if (Intl.Collator.supportedLocalesOf(
"da").length !== 0) {
assertEq(
new Intl.Collator(
"da-DK", {usage:
"sort"}).resolvedOptions().caseFirst,
"upper");
assertEq(
new Intl.Collator(
"da-Latn-DK", {usage:
"sort"}).resolvedOptions().caseFir
st, "upper");
}
if (Intl.Collator.supportedLocalesOf("mt").length !== 0) {
assertEq(new Intl.Collator("mt-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
assertEq(new Intl.Collator("mt-Latn-MT", {usage: "sort"}).resolvedOptions().caseFirst, "upper");
}
if (typeof reportCompare === "function")
reportCompare(0, 0, "ok");