/* 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"
);
// Years should expand to 0100, 2001, 2010
runTest(
["1/1/100" , "1/1/1" , "1/1/10" ],
["1/1/100" , "1/1/1" , "1/1/10" ],
"dates with short year formatting"
);
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"
);
runTest(
[
"1.1.3" ,
"a-release-1.1.3" ,
"b-release-1.1.3" ,
"1.2.3" ,
"a-release-1.2.3" ,
"b-release-1.2.3" ,
"1.1.4" ,
"a-release-1.1.4" ,
"b-release-1.1.4" ,
"1.1.1" ,
"a-release-1.1.1" ,
"b-release-1.1.1" ,
"1.0.5" ,
"a-release-1.0.5" ,
"b-release-1.0.5" ,
],
[
"1.0.5" ,
"1.1.1" ,
"1.1.3" ,
"1.1.4" ,
"1.2.3" ,
"a-release-1.0.5" ,
"a-release-1.1.1" ,
"a-release-1.1.3" ,
"a-release-1.1.4" ,
"a-release-1.2.3" ,
"b-release-1.0.5" ,
"b-release-1.1.1" ,
"b-release-1.1.3" ,
"b-release-1.1.4" ,
"b-release-1.2.3" ,
],
"string first, different names"
);
runTest(
["zstring" , "astring" , "release-1.1.3" ],
["astring" , "release-1.1.3" , "zstring" ],
"string first, mixed with regular strings"
);
});
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);
}
}
quality 97%
¤ Dauer der Verarbeitung: 0.14 Sekunden
¤
*© Formatika GbR, Deutschland