mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Scribunto
synced 2024-11-28 18:20:06 +00:00
e5564cf942
mw.text.unstrip is too broad, it's allowing for unstripping things that cause problems when unstripped (e.g. bug 61268). Since the original request was only for unstripping <nowiki>, let's add a function that does only that. We should also add an interface to StripState::killMarkers(), instead of requiring everyone to roll their own work-alike. Then, to fix the bug, we can make mw.text.unstrip be the combination of the two. This is the most like the original behavior of mw.text.unstrip (removes all strip markers, replacing them with text where applicable) without causing issues. Bug: 61268 Change-Id: I3a151fd678b365d629b71b4f1cb0d5d284b98555
276 lines
8 KiB
Lua
276 lines
8 KiB
Lua
local testframework = require 'Module:TestFramework'
|
|
|
|
-- Force the argument list to be ordered
|
|
local tagattrs = { absent = false, present = true, key = 'value', n = 42 }
|
|
setmetatable( tagattrs, { __pairs = function ( t )
|
|
local keys = { 'absent', 'present', 'key', 'n' }
|
|
local i = 0
|
|
return function()
|
|
i = i + 1
|
|
if i <= #keys then
|
|
return keys[i], t[keys[i]]
|
|
end
|
|
end
|
|
end } )
|
|
|
|
-- For data provider, make sure this is defined
|
|
mw.text.stripTest = mw.text.stripTest or { nowiki = '!!!', general = '!!!' }
|
|
|
|
-- Can't directly expect the value from mw.text.stripTest, because when
|
|
-- 'expect' is processed by the data provider it's the dummy entry above.
|
|
local function stripTest( func, marker )
|
|
local result = func( marker )
|
|
if result == marker then
|
|
result = 'strip-marker'
|
|
end
|
|
return result
|
|
end
|
|
|
|
-- Tests
|
|
local tests = {
|
|
{ name = 'trim',
|
|
func = mw.text.trim, args = { ' foo bar ' },
|
|
expect = { 'foo bar' }
|
|
},
|
|
{ name = 'trim right',
|
|
func = mw.text.trim, args = { 'foo bar ' },
|
|
expect = { 'foo bar' }
|
|
},
|
|
{ name = 'trim left',
|
|
func = mw.text.trim, args = { ' foo bar' },
|
|
expect = { 'foo bar' }
|
|
},
|
|
{ name = 'trim none',
|
|
func = mw.text.trim, args = { 'foo bar' },
|
|
expect = { 'foo bar' }
|
|
},
|
|
{ name = 'trim charset',
|
|
func = mw.text.trim, args = { 'xxx foo bar xxx', 'x' },
|
|
expect = { ' foo bar ' }
|
|
},
|
|
|
|
{ name = 'encode',
|
|
func = mw.text.encode, args = { '<b>foo\194\160"bar"</b> & \'baz\'' },
|
|
expect = { '<b>foo "bar"</b> & 'baz'' }
|
|
},
|
|
{ name = 'encode charset',
|
|
func = mw.text.encode, args = { '<b>foo\194\160"bar"</b> & \'baz\'', 'aeiou' },
|
|
expect = { '<b>foo\194\160"bar"</b> & \'baz\'' }
|
|
},
|
|
|
|
{ name = 'decode',
|
|
func = mw.text.decode,
|
|
args = { '<>&" foo foo ♥ &quot;' },
|
|
expect = { '<>&" foo foo ♥ "' }
|
|
},
|
|
{ name = 'decode named',
|
|
func = mw.text.decode,
|
|
args = { '<>&" foo foo ♥ &quot;', true },
|
|
expect = { '<>&" foo foo ♥ "' }
|
|
},
|
|
|
|
{ name = 'nowiki',
|
|
func = mw.text.nowiki,
|
|
args = { '*"&\'<=>[]{|}#*:;\n*\n#\n:\n;\nhttp://example.com:80/\nRFC 123, ISBN 456' },
|
|
expect = {
|
|
'*"&'<=>[]{|}#*:;' ..
|
|
'\n*\n#\n:\n;\nhttp://example.com:80/' ..
|
|
'\nRFC 123, ISBN 456'
|
|
}
|
|
},
|
|
|
|
{ name = 'tag, simple',
|
|
func = mw.text.tag,
|
|
args = { { name = 'b' } },
|
|
expect = { '<b>' }
|
|
},
|
|
{ name = 'tag, simple with content',
|
|
func = mw.text.tag,
|
|
args = { { name = 'b', content = 'foo' } },
|
|
expect = { '<b>foo</b>' }
|
|
},
|
|
{ name = 'tag, simple self-closing',
|
|
func = mw.text.tag,
|
|
args = { { name = 'br', content = false } },
|
|
expect = { '<br />' }
|
|
},
|
|
{ name = 'tag, args',
|
|
func = mw.text.tag,
|
|
args = { { name = 'b', attrs = tagattrs } },
|
|
expect = { '<b present key="value" n="42">' }
|
|
},
|
|
{ name = 'tag, args with content',
|
|
func = mw.text.tag,
|
|
args = { { name = 'b', attrs = tagattrs, content = 'foo' } },
|
|
expect = { '<b present key="value" n="42">foo</b>' }
|
|
},
|
|
{ name = 'tag, args self-closing',
|
|
func = mw.text.tag,
|
|
args = { { name = 'br', attrs = tagattrs, content = false } },
|
|
expect = { '<br present key="value" n="42" />' }
|
|
},
|
|
{ name = 'tag, args, positional params',
|
|
func = mw.text.tag,
|
|
args = { 'b', tagattrs },
|
|
expect = { '<b present key="value" n="42">' }
|
|
},
|
|
{ name = 'tag, args with content, positional params',
|
|
func = mw.text.tag,
|
|
args = { 'b', tagattrs, 'foo' },
|
|
expect = { '<b present key="value" n="42">foo</b>' }
|
|
},
|
|
|
|
{ name = 'unstrip (nowiki)',
|
|
func = stripTest,
|
|
args = { mw.text.unstrip, mw.text.stripTest.nowiki },
|
|
expect = { 'NoWiki' }
|
|
},
|
|
{ name = 'unstrip (general)',
|
|
func = stripTest,
|
|
args = { mw.text.unstrip, mw.text.stripTest.general },
|
|
expect = { '' }
|
|
},
|
|
|
|
{ name = 'unstripNoWiki (nowiki)',
|
|
func = stripTest,
|
|
args = { mw.text.unstripNoWiki, mw.text.stripTest.nowiki },
|
|
expect = { 'NoWiki' }
|
|
},
|
|
{ name = 'unstripNoWiki (general)',
|
|
func = stripTest,
|
|
args = { mw.text.unstripNoWiki, mw.text.stripTest.general },
|
|
expect = { 'strip-marker' }
|
|
},
|
|
|
|
{ name = 'killMarkers',
|
|
func = mw.text.killMarkers,
|
|
args = { 'a' .. mw.text.stripTest.nowiki .. 'b' .. mw.text.stripTest.general .. 'c' },
|
|
expect = { 'abc' }
|
|
},
|
|
|
|
{ name = 'split, simple',
|
|
func = mw.text.split, args = { 'a,b,c,d', ',' },
|
|
expect = { { 'a', 'b', 'c', 'd' } }
|
|
},
|
|
{ name = 'split, no separator',
|
|
func = mw.text.split, args = { 'xxx', ',' },
|
|
expect = { { 'xxx' } }
|
|
},
|
|
{ name = 'split, empty string',
|
|
func = mw.text.split, args = { '', ',' },
|
|
expect = { { '' } }
|
|
},
|
|
{ name = 'split, with empty items',
|
|
func = mw.text.split, args = { ',,', ',' },
|
|
expect = { { '', '', '' } }
|
|
},
|
|
{ name = 'split, with empty items (1)',
|
|
func = mw.text.split, args = { 'x,,', ',' },
|
|
expect = { { 'x', '', '' } }
|
|
},
|
|
{ name = 'split, with empty items (2)',
|
|
func = mw.text.split, args = { ',x,', ',' },
|
|
expect = { { '', 'x', '' } }
|
|
},
|
|
{ name = 'split, with empty items (3)',
|
|
func = mw.text.split, args = { ',,x', ',' },
|
|
expect = { { '', '', 'x' } }
|
|
},
|
|
{ name = 'split, with empty items (4)',
|
|
func = mw.text.split, args = { ',x,x', ',' },
|
|
expect = { { '', 'x', 'x' } }
|
|
},
|
|
{ name = 'split, with empty items (5)',
|
|
func = mw.text.split, args = { 'x,,x', ',' },
|
|
expect = { { 'x', '', 'x' } }
|
|
},
|
|
{ name = 'split, with empty items (7)',
|
|
func = mw.text.split, args = { 'x,x,', ',' },
|
|
expect = { { 'x', 'x', '' } }
|
|
},
|
|
{ name = 'split, with empty pattern',
|
|
func = mw.text.split, args = { 'xxx', '' },
|
|
expect = { { 'x', 'x', 'x' } }
|
|
},
|
|
{ name = 'split, with empty pattern (2)',
|
|
func = mw.text.split, args = { 'xxx', ',?' },
|
|
expect = { { 'x', 'x', 'x' } }
|
|
},
|
|
|
|
{ name = 'listToText (0)',
|
|
func = mw.text.listToText, args = { {} },
|
|
expect = { '' }
|
|
},
|
|
{ name = 'listToText (1)',
|
|
func = mw.text.listToText, args = { { 1 } },
|
|
expect = { '1' }
|
|
},
|
|
{ name = 'listToText (2)',
|
|
func = mw.text.listToText, args = { { 1, 2 } },
|
|
expect = { '1 and 2' }
|
|
},
|
|
{ name = 'listToText (3)',
|
|
func = mw.text.listToText, args = { { 1, 2, 3 } },
|
|
expect = { '1, 2 and 3' }
|
|
},
|
|
{ name = 'listToText (4)',
|
|
func = mw.text.listToText, args = { { 1, 2, 3, 4 } },
|
|
expect = { '1, 2, 3 and 4' }
|
|
},
|
|
{ name = 'listToText, alternate separator',
|
|
func = mw.text.listToText, args = { { 1, 2, 3, 4 }, '; ' },
|
|
expect = { '1; 2; 3 and 4' }
|
|
},
|
|
{ name = 'listToText, alternate conjunction',
|
|
func = mw.text.listToText, args = { { 1, 2, 3, 4 }, nil, ' or ' },
|
|
expect = { '1, 2, 3 or 4' }
|
|
},
|
|
|
|
{ name = 'truncate, no truncation',
|
|
func = mw.text.truncate, args = { 'foobarbaz', 9 },
|
|
expect = { 'foobarbaz' }
|
|
},
|
|
{ name = 'truncate, no truncation (2)',
|
|
func = mw.text.truncate, args = { 'foobarbaz', -9 },
|
|
expect = { 'foobarbaz' }
|
|
},
|
|
{ name = 'truncate, tail truncation',
|
|
func = mw.text.truncate, args = { 'foobarbaz', 3 },
|
|
expect = { 'foo...' }
|
|
},
|
|
{ name = 'truncate, head truncation',
|
|
func = mw.text.truncate, args = { 'foobarbaz', -3 },
|
|
expect = { '...baz' }
|
|
},
|
|
{ name = 'truncate, avoid silly truncation',
|
|
func = mw.text.truncate, args = { 'foobarbaz', 8 },
|
|
expect = { 'foobarbaz' }
|
|
},
|
|
{ name = 'truncate, avoid silly truncation (2)',
|
|
func = mw.text.truncate, args = { 'foobarbaz', 6 },
|
|
expect = { 'foobarbaz' }
|
|
},
|
|
{ name = 'truncate, alternate ellipsis',
|
|
func = mw.text.truncate, args = { 'foobarbaz', 3, '!' },
|
|
expect = { 'foo!' }
|
|
},
|
|
{ name = 'truncate, with adjusted length',
|
|
func = mw.text.truncate, args = { 'foobarbaz', 6, nil, true },
|
|
expect = { 'foo...' }
|
|
},
|
|
{ name = 'truncate, with adjusted length (2)',
|
|
func = mw.text.truncate, args = { 'foobarbaz', -6, nil, true },
|
|
expect = { '...baz' }
|
|
},
|
|
{ name = 'truncate, ridiculously short',
|
|
func = mw.text.truncate, args = { 'foobarbaz', 1, nil, true },
|
|
expect = { '...' }
|
|
},
|
|
{ name = 'truncate, ridiculously short (2)',
|
|
func = mw.text.truncate, args = { 'foobarbaz', -1, nil, true },
|
|
expect = { '...' }
|
|
},
|
|
}
|
|
|
|
return testframework.getTestProvider( tests )
|