unit-tests.html (11944B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>js-naturalsort test suite</title> 5 <script src='http://code.jquery.com/jquery-latest.js'></script> 6 <link rel='stylesheet' href='http://code.jquery.com/qunit/git/qunit.css' type='text/css' media='screen' /> 7 <script type='text/javascript' src='http://code.jquery.com/qunit/git/qunit.js'></script> 8 <script src='naturalSort.js' type='text/javascript'></script> 9 <script type='text/javascript'> 10 $(function () { 11 test('different values types', function () { 12 wrapTest( 13 ['a',1], 14 [1,'a'], 15 'number always comes first'); 16 wrapTest( 17 ['1',1], 18 ['1',1], 19 'number vs numeric string - should remain unchanged (error in chrome)'); 20 wrapTest( 21 ['02',3,2,'01'], 22 ['01','02',2,3], 23 'padding numeric string vs number'); 24 }); 25 test('datetime', function () { 26 wrapTest( 27 ['10/12/2008','10/11/2008','10/11/2007','10/12/2007'], 28 ['10/11/2007','10/12/2007','10/11/2008','10/12/2008'], 29 'similar dates'); 30 wrapTest( 31 ['01/01/2008','01/10/2008','01/01/1992','01/01/1991'], 32 ['01/01/1991','01/01/1992','01/01/2008','01/10/2008'], 33 'similar dates'); 34 wrapTest( 35 [ 36 'Wed Jan 01 2010 00:00:00 GMT-0800 (Pacific Standard Time)', 37 'Thu Dec 31 2009 00:00:00 GMT-0800 (Pacific Standard Time)', 38 'Wed Jan 01 2010 00:00:00 GMT-0500 (Eastern Standard Time)' 39 ],[ 40 'Thu Dec 31 2009 00:00:00 GMT-0800 (Pacific Standard Time)', 41 'Wed Jan 01 2010 00:00:00 GMT-0500 (Eastern Standard Time)', 42 'Wed Jan 01 2010 00:00:00 GMT-0800 (Pacific Standard Time)' 43 ], 'javascript toString(), different timezones'); 44 wrapTest( 45 [ 46 'Saturday, July 3, 2010', 47 'Monday, August 2, 2010', 48 'Monday, May 3, 2010' 49 ],[ 50 'Monday, May 3, 2010', 51 'Saturday, July 3, 2010', 52 'Monday, August 2, 2010' 53 ], 'Date.toString(), Date.toLocaleString()'); 54 wrapTest( 55 [ 56 'Mon, 15 Jun 2009 20:45:30 GMT', 57 'Mon, 3 May 2010 17:45:30 GMT', 58 'Mon, 15 Jun 2009 17:45:30 GMT' 59 ],[ 60 'Mon, 15 Jun 2009 17:45:30 GMT', 61 'Mon, 15 Jun 2009 20:45:30 GMT', 62 'Mon, 3 May 2010 17:45:30 GMT' 63 ], 'Date.toUTCString()'); 64 wrapTest( 65 [ 66 'Saturday, July 3, 2010 1:45 PM', 67 'Saturday, July 3, 2010 1:45 AM', 68 'Monday, August 2, 2010 1:45 PM', 69 'Monday, May 3, 2010 1:45 PM' 70 ],[ 71 'Monday, May 3, 2010 1:45 PM', 72 'Saturday, July 3, 2010 1:45 AM', 73 'Saturday, July 3, 2010 1:45 PM', 74 'Monday, August 2, 2010 1:45 PM' 75 ], ''); 76 wrapTest( 77 [ 78 'Saturday, July 3, 2010 1:45:30 PM', 79 'Saturday, July 3, 2010 1:45:29 PM', 80 'Monday, August 2, 2010 1:45:01 PM', 81 'Monday, May 3, 2010 1:45:00 PM' 82 ],[ 83 'Monday, May 3, 2010 1:45:00 PM', 84 'Saturday, July 3, 2010 1:45:29 PM', 85 'Saturday, July 3, 2010 1:45:30 PM', 86 'Monday, August 2, 2010 1:45:01 PM' 87 ], ''); 88 wrapTest( 89 [ 90 '2/15/2009 1:45 PM', 91 '1/15/2009 1:45 PM', 92 '2/15/2009 1:45 AM' 93 ],[ 94 '1/15/2009 1:45 PM', 95 '2/15/2009 1:45 AM', 96 '2/15/2009 1:45 PM' 97 ], ''); 98 wrapTest( 99 [ 100 '2010-06-15T13:45:30', 101 '2009-06-15T13:45:30', 102 '2009-06-15T01:45:30.2', 103 '2009-01-15T01:45:30' 104 ],[ 105 '2009-01-15T01:45:30', 106 '2009-06-15T01:45:30.2', 107 '2009-06-15T13:45:30', 108 '2010-06-15T13:45:30' 109 ], 'ISO8601 Dates'); 110 wrapTest( 111 [ 112 '2010-06-15 13:45:30', 113 '2009-06-15 13:45:30', 114 '2009-01-15 01:45:30' 115 ],[ 116 '2009-01-15 01:45:30', 117 '2009-06-15 13:45:30', 118 '2010-06-15 13:45:30' 119 ], 'ISO8601-ish YYYY-MM-DDThh:mm:ss - which does not parse into a Date instance'); 120 wrapTest( 121 [ 122 'Mon, 15 Jun 2009 20:45:30 GMT', 123 'Mon, 15 Jun 2009 20:45:30 PDT', 124 'Mon, 15 Jun 2009 20:45:30 EST', 125 ],[ 126 'Mon, 15 Jun 2009 20:45:30 GMT', 127 'Mon, 15 Jun 2009 20:45:30 EST', 128 'Mon, 15 Jun 2009 20:45:30 PDT' 129 ], 'RFC1123 testing different timezones'); 130 wrapTest( 131 [ 132 '1245098730000', 133 '14330728000', 134 '1245098728000' 135 ],[ 136 '14330728000', 137 '1245098728000', 138 '1245098730000' 139 ], 'unix epoch, Date.getTime()'); 140 }); 141 test('version number strings', function () { 142 wrapTest( 143 ['1.0.2','1.0.1','1.0.0','1.0.9'], 144 ['1.0.0','1.0.1','1.0.2','1.0.9'], 145 'close version numbers'); 146 wrapTest( 147 ['1.0.03','1.0.003','1.0.002','1.0.0001'], 148 ['1.0.0001','1.0.002','1.0.003','1.0.03'], 149 'multi-digit branch release'); 150 wrapTest( 151 ['1.1beta','1.1.2alpha3','1.0.2alpha3','1.0.2alpha1','1.0.1alpha4','2.1.2','2.1.1'], 152 ['1.0.1alpha4','1.0.2alpha1','1.0.2alpha3','1.1.2alpha3','1.1beta','2.1.1','2.1.2'], 153 'close version numbers'); 154 wrapTest( 155 ['myrelease-1.1.3','myrelease-1.2.3','myrelease-1.1.4','myrelease-1.1.1','myrelease-1.0.5'], 156 ['myrelease-1.0.5','myrelease-1.1.1','myrelease-1.1.3','myrelease-1.1.4','myrelease-1.2.3'], 157 'string first'); 158 }); 159 test('numerics', function () { 160 wrapTest( 161 ['10',9,2,'1','4'], 162 ['1',2,'4',9,'10'], 163 'string vs number'); 164 wrapTest( 165 ['0001','002','001'], 166 ['0001','001','002'], 167 '0 left-padded numbers'); 168 wrapTest( 169 [2,1,'1','0001','002','02','001'], 170 ['0001','001','002','02',1,'1',2], 171 '0 left-padded numbers and regular numbers'); 172 wrapTest( 173 ['10.0401',10.022,10.042,'10.021999'], 174 ['10.021999',10.022,'10.0401',10.042], 175 'decimal string vs decimal, different precision'); 176 wrapTest( 177 ['10.04',10.02,10.03,'10.01'], 178 ['10.01',10.02,10.03,'10.04'], 179 'decimal string vs decimal, same precision'); 180 wrapTest( 181 ['10.04f','10.039F','10.038d','10.037D'], 182 ['10.037D','10.038d','10.039F','10.04f'], 183 'float/decimal with \'F\' or \'D\' notation'); 184 wrapTest( 185 ['10.004Z','10.039T','10.038ooo','10.037g'], 186 ['10.004Z','10.037g','10.038ooo','10.039T'], 187 'not foat/decimal notation'); 188 wrapTest( 189 ['1.528535047e5','1.528535047e7','1.52e15','1.528535047e3','1.59e-3'], 190 ['1.59e-3','1.528535047e3','1.528535047e5','1.528535047e7','1.52e15'], 191 'scientific notation'); 192 wrapTest( 193 ['-1','-2','4','-3','0','-5'], 194 ['-5','-3','-2','-1','0','4'], 195 'negative numbers as strings'); 196 wrapTest( 197 [-1,'-2',4,-3,'0','-5'], 198 ['-5',-3,'-2',-1,'0',4], 199 'negative numbers as strings - mixed input type, string + numeric'); 200 wrapTest( 201 [-2.01,-2.1,4.144,4.1,-2.001,-5], 202 [-5,-2.1,-2.01,-2.001,4.1,4.144], 203 'negative floats - all numeric'); 204 }); 205 test('IP addresses', function () { 206 wrapTest( 207 [ 208 '192.168.0.100', 209 '192.168.0.1', 210 '192.168.1.1', 211 '192.168.0.250', 212 '192.168.1.123', 213 '10.0.0.2', 214 '10.0.0.1' 215 ], 216 [ 217 '10.0.0.1', 218 '10.0.0.2', 219 '192.168.0.1', 220 '192.168.0.100', 221 '192.168.0.250', 222 '192.168.1.1', 223 '192.168.1.123' 224 ]); 225 }); 226 test('filenames', function () { 227 wrapTest( 228 ['img12.png','img10.png','img2.png','img1.png'], 229 ['img1.png','img2.png','img10.png','img12.png'], 230 'simple image filenames'); 231 wrapTest( 232 ['car.mov','01alpha.sgi','001alpha.sgi','my.string_41299.tif','organic2.0001.sgi'], 233 ['001alpha.sgi','01alpha.sgi','car.mov','my.string_41299.tif','organic2.0001.sgi'], 234 'complex filenames'); 235 wrapTest([ 236 './system/kernel/js/01_ui.core.js', 237 './system/kernel/js/00_jquery-1.3.2.js', 238 './system/kernel/js/02_my.desktop.js' 239 ],[ 240 './system/kernel/js/00_jquery-1.3.2.js', 241 './system/kernel/js/01_ui.core.js', 242 './system/kernel/js/02_my.desktop.js' 243 ], 'unix filenames'); 244 }); 245 test('space(s) as first character(s)', function () { 246 wrapTest( 247 ['alpha',' 1',' 3',' 2',0], 248 [0,' 1',' 2',' 3','alpha']); 249 }); 250 test('empty strings and space character', function () { 251 wrapTest( 252 ['10023','999','',2,5.663,5.6629], 253 ['',2,5.6629,5.663,'999','10023']); 254 wrapTest( 255 [0,'0',''], 256 [0,'0','']); 257 }); 258 test('hex', function () { 259 wrapTest( 260 [ '0xA','0x9','0x99' ], 261 [ '0x9','0xA','0x99'], 262 'real hex numbers'); 263 wrapTest( 264 [ '0xZZ','0xVVV','0xVEV','0xUU' ], 265 [ '0xUU','0xVEV','0xVVV','0xZZ' ],'fake hex numbers'); 266 }); 267 test('unicode', function () { 268 wrapTest( 269 [ '\u0044', '\u0055', '\u0054', '\u0043' ], 270 [ '\u0043', '\u0044', '\u0054', '\u0055' ], 271 'basic latin'); 272 }); 273 test('sparse array sort', function () { 274 var sarray = [3, 2] 275 sarrayOutput = [1, 2, 3]; 276 sarray[10] = 1; 277 for (var i=0; i < 8; i++) 278 sarrayOutput.push(undefined); 279 wrapTest(sarray, sarrayOutput,'simple sparse array'); 280 }); 281 test('case insensitive support', function () { 282 naturalSort.insensitive = true; 283 wrapTest( 284 ['A', 'b', 'C', 'd', 'E', 'f'], 285 ['A', 'b', 'C', 'd', 'E', 'f'], 286 'case sensitive pre-sorted array'); 287 wrapTest( 288 ['A', 'C', 'E', 'b', 'd', 'f'], 289 ['A', 'b', 'C', 'd', 'E', 'f'], 290 'case sensitive un-sorted array'); 291 naturalSort.insensitive = false; 292 wrapTest( 293 ['A', 'C', 'E', 'b', 'd', 'f'], 294 ['A', 'C', 'E', 'b', 'd', 'f'], 295 'case sensitive pre-sorted array'); 296 wrapTest( 297 ['A', 'b', 'C', 'd', 'E', 'f'], 298 ['A', 'C', 'E', 'b', 'd', 'f'], 299 'case sensitive un-sorted array'); 300 }); 301 test('contributed tests', function () { 302 wrapTest( 303 ['T78','U17','U10','U12','U14','745','U7','01','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'], 304 ['01','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'], 305 'contributed by Bob Zeiner'); 306 wrapTest( 307 [ 308 'FSI stop, Position: 5', 309 'Mail Group stop, Position: 5', 310 'Mail Group stop, Position: 5', 311 'FSI stop, Position: 6', 312 'FSI stop, Position: 6', 313 'Newsstand stop, Position: 4', 314 'Newsstand stop, Position: 4', 315 'FSI stop, Position: 5' 316 ],[ 317 'FSI stop, Position: 5', 318 'FSI stop, Position: 5', 319 'FSI stop, Position: 6', 320 'FSI stop, Position: 6', 321 'Mail Group stop, Position: 5', 322 'Mail Group stop, Position: 5', 323 'Newsstand stop, Position: 4', 324 'Newsstand stop, Position: 4' 325 ],'contributed by Scott'); 326 wrapTest( 327 [2, 10, 1, 'azd', undefined, 'asd'], 328 [1, 2, 10, 'asd', 'azd', undefined], 329 'issue #2 - undefined support - jarvinen pekka'); 330 wrapTest( 331 [undefined, undefined, undefined, 1, undefined], 332 [1, undefined, undefined, undefined], 333 'issue #2 - undefined support - jarvinen pekka'); 334 wrapTest( 335 ['-1', '-2', '4', '-3', '0', '-5'], 336 ['-5', '-3', '-2', '-1', '0', '4'], 337 'issue #3 - invalid numeric string sorting - guilermo.dev'); 338 naturalSort.insensitive = true; 339 wrapTest( 340 ['9','11','22','99','A','aaaa','bbbb','Aaaa','aAaa','aa','AA','Aa','aA','BB','bB','aaA','AaA','aaa'], 341 ['9', '11', '22', '99', 'A', 'aa', 'AA', 'Aa', 'aA', 'aaA', 'AaA', 'aaa', 'aaaa', 'Aaaa', 'aAaa', 'BB', 'bB', 'bbbb'], 342 'issue #5 - invalid sort order - Howie Schecter'); 343 naturalSort.insensitive = false; 344 wrapTest( 345 ['9','11','22','99','A','aaaa','bbbb','Aaaa','aAaa','aa','AA','Aa','aA','BB','bB','aaA','AaA','aaa'], 346 ['9', '11', '22', '99', 'A', 'AA', 'Aa', 'AaA', 'Aaaa', 'BB', 'aA', 'aAaa', 'aa', 'aaA', 'aaa', 'aaaa', 'bB', 'bbbb'], 347 'issue #5 - invalid sort order - Howie Schecter'); 348 wrapTest( 349 ['5D','1A','2D','33A','5E','33K','33D','5S','2C','5C','5F','1D','2M'], 350 ['1A','1D','2C','2D','2M','5C','5D','5E','5F','5S','33A','33D','33K'], 351 'alphanumeric - number first'); 352 }); 353 }); 354 function wrapTest(origArray, sortArray, message) { 355 deepEqual($.extend([], origArray).sort(naturalSort), sortArray, (message ? message + ' - ' : '') + QUnit.jsDump.parse(origArray)); 356 } 357 </script> 358 </head> 359 <body> 360 <h1 id='qunit-header'>js-naturalsort test suite</h1> 361 <h2 id='qunit-banner'></h2> 362 <h2 id='qunit-userAgent'></h2> 363 <ol id='qunit-tests' /> 364 </body> 365 </html>