TheDJ has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/99407


Change subject: [WIP] tablesorter: testcases for the parsers
......................................................................

[WIP] tablesorter: testcases for the parsers

The sorting is dependent on how the values in the cells are recognized
and translated into sortkeys. We have a limited set of testcases on full
tables, but I wanted to get a better grip on what these parsers are
capable of and of their correctness on their output data.

Currently all tests are succeeding, because i want to start by getting a
grip on their 'current' implementation first.

Some bugs are already apparent:
 - number regex was broken
 - output of string values for numeric parser

Also some missing functionality
 - detecting years
 - ability to deal with postfixes (common due to references)

Change-Id: I2dc551c5905431e7d4e6d4373144092449bdcd4d
---
M resources/jquery/jquery.tablesorter.js
M tests/qunit/QUnitTestResources.php
A tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
3 files changed, 223 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/07/99407/1

diff --git a/resources/jquery/jquery.tablesorter.js 
b/resources/jquery/jquery.tablesorter.js
index b3d7bb3..d376cd7 100644
--- a/resources/jquery/jquery.tablesorter.js
+++ b/resources/jquery/jquery.tablesorter.js
@@ -460,11 +460,13 @@
 
                        // Construct regex for number identification
                        for ( var i = 0; i < ascii.length; i++ ) {
-                               ts.transformTable[localised[i]] = ascii[i];
-                               digits.push( $.escapeRE( localised[i] ) );
+                               if( ascii[i] != '' && localised[i] != '') {
+                                       ts.transformTable[localised[i]] = 
ascii[i];
+                                       digits.push( localised[i] );
+                               }
                        }
                }
-               var digitClass = '[' + digits.join( '', digits ) + ']';
+               var digitClass = '[' + $.escapeRE( digits.join( '', digits ) ) 
+ ']';
 
                // We allow a trailing percent sign, which we just strip. This 
works fine
                // if percents and regular numbers aren't being mixed.
@@ -935,6 +937,15 @@
 
                        clearTableBody: function ( table ) {
                                $( table.tBodies[0] ).empty();
+                       },
+
+                       getParser: function ( id ) {
+                               buildTransformTable();
+                               buildDateTable();
+                               cacheRegexs();
+                               buildCollationTable();
+
+                               return getParserById( id );
                        }
                };
 
diff --git a/tests/qunit/QUnitTestResources.php 
b/tests/qunit/QUnitTestResources.php
index 01fedc8..5dd3435 100644
--- a/tests/qunit/QUnitTestResources.php
+++ b/tests/qunit/QUnitTestResources.php
@@ -22,6 +22,7 @@
                        
'tests/qunit/suites/resources/jquery/jquery.placeholder.test.js',
                        
'tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js',
                        
'tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js',
+                       
'tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js',
                        
'tests/qunit/suites/resources/jquery/jquery.textSelection.test.js',
                        'tests/qunit/data/mediawiki.jqueryMsg.data.js',
                        
'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
diff --git 
a/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js 
b/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
new file mode 100644
index 0000000..ef495ef
--- /dev/null
+++ b/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
@@ -0,0 +1,208 @@
+( function ( $, mw ) {
+       /*jshint onevar: false */
+
+       /**
+        * This module tests the input/output capabilities of the parsers of 
tablesorter.
+        * It does not test actual sorting.
+        */
+
+       var config = {
+               wgContentLanguage: 'en',
+               /* default date format of the content language */
+               wgDefaultDateFormat: 'dmy',
+               /* These two are important for numeric interpretations */
+               wgSeparatorTransformTable: ['', ''],
+               wgDigitTransformTable: ['', '']
+       };
+
+       QUnit.module( 'jquery.tablesorter.parsers', QUnit.newMwEnvironment( { 
config: config } ) );
+
+       /**
+        * For a value, check if the parser recognizes it and how it transforms 
it
+        *
+        * @param {String} msg text to pass on to qunit describing the test case
+        * @param {String[]} parserId of the parser that will be tested
+        * @param {String[][]} data Array of testcases. Each testcase, array of
+        *              inputValue: The string value that we want to test the 
parser for
+        *              recognized: If we expect that this value's type is 
detectable by the parser
+        *              outputValue: The value the parser has converted the 
input to
+        *              msg: describing the testcase
+        * @param {function($table)} callback something to do before we start 
the testcase
+        */
+       function parserTest( msg, parserId, data, callback ) {
+               QUnit.test( msg, data.length * 2, function( assert ) {
+                       var extractedR, extractedF, parser;
+
+                       if (callback !== undefined ) {
+                               callback();
+                       }
+
+                       parser = $.tablesorter.getParser( parserId );
+                       $.each( data, function( index, testcase ) {
+                               extractedR = parser.is( testcase[0] );
+                               extractedF = parser.format( testcase[0] );
+
+                               assert.strictEqual( extractedR, testcase[1], 
"Detect: " + testcase[3] );
+                               assert.strictEqual( extractedF, testcase[2], 
"Sortkey: " + testcase[3] );
+                       } );
+
+               } );
+       }
+
+       var text  = [
+               [ "Mars", true, "mars", "Simple text" ],
+               [ "Mẘas", true, "mẘas", "Non ascii character" ],
+               [ "A sentence", true, "a sentence", "A sentence with space 
chars" ]
+       ];
+
+       parserTest( "Textual keys", "text", text );
+
+       var ipv4 = [
+               // Some randomly generated fake IPs
+               ['0.0.0.0', true, 0, "An IP address" ],
+               ['255.255.255.255', true, 255255255255, "An IP address" ],
+               ['45.238.27.109', true, 45238027109, "An IP address" ],
+               ['1.238.27.1', true, 1238027001, "An IP address with small 
numbers" ],
+               ['238.27.1', false, 238027001, "A malformed IP Address" ],
+               ['1', false, 1, "A super malformed IP Address" ],
+               ['Just text', false, 0, "A line with just text" ],
+               ['45.238.27.109Postfix', false, 45238027109, "An IP address 
with a connected postfix" ],
+               ['45.238.27.109 postfix', false, 45238027109, "An IP address 
with a seperated postfix" ],
+       ];
+
+       parserTest( "IPv4", "IPAddress", ipv4 );
+
+       var simpleMDYDatesInMDY = [
+               ['January 17, 2010',    true, 20100117, "Long middle endian 
date"],
+               ['Jan 17, 2010',        true, 20100117, "Short middle endian 
date"],
+               ['1/17/2010',           true, 20100117, "Numeric middle endian 
date"],
+               ['01/17/2010',          true, 20100117, "Numeric middle endian 
date with padding on month"],
+               ['01/07/2010',          true, 20100107, "Numeric middle endian 
date with padding on day"],
+               ['01/07/0010',          true, 20100107, "Numeric middle endian 
date with padding on year"],
+               ['5.12.1990',           true, 19900512, "Numeric middle endian 
date with . separator"]
+       ];
+       parserTest( "MDY Dates using mdy content language", "date", 
simpleMDYDatesInMDY );
+       var simpleMDYDatesInDMY = [
+               ['January 17, 2010',    true, 20100117, "Long middle endian 
date"],
+               ['Jan 17, 2010',        true, 20100117, "Short middle endian 
date"],
+               ['1/17/2010',           true, 20101701, "Numeric middle endian 
date"],
+               ['01/17/2010',          true, 20101701, "Numeric middle endian 
date with padding on month"],
+               ['01/07/2010',          true, 20100701, "Numeric middle endian 
date with padding on day"],
+               ['01/07/0010',          true, 20100701, "Numeric middle endian 
date with padding on year"],
+               ['5.12.1990',           true, 19901205, "Numeric middle endian 
date with . separator"]
+       ];
+       parserTest( "MDY Dates using dmy content language", "date", 
simpleMDYDatesInDMY, function () {
+               mw.config.set( {
+                       'wgDefaultDateFormat': 'dmy',
+                       'wgContentLanguage': 'de'
+               } );
+       } );
+
+       var oldMDYDates = [
+               ['January 19, 1400 BC',         false, "99999999", "BC"],
+               ['January 19, 1400BC',          false, "99999999", "Connected 
BC"],
+               ['January, 19 1400 B.C.',       false, "99999999", "B.C."],
+               ['January 19, 1400 AD',         false, "99999999", "AD"],
+               ['January, 19 10',              true, 20100119, "AD"],
+               ['January, 19 1',               false, "99999999", "AD"]
+       ];
+       parserTest( "Very old MDY dates", "date", oldMDYDates );
+
+       var complexMDYDates = [
+               ['January, 19 2010',    true, 20100119, "Comma after month"],
+               ['January 19, 2010',    true, 20100119, "Comma after day"],
+               ['January/19/2010',     true, 20100119, "Forward slash 
separator"],
+               ['04 22 1991',          true, 19910422, "Month with 0 padding"],
+               ['April 21 1991',       true, 19910421, "Space separation"],
+               ['04 22 1991',          true, 19910422, "Month with 0 padding"],
+               ['December 12 \'10',    true, 20101212, ""],
+               ['Dec 12 \'10',         true, 20101212, ""],
+               ['Dec. 12 \'10',        true, 20101212, ""]
+       ];
+       parserTest( "MDY Dates", "date", complexMDYDates );
+
+       var clobberedDates = [
+               ['January, 19 2010 - January, 20 2010', false, "99999999", 
"Date range with hyphen"],
+               ['January, 19 2010 — January, 20 2010', false, "99999999", 
"Date range with mdash"],
+               ['prefixJanuary, 19 2010',      false, "99999999", "Connected 
prefix"],
+               ['prefix January, 19 2010',     false, "99999999", "Prefix"],
+               ['December 12 2010postfix',     false, "99999999", 
"ConnectedPostfix"],
+               ['December 12 2010 postfix',    false, "99999999", "Postfix"],
+               ['A simple text',               false, "99999999", "Plain text 
in date sort"],
+               ['04l22l1991',                  false, "99999999", "l char as 
separator"],
+               ['January\\19\\2010',           false, "99999999", "backslash 
as date separator"]
+       ];
+       parserTest( "Clobbered Dates", "date", clobberedDates );
+
+       var MYDates = [
+               ['December 2010',       false, "99999999", "Plain month year"],
+               ['Dec 2010',            false, "99999999", "Abreviated month 
year"],
+               ['12 2010',             false, "99999999", "Numeric month year"]
+       ];
+       parserTest( "MY Dates", "date", MYDates );
+
+       var YDates = [
+               ['2010',        false, "99999999", "Plain 4-digit year"],
+               ['876',         false, "99999999", "3-digit year"],
+               ['76',          false, "99999999", "2-digit year"],
+               ['\'76',        false, "99999999", "2-digit millenium bug 
year"],
+               ['2010 BC',     false, "99999999", "4-digit year BC"]
+       ];
+       parserTest( "Y Dates", "date", YDates );
+
+       var currencyData = [
+               ['1.02 $',      true, 1.02, ""],
+               ['$ 3.00',      true, 3, ""],
+               ['€ 2,99',      true, 299, ""],
+               ['$ 1.00',      true, 1, ""],
+               ['$3.50',       true, 3.50, ""],
+               ['$ 1.50',      true, 1.50, ""],
+               ['€ 0.99',      true, 0.99, ""],
+               ['$ 299.99',    true, 299.99, ""],
+               ['$ 2,299.99',  true, 2299.99, ""],
+               ['$ 2,989',     true, 2989, ""],
+               ['$ 2 299.99',  true, 2299.99, ""],
+               ['$ 2 989',     true, 2989, ""],
+               ['$ 2.989',     true, 2.989, ""]
+       ];
+       parserTest( "Currency", "currency", currencyData );
+
+       var transformedCurrencyData = [
+               ['1.02 $',      true, 102, ""],
+               ['$ 3.00',      true, 300, ""],
+               ['€ 2,99',      true, 2.99, ""],
+               ['$ 1.00',      true, 100, ""],
+               ['$3.50',       true, 350, ""],
+               ['$ 1.50',      true, 150, ""],
+               ['€ 0.99',      true, 99, ""],
+               ['$ 299.99',    true, 29999, ""],
+               ['$ 2\'299,99', true, 2299.99, ""],
+               ['$ 2,989',     true, 2.989, ""],
+               ['$ 2 299.99',  true, 229999, ""],
+               ['2 989 $',     true, 2989, ""],
+               ['299.99 $',    true, 29999, ""],
+               ['2\'299,99 $', true, 2299.99, ""],
+               ['2,989 $',     true, 2.989, ""],
+               ['2 299.99 $',  true, 229999, ""],
+               ['2 989 $',     true, 2989, ""]
+       ];
+       parserTest( 'Currency with european separators', 'currency', 
transformedCurrencyData, function () {
+               mw.config.set( {
+                       // We expect 22'234.444,22
+                       // Map from ascii separators => localized separators
+                       wgSeparatorTransformTable: [',  .       ,', '\' ,       
.'],
+                       wgDigitTransformTable: ['', '']
+               } );
+       } );
+
+       var numbers = [
+               [ '12'    ],
+               [  '7'    ],
+               [ '13,000'],
+               [  '9'    ],
+               [ '14'    ],
+               [  '8.0'  ]
+       ];
+       // TODO add numbers sorting tests for bug 8115 with a different language
+
+}( jQuery, mediaWiki ) );

-- 
To view, visit https://gerrit.wikimedia.org/r/99407
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2dc551c5905431e7d4e6d4373144092449bdcd4d
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: TheDJ <hartman.w...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to