diff options
Diffstat (limited to 'tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js')
-rw-r--r-- | tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js | 223 |
1 files changed, 223 insertions, 0 deletions
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 00000000..97a3ae12 --- /dev/null +++ b/tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js @@ -0,0 +1,223 @@ +( function ( $, mw ) { + /** + * This module tests the input/output capabilities of the parsers of tablesorter. + * It does not test actual sorting. + */ + + var text, ipv4, + simpleMDYDatesInMDY, simpleMDYDatesInDMY, oldMDYDates, complexMDYDates, clobberedDates, MYDates, YDates, + currencyData, transformedCurrencyData; + + QUnit.module( 'jquery.tablesorter.parsers', QUnit.newMwEnvironment( { + setup: function () { + this.liveMonths = mw.language.months; + mw.language.months = { + 'keys': { + 'names': ['january', 'february', 'march', 'april', 'may_long', 'june', + 'july', 'august', 'september', 'october', 'november', 'december'], + 'genitive': ['january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen', + 'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen', 'december-gen'], + 'abbrev': ['jan', 'feb', 'mar', 'apr', 'may', 'jun', + 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'] + }, + 'names': ['January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December'], + 'genitive': ['January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December'], + 'abbrev': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + }; + }, + teardown: function () { + mw.language.months = this.liveMonths; + }, + config: { + wgContentLanguage: 'en', + /* default date format of the content language */ + wgDefaultDateFormat: 'dmy', + /* These two are important for numeric interpretations */ + wgSeparatorTransformTable: ['', ''], + wgDigitTransformTable: ['', ''] + } + } ) ); + + /** + * 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] ); + } ); + + } ); + } + + 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 ); + + 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 ); + + 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 ); + + 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' + } ); + } ); + + 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 ); + + 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 ); + + 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 ); + + 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 ); + + 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 ); + + 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 ); + + 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: ['', ''] + } ); + } ); + + // TODO add numbers sorting tests for bug 8115 with a different language + +}( jQuery, mediaWiki ) ); |