<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ADate_table_sorting%2Ftestcases</id>
	<title>Module:Date table sorting/testcases - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ADate_table_sorting%2Ftestcases"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Date_table_sorting/testcases&amp;action=history"/>
	<updated>2026-05-07T22:21:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Date_table_sorting/testcases&amp;diff=135953&amp;oldid=prev</id>
		<title>imported&gt;Pppery: Fixing failed tests</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Date_table_sorting/testcases&amp;diff=135953&amp;oldid=prev"/>
		<updated>2021-10-05T18:42:56Z</updated>

		<summary type="html">&lt;p&gt;Fixing failed tests&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local mDts = require(&amp;#039;Module:Date table sorting/sandbox&amp;#039;) -- the module to be tested&lt;br /&gt;
local Dts = mDts._exportClasses().Dts -- the Dts class&lt;br /&gt;
local ScribuntoUnit = require(&amp;#039;Module:ScribuntoUnit&amp;#039;)&lt;br /&gt;
local suite = ScribuntoUnit:new()&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions and values&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
suite.currentYear = os.date(&amp;#039;*t&amp;#039;).year&lt;br /&gt;
suite.nowrapPattern = &amp;#039;^&amp;lt;span data%-sort%-value=&amp;quot;[^&amp;quot;&amp;lt;&amp;gt;]-&amp;quot; style=&amp;quot;white%-space:nowrap&amp;quot;&amp;gt;[^&amp;lt;&amp;gt;]-&amp;lt;/span&amp;gt;$&amp;#039;&lt;br /&gt;
&lt;br /&gt;
suite.offValues = {&amp;#039;off&amp;#039;, &amp;#039;no&amp;#039;, &amp;#039;NO&amp;#039;, &amp;#039;n&amp;#039;, &amp;#039;false&amp;#039;, false}&lt;br /&gt;
suite.onValues = {&amp;#039;on&amp;#039;, &amp;#039;yes&amp;#039;, &amp;#039;YES&amp;#039;, &amp;#039;y&amp;#039;, &amp;#039;true&amp;#039;, true}&lt;br /&gt;
local function makeOnOffAsserts(fragment)&lt;br /&gt;
	suite[&amp;#039;assert&amp;#039; .. fragment .. &amp;#039;WhenOn&amp;#039;] = function (self, first, func, ...)&lt;br /&gt;
		for i, on in ipairs(suite.onValues) do&lt;br /&gt;
			self[&amp;#039;assert&amp;#039; .. fragment](self, first, func(on), ...)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	suite[&amp;#039;assert&amp;#039; .. fragment .. &amp;#039;WhenOff&amp;#039;] = function (self, first, func, ...)&lt;br /&gt;
		for i, off in ipairs(suite.offValues) do&lt;br /&gt;
			self[&amp;#039;assert&amp;#039; .. fragment](self, first, func(off), ...)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
makeOnOffAsserts(&amp;#039;Equals&amp;#039;)&lt;br /&gt;
makeOnOffAsserts(&amp;#039;StringContains&amp;#039;)&lt;br /&gt;
makeOnOffAsserts(&amp;#039;NotStringContains&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function suite:assertErrorContains(pattern, func, plain)&lt;br /&gt;
	local success, msg = pcall(func)&lt;br /&gt;
	self:assertFalse(success)&lt;br /&gt;
	self:assertStringContains(pattern, msg, plain)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertDateEquals(year, month, day, args)&lt;br /&gt;
	local dtsObj = Dts.new(args)&lt;br /&gt;
	self:assertEquals(year, dtsObj.year)&lt;br /&gt;
	self:assertEquals(month, dtsObj.month)&lt;br /&gt;
	self:assertEquals(day, dtsObj.day)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertSortKeyEquals(expected, args)&lt;br /&gt;
	local dtsObj = Dts.new(args)&lt;br /&gt;
	self:assertEquals(expected, dtsObj:makeSortKey())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertDisplayEquals(expected, args)&lt;br /&gt;
	local dtsObj = Dts.new(args)&lt;br /&gt;
	self:assertEquals(expected, dtsObj:makeDisplay())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Date parameter tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testDateYMD()&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {2000, 1, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateYMonthD()&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {2000, &amp;#039;January&amp;#039;, 27})&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {2000, &amp;#039;january&amp;#039;, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateYMonD()&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {2000, &amp;#039;Jan&amp;#039;, 27})&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {2000, &amp;#039;jan&amp;#039;, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateYM()&lt;br /&gt;
	self:assertDateEquals(2000, 1, nil, {2000, 1})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateYD()&lt;br /&gt;
	self:assertDateEquals(2000, nil, 27, {2000, nil, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateMD()&lt;br /&gt;
	self:assertDateEquals(nil, 1, 27, {nil, 1, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateY()&lt;br /&gt;
	self:assertDateEquals(2000, nil, nil, {2000})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateM()&lt;br /&gt;
	self:assertDateEquals(nil, 1, nil, {nil, 1})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateD()&lt;br /&gt;
	self:assertDateEquals(nil, nil, 27, {nil, nil, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateNegativeYear()&lt;br /&gt;
	self:assertDateEquals(-2000, 1, 27, {-2000, 1, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateString()&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {&amp;#039;2000&amp;#039;, &amp;#039;1&amp;#039;, &amp;#039;27&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateAllMonths()&lt;br /&gt;
	self:assertDateEquals(nil, 1, nil, {nil, &amp;#039;January&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 2, nil, {nil, &amp;#039;February&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 3, nil, {nil, &amp;#039;March&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 4, nil, {nil, &amp;#039;April&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 5, nil, {nil, &amp;#039;May&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 6, nil, {nil, &amp;#039;June&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 7, nil, {nil, &amp;#039;July&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 8, nil, {nil, &amp;#039;August&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 9, nil, {nil, &amp;#039;September&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 10, nil, {nil, &amp;#039;October&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 11, nil, {nil, &amp;#039;November&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 12, nil, {nil, &amp;#039;December&amp;#039;, nil})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDateAllMons()&lt;br /&gt;
	self:assertDateEquals(nil, 1, nil, {nil, &amp;#039;Jan&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 2, nil, {nil, &amp;#039;Feb&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 3, nil, {nil, &amp;#039;Mar&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 4, nil, {nil, &amp;#039;Apr&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 5, nil, {nil, &amp;#039;May&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 6, nil, {nil, &amp;#039;Jun&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 7, nil, {nil, &amp;#039;Jul&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 8, nil, {nil, &amp;#039;Aug&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 9, nil, {nil, &amp;#039;Sep&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 10, nil, {nil, &amp;#039;Oct&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 11, nil, {nil, &amp;#039;Nov&amp;#039;, nil})&lt;br /&gt;
	self:assertDateEquals(nil, 12, nil, {nil, &amp;#039;Dec&amp;#039;, nil})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- parseDate tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testParseYear()&lt;br /&gt;
	self:assertDateEquals(2000, nil, nil, {&amp;#039;2000&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseNegativeYear()&lt;br /&gt;
	self:assertDateEquals(-2000, nil, nil, {&amp;#039;-2000&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseSmallYear()&lt;br /&gt;
	self:assertDateEquals(12, nil, nil, {&amp;#039;12&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseYYYYMMDD()&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {&amp;#039;2000-01-27&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {&amp;#039;2000-1-27&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(2000, 1, 6, {&amp;#039;2000-01-06&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(2000, 1, 6, {&amp;#039;2000-01-06&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseDDMMYYYY()&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {&amp;#039;27-01-2000&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(2000, 1, 27, {&amp;#039;27-1-2000&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(2000, 1, 6, {&amp;#039;06-01-2000&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseYYYYMM()&lt;br /&gt;
	self:assertDateEquals(2000, 1, nil, {&amp;#039;2000-01&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(2000, 1, nil, {&amp;#039;2000-1&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseMonthYYYY()&lt;br /&gt;
	self:assertDateEquals(1418, 2, nil, {&amp;#039;February 1418&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseMonYYYY()&lt;br /&gt;
	self:assertDateEquals(1418, 2, nil, {&amp;#039;Feb 1418&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseDDMonthYYYY()&lt;br /&gt;
	self:assertDateEquals(1975, 4, 24, {&amp;#039;24 April 1975&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseDDMonYYYY()&lt;br /&gt;
	self:assertDateEquals(1975, 4, 24, {&amp;#039;24 Apr 1975&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseMonthDDYYYY()&lt;br /&gt;
	self:assertDateEquals(1975, 4, 24, {&amp;#039;April 24, 1975&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(1975, 4, 24, {&amp;#039;April 24 1975&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseMonDDYYYY()&lt;br /&gt;
	self:assertDateEquals(1975, 4, 24, {&amp;#039;Apr 24, 1975&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(1975, 4, 24, {&amp;#039;Apr 24 1975&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseMonth()&lt;br /&gt;
	self:assertDateEquals(nil, 4, nil, {&amp;#039;April&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 4, nil, {&amp;#039;april&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseMon()&lt;br /&gt;
	self:assertDateEquals(nil, 4, nil, {&amp;#039;Apr&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 4, nil, {&amp;#039;apr&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseDDMonth()&lt;br /&gt;
	self:assertDateEquals(nil, 11, 12, {&amp;#039;12 November&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseDDMon()&lt;br /&gt;
	self:assertDateEquals(nil, 11, 12, {&amp;#039;12 Nov&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseMonthDD()&lt;br /&gt;
	self:assertDateEquals(nil, 11, 12, {&amp;#039;November 12&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseMonDD()&lt;br /&gt;
	self:assertDateEquals(nil, 11, 12, {&amp;#039;Nov 12&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseDDMonthYYY()&lt;br /&gt;
	self:assertDateEquals(100, 1, 27, {&amp;#039;27 January 100&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseDDMonth0YYY()&lt;br /&gt;
	self:assertDateEquals(100, 1, 27, {&amp;#039;27 January 0100&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseDDMonth000Y()&lt;br /&gt;
	self:assertDateEquals(3, 1, 27, {&amp;#039;27 January 0003&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseAllMonths()&lt;br /&gt;
	self:assertDateEquals(nil, 1, nil, {&amp;#039;January&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 2, nil, {&amp;#039;February&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 3, nil, {&amp;#039;March&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 4, nil, {&amp;#039;April&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 5, nil, {&amp;#039;May&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 6, nil, {&amp;#039;June&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 7, nil, {&amp;#039;July&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 8, nil, {&amp;#039;August&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 9, nil, {&amp;#039;September&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 10, nil, {&amp;#039;October&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 11, nil, {&amp;#039;November&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 12, nil, {&amp;#039;December&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseAllMons()&lt;br /&gt;
	self:assertDateEquals(nil, 1, nil, {&amp;#039;Jan&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 2, nil, {&amp;#039;Feb&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 3, nil, {&amp;#039;Mar&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 4, nil, {&amp;#039;Apr&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 5, nil, {&amp;#039;May&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 6, nil, {&amp;#039;Jun&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 7, nil, {&amp;#039;Jul&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 8, nil, {&amp;#039;Aug&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 9, nil, {&amp;#039;Sep&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 10, nil, {&amp;#039;Oct&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 11, nil, {&amp;#039;Nov&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 12, nil, {&amp;#039;Dec&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testParseSept()&lt;br /&gt;
	self:assertDateEquals(nil, 9, nil, {&amp;#039;Sept&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(nil, 9, nil, {&amp;#039;sept&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(2012, 9, 1, {&amp;#039;1 Sept 2012&amp;#039;})&lt;br /&gt;
	self:assertDateEquals(2012, 9, 1, {2012, &amp;#039;Sept&amp;#039;, 1})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Date error tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testInvalidDateError()&lt;br /&gt;
	self:assertErrorContains(&amp;quot;&amp;#039;foo&amp;#039; is an invalid date&amp;quot;, function ()&lt;br /&gt;
		Dts.new{&amp;#039;foo&amp;#039;}&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testZeroYearError()&lt;br /&gt;
	self:assertErrorContains(&amp;#039;years cannot be zero&amp;#039;, function ()&lt;br /&gt;
		Dts.new{0}&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testYearNonIntegerError()&lt;br /&gt;
	self:assertErrorContains(&amp;#039;years must be an integer&amp;#039;, function ()&lt;br /&gt;
		Dts.new{2015.5}&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testYearLowRangeError()&lt;br /&gt;
	self:assertErrorContains(&lt;br /&gt;
		&amp;#039;years cannot be less than −999,999,999,999&amp;#039;,&lt;br /&gt;
		function ()&lt;br /&gt;
			Dts.new{-1000000000000}&lt;br /&gt;
		end,&lt;br /&gt;
		true -- plain match&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testYearHighRangeError()&lt;br /&gt;
	self:assertErrorContains(&amp;#039;years cannot be greater than 999,999,999,999&amp;#039;, function ()&lt;br /&gt;
		Dts.new{1000000000000}&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testMonthError()&lt;br /&gt;
	self:assertErrorContains(&amp;#039;months must be an integer between 1 and 12&amp;#039;, function ()&lt;br /&gt;
		Dts.new{2000, 0}&lt;br /&gt;
	end)&lt;br /&gt;
	self:assertErrorContains(&amp;#039;months must be an integer between 1 and 12&amp;#039;, function ()&lt;br /&gt;
		Dts.new{2000, 13}&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testDayError()&lt;br /&gt;
	self:assertErrorContains(&amp;#039;days must be an integer between 1 and 31&amp;#039;, function ()&lt;br /&gt;
		Dts.new{2000, 1, 0}&lt;br /&gt;
	end)&lt;br /&gt;
	self:assertErrorContains(&amp;#039;days must be an integer between 1 and 31&amp;#039;, function ()&lt;br /&gt;
		Dts.new{2000, 1, 32}&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testBCError()&lt;br /&gt;
	self:assertErrorContains(&lt;br /&gt;
		&amp;quot;&amp;#039;foo&amp;#039; is not a valid era code (expected &amp;#039;BC&amp;#039;, &amp;#039;BCE&amp;#039;, &amp;#039;AD&amp;#039; or &amp;#039;CE&amp;#039;)&amp;quot;,&lt;br /&gt;
		function ()&lt;br /&gt;
			Dts.new{2000, 1, 27, &amp;#039;foo&amp;#039;}&lt;br /&gt;
		end,&lt;br /&gt;
		true -- plain match&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Sort key tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyYMD()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000002000-05-27-0000&amp;#039;, {2000, 5, 27})&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000002000-01-27-0000&amp;#039;, {2000, 1, 27})&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000002000-01-01-0000&amp;#039;, {2000, 1, 1})&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000000001-01-01-0000&amp;#039;, {1, 1, 1})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyYM()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000002000-05-01-0000&amp;#039;, {2000, 5, nil})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyYD()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000002000-01-27-0000&amp;#039;, {2000, nil, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyMD()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;00000000&amp;#039; .. suite.currentYear .. &amp;#039;-05-27-0000&amp;#039;, {nil, 5, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyY()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000002000-01-01-0000&amp;#039;, {2000, nil, nil})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyM()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;00000000&amp;#039; .. suite.currentYear .. &amp;#039;-05-01-0000&amp;#039;, {nil, 5, nil})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyD()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;00000000&amp;#039; .. suite.currentYear .. &amp;#039;-01-27-0000&amp;#039;, {nil, nil, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyNegative()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;-999999999955-05-27-0000&amp;#039;, {-45, 5, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyMaxYear()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;999999999999-01-01-0000&amp;#039;, {999999999999})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyMinYear()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;-000000000001-01-01-0000&amp;#039;, {-999999999999})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testSortKeyBlank()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;999999999999-99-99-0000&amp;#039;, {})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- addkey tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testAddkey()&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000002000-05-27-0003&amp;#039;, {2000, 5, 27, addkey = 3})&lt;br /&gt;
	suite:assertSortKeyEquals(&amp;#039;000000002000-05-27-0003&amp;#039;, {2000, 5, 27, addkey = &amp;#039;3&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testAddkeyError()&lt;br /&gt;
	local msg = &amp;quot;the &amp;#039;addkey&amp;#039; parameter must be an integer between 0 and 9999&amp;quot;&lt;br /&gt;
	self:assertErrorContains(msg, function ()&lt;br /&gt;
		Dts.new{2000, 5, 27, addkey = 3.5}&lt;br /&gt;
	end)&lt;br /&gt;
	self:assertErrorContains(msg, function ()&lt;br /&gt;
		Dts.new{2000, 5, 27, addkey = -1}&lt;br /&gt;
	end)&lt;br /&gt;
	self:assertErrorContains(msg, function ()&lt;br /&gt;
		Dts.new{2000, 5, 27, addkey = 10000}&lt;br /&gt;
	end)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Display tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatDefault()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;January 27, 2000&amp;#039;, {2000, 1, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatDMY()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;27 January 2000&amp;#039;, {2000, 1, 27, format = &amp;#039;dmy&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatMDY()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;January 27, 2000&amp;#039;, {2000, 1, 27, format = &amp;#039;mdy&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatDM()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;27 January&amp;#039;, {2000, 1, 27, format = &amp;#039;dm&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatMD()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;January 27&amp;#039;, {2000, 1, 27, format = &amp;#039;md&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatMY()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;January 2000&amp;#039;, {2000, 1, 27, format = &amp;#039;my&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatY()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;2000&amp;#039;, {2000, 1, 27, format = &amp;#039;y&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatM()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;January&amp;#039;, {2000, 1, 27, format = &amp;#039;m&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatD()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;27&amp;#039;, {2000, 1, 27, format = &amp;#039;d&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testFormatHide()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;&amp;#039;, {2000, 1, 27, format = &amp;#039;hide&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testBCParam()&lt;br /&gt;
	local result = &amp;#039;January 27, 2000&amp;amp;nbsp;BC&amp;#039;&lt;br /&gt;
	suite:assertDisplayEquals(result, {2000, 1, 27, &amp;#039;BC&amp;#039;})&lt;br /&gt;
	suite:assertDisplayEquals(result, {2000, 1, 27, &amp;#039;BCE&amp;#039;})&lt;br /&gt;
	suite:assertDisplayEquals(result, {2000, 1, 27, &amp;#039;bc&amp;#039;})&lt;br /&gt;
	suite:assertDisplayEquals(result, {2000, 1, 27, &amp;#039;bce&amp;#039;})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testBCNegativeYear()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;January 27, 2000&amp;amp;nbsp;BC&amp;#039;, {-2000, 1, 27})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLargeYearDisplay()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;1,000,000&amp;#039;, {1000000})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLargeNegativeYearDisplay()&lt;br /&gt;
	suite:assertDisplayEquals(&amp;#039;1,000,000&amp;amp;nbsp;BC&amp;#039;, {-1000000})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Blank tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testBlank()&lt;br /&gt;
	self:assertStringContains(&lt;br /&gt;
		&amp;#039;^&amp;lt;span data%-sort%-value=&amp;quot;[^&amp;quot;&amp;lt;&amp;gt;]-&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;$&amp;#039;,&lt;br /&gt;
		mDts._main{}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Nowrap tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testNoWrapDefault()&lt;br /&gt;
	self:assertStringContains(&lt;br /&gt;
		self.nowrapPattern,		&lt;br /&gt;
		mDts._main{2000, 1, 1}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoWrapOff()&lt;br /&gt;
	self:assertStringContainsWhenOff(&lt;br /&gt;
		&amp;#039;^&amp;lt;span data%-sort%-value=&amp;quot;[^&amp;quot;&amp;lt;&amp;gt;]-&amp;quot;&amp;gt;[^&amp;gt;]-&amp;lt;/span&amp;gt;$&amp;#039;,&lt;br /&gt;
		function (off)&lt;br /&gt;
			return mDts._main{2000, 1, 1, nowrap = off}&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	self:assertNotStringContainsWhenOff(&lt;br /&gt;
		&amp;#039;white%-space%s*:%s*nowrap&amp;#039;,&lt;br /&gt;
		function (off)&lt;br /&gt;
			return mDts._main{2000, 1, 1, nowrap = off}&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testNoWrapOn()&lt;br /&gt;
	self:assertStringContainsWhenOn(&lt;br /&gt;
		self.nowrapPattern,&lt;br /&gt;
		function (on)&lt;br /&gt;
			return mDts._main{2000, 1, 1, nowrap = on}&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Abbr tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testAbbrDefault()&lt;br /&gt;
	self:assertStringContains(&lt;br /&gt;
		&amp;#039;January 1, 2000&amp;#039;,&lt;br /&gt;
		mDts._main{2000, 1, 1}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testAbbrOn()&lt;br /&gt;
	self:assertStringContainsWhenOn(&lt;br /&gt;
		&amp;#039;Jan 1, 2000&amp;#039;,&lt;br /&gt;
		function (on)&lt;br /&gt;
			return mDts._main{2000, 1, 1, abbr = on}&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testAbbrOff()&lt;br /&gt;
	self:assertStringContainsWhenOff(&lt;br /&gt;
		&amp;#039;January 1, 2000&amp;#039;,&lt;br /&gt;
		function (off)&lt;br /&gt;
			return mDts._main{2000, 1, 1, abbr = off}&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
-- Main tests&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testMain()&lt;br /&gt;
	local errorPattern = &amp;#039;^&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error in %[%[Template:Date table sorting%]%]: .-&amp;lt;/strong&amp;gt;&amp;#039;&lt;br /&gt;
	self:assertStringContains(errorPattern, mDts.main{&amp;#039;foo&amp;#039;})&lt;br /&gt;
	self:assertNotStringContains(errorPattern, mDts.main{2000})&lt;br /&gt;
	self:assertStringContains(errorPattern, mDts._main{&amp;#039;foo&amp;#039;})&lt;br /&gt;
	self:assertNotStringContains(errorPattern, mDts._main{2000})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return suite&lt;/div&gt;</summary>
		<author><name>imported&gt;Pppery</name></author>
	</entry>
</feed>