/* 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);
}
}
Messung V0.5 C=96 H=92 G=93
¤ Dauer der Verarbeitung: 0.23 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland