forked from mirrors/gecko-dev
911 lines
23 KiB
JavaScript
911 lines
23 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const l10n = new Localization(["devtools/client/storage.ftl"], true);
|
|
const sessionString = l10n.formatValueSync("storage-expires-session");
|
|
const {
|
|
naturalSortCaseSensitive,
|
|
naturalSortCaseInsensitive,
|
|
} = require("resource://devtools/shared/natural-sort.js");
|
|
|
|
function run_test() {
|
|
test("different values types", function () {
|
|
runTest(["a", 1], [1, "a"], "number always comes first");
|
|
runTest(
|
|
["1", 1],
|
|
["1", 1],
|
|
"number vs numeric string - should remain unchanged (error in chrome)"
|
|
);
|
|
runTest(
|
|
["02", 3, 2, "01"],
|
|
["01", "02", 2, 3],
|
|
"padding numeric string vs number"
|
|
);
|
|
});
|
|
|
|
test("datetime", function () {
|
|
runTest(
|
|
["10/12/2008", "10/11/2008", "10/11/2007", "10/12/2007"],
|
|
["10/11/2007", "10/12/2007", "10/11/2008", "10/12/2008"],
|
|
"similar dates"
|
|
);
|
|
runTest(
|
|
["01/01/2008", "01/10/2008", "01/01/1992", "01/01/1991"],
|
|
["01/01/1991", "01/01/1992", "01/01/2008", "01/10/2008"],
|
|
"similar dates"
|
|
);
|
|
runTest(
|
|
[
|
|
"Wed Jan 01 2010 00:00:00 GMT-0800 (Pacific Standard Time)",
|
|
"Thu Dec 31 2009 00:00:00 GMT-0800 (Pacific Standard Time)",
|
|
"Wed Jan 01 2010 00:00:00 GMT-0500 (Eastern Standard Time)",
|
|
],
|
|
[
|
|
"Thu Dec 31 2009 00:00:00 GMT-0800 (Pacific Standard Time)",
|
|
"Wed Jan 01 2010 00:00:00 GMT-0500 (Eastern Standard Time)",
|
|
"Wed Jan 01 2010 00:00:00 GMT-0800 (Pacific Standard Time)",
|
|
],
|
|
"javascript toString(), different timezones"
|
|
);
|
|
runTest(
|
|
[
|
|
"Saturday, July 3, 2010",
|
|
"Monday, August 2, 2010",
|
|
"Monday, May 3, 2010",
|
|
],
|
|
[
|
|
"Monday, May 3, 2010",
|
|
"Saturday, July 3, 2010",
|
|
"Monday, August 2, 2010",
|
|
],
|
|
"Date.toString(), Date.toLocaleString()"
|
|
);
|
|
runTest(
|
|
[
|
|
"Mon, 15 Jun 2009 20:45:30 GMT",
|
|
"Mon, 3 May 2010 17:45:30 GMT",
|
|
"Mon, 15 Jun 2009 17:45:30 GMT",
|
|
],
|
|
[
|
|
"Mon, 15 Jun 2009 17:45:30 GMT",
|
|
"Mon, 15 Jun 2009 20:45:30 GMT",
|
|
"Mon, 3 May 2010 17:45:30 GMT",
|
|
],
|
|
"Date.toUTCString()"
|
|
);
|
|
runTest(
|
|
[
|
|
"Saturday, July 3, 2010 1:45 PM",
|
|
"Saturday, July 3, 2010 1:45 AM",
|
|
"Monday, August 2, 2010 1:45 PM",
|
|
"Monday, May 3, 2010 1:45 PM",
|
|
],
|
|
[
|
|
"Monday, May 3, 2010 1:45 PM",
|
|
"Saturday, July 3, 2010 1:45 AM",
|
|
"Saturday, July 3, 2010 1:45 PM",
|
|
"Monday, August 2, 2010 1:45 PM",
|
|
],
|
|
""
|
|
);
|
|
runTest(
|
|
[
|
|
"Saturday, July 3, 2010 1:45:30 PM",
|
|
"Saturday, July 3, 2010 1:45:29 PM",
|
|
"Monday, August 2, 2010 1:45:01 PM",
|
|
"Monday, May 3, 2010 1:45:00 PM",
|
|
],
|
|
[
|
|
"Monday, May 3, 2010 1:45:00 PM",
|
|
"Saturday, July 3, 2010 1:45:29 PM",
|
|
"Saturday, July 3, 2010 1:45:30 PM",
|
|
"Monday, August 2, 2010 1:45:01 PM",
|
|
],
|
|
""
|
|
);
|
|
runTest(
|
|
["2/15/2009 1:45 PM", "1/15/2009 1:45 PM", "2/15/2009 1:45 AM"],
|
|
["1/15/2009 1:45 PM", "2/15/2009 1:45 AM", "2/15/2009 1:45 PM"],
|
|
""
|
|
);
|
|
runTest(
|
|
[
|
|
"2010-06-15T13:45:30",
|
|
"2009-06-15T13:45:30",
|
|
"2009-06-15T01:45:30.2",
|
|
"2009-01-15T01:45:30",
|
|
],
|
|
[
|
|
"2009-01-15T01:45:30",
|
|
"2009-06-15T01:45:30.2",
|
|
"2009-06-15T13:45:30",
|
|
"2010-06-15T13:45:30",
|
|
],
|
|
"ISO8601 Dates"
|
|
);
|
|
runTest(
|
|
["2010-06-15 13:45:30", "2009-06-15 13:45:30", "2009-01-15 01:45:30"],
|
|
["2009-01-15 01:45:30", "2009-06-15 13:45:30", "2010-06-15 13:45:30"],
|
|
"ISO8601-ish YYYY-MM-DDThh:mm:ss - which does not parse into a Date instance"
|
|
);
|
|
runTest(
|
|
[
|
|
"Mon, 15 Jun 2009 20:45:30 GMT",
|
|
"Mon, 15 Jun 2009 20:45:30 PDT",
|
|
"Mon, 15 Jun 2009 20:45:30 EST",
|
|
],
|
|
[
|
|
"Mon, 15 Jun 2009 20:45:30 GMT",
|
|
"Mon, 15 Jun 2009 20:45:30 EST",
|
|
"Mon, 15 Jun 2009 20:45:30 PDT",
|
|
],
|
|
"RFC1123 testing different timezones"
|
|
);
|
|
runTest(
|
|
["1245098730000", "14330728000", "1245098728000"],
|
|
["14330728000", "1245098728000", "1245098730000"],
|
|
"unix epoch, Date.getTime()"
|
|
);
|
|
runTest(
|
|
[
|
|
new Date("2001-01-10"),
|
|
"2015-01-01",
|
|
new Date("2001-01-01"),
|
|
"1998-01-01",
|
|
],
|
|
[
|
|
"1998-01-01",
|
|
new Date("2001-01-01"),
|
|
new Date("2001-01-10"),
|
|
"2015-01-01",
|
|
],
|
|
"mixed Date types"
|
|
);
|
|
runTest(
|
|
[
|
|
"Tue, 29 Jun 2021 11:31:17 GMT",
|
|
"Sun, 14 Jun 2009 11:11:15 GMT",
|
|
sessionString,
|
|
"Mon, 15 Jun 2009 20:45:30 GMT",
|
|
],
|
|
[
|
|
sessionString,
|
|
"Sun, 14 Jun 2009 11:11:15 GMT",
|
|
"Mon, 15 Jun 2009 20:45:30 GMT",
|
|
"Tue, 29 Jun 2021 11:31:17 GMT",
|
|
],
|
|
`"${sessionString}" amongst date strings`
|
|
);
|
|
runTest(
|
|
[
|
|
"Wed, 04 Sep 2024 09:11:44 GMT",
|
|
sessionString,
|
|
"Tue, 06 Sep 2022 09:11:44 GMT",
|
|
sessionString,
|
|
"Mon, 05 Sep 2022 09:12:41 GMT",
|
|
],
|
|
[
|
|
sessionString,
|
|
sessionString,
|
|
"Mon, 05 Sep 2022 09:12:41 GMT",
|
|
"Tue, 06 Sep 2022 09:11:44 GMT",
|
|
"Wed, 04 Sep 2024 09:11:44 GMT",
|
|
],
|
|
`"${sessionString}" amongst date strings (complex)`
|
|
);
|
|
|
|
runTest(
|
|
[
|
|
"Madras",
|
|
"Jalfrezi",
|
|
"Rogan Josh",
|
|
"Vindaloo",
|
|
"Tikka Masala",
|
|
sessionString,
|
|
"Masala",
|
|
"Korma",
|
|
],
|
|
[
|
|
"Jalfrezi",
|
|
"Korma",
|
|
"Madras",
|
|
"Masala",
|
|
"Rogan Josh",
|
|
sessionString,
|
|
"Tikka Masala",
|
|
"Vindaloo",
|
|
],
|
|
`"${sessionString}" amongst strings`
|
|
);
|
|
});
|
|
|
|
test("version number strings", function () {
|
|
runTest(
|
|
["1.0.2", "1.0.1", "1.0.0", "1.0.9"],
|
|
["1.0.0", "1.0.1", "1.0.2", "1.0.9"],
|
|
"close version numbers"
|
|
);
|
|
runTest(
|
|
["1.1.100", "1.1.1", "1.1.10", "1.1.54"],
|
|
["1.1.1", "1.1.10", "1.1.54", "1.1.100"],
|
|
"more version numbers"
|
|
);
|
|
runTest(
|
|
["1.0.03", "1.0.003", "1.0.002", "1.0.0001"],
|
|
["1.0.0001", "1.0.002", "1.0.003", "1.0.03"],
|
|
"multi-digit branch release"
|
|
);
|
|
runTest(
|
|
[
|
|
"1.1beta",
|
|
"1.1.2alpha3",
|
|
"1.0.2alpha3",
|
|
"1.0.2alpha1",
|
|
"1.0.1alpha4",
|
|
"2.1.2",
|
|
"2.1.1",
|
|
],
|
|
[
|
|
"1.0.1alpha4",
|
|
"1.0.2alpha1",
|
|
"1.0.2alpha3",
|
|
"1.1.2alpha3",
|
|
"1.1beta",
|
|
"2.1.1",
|
|
"2.1.2",
|
|
],
|
|
"close version numbers"
|
|
);
|
|
runTest(
|
|
[
|
|
"myrelease-1.1.3",
|
|
"myrelease-1.2.3",
|
|
"myrelease-1.1.4",
|
|
"myrelease-1.1.1",
|
|
"myrelease-1.0.5",
|
|
],
|
|
[
|
|
"myrelease-1.0.5",
|
|
"myrelease-1.1.1",
|
|
"myrelease-1.1.3",
|
|
"myrelease-1.1.4",
|
|
"myrelease-1.2.3",
|
|
],
|
|
"string first"
|
|
);
|
|
});
|
|
|
|
test("numerics", function () {
|
|
runTest(["10", 9, 2, "1", "4"], ["1", 2, "4", 9, "10"], "string vs number");
|
|
runTest(
|
|
["0001", "002", "001"],
|
|
["0001", "001", "002"],
|
|
"0 left-padded numbers"
|
|
);
|
|
runTest(
|
|
[2, 1, "1", "0001", "002", "02", "001"],
|
|
[1, "1", "0001", "001", 2, "002", "02"],
|
|
"0 left-padded numbers and regular numbers"
|
|
);
|
|
runTest(
|
|
["10.0401", 10.022, 10.042, "10.021999"],
|
|
["10.021999", 10.022, "10.0401", 10.042],
|
|
"decimal string vs decimal, different precision"
|
|
);
|
|
runTest(
|
|
["10.04", 10.02, 10.03, "10.01"],
|
|
["10.01", 10.02, 10.03, "10.04"],
|
|
"decimal string vs decimal, same precision"
|
|
);
|
|
runTest(
|
|
["10.04f", "10.039F", "10.038d", "10.037D"],
|
|
["10.037D", "10.038d", "10.039F", "10.04f"],
|
|
"float/decimal with 'F' or 'D' notation"
|
|
);
|
|
runTest(
|
|
["10.004Z", "10.039T", "10.038ooo", "10.037g"],
|
|
["10.004Z", "10.037g", "10.038ooo", "10.039T"],
|
|
"not foat/decimal notation"
|
|
);
|
|
runTest(
|
|
["1.528535047e5", "1.528535047e7", "1.52e15", "1.528535047e3", "1.59e-3"],
|
|
["1.59e-3", "1.528535047e3", "1.528535047e5", "1.528535047e7", "1.52e15"],
|
|
"scientific notation"
|
|
);
|
|
runTest(
|
|
["-1", "-2", "4", "-3", "0", "-5"],
|
|
["-5", "-3", "-2", "-1", "0", "4"],
|
|
"negative numbers as strings"
|
|
);
|
|
runTest(
|
|
[-1, "-2", 4, -3, "0", "-5"],
|
|
["-5", -3, "-2", -1, "0", 4],
|
|
"negative numbers as strings - mixed input type, string + numeric"
|
|
);
|
|
runTest(
|
|
[-2.01, -2.1, 4.144, 4.1, -2.001, -5],
|
|
[-5, -2.1, -2.01, -2.001, 4.1, 4.144],
|
|
"negative floats - all numeric"
|
|
);
|
|
});
|
|
|
|
test("IP addresses", function () {
|
|
runTest(
|
|
[
|
|
"192.168.0.100",
|
|
"192.168.0.1",
|
|
"192.168.1.1",
|
|
"192.168.0.250",
|
|
"192.168.1.123",
|
|
"10.0.0.2",
|
|
"10.0.0.1",
|
|
],
|
|
[
|
|
"10.0.0.1",
|
|
"10.0.0.2",
|
|
"192.168.0.1",
|
|
"192.168.0.100",
|
|
"192.168.0.250",
|
|
"192.168.1.1",
|
|
"192.168.1.123",
|
|
]
|
|
);
|
|
});
|
|
|
|
test("filenames", function () {
|
|
runTest(
|
|
["img12.png", "img10.png", "img2.png", "img1.png"],
|
|
["img1.png", "img2.png", "img10.png", "img12.png"],
|
|
"simple image filenames"
|
|
);
|
|
runTest(
|
|
[
|
|
"car.mov",
|
|
"01alpha.sgi",
|
|
"001alpha.sgi",
|
|
"my.string_41299.tif",
|
|
"organic2.0001.sgi",
|
|
],
|
|
[
|
|
"001alpha.sgi",
|
|
"01alpha.sgi",
|
|
"car.mov",
|
|
"my.string_41299.tif",
|
|
"organic2.0001.sgi",
|
|
],
|
|
"complex filenames"
|
|
);
|
|
runTest(
|
|
[
|
|
"./system/kernel/js/01_ui.core.js",
|
|
"./system/kernel/js/00_jquery-1.3.2.js",
|
|
"./system/kernel/js/02_my.desktop.js",
|
|
],
|
|
[
|
|
"./system/kernel/js/00_jquery-1.3.2.js",
|
|
"./system/kernel/js/01_ui.core.js",
|
|
"./system/kernel/js/02_my.desktop.js",
|
|
],
|
|
"unix filenames"
|
|
);
|
|
});
|
|
|
|
test("space(s) as first character(s)", function () {
|
|
runTest(["alpha", " 1", " 3", " 2", 0], [0, " 1", " 2", " 3", "alpha"]);
|
|
});
|
|
|
|
test("empty strings and space character", function () {
|
|
runTest(
|
|
["10023", "999", "", 2, 5.663, 5.6629],
|
|
["", 2, 5.6629, 5.663, "999", "10023"]
|
|
);
|
|
runTest([0, "0", ""], [0, "0", ""]);
|
|
});
|
|
|
|
test("hex", function () {
|
|
runTest(["0xA", "0x9", "0x99"], ["0x9", "0xA", "0x99"], "real hex numbers");
|
|
runTest(
|
|
["0xZZ", "0xVVV", "0xVEV", "0xUU"],
|
|
["0xUU", "0xVEV", "0xVVV", "0xZZ"],
|
|
"fake hex numbers"
|
|
);
|
|
});
|
|
|
|
test("unicode", function () {
|
|
runTest(
|
|
["\u0044", "\u0055", "\u0054", "\u0043"],
|
|
["\u0043", "\u0044", "\u0054", "\u0055"],
|
|
"basic latin"
|
|
);
|
|
});
|
|
|
|
test("sparse array sort", function () {
|
|
const sarray = [3, 2];
|
|
const sarrayOutput = [1, 2, 3];
|
|
|
|
sarray[10] = 1;
|
|
for (let i = 0; i < 8; i++) {
|
|
sarrayOutput.push(undefined);
|
|
}
|
|
runTest(sarray, sarrayOutput, "simple sparse array");
|
|
});
|
|
|
|
test("case insensitive support", function () {
|
|
runTest(
|
|
["A", "b", "C", "d", "E", "f"],
|
|
["A", "b", "C", "d", "E", "f"],
|
|
"case sensitive pre-sorted array",
|
|
true
|
|
);
|
|
runTest(
|
|
["A", "C", "E", "b", "d", "f"],
|
|
["A", "b", "C", "d", "E", "f"],
|
|
"case sensitive un-sorted array",
|
|
true
|
|
);
|
|
runTest(
|
|
["A", "C", "E", "b", "d", "f"],
|
|
["A", "C", "E", "b", "d", "f"],
|
|
"case sensitive pre-sorted array"
|
|
);
|
|
runTest(
|
|
["A", "b", "C", "d", "E", "f"],
|
|
["A", "C", "E", "b", "d", "f"],
|
|
"case sensitive un-sorted array"
|
|
);
|
|
});
|
|
|
|
test("rosetta code natural sort small test set", function () {
|
|
runTest(
|
|
[
|
|
"ignore leading spaces: 2-2",
|
|
" ignore leading spaces: 2-1",
|
|
" ignore leading spaces: 2+0",
|
|
" ignore leading spaces: 2+1",
|
|
],
|
|
[
|
|
" ignore leading spaces: 2+0",
|
|
" ignore leading spaces: 2+1",
|
|
" ignore leading spaces: 2-1",
|
|
"ignore leading spaces: 2-2",
|
|
],
|
|
"Ignoring leading spaces"
|
|
);
|
|
runTest(
|
|
[
|
|
"ignore m.a.s spaces: 2-2",
|
|
"ignore m.a.s spaces: 2-1",
|
|
"ignore m.a.s spaces: 2+0",
|
|
"ignore m.a.s spaces: 2+1",
|
|
],
|
|
[
|
|
"ignore m.a.s spaces: 2+0",
|
|
"ignore m.a.s spaces: 2+1",
|
|
"ignore m.a.s spaces: 2-1",
|
|
"ignore m.a.s spaces: 2-2",
|
|
],
|
|
"Ignoring multiple adjacent spaces (m.a.s)"
|
|
);
|
|
runTest(
|
|
[
|
|
"Equiv. spaces: 3-3",
|
|
"Equiv.\rspaces: 3-2",
|
|
"Equiv.\x0cspaces: 3-1",
|
|
"Equiv.\x0bspaces: 3+0",
|
|
"Equiv.\nspaces: 3+1",
|
|
"Equiv.\tspaces: 3+2",
|
|
],
|
|
[
|
|
"Equiv.\x0bspaces: 3+0",
|
|
"Equiv.\nspaces: 3+1",
|
|
"Equiv.\tspaces: 3+2",
|
|
"Equiv.\x0cspaces: 3-1",
|
|
"Equiv.\rspaces: 3-2",
|
|
"Equiv. spaces: 3-3",
|
|
],
|
|
"Equivalent whitespace characters"
|
|
);
|
|
runTest(
|
|
[
|
|
"cASE INDEPENENT: 3-2",
|
|
"caSE INDEPENENT: 3-1",
|
|
"casE INDEPENENT: 3+0",
|
|
"case INDEPENENT: 3+1",
|
|
],
|
|
[
|
|
"casE INDEPENENT: 3+0",
|
|
"case INDEPENENT: 3+1",
|
|
"caSE INDEPENENT: 3-1",
|
|
"cASE INDEPENENT: 3-2",
|
|
],
|
|
"Case Indepenent sort (naturalSort.insensitive = true)",
|
|
true
|
|
);
|
|
runTest(
|
|
[
|
|
"foo100bar99baz0.txt",
|
|
"foo100bar10baz0.txt",
|
|
"foo1000bar99baz10.txt",
|
|
"foo1000bar99baz9.txt",
|
|
],
|
|
[
|
|
"foo100bar10baz0.txt",
|
|
"foo100bar99baz0.txt",
|
|
"foo1000bar99baz9.txt",
|
|
"foo1000bar99baz10.txt",
|
|
],
|
|
"Numeric fields as numerics"
|
|
);
|
|
runTest(
|
|
[
|
|
"The Wind in the Willows",
|
|
"The 40th step more",
|
|
"The 39 steps",
|
|
"Wanda",
|
|
],
|
|
[
|
|
"The 39 steps",
|
|
"The 40th step more",
|
|
"The Wind in the Willows",
|
|
"Wanda",
|
|
],
|
|
"Title sorts"
|
|
);
|
|
runTest(
|
|
[
|
|
"Equiv. \xfd accents: 2-2",
|
|
"Equiv. \xdd accents: 2-1",
|
|
"Equiv. y accents: 2+0",
|
|
"Equiv. Y accents: 2+1",
|
|
],
|
|
[
|
|
"Equiv. y accents: 2+0",
|
|
"Equiv. Y accents: 2+1",
|
|
"Equiv. \xfd accents: 2-2",
|
|
"Equiv. \xdd accents: 2-1",
|
|
],
|
|
"Equivalent accented characters (and case) (naturalSort.insensitive = true)",
|
|
true
|
|
);
|
|
// This is not a valuable unicode ordering test
|
|
// runTest(
|
|
// ['Start with an \u0292: 2-2', 'Start with an \u017f: 2-1', 'Start with an \xdf: 2+0', 'Start with an s: 2+1'],
|
|
// ['Start with an s: 2+1', 'Start with an \xdf: 2+0', 'Start with an \u017f: 2-1', 'Start with an \u0292: 2-2'],
|
|
// 'Character replacements');
|
|
});
|
|
|
|
test("contributed tests", function () {
|
|
runTest(
|
|
[
|
|
"T78",
|
|
"U17",
|
|
"U10",
|
|
"U12",
|
|
"U14",
|
|
"745",
|
|
"U7",
|
|
"485",
|
|
"S16",
|
|
"S2",
|
|
"S22",
|
|
"1081",
|
|
"S25",
|
|
"1055",
|
|
"779",
|
|
"776",
|
|
"771",
|
|
"44",
|
|
"4",
|
|
"87",
|
|
"1091",
|
|
"42",
|
|
"480",
|
|
"952",
|
|
"951",
|
|
"756",
|
|
"1000",
|
|
"824",
|
|
"770",
|
|
"666",
|
|
"633",
|
|
"619",
|
|
"1",
|
|
"991",
|
|
"77H",
|
|
"PIER-7",
|
|
"47",
|
|
"29",
|
|
"9",
|
|
"77L",
|
|
"433",
|
|
],
|
|
[
|
|
"1",
|
|
"4",
|
|
"9",
|
|
"29",
|
|
"42",
|
|
"44",
|
|
"47",
|
|
"77H",
|
|
"77L",
|
|
"87",
|
|
"433",
|
|
"480",
|
|
"485",
|
|
"619",
|
|
"633",
|
|
"666",
|
|
"745",
|
|
"756",
|
|
"770",
|
|
"771",
|
|
"776",
|
|
"779",
|
|
"824",
|
|
"951",
|
|
"952",
|
|
"991",
|
|
"1000",
|
|
"1055",
|
|
"1081",
|
|
"1091",
|
|
"PIER-7",
|
|
"S2",
|
|
"S16",
|
|
"S22",
|
|
"S25",
|
|
"T78",
|
|
"U7",
|
|
"U10",
|
|
"U12",
|
|
"U14",
|
|
"U17",
|
|
],
|
|
"contributed by Bob Zeiner (Chrome not stable sort)"
|
|
);
|
|
runTest(
|
|
[
|
|
"FSI stop, Position: 5",
|
|
"Mail Group stop, Position: 5",
|
|
"Mail Group stop, Position: 5",
|
|
"FSI stop, Position: 6",
|
|
"FSI stop, Position: 6",
|
|
"Newsstand stop, Position: 4",
|
|
"Newsstand stop, Position: 4",
|
|
"FSI stop, Position: 5",
|
|
],
|
|
[
|
|
"FSI stop, Position: 5",
|
|
"FSI stop, Position: 5",
|
|
"FSI stop, Position: 6",
|
|
"FSI stop, Position: 6",
|
|
"Mail Group stop, Position: 5",
|
|
"Mail Group stop, Position: 5",
|
|
"Newsstand stop, Position: 4",
|
|
"Newsstand stop, Position: 4",
|
|
],
|
|
"contributed by Scott"
|
|
);
|
|
runTest(
|
|
[2, 10, 1, "azd", undefined, "asd"],
|
|
[1, 2, 10, "asd", "azd", undefined],
|
|
"issue #2 - undefined support - jarvinen pekka"
|
|
);
|
|
runTest(
|
|
[undefined, undefined, undefined, 1, undefined],
|
|
[1, undefined, undefined, undefined],
|
|
"issue #2 - undefined support - jarvinen pekka"
|
|
);
|
|
runTest(
|
|
["-1", "-2", "4", "-3", "0", "-5"],
|
|
["-5", "-3", "-2", "-1", "0", "4"],
|
|
"issue #3 - invalid numeric string sorting - guilermo.dev"
|
|
);
|
|
// native sort implementations are not guaranteed to be stable (i.e. Chrome)
|
|
// runTest(
|
|
// ['9','11','22','99','A','aaaa','bbbb','Aaaa','aAaa','aa','AA','Aa','aA','BB','bB','aaA','AaA','aaa'],
|
|
// ['9', '11', '22', '99', 'A', 'aa', 'AA', 'Aa', 'aA', 'aaA', 'AaA', 'aaa', 'aaaa', 'Aaaa', 'aAaa', 'BB', 'bB', 'bbbb'],
|
|
// 'issue #5 - invalid sort order - Howie Schecter (naturalSort.insensitive = true)'m true);
|
|
runTest(
|
|
[
|
|
"9",
|
|
"11",
|
|
"22",
|
|
"99",
|
|
"A",
|
|
"aaaa",
|
|
"bbbb",
|
|
"Aaaa",
|
|
"aAaa",
|
|
"aa",
|
|
"AA",
|
|
"Aa",
|
|
"aA",
|
|
"BB",
|
|
"bB",
|
|
"aaA",
|
|
"AaA",
|
|
"aaa",
|
|
],
|
|
[
|
|
"9",
|
|
"11",
|
|
"22",
|
|
"99",
|
|
"A",
|
|
"AA",
|
|
"Aa",
|
|
"AaA",
|
|
"Aaaa",
|
|
"BB",
|
|
"aA",
|
|
"aAaa",
|
|
"aa",
|
|
"aaA",
|
|
"aaa",
|
|
"aaaa",
|
|
"bB",
|
|
"bbbb",
|
|
],
|
|
"issue #5 - invalid sort order - Howie Schecter (naturalSort.insensitive = false)"
|
|
);
|
|
runTest(
|
|
[
|
|
"5D",
|
|
"1A",
|
|
"2D",
|
|
"33A",
|
|
"5E",
|
|
"33K",
|
|
"33D",
|
|
"5S",
|
|
"2C",
|
|
"5C",
|
|
"5F",
|
|
"1D",
|
|
"2M",
|
|
],
|
|
[
|
|
"1A",
|
|
"1D",
|
|
"2C",
|
|
"2D",
|
|
"2M",
|
|
"5C",
|
|
"5D",
|
|
"5E",
|
|
"5F",
|
|
"5S",
|
|
"33A",
|
|
"33D",
|
|
"33K",
|
|
],
|
|
"alphanumeric - number first"
|
|
);
|
|
runTest(
|
|
["img 99", "img199", "imga99", "imgz99"],
|
|
["img 99", "img199", "imga99", "imgz99"],
|
|
"issue #16 - Sorting incorrect when there is a space - adrien-be"
|
|
);
|
|
runTest(
|
|
["img199", "img 99", "imga99", "imgz 99", "imgb99", "imgz199"],
|
|
["img 99", "img199", "imga99", "imgb99", "imgz 99", "imgz199"],
|
|
"issue #16 - expanded test"
|
|
);
|
|
runTest(
|
|
["1", "02", "3"],
|
|
["1", "02", "3"],
|
|
"issue #18 - Any zeros that precede a number messes up the sorting - menixator"
|
|
);
|
|
// strings are coerced as floats/ints if possible and sorted accordingly - e.g. they are not chunked
|
|
runTest(
|
|
["1.100", "1.1", "1.10", "1.54"],
|
|
["1.100", "1.1", "1.10", "1.54"],
|
|
"issue #13 - ['1.100', '1.10', '1.1', '1.54'] etc do not sort properly... - rubenstolk"
|
|
);
|
|
runTest(
|
|
["v1.100", "v1.1", "v1.10", "v1.54"],
|
|
["v1.1", "v1.10", "v1.54", "v1.100"],
|
|
"issue #13 - ['v1.100', 'v1.10', 'v1.1', 'v1.54'] etc do not sort properly... - rubenstolk (bypass float coercion)"
|
|
);
|
|
runTest(
|
|
[
|
|
"MySnmp 1234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567",
|
|
"MySnmp 4234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567",
|
|
"MySnmp 2234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567",
|
|
"MySnmp 3234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567",
|
|
],
|
|
[
|
|
"MySnmp 1234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567",
|
|
"MySnmp 2234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567",
|
|
"MySnmp 3234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567",
|
|
"MySnmp 4234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567891234567",
|
|
],
|
|
"issue #14 - Very large numbers make sorting very slow - Mottie"
|
|
);
|
|
runTest(
|
|
["bar.1-2", "bar.1"],
|
|
["bar.1", "bar.1-2"],
|
|
"issue #21 - javascript error"
|
|
);
|
|
runTest(
|
|
["SomeString", "SomeString 1"],
|
|
["SomeString", "SomeString 1"],
|
|
"PR #19 - ['SomeString', 'SomeString 1'] bombing on 'undefined is not an object' - dannycochran"
|
|
);
|
|
runTest(
|
|
[
|
|
"Udet",
|
|
"\xDCbelacker",
|
|
"Uell",
|
|
"\xDClle",
|
|
"Ueve",
|
|
"\xDCxk\xFCll",
|
|
"Uffenbach",
|
|
],
|
|
[
|
|
"\xDCbelacker",
|
|
"Udet",
|
|
"Uell",
|
|
"Ueve",
|
|
"Uffenbach",
|
|
"\xDClle",
|
|
"\xDCxk\xFCll",
|
|
],
|
|
"issue #9 - Sorting umlauts characters \xC4, \xD6, \xDC - diogoalves"
|
|
);
|
|
runTest(
|
|
["2.2 sec", "1.9 sec", "1.53 sec"],
|
|
["1.53 sec", "1.9 sec", "2.2 sec"],
|
|
"https://github.com/overset/javascript-natural-sort/issues/13 - ['2.2 sec','1.9 sec','1.53 sec'] - padded by spaces - harisb"
|
|
);
|
|
runTest(
|
|
["2.2sec", "1.9sec", "1.53sec"],
|
|
["1.53sec", "1.9sec", "2.2sec"],
|
|
"https://github.com/overset/javascript-natural-sort/issues/13 - ['2.2sec','1.9sec','1.53sec'] - no padding - harisb"
|
|
);
|
|
});
|
|
}
|
|
|
|
function test(description, testFunc) {
|
|
info(description);
|
|
testFunc();
|
|
}
|
|
|
|
function runTest(testArray, expected, description, caseInsensitive = false) {
|
|
let actual = null;
|
|
|
|
if (caseInsensitive) {
|
|
actual = testArray.sort((a, b) =>
|
|
naturalSortCaseInsensitive(a, b, sessionString)
|
|
);
|
|
} else {
|
|
actual = testArray.sort((a, b) =>
|
|
naturalSortCaseSensitive(a, b, sessionString)
|
|
);
|
|
}
|
|
|
|
compareOptions(actual, expected, description);
|
|
}
|
|
|
|
// deepEqual() doesn't work well for testing arrays containing `undefined` so
|
|
// we need to use a custom method.
|
|
function compareOptions(actual, expected, description) {
|
|
let match = true;
|
|
for (let i = 0; i < actual.length; i++) {
|
|
if (actual[i] + "" !== expected[i] + "") {
|
|
ok(
|
|
false,
|
|
`${description}\nElement ${i} does not match:\n[${i}] ${actual[i]}\n[${i}] ${expected[i]}`
|
|
);
|
|
match = false;
|
|
break;
|
|
}
|
|
}
|
|
if (match) {
|
|
ok(true, description);
|
|
}
|
|
}
|