Module:Reply to/testcases

local libName = 'Module:Reply to' local ScribuntoUnit = require('Module:ScribuntoUnit') local suite = ScribuntoUnit:new local frame = mw.getCurrentFrame

-- Helper to run all tests using sandbox version of the library from the debug console. To run against main lib, use =p.run function suite.runSandbox return suite.run(frame:newChild{		title = libName .. '/testcases',		args = {			module = libName .. '/sandbox',			displayMode = 'log'		},	}) end

-- Allow test runner to use both the main library and the sandbox of the library with the same testcases function suite:module return self.frame and self.frame.args.module or libName end

-- Helper functions

local function makeFrameWithParentArgs(args) local parent = frame:newChild{title = 'Template:Reply to', args = args} local child = parent:newChild{title = 'Module:Reply to'} return child end

local function replyTo(args) return require(suite:module).replyto(makeFrameWithParentArgs(args)) end

-- Returns an array of n unique strings. local function makeNUniqueStrings(n) local ret = {} for i = 1, n do		ret[i] = tostring(i) end return ret end

function suite:assertHtmlError(pattern, output) pattern = '^ Error in %%&%#123%;%&%#123%;%[%[Template:reply to%|reply to%]%]%&%#125%;%&%#125%;%<%/span%>: ' .. pattern .. '. $'	self:assertStringContains(pattern, output) end

function suite:assertContentEquals(expected, actual) expected = ' ' .. expected .. ' '	self:assertEquals(mw.text.trim(expected), mw.text.trim(actual)) end

-- Error tests

function suite:testNoUsernamesError self:assertHtmlError('Username not given', replyTo{}) end

function suite:testInvalidUsernameError self:assertHtmlError("Input contains forbidden characters", replyTo{'Examp|le'}) end

function suite:testTooManyUsernamesError self:assertHtmlError(		'More than %d+ names specified',		replyTo(makeNUniqueStrings(1000)) -- The limit is probably always going to be lower than 1000	) end

-- Test defaults

function suite:testOneUsername self:assertContentEquals(		'@Example:',		replyTo{'Example'}	) end

function suite:testTwoUsernames self:assertContentEquals(		'@Example and Example2:',		replyTo{'Example', 'Example2'}	) end

function suite:testThreeUsernames self:assertContentEquals(		'@Example, Example2, and Example3:',		replyTo{'Example', 'Example2', 'Example3'}	) end

function suite:testFourUsernames self:assertContentEquals(		'@Example, Example2, Example3, and Example4:',		replyTo{'Example', 'Example2', 'Example3', 'Example4'}	) end

-- Test labels

function suite:testLabel self:assertContentEquals(		'@Foo:',		replyTo{[1] = 'Example', label = 'Foo'}	) end

function suite:testLabel1 self:assertContentEquals(		'@Foo:',		replyTo{[1] = 'Example', label1 = 'Foo'}	) end

function suite:testTwoLabels self:assertContentEquals(		'@Foo and Bar:',		replyTo{[1] = 'Example', label1 = 'Foo', [2] = 'Example2', label2 = 'Bar'}	) end

function suite:testThreeLabels self:assertContentEquals(		'@Foo, Bar, and Baz:',		replyTo{[1] = 'Example', label1 = 'Foo', [2] = 'Example2', label2 = 'Bar', [3] = 'Example3', label3 = 'Baz'}	) end

-- Test special formatting

function suite:testPrefix self:assertContentEquals(		'fooExample:',		replyTo{'Example', prefix = 'foo'}	) end

function suite:testBlankPrefix self:assertContentEquals(		'Example:',		replyTo{'Example', prefix = ''}	) end

function suite:testConjunction self:assertContentEquals(		'@Example, Example2, foo Example3:',		replyTo{'Example', 'Example2', 'Example3', c = 'foo'}	) end

function suite:testBlankConjunction self:assertContentEquals(		'@Example, Example2,  Example3:',		replyTo{'Example', 'Example2', 'Example3', c = ''}	) end

function suite:testPunctuation self:assertContentEquals(		'@Examplefoo',		replyTo{'Example', p = 'foo'}	) end

function suite:testBlankPunctuation self:assertContentEquals(		'@Example',		replyTo{'Example', p = ''}	) end

-- Test non-standard parameter orders

function suite:testNoFirstParam self:assertContentEquals(		'@Example:',		replyTo{[2] = 'Example'}	) end

function suite:testNoFirstParamWithLabel self:assertContentEquals(		'@Example:',		replyTo{[2] = 'Example', label = 'Foo'}	) end

function suite:testNoFirstParamWithLabel2 self:assertContentEquals(		'@Foo:',		replyTo{[2] = 'Example', label2 = 'Foo'}	) end

return suite