Module:Sandbox/Izno/citationTests

-- we never call cs1 directly because it doesn't have a nice implementation -- as a module, so comment out below line -- local myModule = require('Module:Citation/CS1') -- the module to be tested local ScribuntoUnit = require('Module:ScribuntoUnit') local suite = ScribuntoUnit:new

-- merge keys and values into one table local function merge(t1, t2) local t3 = {} for k, v in pairs(t1) do		t3[k] = v	end for k, v in pairs(t2) do		t3[k] = v	end return t3 end

-- takes an object and template args -- the object should have a base_args object, the frame, the template name, -- and the pattern to find in or near the CITEREF generated local function citeref(test_parameters, targs) local merged_args = merge(test_parameters.base_args, targs) local expansion = test_parameters.frame:expandTemplate{ title = test_parameters.template, args = merged_args }	local _, _, citeref_value = mw.ustring.find(expansion, test_parameters.pattern) if not citeref_value then citeref_value = '' end return citeref_value end

-- Tests to ensure author masks don't corrupt the CITEREF function suite:testAuthorMask local env = { frame = mw.getCurrentFrame, pattern = 'id=\"(CITEREF%S-)\"', template = 'cite book/new', base_args = { title = 'T', author = '_A1_', year = '2020' } }	self:assertEquals( 'CITEREF_A1_2020', citeref(env, {chapter = 'CH'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {['author-mask'] = 'A1'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {['author-mask1'] = '2'})) end

-- Tests what happens with various counts of contributors, authors, and editors function suite:testCounts local env = { frame = mw.getCurrentFrame, pattern = 'id=\"(CITEREF%S-)\"', template = 'cite book/new', base_args = { title = 'T', year = '2020' } }	self:assertEquals( '', citeref(env, {chapter = 'CH'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {author = '_A1_'})) self:assertEquals( '', citeref(env, {contributor = 'C1'})) self:assertEquals( '', citeref(env, {contributor = 'C1', contribution = 'CON'})) self:assertEquals( 'CITEREF_E1_2020', citeref(env, {editor = '_E1_'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {author = '_A1_', contributor = '_C1_'})) self:assertEquals( 'CITEREF_C1_2020', citeref(env, {author = '_A1_', contributor = '_C1_', contribution = 'CON'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {author = '_A1_', editor = '_E1_'})) self:assertEquals( 'CITEREF_E1_2020', citeref(env, {editor = '_E1_', contributor = '_C1_'})) self:assertEquals( 'CITEREF_E1_2020', citeref(env, {editor = '_E1_', contributor = '_C1_', contribution = 'CON'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {author = '_A1_', contributor = '_C1_', editor = '_E1_'})) self:assertEquals( 'CITEREF_C1_2020', citeref(env, {author = '_A1_', contributor = '_C1_', editor = '_E1_', contribution = 'CON'})) self:assertEquals( 'CITEREF_A1_A2_A3_A4_2020', citeref(env, {author = '_A1_', author2 = 'A2_', author3 = 'A3_', author4 = 'A4_'})) self:assertEquals( 'CITEREF_A1_A2_A3_A4_2020', citeref(env, {author = '_A1_', author2 = 'A2_', author3 = 'A3_', author4 = 'A4_', author5 = 'A5_'})) self:assertEquals( 'CITEREF_C1_C2_C3_2020', citeref(env, {author = '_A1_', contributor = '_C1_', contributor2 = 'C2_', contributor3 = 'C3_', contribution = 'CON'})) self:assertEquals( 'CITEREF_E1_E2_2020', citeref(env, {editor = '_E1_', editor2 = 'E2_'})) end

-- Tests date resolution code, including anchor years. function suite:testDates local env = { frame = mw.getCurrentFrame, pattern = 'id=\"(CITEREF%S-)\"', template = 'cite book/new', base_args = { title = 'T', author = '_A1_' } }	self:assertEquals( 'CITEREF_A1_2020', citeref(env, {year='2020'})) self:assertEquals( 'CITEREF_A1_c\._2020', citeref(env, {date='c. 2020'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {date='1 January 2020'})) self:assertEquals( 'CITEREF_A1_2020a', citeref(env, {date='1 January 2020a'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {date='1 January 2020', year='2020'})) self:assertEquals( 'CITEREF_A1_2020a', citeref(env, {date='1 January 2020', year='2020a'})) self:assertEquals( 'CITEREF_A1_2020', citeref(env, {date='2020-01-01', year='2020'})) self:assertEquals( 'CITEREF_A1_2020a', citeref(env, {date='2020-01-01', year='2020a'})) end

function suite:testDatesUnexpectedLetter local frame = mw.getCurrentFrame local args = {title = 'T', author = '_A1_', date = '1 January 2020a'} self:assertNotStringContains('1 January 2020a', frame:expandTemplate{		title = 'cite book/new', args = args	}) end

function suite:testDatesUnexpectedMaint local frame = mw.getCurrentFrame local args = {title = 'T', author = '_A1_', date = '1 January 2020', year = '2020a' } self:assertNotStringContains('CS1 maint: date and year', frame:expandTemplate{		title = 'cite book/new', args = args	}) end

function suite:testDatesMaint local frame = mw.getCurrentFrame local base_args = {title = 'T', author = '_A1_', year = '2020'} local template = 'cite book/new' local maint = 'CS1 maint: date and year' self:assertStringContains(maint, frame:expandTemplate{		title = template, args = merge(base_args, { date = '1 January 2020'})	}) self:assertStringContains(maint, frame:expandTemplate{		title = template, args = merge(base_args, { date = '2020-01-01'})	}) end

-- should fail: extra unexpected nd in the anchor, plus trailingauthordash below -- TODO: Should that change? I've seen workarounds in the wild. function suite:testDatesExtraNd local env = { frame = mw.getCurrentFrame, pattern = 'id=\"(CITEREF%S-)\"', template = 'cite book/new', base_args = { title = 'T', author = '_A1_' } }	self:assertEquals( 'CITEREF_A1_', citeref(env, {date='nd'})) end

-- should fail: extra unexpected n.d. in the anchor -- TODO: Should that change? I've seen workarounds in the wild. function suite:testDatesExtraNdPunct local env = { frame = mw.getCurrentFrame, pattern = 'id=\"(CITEREF%S-)\"', template = 'cite book/new', base_args = { title = 'T', author = '_A1_' } }	self:assertEquals( 'CITEREF_A1_', citeref(env, {date='n.d.'})) end

-- Tests to ensure display name settings don't corrupt the CITEREF function suite:testDisplayNames local env = { frame = mw.getCurrentFrame, pattern = 'id=\"(CITEREF%S-)\"', template = 'cite book/new', base_args = { title = 'T', author = '_A1_', author2 = 'A2_', date = '2020' } }	self:assertEquals( 'CITEREF_A1_A2_2020', citeref(env, {chapter = 'CH'})) self:assertEquals( 'CITEREF_A1_A2_2020', citeref(env, {['display-authors'] = '0'})) self:assertEquals( 'CITEREF_A1_A2_2020', citeref(env, {['display-authors'] = '1'})) self:assertEquals( 'CITEREF_A1_A2_2020', citeref(env, {['display-authors'] = 'etal'})) end

-- Tests what happens for certain values of ref function suite:testRef local env = { frame = mw.getCurrentFrame, pattern = '(id=\"CITEREF%S-\")', template = 'cite book/new', base_args = { title = 'T', author = '_A1_', year = '2020' } }	-- TODO test citation for equivalent value self:assertEquals( 'id=\"CITEREF_A1_2020\"', citeref(env, {chapter = 'CH'})) self:assertEquals( 'id=\"CITEREF_A1_2020\"', citeref(env, {ref = 'harv'})) self:assertEquals( '', citeref(env, {ref = 'none'})) self:assertEquals( 'id=\"CITEREF_A1_2020\"', citeref(env, {ref = 'CITEREF_A1_2020'}))

end

-- slightly different setup function suite:testRefREF local env = { frame = mw.getCurrentFrame, pattern = '(id=\"REF\")', template = 'cite book/new', base_args = { title = 'T', author = '_A1_', year = '2020' } }	self:assertEquals( 'id=\"REF\"', citeref(env, {ref = 'REF'})) end

-- tests for expected presence of maintenance messages in ref function suite:testRefMaint local frame = mw.getCurrentFrame local base_args = {title = 'T', author = '_A1_', date = '2020'} self:assertStringContains('CS1 maint: ref duplicates default', frame:expandTemplate{		title = 'cite book/new', args = merge(base_args, { ref = 'CITEREF_A1_2020'})	}) self:assertStringContains('CS1 maint: ref=harv', frame:expandTemplate{		title = 'cite book/new', args = merge(base_args, { ref = 'harv'})	}) end

-- should fail: missing trailing underscore in anchor; not sure if that's desirable -- or if that can change -- TODO: Ask someone. function suite:testTrailingAuthorDash local env = { frame = mw.getCurrentFrame, pattern = 'id=\"(CITEREF%S-)\"', template = 'cite book/new', base_args = { title = 'T', author = '_A1_' } }	self:assertEquals( 'CITEREF_A1_', citeref(env, {chapter='CH'})) end

return suite