Bước tới nội dung

Mô đun:List/testcases

Bách khoa toàn thư mở Wikipedia
-- Unit tests for [[Module:List]]. Click talk page to run tests.local mList = require('Module:List/sandbox')local ScribuntoUnit = require('Module:ScribuntoUnit')local suite = ScribuntoUnit:new()---------------------------------------------------------------------------------- Default values--------------------------------------------------------------------------------local d = {}-- Function namesd.bulletedFunc = 'bulleted'd.unbulletedFunc = 'unbulleted'd.horizontalFunc = 'horizontal'd.orderedFunc = 'ordered'd.horizontalOrderedFunc = 'horizontal_ordered'-- List itemsd.item1 = 'Foo'd.item2 = 'Bar'd.itemNested = '\n*Subitem 1\n*Subitem 2'  -- The leading LF must not be trimmed from such item-- Styles and classesd.arbitraryStyle = 'text-align: right'd.arbitraryValue = 'some value'd.arbitraryClass = 'someclass'd.arbitraryClass2 = 'someclass2'd.hlist = 'hlist'd.plainlist = 'plainlist'd.templatestyles_pattern = '\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127'-- Parameter namesd.itemStyleParam1 = 'item1_style'd.itemValueParam1 = 'item1_value'-- Attributesd.arbitraryStart = '5'-- Tracking categoriesd.trackingCategory = '[[Category:List templates with deprecated parameters]]'---------------------------------------------------------------------------------- Helper functions--------------------------------------------------------------------------------function suite:assertArrayContainsString(expected, t)	-- This only works on arrays that only contain strings.	local sep = '|SEPARATOR|'	local concatenated = sep .. table.concat(t, sep) .. sep	self:assertStringContains(sep .. expected .. sep, concatenated, true)end---------------------------------------------------------------------------------- Test makeListData--------------------------------------------------------------------------------function suite:testDataBlank()	local data = mList.makeListData(d.bulletedFunc, {})	self:assertEquals('table', type(data))endfunction suite:testDataOneItem()	local data = mList.makeListData(d.bulletedFunc, {d.item1})	self:assertEquals(d.item1, data.items[1].content)endfunction suite:testDataTwoItems()	local data = mList.makeListData(d.bulletedFunc, {d.item1, d.item2})	self:assertEquals(d.item1, data.items[1].content)	self:assertEquals(d.item2, data.items[2].content)endfunction suite:testDataItemStyle1()	local data = mList.makeListData(d.bulletedFunc, {d.item1, [d.itemStyleParam1] = d.arbitraryStyle})	self:assertEquals(d.arbitraryStyle, data.items[1].style)endfunction suite:testDataItemStyle1NoContent()	local data = mList.makeListData(d.bulletedFunc, {[d.itemStyleParam1] = d.arbitraryStyle})	self:assertEquals(nil, data.items[1])endfunction suite:testDataItemValue1()	local data = mList.makeListData(d.bulletedFunc, {d.item1, [d.itemValueParam1] = d.arbitraryValue})	self:assertEquals(d.arbitraryValue, data.items[1].value)endfunction suite:testDataItemValue1NoContent()	local data = mList.makeListData(d.bulletedFunc, {[d.itemValueParam1] = d.arbitraryValue})	self:assertEquals(nil, data.items[1])endfunction suite:testDataItemStyle()	local data = mList.makeListData(d.bulletedFunc, {item_style = d.arbitraryStyle})	self:assertEquals(d.arbitraryStyle, data.itemStyle)endfunction suite:testDataListStyle()	local data = mList.makeListData(d.bulletedFunc, {list_style = d.arbitraryStyle})	self:assertEquals(d.arbitraryStyle, data.listStyle)endfunction suite:testDataStart()	local data = mList.makeListData(d.bulletedFunc, {start = d.arbitraryStart})	self:assertEquals(d.arbitraryStart, data.start)endfunction suite:testDataHorizontalNumberingFix()	local data = mList.makeListData(d.horizontalOrderedFunc, {start = '5'})	self:assertEquals('5', data.start)	self:assertEquals('listitem 4', data.counterReset)endfunction suite:testDataHorizontalNumberingFixBadInput()	local data = mList.makeListData(d.horizontalOrderedFunc, {start = 'foo'})	self:assertEquals('foo', data.start)	self:assertEquals(nil, data.counterReset)endfunction suite:testDataHorizontalNumberingFixNumberInput()	local data = mList.makeListData(d.horizontalOrderedFunc, {start = 6})	self:assertEquals(6, data.start)	self:assertEquals('listitem 5', data.counterReset)endfunction suite:testDataListTag()	self:assertEquals('ul', mList.makeListData(d.bulletedFunc, {}).listTag)	self:assertEquals('ul', mList.makeListData(d.horizontalFunc, {}).listTag)	self:assertEquals('ul', mList.makeListData(d.unbulletedFunc, {}).listTag)	self:assertEquals('ol', mList.makeListData(d.orderedFunc, {}).listTag)	self:assertEquals('ol', mList.makeListData(d.horizontalOrderedFunc, {}).listTag)endfunction suite:testDataListStyleType()	self:assertEquals('foo', mList.makeListData(d.orderedFunc, {list_style_type = 'foo'}).listStyleType)	self:assertEquals('foo', mList.makeListData(d.horizontalOrderedFunc, {list_style_type = 'foo'}).listStyleType)	self:assertEquals(nil, mList.makeListData(d.bulletedFunc, {list_style_type = 'foo'}).listStyleType)endfunction suite:testDataListStyleTypeAltSyntax()	self:assertEquals('foo', mList.makeListData(d.orderedFunc, {['list-style-type'] = 'foo'}).listStyleType)	self:assertEquals('foo', mList.makeListData(d.horizontalOrderedFunc, {['list-style-type'] = 'foo'}).listStyleType)	self:assertEquals(nil, mList.makeListData(d.bulletedFunc, {['list-style-type'] = 'foo'}).listStyleType)endfunction suite:testDataValidType()	self:assertEquals('1', mList.makeListData(d.orderedFunc, {type = '1'}).type)	self:assertEquals('A', mList.makeListData(d.orderedFunc, {type = 'A'}).type)	self:assertEquals('a', mList.makeListData(d.orderedFunc, {type = 'a'}).type)	self:assertEquals('I', mList.makeListData(d.orderedFunc, {type = 'I'}).type)	self:assertEquals('i', mList.makeListData(d.orderedFunc, {type = 'i'}).type)endfunction suite:testDataInvalidType()	local data = mList.makeListData(d.orderedFunc, {type = 'foo'})	self:assertEquals(nil, data.type)	self:assertEquals('foo', data.listStyleType)endfunction suite:testDataTypeByListType()	self:assertEquals('1', mList.makeListData(d.orderedFunc, {type = '1'}).type)	self:assertEquals('1', mList.makeListData(d.horizontalOrderedFunc, {type = '1'}).type)	self:assertEquals(nil, mList.makeListData(d.bulletedFunc, {type = '1'}).type)endfunction suite:testDataIndent()	self:assertEquals('1.6em', mList.makeListData(d.horizontalFunc, {indent = 1}).marginLeft)	self:assertEquals('3.2em', mList.makeListData(d.horizontalFunc, {indent = 2}).marginLeft)	self:assertEquals('1.6em', mList.makeListData(d.horizontalFunc, {indent = '1'}).marginLeft)	self:assertEquals(nil, mList.makeListData(d.horizontalFunc, {}).marginLeft)endfunction suite:testDataIndentByListType()	self:assertEquals('1.6em', mList.makeListData(d.horizontalFunc, {indent = 1}).marginLeft)	self:assertEquals('1.6em', mList.makeListData(d.horizontalOrderedFunc, {indent = 1}).marginLeft)	self:assertEquals(nil, mList.makeListData(d.bulletedFunc, {indent = 1}).marginLeft)	self:assertEquals(nil, mList.makeListData(d.unbulletedFunc, {indent = 1}).marginLeft)	self:assertEquals(nil, mList.makeListData(d.orderedFunc, {indent = 1}).marginLeft)endfunction suite:testDataStyle()	self:assertEquals(d.arbitraryStyle, mList.makeListData(d.horizontalFunc, {style = d.arbitraryStyle}).style)endfunction suite:testDataClass()	self:assertArrayContainsString(d.arbitraryClass, mList.makeListData(d.bulletedFunc, {class = d.arbitraryClass}).classes)endfunction suite:testDataListTypeClasses()	self:assertArrayContainsString(d.hlist, mList.makeListData(d.horizontalFunc, {}).classes)	self:assertArrayContainsString(d.hlist, mList.makeListData(d.horizontalOrderedFunc, {}).classes)	self:assertArrayContainsString(d.plainlist, mList.makeListData(d.unbulletedFunc, {}).classes)end---------------------------------------------------------------------------------- Test deprecated parameters--------------------------------------------------------------------------------function suite:testDeprecatedItemStyle1()	local data = mList.makeListData(d.bulletedFunc, {d.item1, item_style1 = d.arbitraryStyle})	self:assertEquals(d.arbitraryStyle, data.items[1].style)endfunction suite:testDeprecatedItemStyle1NoContent()	local data = mList.makeListData(d.bulletedFunc, {item_style1 = d.arbitraryStyle})	self:assertEquals(nil, data.items[1])endfunction suite:testDeprecatedValueStyle1()	local data = mList.makeListData(d.bulletedFunc, {d.item1, item_value1 = d.arbitraryStyle})	self:assertEquals(d.arbitraryStyle, data.items[1].value)endfunction suite:testDeprecatedValueStyle1NoContent()	local data = mList.makeListData(d.bulletedFunc, {item_value1 = d.arbitraryStyle})	self:assertEquals(nil, data.items[1])end---------------------------------------------------------------------------------- Test tracking categories--------------------------------------------------------------------------------function suite:testTrackingCategoriesItem1Style()	local result = mList.renderTrackingCategories{item1_style = d.arbitraryStyle}	self:assertEquals('', result)endfunction suite:testTrackingCategoriesItemStyle1()	local result = mList.renderTrackingCategories{item_style1 = d.arbitraryStyle}	self:assertEquals(d.trackingCategory, result)endfunction suite:testTrackingCategoriesItemStyle4()	local result = mList.renderTrackingCategories{item_style4 = d.arbitraryStyle}	self:assertEquals(d.trackingCategory, result)endfunction suite:testTrackingCategoriesItemValue1()	local result = mList.renderTrackingCategories{item_value1 = d.arbitraryValue}	self:assertEquals(d.trackingCategory, result)end---------------------------------------------------------------------------------- Test renderList--------------------------------------------------------------------------------function suite.makeDataWithOneItem(args)	local data = {		classes = {},		items = {},		templatestyles = '',	}	data.items[1] = {content = d.item1}	for k, v in pairs(args or {}) do		data[k] = v	end	return dataendfunction suite.cleanPattern(s)	-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.	s = s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')	return sendfunction suite.makePattern(tag, attr, s1, s2)	-- For making a pattern to use with assertStringContains inside a specific attribute and HTML tag.	s1 = suite.cleanPattern(s1)	if s2 then		s2 = suite.cleanPattern(s2)	end	local ssep = ''	if s2 then		ssep = '%s*:%s*'	end	s2 = s2 or ''	return string.format(		'<%s[^>]-%s="[^">]-%s%s%s[^">]-"[^>]->',		tag,		attr,		s1,		ssep,		s2	)endfunction suite:testRenderNoItems()	self:assertEquals('', mList.renderList{})	self:assertEquals('', mList.renderList{items = {}})endfunction suite:testRenderOneItem()	local data = self.makeDataWithOneItem()	self:assertStringContains('^<div>%s*<ul>%s*<li>%s*' .. self.cleanPattern(d.item1) .. '%s*</li>%s*</ul>%s*</div>$', mList.renderList(data))endfunction suite:testRenderTwoItems()	local data = self.makeDataWithOneItem()	data.items[2] = {content = d.item2}	self:assertStringContains('^<div>%s*<ul>%s*<li>%s*' .. self.cleanPattern(d.item1) .. '%s*</li>%s*<li>%s*' .. self.cleanPattern(d.item2) .. '%s*</li>%s*</ul>%s*</div>$', mList.renderList(data))endfunction suite:testRenderOneClass()	local data = self.makeDataWithOneItem()	data.classes[1] = d.arbitraryClass	self:assertStringContains('<div class="' .. d.arbitraryClass .. '">', mList.renderList(data), true)endfunction suite:testRenderTwoClasses()	local data = self.makeDataWithOneItem()	data.classes[1] = d.arbitraryClass	data.classes[2] = d.arbitraryClass2	local pattern = self.makePattern('div', 'class', d.arbitraryClass .. ' ' .. d.arbitraryClass2)	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderMarginLeft()	local data = self.makeDataWithOneItem{marginLeft = '5px'}	local pattern = self.makePattern('div', 'style', 'margin-left', '5px')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderStyle()	local data = self.makeDataWithOneItem{style = 'foo:bar'}	local pattern = self.makePattern('div', 'style', 'foo:bar')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderListTag()	local data = self.makeDataWithOneItem{listTag = 'ol'}	self:assertEquals('<div><ol><li>' .. d.item1 .. '</li></ol></div>', mList.renderList(data))endfunction suite:testRenderStart()	local data = self.makeDataWithOneItem{start = '7'}	local pattern = self.makePattern('ul', 'start', '7')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderStartNumber()	local data = self.makeDataWithOneItem{start = 7}	local pattern = self.makePattern('ul', 'start', '7')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderType()	local data = self.makeDataWithOneItem{type = 'i'}	local pattern = self.makePattern('ul', 'type', 'i')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderCounterReset()	local data = self.makeDataWithOneItem{counterReset = 'item 3'}	local pattern = self.makePattern('ul', 'style', 'counter-reset', 'item 3')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderListStyleType()	local data = self.makeDataWithOneItem{listStyleType = 'roman'}	local pattern = self.makePattern('ul', 'style', 'list-style-type', 'roman')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderListStyle()	local data = self.makeDataWithOneItem{listStyle = 'bar:baz'}	local pattern = self.makePattern('ul', 'style', 'bar:baz')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderItemStyle()	local data = self.makeDataWithOneItem{itemStyle = 'qux:foo'}	local pattern = self.makePattern('li', 'style', 'qux:foo')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderItemStyleTwoItems()	local data = self.makeDataWithOneItem{itemStyle = 'bar:foo'}	data.items[2] = {content = d.item2}	local tagPattern = self.makePattern('li', 'style', 'bar:foo')	local pattern = tagPattern .. d.item1 .. '</li>' .. tagPattern .. d.item2	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderItem1Style()	local data = self.makeDataWithOneItem()	data.items[1].style = 'baz:foo'	local pattern = self.makePattern('li', 'style', 'baz:foo')	self:assertStringContains(pattern, mList.renderList(data), false)endfunction suite:testRenderItem1Value()	local data = self.makeDataWithOneItem()	data.items[1].value = d.arbitraryValue	local pattern = self.makePattern('li', 'value', d.arbitraryValue)	self:assertStringContains(pattern, mList.renderList(data), false)end---------------------------------------------------------------------------------- Whole-module tests--------------------------------------------------------------------------------function suite:testBulleted()	local actual = mList[d.bulletedFunc]{d.item1}	local pattern = '^<div>%s*<ul>%s*<li>%s*' .. self.cleanPattern(d.item1) .. '%s*</li>%s*</ul>%s*</div>$'	self:assertStringContains(pattern, actual, false)endfunction suite:testUnbulleted()	local actual = mList[d.unbulletedFunc]{d.item1}	local pattern = '^' .. d.templatestyles_pattern .. self.makePattern('div', 'class', 'plainlist') .. '%s*<ul>%s*<li>%s*' ..		self.cleanPattern(d.item1) .. '%s*</li>%s*</ul>%s*</div>$'	self:assertStringContains(pattern, actual, false)endfunction suite:testHorizontal()	local actual = mList[d.horizontalFunc]{d.item1}	local pattern = '^' .. d.templatestyles_pattern .. self.makePattern('div', 'class', 'hlist') .. '%s*<ul>%s*<li>%s*' ..		self.cleanPattern(d.item1) .. '%s*</li>%s*</ul>%s*</div>$'	self:assertStringContains(pattern, actual, false)endfunction suite:testOrdered()	local actual = mList[d.orderedFunc]{d.item1}	local pattern = '^<div>%s*<ol>%s*<li>%s*' .. self.cleanPattern(d.item1) .. '%s*</li>%s*</ol>%s*</div>$'	self:assertStringContains(pattern, actual, false)endfunction suite:testHorizontalOrdered()	local actual = mList[d.horizontalOrderedFunc]{d.item1}	local pattern = '^' .. d.templatestyles_pattern .. self.makePattern('div', 'class', 'hlist') .. '%s*<ol>%s*<li>%s*' ..		self.cleanPattern(d.item1) .. '%s*</li>%s*</ol>%s*</div>$'	self:assertStringContains(pattern, actual, false)endfunction suite:testTrimming()	local actual = mList[d.orderedFunc]{'\n Foo \n'}	-- Now many templates expect the arguments to be trimmed	local pattern = '^<div>%s*<ol>%s*<li>' .. self.cleanPattern('Foo') .. '</li>%s*</ol>%s*</div>$'	self:assertStringContains(pattern, actual, false)endfunction suite:testNested()	local actual = mList[d.orderedFunc]{d.itemNested}	local pattern = '^<div>%s*<ol>%s*<li>%s*' .. self.cleanPattern(d.itemNested) .. '%s*</li>%s*</ol>%s*</div>$'	self:assertStringContains(pattern, actual, false)endreturn suite