local p = require('Module:UnitTests')
function p:test_parseDate() -- Must begin with 'test'
self:preprocess_equals_many('{{#invoke:Infobox date field metadata|parseDateOutputRaw|', '|noUnstrip=yes}}', {
--Y
{ '2013', '2013' },
{ '2113', '2113' },
{ '1913', '1913' },
{ '1113', 'Invalid date/time' },
{ '322', 'Unrecognized pattern' },
{ '96', 'Unrecognized pattern' },
{ '1913 BC', 'Unrecognized pattern' },
--My
{ 'June 2013', '2013-06' },
{ '2013 June', '2013-06' },
{ '2013, June', '2013-06' },
{ 'August 2013', '2013-08' },
{ 'August, 2013', '2013-08' },
{ 'May 2013', '2013-05' },
{ 'Jan 2013', '2013-01' },
{ 'Dec 2013', '2013-12' },
{ 'Dec. 2013', '2013-12' },
{ 'December, 2013', '2013-12' },
{ 'June 1013', 'Invalid date/time' },
{ 'June 2113', '2113-06' },
{ 'Plucktober 2013', 'Unrecognized pattern' },
{ 'June 196', 'Unrecognized pattern' },
{ 'June 96', 'Invalid date/time' }, -- this will try to match d M, like '15 June' but fail when checking validity
{ '96 June', 'Invalid date/time' }, -- ditto
--dMy
{ '3 May 2013', '2013-05-03' },
{ '27 August 2013', '2013-08-27' },
{ '30 November 2013', '2013-11-30' },
{ '32 June 2013', 'Invalid date/time' },
{ '31 June 2013', 'Invalid date/time' },
{ '30 June 2013', '2013-06-30' },
{ '28 February 2013', '2013-02-28' },
{ '29 February 2013', 'Invalid date/time' },
{ '29 February 2012', '2012-02-29' },
{ '29 February 2000', '2000-02-29' },
{ '29 February 1900', 'Invalid date/time' },
{ '12 June 3013', '3013-06-12' },
{ '12 June 1213', 'Invalid date/time' },
{ '12 Blobember 2013', 'Unrecognized pattern' },
{ '12 Dec 2013', '2013-12-12' },
{ '12 Dec. 2013', '2013-12-12' },
{ '12 June 96', 'Unrecognized pattern' },
{ '3 May, 2013', '2013-05-03' },
{ '3rd May 2013', '2013-05-03' },
{ '3rd May, 2013', '2013-05-03' },
--Mdy
{ 'May 3, 2013', '2013-05-03' },
{ 'August 27, 2013', '2013-08-27' },
{ 'November 30, 2013', '2013-11-30' },
{ 'Nov. 30, 2013', '2013-11-30' },
{ 'June 32, 2013', 'Invalid date/time' },
{ 'June 31, 2013', 'Invalid date/time' },
{ 'June 30, 2013', '2013-06-30' },
{ 'February 28, 2013', '2013-02-28' },
{ 'February 29, 2013', 'Invalid date/time' },
{ 'February 29, 2012', '2012-02-29' },
{ 'February 29, 2000', '2000-02-29' },
{ 'February 29, 1900', 'Invalid date/time' },
{ 'June 12, 3013', '3013-06-12' },
{ 'June 12, 1213', 'Invalid date/time' },
{ 'Blobember 12, 2013', 'Unrecognized pattern' },
{ 'June 12, 96', 'Unrecognized pattern' },
{ 'May 3 2013', '2013-05-03' },
{ 'May 3, 2013', '2013-05-03' },
{ 'May 3rd 2013', '2013-05-03' },
{ 'May 3rd, 2013', '2013-05-03' },
{ '2013 May 3', '2013-05-03' },
{ '2013, May 3', '2013-05-03' },
{ '2013 3 May', '2013-05-03' },
{ '2013, 3 May', '2013-05-03' },
--ymd
{ '2013-05-03', '2013-05-03' },
{ '2013-08-27', '2013-08-27' },
{ '2013-11-27', '2013-11-27' },
{ '2013-06-32', 'Invalid date/time' },
{ '2013-06-31', 'Invalid date/time' },
{ '2013-06-30', '2013-06-30' },
{ '2013-02-28', '2013-02-28' },
{ '2013-02-29', 'Invalid date/time' },
{ '2012-02-29', '2012-02-29' },
{ '2000-02-29', '2000-02-29' },
{ '1900-02-29', 'Invalid date/time' },
{ '3013-06-12', '3013-06-12' },
{ '1413-06-12', 'Invalid date/time' },
{ '2013-14-12', 'Invalid date/time' },
{ '2013-00-12', 'Invalid date/time' },
{ '2003-11', 'Unrecognized pattern' }, -- for now (ambiguous case)
{ '2003-13', 'Unrecognized pattern' }, -- for now
{ '2013-05', 'Unrecognized pattern' }, -- for now
{ '2013-13', 'Unrecognized pattern' }, -- for now
{ '1999-11', 'Unrecognized pattern' }, -- for now
{ '1906-08', 'Unrecognized pattern' }, -- for now
-- hms
{ '10:38:27', '10:38:27'},
{ '10:38:87', 'Invalid date/time'},
{ '10:62:27', 'Invalid date/time'},
{ '25:38:27', 'Invalid date/time'},
{ '10:38:27 am', '10:38:27'},
{ '10:38:27 pm', '22:38:27'},
{ '10:38', '10:38'},
{ '10:38 am', '10:38'},
{ '10:38 pm', '22:38'},
{ '10 am', '10'},
{ '10', 'Unrecognized pattern'},
{ '10 pm', '22'},
-- dMy hms
{ '1 May 1973, 10:38:27', '1973-05-01 10:38:27'},
{ '1 May 1973, 8:38:27', '1973-05-01 08:38:27'},
{ '1 May 1973, 10:38:87', 'Invalid date/time'},
{ '1 May 1973, 10:62:27', 'Invalid date/time'},
{ '1 May 1973, 25:38:27', 'Invalid date/time'},
-- Mdy hms
{ 'May 1, 1973, 10:38:27', '1973-05-01 10:38:27'},
-- ymd hms
{ '1973-05-01, 10:38:27', '1973-05-01 10:38:27'},
-- hms dMy
{ '10:38:27, 1 May 1973', '1973-05-01 10:38:27'},
-- hms Mdy
{ '10:38:27, May 1, 1973', '1973-05-01 10:38:27'},
-- hms ymd
{ '10:38:27, 1973-05-01', '1973-05-01 10:38:27'},
-- no commas
{ '10:38:27 May 1 1973', '1973-05-01 10:38:27'},
-- dMy hms
{ '1 May 1973, 10:38:27am', '1973-05-01 10:38:27'},
-- Mdy hms
{ 'May 1, 1973, 10:38:27am', '1973-05-01 10:38:27'},
-- ymd hms
{ '1973-05-01, 10:38:27 am', '1973-05-01 10:38:27'},
-- hms dMy
{ '10:38:27 am, 1 May 1973', '1973-05-01 10:38:27'},
-- hms Mdy
{ '10:38:27am, May 1, 1973', '1973-05-01 10:38:27'},
-- hms ymd
{ '10:38:27 am, 1973-05-01', '1973-05-01 10:38:27'},
-- dMy hms
{ '1 May 1973, 10:38:27 pm', '1973-05-01 22:38:27'},
-- Mdy hms
{ 'May 1, 1973, 10:38:27 pm', '1973-05-01 22:38:27'},
-- ymd hms
{ '1973-05-01, 10:38:27pm', '1973-05-01 22:38:27'},
-- hms dMy
{ '10:38:27pm, 1 May 1973', '1973-05-01 22:38:27'},
-- hms Mdy
{ '10:38:27 pm, May 1, 1973', '1973-05-01 22:38:27'},
-- hms ymd
{ '10:38:27pm, 1973-05-01', '1973-05-01 22:38:27'},
-- dMy hm
{ '1 May 1973, 10:38', '1973-05-01 10:38'},
-- Mdy hm
{ 'May 1, 1973, 10:38', '1973-05-01 10:38'},
-- ymd hm
{ '1973-05-01, 10:38', '1973-05-01 10:38'},
-- hm dMy
{ '10:38, 1 May 1973', '1973-05-01 10:38'},
-- hm Mdy
{ '10:38, May 1, 1973', '1973-05-01 10:38'},
-- hm ymd
{ '10:38, 1973-05-01', '1973-05-01 10:38'},
-- dMy hmp
{ '1 May 1973, 10:38 am', '1973-05-01 10:38'},
-- Mdy hmp
{ 'May 1, 1973, 10:38am', '1973-05-01 10:38'},
-- ymd hmp
{ '1973-05-01, 10:38am', '1973-05-01 10:38'},
-- hmp dMy
{ '10:38 am, 1 May 1973', '1973-05-01 10:38'},
-- hmp Mdy
{ '10:38am, May 1, 1973', '1973-05-01 10:38'},
-- hmp ymd
{ '10:38am, 1973-05-01', '1973-05-01 10:38'},
-- dMy hmp
{ '1 May 1973, 10:38pm', '1973-05-01 22:38'},
-- Mdy hmp
{ 'May 1, 1973, 10:38 pm', '1973-05-01 22:38'},
-- ymd hmp
{ '1973-05-01, 10:38 pm', '1973-05-01 22:38'},
-- hmp dMy
{ '10:38pm, 1 May 1973', '1973-05-01 22:38'},
-- hmp Mdy
{ '10:38 pm, May 1, 1973', '1973-05-01 22:38'},
-- hmp ymd
{ '10:38 pm, 1973-05-01', '1973-05-01 22:38'},
-- dMy hp
{ '1 May 1973, 10 am', '1973-05-01 10'},
-- Mdy hp
{ 'May 1, 1973, 10am', '1973-05-01 10'},
-- ymd hp
{ '1973-05-01, 10am', '1973-05-01 10'},
-- hp dMy
{ '10 am, 1 May 1973', '1973-05-01 10'},
-- hp Mdy
{ '10am, May 1, 1973', '1973-05-01 10'},
-- hp ymd
{ '10am, 1973-05-01', '1973-05-01 10'},
-- dMy hp
{ '1 May 1973, 10pm', '1973-05-01 22'},
-- Mdy hp
{ 'May 1, 1973, 10 pm', '1973-05-01 22'},
-- ymd hp
{ '1973-05-01, 10 pm', '1973-05-01 22'},
-- hp dMy
{ '10pm, 1 May 1973', '1973-05-01 22'},
-- hp Mdy
{ '10 pm, May 1, 1973', '1973-05-01 22'},
-- hp ymd
{ '10 pm, 1973-05-01', '1973-05-01 22'},
-- invalid
{ 'This is not a date', 'Unrecognized pattern' },
{ '2004 was a nice year', 'Unrecognized pattern' },
{ 'Somewhere around 2004', 'Unrecognized pattern' },
{ '2004 <!--comment-->', 'Unrecognized pattern' },
{ '1 May 1733 (Russian)', 'Unrecognized pattern' },
{ '1 May 1933 (uncertain)', 'Unrecognized pattern' },
{ '1 May 1733 (old style)', 'Unrecognized pattern' },
{ '1 May 1973 (but later cancelled)', 'Unrecognized pattern' },
{ '1 May 1973 (UK), 4 June 1973 (USA)', 'Unrecognized pattern' },
-- date ranges
{ '3 May 2013 - 12 February 2014', '2013-05-03; 2014-02-12' },
{ 'May 3, 2013 - February 12, 2014', '2013-05-03; 2014-02-12' },
{ '3 May - 12 October 2013', '2013-05-03; 2013-10-12' },
{ 'May 3 - October 12, 2013', '2013-05-03; 2013-10-12' },
{ '3 - 12 May 2013', '2013-05-03; 2013-05-12' },
{ 'May 3 - 12, 2013', '2013-05-03; 2013-05-12' },
{ 'May - June 2013', '2013-05; 2013-06' },
{ 'May 2013 - February 2014', '2013-05; 2014-02' },
{ '2013 - 2014', '2013; 2014' },
{ 'May 3 2013 - February 12 2014', '2013-05-03; 2014-02-12' },
{ 'May 3 - October 12 2013', '2013-05-03; 2013-10-12' },
{ 'May 3 - 12 2013', '2013-05-03; 2013-05-12' },
{ '3rd May 2013 - 12th February 2014', '2013-05-03; 2014-02-12' },
{ 'May 3rd, 2013 - February 12th, 2014', '2013-05-03; 2014-02-12' },
{ '3rd May - 12th October 2013', '2013-05-03; 2013-10-12' },
{ 'May 3rd - October 12th, 2013', '2013-05-03; 2013-10-12' },
{ '3rd - 12th May 2013', '2013-05-03; 2013-05-12' },
{ 'May 3rd - 12th, 2013', '2013-05-03; 2013-05-12' },
-- variations in dates
{ '3 May 2013 - 3 May 2013', '2013-05-03; 2013-05-03' }, -- ?? well, they are inclusive, so
{ '3 May 2013 - 2 May 2013', 'Invalid date range' },
{ '3 May 2013 - 4 March 2013', 'Invalid date range' },
{ '3 May 2013 - 4 May 2012', 'Invalid date range' },
{ '3 May - 3 May 2013', '2013-05-03; 2013-05-03' },
{ '3 May - 2 May 2013', 'Invalid date range' },
{ '3 May - 4 March 2013', 'Invalid date range' },
{ '3 May - 4 May 2012', '2012-05-03; 2012-05-04' },
{ '3 May - 3 May 2012', '2012-05-03; 2012-05-03' },
{ '3 - 2 May 2013', 'Invalid date range' },
{ 'May - April 2013', 'Invalid date range' },
{ '2013 - 2012', 'Invalid date range' },
-- dashes and date sep test
{ '3 May 2013 – 12 February 2014', '2013-05-03; 2014-02-12' },
{ '3 May 2013 – 12 February 2014', '2013-05-03; 2014-02-12' },
{ '3 May 2013 — 12 February 2014', '2013-05-03; 2014-02-12' },
{ '3 May 2013-12 February 2014', '2013-05-03; 2014-02-12' },
{ 'May 3 2013-February 12 2014', '2013-05-03; 2014-02-12' },
{ 'May 2013-February 2014', '2013-05; 2014-02' },
{ '2013-2014', '2013; 2014' },
{ '3 May 2013 – 12 February 2014', '2013-05-03; 2014-02-12' },
{ '3 May 2013 – 12 February 2014', '2013-05-03; 2014-02-12' },
{ '3 May 2013 – 12 February 2014', '2013-05-03; 2014-02-12' },
{ '3 May 2013 – 12 February 2014', '2013-05-03; 2014-02-12' },
-- missing parts
{ '3 May', 'Incomplete date' },
{ 'May 3', 'Incomplete date' },
{ 'February 29', 'Incomplete date' }, -- can't check if 29 is valid
{ 'May', 'Incomplete date' },
{ 'October', 'Incomplete date' },
--[[ -- these are kinda hypothetical and not used real-world
-- missing parts ranges dmY
{ '3 May 2013 - April 2014', 'Incomplete date range' },
{ '3 May 2013 - 2014', 'Incomplete date range' },
{ 'May 2013 - 5 April 2014', 'Incomplete date range' },
{ 'May 2013 - 2014', 'Incomplete date range' },
{ '2013 - 5 April 2014', 'Incomplete date range' },
{ '2013 - April 2014', 'Incomplete date range' },
-- missing parts ranges Mdy
{ 'May 3, 2013 - April 2014', 'Incomplete date range' },
{ 'May 3, 2013 - 2014', 'Incomplete date range' },
{ 'May 2013 - April 5, 2014', 'Incomplete date range' },
{ '2013 - April 5, 2014', 'Incomplete date range' },
]]
-- missing parts in ranges (actual real world use)
{ '3 - 26 May', 'Incomplete date range' },
{ 'May 3 - 26', 'Incomplete date range' },
{ '3 May - 5 April', 'Incomplete date range' },
{ 'May 3 - April 5', 'Incomplete date range' },
{ 'February 29 - April 5', 'Incomplete date range' }, -- can't check if 29 is valid
{ 'March 3 - February 29', 'Incomplete date range' },
-- empty
{ '', 'Empty input' },
{ ' ', 'Empty input' },
--{ '{{Start date|2012|12|10}}', 'Has metadata template' },
--{ '{{Enddate|2013|12|10}}', 'Has metadata template' },
--[[
{ '3 May 2013 - 5 April 2014', '2013-05-03; 2014-04-05' },
{ '3 May 2013 - April 2014', '' },
{ '3 May 2013 - 2014', '' },
{ 'May 2013 - 5 April 2014', '' },
{ 'May 2013 - 2014', '' },
{ '2013 - 5 April 2014', '' },
{ '2013 - April 2014', '' },
--]]
})
end
function p:test_emitMetadata() -- Must begin with 'test'
self:preprocess_equals_many('{{#invoke:Infobox date field metadata|emitMetadata|', '|dtstart=yes|dtend=yes|noTrackingCat=yes}}', {
-- different styles
{ '3 May 2013', '<span style="display:none"> (<span class="dtstart">2013-05-03</span>)</span>' },
{ 'May 3, 2013', '<span style="display:none"> (<span class="dtstart">2013-05-03</span>)</span>' },
{ 'May 2013', '<span style="display:none"> (<span class="dtstart">2013-05</span>)</span>' },
{ '2013', '<span style="display:none"> (<span class="dtstart">2013</span>)</span>' },
{ '12:15:04, May 3, 2013', '<span style="display:none"> (<span class="dtstart">2013-05-03T12:15:04</span>)</span>' },
{ 'May 3, 2013, 12:15:04', '<span style="display:none"> (<span class="dtstart">2013-05-03T12:15:04</span>)</span>' },
{ '12:15, May 3, 2013', '<span style="display:none"> (<span class="dtstart">2013-05-03T12:15</span>)</span>' },
{ '10pm, May 3, 2013', '<span style="display:none"> (<span class="dtstart">2013-05-03T22</span>)</span>' },
{ '12:15:04', '<span style="display:none"> (<span class="dtstart">12:15:04</span>)</span>' },
{ '12:15', '<span style="display:none"> (<span class="dtstart">12:15</span>)</span>' },
{ '3 May 2013 – 6 February 2014', '<span style="display:none"> (<span class="dtstart">2013-05-03</span> - <span class="dtend">2014-02-06</span>)</span>' },
{ '3 May – 22 June 2013', '<span style="display:none"> (<span class="dtstart">2013-05-03</span> - <span class="dtend">2013-06-22</span>)</span>' },
{ 'May 2013 – February 2014', '<span style="display:none"> (<span class="dtstart">2013-05</span> - <span class="dtend">2014-02</span>)</span>' },
{ '2013 – 2014', '<span style="display:none"> (<span class="dtstart">2013</span> - <span class="dtend">2014</span>)</span>' },
}, { nowiki = true } )
end
function p:test_stripFieldExtras() -- Must begin with 'test'
self:preprocess_equals_many('{{#invoke:Infobox date field metadata|outputRawStripped|<nowiki>', '</nowiki>}}', {
-- references stripping
{ '3 May 2013', '3 May 2013' },
{ '3 May 2013 ', '3 May 2013' },
{ ' 3 May 2013', '3 May 2013' },
{ ' 3 May 2013 ', '3 May 2013' },
{ '3 May 2013<ref>Well, hello there!</ref>', '3 May 2013' },
{ '3 May 2013 <ref>Well, hello there!</ref>', '3 May 2013' },
{ '3 May 2013<ref name="hello">Well, hello there!</ref>', '3 May 2013' },
{ '3 May 2013</ref>Broken', '3 May 2013</ref>Broken' }, -- opening ref causes markup errors
{ '3 May 2013<ref></ref>', '3 May 2013' },
{ '3 May 2013<ref>Well, hello there!</ref><ref>Well, hello!</ref>', '3 May 2013' },
{ '3 May 2013<ref>Well, hello there!</ref><ref>Well, hello!</ref><ref>Well well well</ref>', '3 May 2013' },
{ '3 May 2013<ref name="hello">Well,</ref><ref name="hello">..hello!</ref>', '3 May 2013' },
{ '3 May 2013<ref></ref><ref></ref>', '3 May 2013' },
{ '3 May 2013<ref name="junky"/>', '3 May 2013' },
{ '3 May 2013<ref name="junky"/><ref name="junky"/>', '3 May 2013' },
{ '3 May 2013<ref name="junky"/><ref name="junky"/><ref name="junky"/>', '3 May 2013' },
{ '3 May 2013 <ref name="junky"/>', '3 May 2013' },
{ '3 May 2013<!--don\'t add extra dates-->', '3 May 2013' },
{ '3 May 2013 <!---->', '3 May 2013' },
{ '<!--Per MOS somethng do something-->3 May 2013', '3 May 2013' },
{ '<!----> 3 May 2013', '3 May 2013' },
{ '{{Flag icon|USA}} 3 May 2013', '3 May 2013' },
{ '{{Flagicon|UK}} 3 May 2013', '3 May 2013' },
{ '{{Flagicon|UK}} {{Flag icon|USA}} 3 May 2013', '3 May 2013' },
{ '3 May 2013{{Flagicon|UK}}', '3 May 2013' },
{ '3 May 2013 {{Flagicon|UK}} {{Flag icon|USA}} ', '3 May 2013' },
}
, { nowiki = true }
)
end
return p