2efd6cd9a9bfecec1e37de6a5718767079a24f4e
3 module( 'jquery.tablesorter' );
6 mw
.config
.set('wgMonthNames', window
.wgMonthNames
= ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']);
7 mw
.config
.set('wgMonthNamesShort', window
.wgMonthNamesShort
= ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']);
8 mw
.config
.set('wgDefaultDateFormat', window
.wgDefaultDateFormat
= 'dmy');
10 test( '-- Initial check', function() {
12 ok( $.tablesorter
, '$.tablesorter defined' );
16 * Create an HTML table from an array of row arrays containing text strings.
17 * First row will be header row. No fancy rowspan/colspan stuff.
19 * @param {String[]} header
20 * @param {String[][]} data
23 var tableCreate = function( header
, data
) {
24 var $table
= $('<table class="sortable"><thead></thead><tbody></tbody></table>'),
25 $thead
= $table
.find('thead'),
26 $tbody
= $table
.find('tbody');
28 $.each(header
, function(i
, str
) {
30 $th
.text(str
).appendTo($tr
);
34 for (var i
= 0; i
< data
.length
; i
++) {
36 $.each(data
[i
], function(j
, str
) {
38 $td
.text(str
).appendTo($tr
);
46 * Extract text from table.
48 * @param {jQuery} $table
51 var tableExtract = function( $table
) {
53 $table
.find('tbody').find('tr').each(function(i
, tr
) {
55 $(tr
).find('td,th').each(function(i
, td
) {
56 row
.push($(td
).text());
64 * Run a table test by building a table with the given data,
65 * running some callback on it, then checking the results.
67 * @param {String} msg text to pass on to qunit for the comparison
68 * @param {String[]} header cols to make the table
69 * @param {String[][]} data rows/cols to make the table
70 * @param {String[][]} expected rows/cols to compare against at end
71 * @param {function($table)} callback something to do with the table before we compare
73 var tableTest = function( msg
, header
, data
, expected
, callback
) {
74 test( msg
, function() {
77 var $table
= tableCreate( header
, data
);
78 //$('body').append($table);
80 // Give caller a chance to set up sorting and manipulate the table.
83 // Table sorting is done synchronously; if it ever needs to change back
84 // to asynchronous, we'll need a timeout or a callback here.
85 var extracted
= tableExtract( $table
);
86 deepEqual( extracted
, expected
, msg
);
90 var reversed = function(arr
) {
91 var arr2
= arr
.slice(0);
96 // Sample data set: some planets!
97 var header
= ['Planet', 'Radius (km)'],
98 mercury
= ['Mercury', '2439.7'],
99 venus
= ['Venus', '6051.8'],
100 earth
= ['Earth', '6371.0'],
101 mars
= ['Mars', '3390.0'],
102 jupiter
= ['Jupiter', '69911'],
103 saturn
= ['Saturn', '58232'];
106 var planets
= [mercury
, venus
, earth
, mars
, jupiter
, saturn
];
107 var ascendingName
= [earth
, jupiter
, mars
, mercury
, saturn
, venus
];
108 var ascendingRadius
= [mercury
, mars
, venus
, earth
, saturn
, jupiter
];
111 'Basic planet table: ascending by name',
116 $table
.tablesorter();
117 $table
.find('.headerSort:eq(0)').click();
121 'Basic planet table: ascending by name a second time',
126 $table
.tablesorter();
127 $table
.find('.headerSort:eq(0)').click();
131 'Basic planet table: descending by name',
134 reversed(ascendingName
),
136 $table
.tablesorter();
137 $table
.find('.headerSort:eq(0)').click().click();
141 'Basic planet table: ascending radius',
146 $table
.tablesorter();
147 $table
.find('.headerSort:eq(1)').click();
151 'Basic planet table: descending radius',
154 reversed(ascendingRadius
),
156 $table
.tablesorter();
157 $table
.find('.headerSort:eq(1)').click().click();
164 'Bug 28775: German-style short numeric dates',
167 // German-style dates are day-month-year
175 // Sorted by ascending date
183 // @fixme reset it at end or change module to allow us to override it
184 mw
.config
.set('wgDefaultDateFormat', window
.wgDefaultDateFormat
= 'dmy');
185 $table
.tablesorter();
186 $table
.find('.headerSort:eq(0)').click();
190 'Bug 28775: American-style short numeric dates',
193 // American-style dates are month-day-year
201 // Sorted by ascending date
209 // @fixme reset it at end or change module to allow us to override it
210 mw
.config
.set('wgDefaultDateFormat', window
.wgDefaultDateFormat
= 'mdy');
211 $table
.tablesorter();
212 $table
.find('.headerSort:eq(0)').click();
217 // Some randomly generated fake IPs
228 // Sort order should go octet by octet
239 'Bug 17141: IPv4 address sorting',
244 $table
.tablesorter();
245 $table
.find('.headerSort:eq(0)').click();
249 'Bug 17141: IPv4 address sorting (reverse)',
252 reversed(ipv4Sorted
),
254 $table
.tablesorter();
255 $table
.find('.headerSort:eq(0)').click().click();
260 // Some words with Umlauts
271 var umlautWordsSorted
= [
272 // Some words with Umlauts
284 'Accented Characters with custom collation',
289 mw
.config
.set('tableSorterCollation', {'ä':'ae', 'ö' : 'oe', 'ß': 'ss', 'ü':'ue'});
290 $table
.tablesorter();
291 $table
.find('.headerSort:eq(0)').click();
292 mw
.config
.set('tableSorterCollation', {});
296 var planetsRowspan
=[["Earth","6051.8"], jupiter
, ["Mars","6051.8"], mercury
, saturn
, venus
];
297 var planetsRowspanII
=[jupiter
, mercury
, saturn
, ['Venus', '6371.0'], venus
, ['Venus', '3390.0']];
300 'Basic planet table: Same value for multiple rows via rowspan',
306 $table
.find('tr:eq(3) td:eq(1), tr:eq(4) td:eq(1)').remove();
307 $table
.find('tr:eq(2) td:eq(1)').attr('rowspan', '3');
308 $table
.tablesorter();
309 $table
.find('.headerSort:eq(0)').click();
313 'Basic planet table: Same value for multiple rows via rowspan II',
319 $table
.find('tr:eq(3) td:eq(0), tr:eq(4) td:eq(0)').remove();
320 $table
.find('tr:eq(2) td:eq(0)').attr('rowspan', '3');
321 $table
.tablesorter();
322 $table
.find('.headerSort:eq(0)').click();
326 var complexMDYDates
= [
327 // Some words with Umlauts
328 ['January, 19 2010'],
335 var complexMDYSorted
= [
339 ["January, 19 2010"],
344 'Complex date parsing I',
349 mw
.config
.set('wgDefaultDateFormat', window
.wgDefaultDateFormat
= 'mdy');
350 $table
.tablesorter();
351 $table
.find('.headerSort:eq(0)').click();
355 var ascendingNameLegacy
= ascendingName
.slice(0);
356 ascendingNameLegacy
[4] = ascendingNameLegacy
[5];
357 ascendingNameLegacy
.pop();
360 'Legacy compat with .sortbottom',
365 $table
.find('tr:last').addClass('sortbottom');
366 $table
.tablesorter();
367 $table
.find('.headerSort:eq(0)').click();