!! options parsoid-compatible version=2 !! end # Force the test runner to ensure the extension is loaded !! functionhooks invoke !! endfunctionhooks !! article Module:Test !! text local p = {} local isoTestData = '' local bit = require('bit') function p.tooFewArgs() require() end function p.getAllArgs( frame ) local buf = {} local names = {} local values = {} for name, value in pairs( frame.args ) do table.insert(names, name) values[name] = value end table.sort(names, function (a, b) return tostring(a) < tostring(b) end) for index, name in ipairs(names) do if #buf ~= 0 then table.insert( buf, ', ' ) end table.insert( buf, name .. '=' .. values[name] ) end return table.concat( buf ) end function p.getAllArgs2( frame ) local buf = {} local names = {} local values = {} for name, value in frame:argumentPairs() do table.insert(names, name) values[name] = value end table.sort(names, function (a, b) return tostring(a) < tostring(b) end) for index, name in ipairs(names) do if #buf ~= 0 then table.insert( buf, ', ' ) end table.insert( buf, name .. '=' .. values[name] ) end return table.concat( buf ) end function p.getNumericArgs( frame ) local buf = {} for index, value in ipairs(frame.args) do if #buf ~= 0 then table.insert( buf, ', ' ) end table.insert( buf, index .. '=' .. value ) end return table.concat( buf ) end function p.getArg( frame ) local name = frame.args[1] return frame:getArgument( name ):expand() end function p.getArgLength( frame ) local name = frame.args[1] return #(frame.args[name]) end function p.getArgType( frame ) local name = frame.args[1] return type( frame.args[name] ) end function p.hello() return 'hello' end function p.emptyTable() return {} end function p.import() return require('Module:Test2').countBeans() end function p.bitop() return bit.bor(1, bit.bor(2, bit.bor(4, 8))) end function p.isolationTestUpvalue( frame ) isoTestData = isoTestData .. frame.args[1] return isoTestData end function p.isolationTestGlobal( frame ) if isoTestDataGlobal == nil then isoTestDataGlobal = '' end isoTestDataGlobal = isoTestDataGlobal .. frame.args[1] return isoTestDataGlobal end function p.getParentArgs( frame ) return p.getAllArgs( frame:getParent() ) end function p.testExpandTemplate( frame ) return frame:expandTemplate{ title = 'Scribunto_all_args', args = { x = 1, y = 2, z = '|||' } } end function p.testExpandTemplateWithHeaders( frame ) return frame:expandTemplate{ title = 'Scribunto_template_with_headers' } end function p.testNewTemplateParserValue( frame ) return frame:newTemplateParserValue{ title = 'Scribunto_all_args', args = { x = 1, y = 2, z = 'blah' } } : expand() end function p.testPreprocess( frame ) return frame:preprocess( '{{Scribunto_all_args|{{{1}}}}}|x=y' ) end function p.testNewParserValue( frame ) return frame:newParserValue( '{{Scribunto_all_args|{{{1}}}}}|x=y' ):expand() end function p.null( frame ) return '\0' end function p.isSubsting( frame ) return tostring( mw.isSubsting() ) end function p.getFrameTitle( frame ) return frame:getTitle() end p['test=InFunctionName'] = function( frame ) return frame.args[1] end function p.testStrippedCss( frame ) return mw.html.create( 'div' ):css( 'color', frame.args[1] ) end function p.testFrameCaching( frame ) return string.format( 'Parent frame is the root: %s. Child frame is the root: %s.', frame:getParent():preprocess('noyes'), frame:preprocess('noyes') ) end function p.testIsRedirect( frame ) local name = frame.args[1] local title = mw.title.new( name ) if title.redirectTarget then return string.format( "redirects to %s", title.redirectTarget.prefixedText ) else return "not a redirect" end end return p !! endarticle !! article Module:Test2 !! text return { countBeans = function () return 3 end } !! endarticle !! article Module:Metatables !! text local p, mt1, mt2 = {}, {}, {} mt1.__index = {} function p.zero(frame) return 'You called the zero method from p' end function mt1.__index.one(frame) return 'You called the one method from mt1' end function mt2.__index(t, k) return function(frame) return 'You called the ' .. k .. ' method from mt2' end end setmetatable(mt1.__index, mt2) setmetatable(p, mt1) return p !! endarticle !! article Module:Redirected !! text return require [[Module:Test]] !! endarticle !! article Module:Test "with" quotes !! text return require [[Module:Test]] !! endarticle !! article Module:Redirected "with" quotes !! text return require [[Module:Test "with" quotes]] !! endarticle !! article Template:Scribunto_all_args !! text {{#invoke:test|getParentArgs}} !! endarticle !! article Template:Scribunto_template_with_headers !! text == bar == !! endarticle !! article Template:Scribunto_frame_caching !! text {{#invoke:test|testFrameCaching}} !! endarticle !! test Scribunto: no such module !! options parsoid={ "modes": ["wt2html","wt2wt"] } cat extension=ScribuntoErrors-5e10d413 !! wikitext {{#invoke:foo|bar}} !! metadata cat=Pages_with_script_errors sort= extension[ScribuntoErrors-5e10d413]="

Script error: No such module \"foo\".

No further details are available.

" !! html/php

Script error: No such module "foo".

!! html/parsoid

Script error: No such module "foo".

!! end !! test Scribunto: no such function !! options parsoid={ "modes": ["wt2html","wt2wt"] } cat extension=ScribuntoErrors-d64a22ba !! wikitext {{#invoke:test|blah}} !! metadata cat=Pages_with_script_errors sort= extension[ScribuntoErrors-d64a22ba]="

Script error: The function \"blah\" does not exist.

No further details are available.

" !! html/php

Script error: The function "blah" does not exist.

!! html/parsoid

Script error: The function "blah" does not exist.

!! end !! test Scribunto: hello world !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|hello}} !! html

hello

!! end !! test Scribunto: redirect to hello world !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:redirected|hello}} {{#invoke:redirected "with" quotes|hello}} {{#invoke:redirected|testIsRedirect|Module:Redirected}} {{#invoke:redirected "with" quotes|testIsRedirect|Module:Test "with" quotes}} {{#invoke:redirected "with" quotes|testIsRedirect|Module:Redirected "with" quotes}} !! html

hello hello redirects to Module:Test redirects to Module:Test redirects to Module:Test "with" quotes

!! end !! test Scribunto: getAllArgs !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|getAllArgs|x|y|z|a=1|b=2|c=3|7=?}} !! html

1=x, 2=y, 3=z, 7=?, a=1, b=2, c=3

!! end !! test Scribunto: getAllArgs, deprecated style !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|getAllArgs2|x|y|z|a=1|b=2|c=3|7=?}} !! html

1=x, 2=y, 3=z, 7=?, a=1, b=2, c=3

!! end !! test Scribunto: getNumericArgs !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|getNumericArgs|x|y|z|a=1|b=2|c=3|7=?}} !! html

1=x, 2=y, 3=z

!! end !! test Scribunto: named numeric parameters !! options parsoid={ "modes": ["wt2html","wt2wt"] } !! wikitext {{#invoke:test|getArg|2|a|2=b}} {{#invoke:test|getArg|2|2=a|b}} !! html/php

b b

!! html/parsoid

b b

!! end !! test Scribunto: template-style argument trimming !! options parsoid={ "modes": ["wt2html","wt2wt"] } !! wikitext {{#invoke:test|getArgLength|2| x }} {{#invoke:test|getArgLength|2|2= x }} !! html/php

3 1

!! html/parsoid

3 1

!! end !! test Scribunto: missing argument !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|getArgType|2}} {{#invoke:test|getArgType|blah}} !! html

nil nil

!! end !! test Scribunto: parent frame access !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{Scribunto_all_args|x|y|z|a = 1|b = 2|c = 3}} !! html

1=x, 2=y, 3=z, a=1, b=2, c=3

!! end !! test Scribunto: expandTemplate !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|testExpandTemplate}} !! html

x=1, y=2, z=|||

!! end !! test Scribunto: expandTemplate with headers !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext ==foo== {{#invoke:test|testExpandTemplateWithHeaders}} !! html

foo[edit]

bar[edit]

!! end !! test Scribunto: newTemplateParserValue !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|testNewTemplateParserValue}} !! html

x=1, y=2, z=blah

!! end !! test Scribunto: preprocess !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|testPreprocess|foo}} !! html

1=foo|x=y

!! end !! test Scribunto: newParserValue !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|testNewParserValue|foo}} !! html

1=foo|x=y

!! end !! test Scribunto: table return !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|emptyTable}} !! html

table

!! end !! test Scribunto: require !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|import}} !! html

3

!! end !! test Scribunto: access to a module imported at the chunk level !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|bitop}} !! html

15

!! end !! test Scribunto: invoke instance upvalue isolation !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|isolationTestUpvalue|1}} {{#invoke:test|isolationTestUpvalue|2}} {{#invoke:test|isolationTestUpvalue|3}} !! html

1 2 3

!! end !! test Scribunto: invoke instance global isolation !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|isolationTestGlobal|1}} {{#invoke:test|isolationTestGlobal|2}} {{#invoke:test|isolationTestGlobal|3}} !! html

1 2 3

!! end !! test Scribunto: ASCII null !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|null}} !! html

!! end !! test Scribunto: isSubsting during PST !! options pst parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{safesubst:#invoke:test|isSubsting}} !! html true !! end !! test Scribunto: isSubsting during normal parse !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{safesubst:#invoke:test|isSubsting}} !! html

false

!! end !! test Scribunto: frame:getTitle !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|getFrameTitle}} !! html

Module:Test

!! end !! test Scribunto: Metatable on export table !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:Metatables|zero}} {{#invoke:Metatables|one}} {{#invoke:Metatables|two}} !! html

You called the zero method from p You called the one method from mt1 You called the two method from mt2

!! end !! test Scribunto: Correct argument numbering with equals sign in function name !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|test=InFunctionName|good|bad}} !! html

good

!! end !! test Scribunto: Strip markers in CSS !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext {{#invoke:test|testStrippedCss|#ff0000}} !! html
!! end !! test Scribunto: Parser output isn't incorrectly cached across frames !! options parsoid={ "modes": ["wt2html","wt2wt"], "normalizePhp": true } !! wikitext Root: {{#invoke:test|testFrameCaching}} Template: {{Scribunto frame caching}} !! html

Root: Parent frame is the root: yes. Child frame is the root: no. Template: Parent frame is the root: no. Child frame is the root: no.

!! end # Tests for T272507 !! article Module:EchoTest !! text local p = {} function p.echo(frame) return frame.args[1] end return p !! end !! article Module:UnstripTest !! text local p = {} function p.unstrip(frame) return mw.text.nowiki(mw.text.unstripNoWiki(frame.args[1])) end return p !! end !! test Scribunto: Test unstripNowiki behavior !! options parsoid={ "modes": ["wt2html","wt2wt"] } !! wikitext {{#invoke:EchoTest|echo|foo}} {{#invoke:EchoTest|echo|[[Foo]]}} {{#invoke:UnstripTest|unstrip|foo}} {{#invoke:UnstripTest|unstrip|[[Foo]]}} !! html/php

foo [[Foo]]

foo [[Foo]]

!! html/parsoid

foo [[Foo]]

foo [[Foo]]

!! end