2019-10-29 21:35:43 +00:00
/* global moment */
2019-10-24 11:41:25 +00:00
var
2020-03-19 18:43:51 +00:00
testUtils = require ( './testUtils.js' ) ,
2020-02-25 02:10:27 +00:00
parser = require ( 'ext.discussionTools.init' ) . parser ;
2019-10-24 11:41:25 +00:00
2020-03-19 18:43:51 +00:00
QUnit . module ( 'mw.dt.parser' , testUtils . newEnvironment ( ) ) ;
2019-10-24 11:41:25 +00:00
QUnit . test ( '#getTimestampRegexp' , function ( assert ) {
var i , cases ;
2020-03-19 18:43:51 +00:00
testUtils . overrideParserData ( require ( './data-en.json' ) ) ;
2019-10-24 11:41:25 +00:00
cases = [
{
format : 'H:i, j F Y' ,
2020-02-21 20:11:19 +00:00
expected : '(\\d{2}):(\\d{2}), (\\d{1,2}) (January|February|March|April|May|June|July|August|September|October|November|December) (\\d{4})[\\u200E\\u200F]? [\\u200E\\u200F]?\\((UTC)\\)' ,
2019-10-24 11:41:25 +00:00
message : '(en) Boring'
} ,
{
format : 'H:i، j xg Y' ,
2020-02-21 20:11:19 +00:00
expected : '(\\d{2}):(\\d{2})، (\\d{1,2}) (January|February|March|April|May|June|July|August|September|October|November|December) (\\d{4})[\\u200E\\u200F]? [\\u200E\\u200F]?\\((UTC)\\)' ,
2019-10-24 11:41:25 +00:00
message : '(ar) "xg" specifier'
} ,
{
format : 'H:i, j F xkY' ,
2020-02-21 20:11:19 +00:00
expected : '(\\d{2}):(\\d{2}), (\\d{1,2}) (January|February|March|April|May|June|July|August|September|October|November|December) (\\d{4})[\\u200E\\u200F]? [\\u200E\\u200F]?\\((UTC)\\)' ,
2019-10-24 11:41:25 +00:00
message : '(th) "xkY" specifier'
} ,
{
format : 'H"h"i"min" "de" j "de" F "de" Y' ,
2020-02-21 20:11:19 +00:00
expected : '(\\d{2})h(\\d{2})min de (\\d{1,2}) de (January|February|March|April|May|June|July|August|September|October|November|December) de (\\d{4})[\\u200E\\u200F]? [\\u200E\\u200F]?\\((UTC)\\)' ,
2019-10-24 11:41:25 +00:00
message : '(pt) Escaped text (quotes)'
} ,
{
format : 'H\\hi\\m\\i\\n \\d\\e j \\d\\e F \\d\\e Y' ,
2020-02-21 20:11:19 +00:00
expected : '(\\d{2})h(\\d{2})min de (\\d{1,2}) de (January|February|March|April|May|June|July|August|September|October|November|December) de (\\d{4})[\\u200E\\u200F]? [\\u200E\\u200F]?\\((UTC)\\)' ,
2019-10-24 11:41:25 +00:00
message : '(pt) Escaped text (backslashes)'
} ,
{
format : 'j F Y à H:i' ,
2020-02-21 20:11:19 +00:00
expected : '(\\d{1,2}) (January|February|March|April|May|June|July|August|September|October|November|December) (\\d{4}) à (\\d{2}):(\\d{2})[\\u200E\\u200F]? [\\u200E\\u200F]?\\((UTC)\\)' ,
2019-10-24 11:41:25 +00:00
message : '(fr) Unescaped text (non-ASCII)'
} ,
{
format : 'Y年n月j日 (D) H:i' ,
2020-02-21 20:11:19 +00:00
expected : '(\\d{4})年(\\d{1,2})月(\\d{1,2})日 \\((Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\) (\\d{2}):(\\d{2})[\\u200E\\u200F]? [\\u200E\\u200F]?\\((UTC)\\)' ,
2019-10-24 11:41:25 +00:00
message : '(ja) Unescaped regexp special characters'
}
] ;
for ( i = 0 ; i < cases . length ; i ++ ) {
assert . strictEqual (
parser . getTimestampRegexp ( cases [ i ] . format , '\\d' , { UTC : 'UTC' } ) ,
cases [ i ] . expected ,
cases [ i ] . message
) ;
}
} ) ;
2019-10-24 12:59:42 +00:00
2019-10-29 21:35:43 +00:00
QUnit . test ( '#getTimestampParser' , function ( assert ) {
var i , cases , expectedDate , tsParser ;
2020-03-19 18:43:51 +00:00
testUtils . overrideParserData ( require ( './data-en.json' ) ) ;
2019-10-29 21:35:43 +00:00
expectedDate = moment ( '2011-02-03T04:05:00+00:00' ) ;
cases = [
{
format : 'Y n j D H i' ,
data : [ null , '2011' , '2' , '3' , 'unused' , '04' , '05' , 'UTC' ] ,
message : 'Date is parsed'
} ,
{
format : 'xkY xg d "asdf" G i' ,
data : [ null , '2554' , 'February' , '03' , '4' , '05' , 'UTC' ] ,
message : 'Date is parsed'
} ,
{
format : 'H i n j Y' ,
data : [ null , '04' , '05' , '2' , '3' , '2011' , 'UTC' ] ,
message : 'Date is parsed'
}
] ;
for ( i = 0 ; i < cases . length ; i ++ ) {
tsParser = parser . getTimestampParser ( cases [ i ] . format , null , 'UTC' , { UTC : 'UTC' } ) ;
assert . ok (
tsParser ( cases [ i ] . data ) . isSame ( expectedDate ) ,
cases [ i ] . message
) ;
}
} ) ;
QUnit . test ( '#getTimestampParser (at DST change)' , function ( assert ) {
var i , cases , format , timezone , timezoneAbbrs , regexp , tsParser , date ;
2020-03-19 18:43:51 +00:00
testUtils . overrideParserData ( require ( './data-en.json' ) ) ;
2019-10-29 21:35:43 +00:00
format = 'H:i, j M Y' ;
timezone = 'Europe/Warsaw' ;
timezoneAbbrs = {
CET : 'CET' ,
CEST : 'CEST'
} ;
regexp = parser . getTimestampRegexp ( format , '\\d' , timezoneAbbrs ) ;
tsParser = parser . getTimestampParser ( format , null , timezone , timezoneAbbrs ) ;
cases = [
{
sample : '01:30, 28 Oct 2018 (CEST)' ,
expected : moment ( '2018-10-28T01:30:00+02:00' ) ,
expectedUtc : moment ( '2018-10-27T23:30:00Z' ) ,
message : 'Before DST change (not ambiguous)'
} ,
{
sample : '02:30, 28 Oct 2018 (CEST)' ,
expected : moment ( '2018-10-28T02:30:00+02:00' ) ,
expectedUtc : moment ( '2018-10-28T00:30:00Z' ) ,
message : 'Before DST change (ambiguous)'
} ,
// At 03:00, time goes back by 1 hour
{
sample : '02:30, 28 Oct 2018 (CET)' ,
expected : moment ( '2018-10-28T02:30:00+01:00' ) ,
expectedUtc : moment ( '2018-10-28T01:30:00Z' ) ,
message : 'After DST change (ambiguous)'
} ,
{
sample : '03:30, 28 Oct 2018 (CET)' ,
expected : moment ( '2018-10-28T03:30:00+01:00' ) ,
expectedUtc : moment ( '2018-10-28T02:30:00Z' ) ,
message : 'After DST change (not ambiguous)'
}
] ;
for ( i = 0 ; i < cases . length ; i ++ ) {
date = tsParser ( cases [ i ] . sample . match ( regexp ) ) ;
assert . ok (
date . isSame ( cases [ i ] . expected ) ,
cases [ i ] . message
) ;
assert . ok (
date . isSame ( cases [ i ] . expectedUtc ) ,
cases [ i ] . message
) ;
}
} ) ;
2020-03-04 20:25:35 +00:00
QUnit . test ( '#getComments/#groupThreads' , function ( assert ) {
2019-10-24 12:59:42 +00:00
var i , j , cases , comments , threads , fixture ;
cases = [
{
name : 'plwiki oldparser' ,
2020-02-21 19:56:52 +00:00
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/pl-big-oldparser/pl-big-oldparser.html' ) . render ( ) ,
expected : require ( './cases/pl-big-oldparser/pl-big-oldparser.json' ) ,
2019-10-24 12:59:42 +00:00
config : require ( './data/plwiki-config.json' ) ,
data : require ( './data/plwiki-data.json' )
} ,
{
name : 'plwiki parsoid' ,
2020-02-21 19:56:52 +00:00
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/pl-big-parsoid/pl-big-parsoid.html' ) . render ( ) ,
expected : require ( './cases/pl-big-parsoid/pl-big-parsoid.json' ) ,
2019-10-24 12:59:42 +00:00
config : require ( './data/plwiki-config.json' ) ,
data : require ( './data/plwiki-data.json' )
} ,
{
name : 'enwiki oldparser' ,
2020-02-21 19:56:52 +00:00
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/en-big-oldparser/en-big-oldparser.html' ) . render ( ) ,
expected : require ( './cases/en-big-oldparser/en-big-oldparser.json' ) ,
2019-10-24 12:59:42 +00:00
config : require ( './data/enwiki-config.json' ) ,
data : require ( './data/enwiki-data.json' )
} ,
{
name : 'enwiki parsoid' ,
2020-02-21 19:56:52 +00:00
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/en-big-parsoid/en-big-parsoid.html' ) . render ( ) ,
expected : require ( './cases/en-big-parsoid/en-big-parsoid.json' ) ,
2019-10-24 12:59:42 +00:00
config : require ( './data/enwiki-config.json' ) ,
data : require ( './data/enwiki-data.json' )
2020-01-28 23:35:26 +00:00
} ,
2020-04-02 21:39:18 +00:00
{
name : 'arwiki no-paragraph oldparser' ,
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/ar-no-paragraph-oldparser/ar-no-paragraph-oldparser.html' ) . render ( ) ,
expected : require ( './cases/ar-no-paragraph-oldparser/ar-no-paragraph-oldparser.json' ) ,
config : require ( './data/arwiki-config.json' ) ,
data : require ( './data/arwiki-data.json' )
} ,
{
name : 'arwiki no-paragraph parsoid' ,
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/ar-no-paragraph-parsoid/ar-no-paragraph-parsoid.html' ) . render ( ) ,
expected : require ( './cases/ar-no-paragraph-parsoid/ar-no-paragraph-parsoid.json' ) ,
config : require ( './data/arwiki-config.json' ) ,
data : require ( './data/arwiki-data.json' )
} ,
2020-01-28 23:35:26 +00:00
{
name : 'No heading' ,
2020-02-21 19:56:52 +00:00
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/no-heading/no-heading.html' ) . render ( ) ,
expected : require ( './cases/no-heading/no-heading.json' ) ,
2020-01-28 23:35:26 +00:00
config : require ( './data/enwiki-config.json' ) ,
data : require ( './data/enwiki-data.json' )
2020-02-21 20:11:19 +00:00
} ,
{
name : 'Manually added signature with LRM' ,
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/lrm-signature/lrm-signature.html' ) . render ( ) ,
expected : require ( './cases/lrm-signature/lrm-signature.json' ) ,
config : require ( './data/nlwiki-config.json' ) ,
data : require ( './data/nlwiki-data.json' )
2020-02-29 18:02:05 +00:00
} ,
{
name : 'Link using fallback 8-bit encoding (invalid UTF-8)' ,
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/fallback-encoding-link/fallback-encoding-link.html' ) . render ( ) ,
expected : require ( './cases/fallback-encoding-link/fallback-encoding-link.json' ) ,
config : require ( './data/huwiki-config.json' ) ,
data : require ( './data/huwiki-data.json' )
2019-10-24 12:59:42 +00:00
}
] ;
fixture = document . getElementById ( 'qunit-fixture' ) ;
for ( i = 0 ; i < cases . length ; i ++ ) {
$ ( fixture ) . empty ( ) . append ( cases [ i ] . dom ) ;
2020-03-19 18:43:51 +00:00
testUtils . overrideMwConfig ( cases [ i ] . config ) ;
testUtils . overrideParserData ( cases [ i ] . data ) ;
2019-10-24 12:59:42 +00:00
comments = parser . getComments ( fixture ) ;
threads = parser . groupThreads ( comments ) ;
for ( j = 0 ; j < threads . length ; j ++ ) {
2020-03-19 18:43:51 +00:00
testUtils . serializeComments ( threads [ j ] , fixture ) ;
2019-10-24 12:59:42 +00:00
assert . deepEqual (
JSON . parse ( JSON . stringify ( threads [ j ] ) ) ,
cases [ i ] . expected [ j ] ,
cases [ i ] . name + ' section ' + j
) ;
}
2019-11-24 16:28:01 +00:00
2020-03-04 20:25:35 +00:00
// Uncomment this to get updated content for the JSON files, for copy/paste:
2019-11-24 16:28:01 +00:00
// console.log( JSON.stringify( threads, null, 2 ) );
2019-10-24 12:59:42 +00:00
}
} ) ;
2020-03-04 20:25:35 +00:00
QUnit . test ( '#getTranscludedFrom' , function ( assert ) {
var i , j , cases , comments , transcludedFrom , fixture ;
cases = [
2020-03-19 17:37:19 +00:00
{
name : 'transclusions' ,
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/transclusions/transclusions.html' ) . render ( ) ,
expected : require ( './cases/transclusions/transclusions-transcludedFrom.json' ) ,
config : require ( './data/enwiki-config.json' ) ,
data : require ( './data/enwiki-data.json' )
} ,
2020-03-04 20:25:35 +00:00
{
name : 'enwiki parsoid' ,
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/en-big-parsoid/en-big-parsoid.html' ) . render ( ) ,
expected : require ( './cases/en-big-parsoid/en-big-parsoid-transcludedFrom.json' ) ,
config : require ( './data/enwiki-config.json' ) ,
data : require ( './data/enwiki-data.json' )
} ,
{
name : 'enwiki parsoid AFD' ,
dom : mw . template . get ( 'test.DiscussionTools' , 'cases/en-bigafd-parsoid/en-bigafd-parsoid.html' ) . render ( ) ,
expected : require ( './cases/en-bigafd-parsoid/en-bigafd-parsoid-transcludedFrom.json' ) ,
config : require ( './data/enwiki-config.json' ) ,
data : require ( './data/enwiki-data.json' )
}
] ;
fixture = document . getElementById ( 'qunit-fixture' ) ;
for ( i = 0 ; i < cases . length ; i ++ ) {
$ ( fixture ) . empty ( ) . append ( cases [ i ] . dom ) ;
2020-03-19 17:37:19 +00:00
mw . libs . ve . unwrapParsoidSections ( fixture ) ;
2020-03-19 18:43:51 +00:00
testUtils . overrideMwConfig ( cases [ i ] . config ) ;
testUtils . overrideParserData ( cases [ i ] . data ) ;
2020-03-04 20:25:35 +00:00
comments = parser . getComments ( fixture ) ;
parser . groupThreads ( comments ) ;
transcludedFrom = { } ;
for ( j = 0 ; j < comments . length ; j ++ ) {
if ( comments [ j ] . id ) {
transcludedFrom [ comments [ j ] . id ] = parser . getTranscludedFrom ( comments [ j ] ) ;
}
}
assert . deepEqual (
transcludedFrom ,
cases [ i ] . expected ,
cases [ i ] . name
) ;
// Uncomment this to get updated content for the JSON files, for copy/paste:
// console.log( JSON.stringify( transcludedFrom, null, 2 ) );
}
} ) ;