Module:Infobox date field metadata/testcases

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 &ndash; 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&nbsp;&ndash; 12 February 2014', '2013-05-03; 2014-02-12' },
      { '3 May 2013&nbsp;&ndash;&nbsp;12 February 2014', '2013-05-03; 2014-02-12' },
      { '3 May 2013&nbsp;– 12 February 2014', '2013-05-03; 2014-02-12' },
      { '3 May 2013&nbsp;–&nbsp;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">&#160;(<span class="dtstart">2013-05-03</span>)</span>' },
        { 'May 3, 2013', '<span style="display:none">&#160;(<span class="dtstart">2013-05-03</span>)</span>' },
        { 'May 2013', '<span style="display:none">&#160;(<span class="dtstart">2013-05</span>)</span>' },
        { '2013', '<span style="display:none">&#160;(<span class="dtstart">2013</span>)</span>' },
        { '12:15:04, May 3, 2013', '<span style="display:none">&#160;(<span class="dtstart">2013-05-03T12:15:04</span>)</span>' },
        { 'May 3, 2013, 12:15:04', '<span style="display:none">&#160;(<span class="dtstart">2013-05-03T12:15:04</span>)</span>' },
        { '12:15, May 3, 2013', '<span style="display:none">&#160;(<span class="dtstart">2013-05-03T12:15</span>)</span>' },
        { '10pm, May 3, 2013', '<span style="display:none">&#160;(<span class="dtstart">2013-05-03T22</span>)</span>' },
        { '12:15:04', '<span style="display:none">&#160;(<span class="dtstart">12:15:04</span>)</span>' },
        { '12:15', '<span style="display:none">&#160;(<span class="dtstart">12:15</span>)</span>' },
        { '3 May 2013 – 6 February 2014', '<span style="display:none">&#160;(<span class="dtstart">2013-05-03</span> - <span class="dtend">2014-02-06</span>)</span>' },
        { '3 May – 22 June 2013', '<span style="display:none">&#160;(<span class="dtstart">2013-05-03</span> - <span class="dtend">2013-06-22</span>)</span>' },
        { 'May 2013 – February 2014', '<span style="display:none">&#160;(<span class="dtstart">2013-05</span> - <span class="dtend">2014-02</span>)</span>' },
        { '2013 – 2014', '<span style="display:none">&#160;(<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