Revert r90678 per CR
[mediawiki.git] / tests / qunit / suites / resources / jquery / jquery.tablesorter.test.js
blobb79843290c802fbc5275186d82069040a82d1d6d
1 (function() {
3 module( 'jquery.tablesorter.test.js' );
5 // setup hack
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() {
11         expect(1);
12         ok( $.tablesorter, '$.tablesorter defined' );
13 });
15 /**
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.
18  *
19  * @param {String[]} header
20  * @param {String[][]} data
21  * @return jQuery
22  */
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');
27         var $tr = $('<tr>');
28         $.each(header, function(i, str) {
29                 var $th = $('<th>');
30                 $th.text(str).appendTo($tr);
31         });
32         $tr.appendTo($thead);
34         for (var i = 0; i < data.length; i++) {
35                 $tr = $('<tr>');
36                 $.each(data[i], function(j, str) {
37                         var $td = $('<td>');
38                         $td.text(str).appendTo($tr);
39                 });
40                 $tr.appendTo($tbody);
41         }
42         return $table;
45 /**
46  * Extract text from table.
47  *
48  * @param {jQuery} $table
49  * @return String[][]
50  */
51 var tableExtract = function( $table ) {
52         var data = [];
53         $table.find('tbody').find('tr').each(function(i, tr) {
54                 var row = [];
55                 $(tr).find('td,th').each(function(i, td) {
56                         row.push($(td).text());
57                 });
58                 data.push(row);
59         });
60         return data;
63 /**
64  * Run a table test by building a table with the given data,
65  * running some callback on it, then checking the results.
66  *
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
72  */
73 var tableTest = function( msg, header, data, expected, callback ) {
74         test( msg, function() {
75                 expect(1);
77                 var $table = tableCreate( header, data );
78                 //$('body').append($table);
80                 // Give caller a chance to set up sorting and manipulate the table.
81                 callback( $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 );
87         });
90 var reversed = function(arr) {
91         var arr2 = arr.slice(0);
92         arr2.reverse();
93         return arr2;
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'];
105 // Initial data set
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];
110 tableTest(
111         'Basic planet table: ascending by name',
112         header,
113         planets,
114         ascendingName,
115         function( $table ) {
116                 $table.tablesorter();
117                 $table.find('.headerSort:eq(0)').click();
118         }
120 tableTest(
121         'Basic planet table: ascending by name a second time',
122         header,
123         planets,
124         ascendingName,
125         function( $table ) {
126                 $table.tablesorter();
127                 $table.find('.headerSort:eq(0)').click();
128         }
130 tableTest(
131         'Basic planet table: descending by name',
132         header,
133         planets,
134         reversed(ascendingName),
135         function( $table ) {
136                 $table.tablesorter();
137                 $table.find('.headerSort:eq(0)').click().click();
138         }
140 tableTest(
141         'Basic planet table: ascending radius',
142         header,
143         planets,
144         ascendingRadius,
145         function( $table ) {
146                 $table.tablesorter();
147                 $table.find('.headerSort:eq(1)').click();
148         }
150 tableTest(
151         'Basic planet table: descending radius',
152         header,
153         planets,
154         reversed(ascendingRadius),
155         function( $table ) {
156                 $table.tablesorter();
157                 $table.find('.headerSort:eq(1)').click().click();
158         }
162 // Regression tests!
163 tableTest(
164         'Bug 28775: German-style short numeric dates',
165         ['Date'],
166         [
167                 // German-style dates are day-month-year
168                 ['11.11.2011'],
169                 ['01.11.2011'],
170                 ['02.10.2011'],
171                 ['03.08.2011'],
172                 ['09.11.2011']
173         ],
174         [
175                 // Sorted by ascending date
176                 ['03.08.2011'],
177                 ['02.10.2011'],
178                 ['01.11.2011'],
179                 ['09.11.2011'],
180                 ['11.11.2011']
181         ],
182         function( $table ) {
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();
187         }
189 tableTest(
190         'Bug 28775: American-style short numeric dates',
191         ['Date'],
192         [
193                 // American-style dates are month-day-year
194                 ['11.11.2011'],
195                 ['01.11.2011'],
196                 ['02.10.2011'],
197                 ['03.08.2011'],
198                 ['09.11.2011']
199         ],
200         [
201                 // Sorted by ascending date
202                 ['01.11.2011'],
203                 ['02.10.2011'],
204                 ['03.08.2011'],
205                 ['09.11.2011'],
206                 ['11.11.2011']
207         ],
208         function( $table ) {
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();
213         }
216 var ipv4 = [
217         // Some randomly generated fake IPs
218         ['45.238.27.109'],
219         ['44.172.9.22'],
220         ['247.240.82.209'],
221         ['204.204.132.158'],
222         ['170.38.91.162'],
223         ['197.219.164.9'],
224         ['45.68.154.72'],
225         ['182.195.149.80']
227 var ipv4Sorted = [
228         // Sort order should go octet by octet
229         ['44.172.9.22'],
230         ['45.68.154.72'],
231         ['45.238.27.109'],
232         ['170.38.91.162'],
233         ['182.195.149.80'],
234         ['197.219.164.9'],
235         ['204.204.132.158'],
236         ['247.240.82.209']
238 tableTest(
239         'Bug 17141: IPv4 address sorting',
240         ['IP'],
241         ipv4,
242         ipv4Sorted,
243         function( $table ) {
244                 $table.tablesorter();
245                 $table.find('.headerSort:eq(0)').click();
246         }
248 tableTest(
249         'Bug 17141: IPv4 address sorting (reverse)',
250         ['IP'],
251         ipv4,
252         reversed(ipv4Sorted),
253         function( $table ) {
254                 $table.tablesorter();
255                 $table.find('.headerSort:eq(0)').click().click();
256         }
259 var umlautWords = [
260         // Some words with Umlauts
261         ['Günther'],
262         ['Peter'],
263         ['Björn'],
264         ['Bjorn'],
265         ['Apfel'],
266         ['Äpfel'],
267         ['Strasse'],
268         ['Sträßschen']
271 var umlautWordsSorted = [
272         // Some words with Umlauts
273         ['Äpfel'],
274         ['Apfel'],
275         ['Björn'],
276         ['Bjorn'],
277         ['Günther'],
278         ['Peter'],
279         ['Sträßschen'],
280         ['Strasse']
283 tableTest(
284         'Accented Characters with custom collation',
285         ['Name'],
286         umlautWords,
287         umlautWordsSorted,
288         function( $table ) {
289                 mw.config.set('tableSorterCollation', {'ä':'ae', 'ö' : 'oe', 'ß': 'ss', 'ü':'ue'});
290                 $table.tablesorter();
291                 $table.find('.headerSort:eq(0)').click();
292                 mw.config.set('tableSorterCollation', {});
293         }
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']];
299 tableTest(
300         'Basic planet table: Same value for multiple rows via rowspan',
301         header,
302         planets,
303         planetsRowspan,
304         function( $table ) {
305                 //Quick&Dirty mod
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();
310         }
312 tableTest(
313         'Basic planet table: Same value for multiple rows via rowspan II',
314         header,
315         planets,
316         planetsRowspanII,
317         function( $table ) {
318                 //Quick&Dirty mod
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();
323         }
326 var complexMDYDates = [
327         // Some words with Umlauts
328         ['January, 19 2010'],
329         ['April 21 1991'],
330         ['04 22 1991'],
331         ['5.12.1990'],
332         ['December 12 \'10']
335 var complexMDYSorted = [
336         ["5.12.1990"],
337         ["April 21 1991"],
338         ["04 22 1991"],
339         ["January, 19 2010"],
340         ["December 12 '10"]
343 tableTest(
344         'Complex date parsing I',
345         ['date'],
346         complexMDYDates,
347         complexMDYSorted,
348         function( $table ) {
349                 mw.config.set('wgDefaultDateFormat', window.wgDefaultDateFormat = 'mdy');
350                 $table.tablesorter();
351                 $table.find('.headerSort:eq(0)').click();
352         }
355 var ascendingNameLegacy = ascendingName.slice(0);
356 ascendingNameLegacy[4] = ascendingNameLegacy[5];
357 ascendingNameLegacy.pop();
359 tableTest(
360         'Legacy compat with .sortbottom',
361         header,
362         planets,
363         ascendingNameLegacy,
364         function( $table ) {
365                 $table.find('tr:last').addClass('sortbottom');
366                 $table.tablesorter();
367                 $table.find('.headerSort:eq(0)').click();
368         }
371 })();