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