นี่เป็นมอดูลที่ถูกป้องกันถาวรเนื่องจากมีความเสี่ยงสูง กรุณาอภิปรายการเปลี่ยนแปลงใด ๆ ทาง(หน้าคุย) คุณอาจส่งคำขอแก้ไขไปยังเพื่อให้แก้ไขได้หากเป็นการแก้ไขที่ไม่มีการคัดค้านหรือมีความเห็นพ้องสนับสนุน คุณยังสามารถขอให้เลิกป้องกันหน้าได้ |
- {{[[Module:{{{1}}}|#invoke:{{{1}}}]]|function}}
UnitTests provides a unit test facility that can be used by other scripts using require. See for details. Following is a sample from (Module:Bananas/tests):
-- Unit tests for [[Module:Bananas]]. Click talk page to run tests. local p = require('Module:UnitTests') function p:test_hello() self:preprocess_equals('{{#invoke:Bananas | hello}}', 'Hello, world!') end return p
The talk page (Module talk:Bananas/tests) executes it with {{#invoke: Bananas/tests | run_tests}}
. Test methods like test_hello above must begin with "test".
Methods
- run_tests(differs_at): Runs all tests. If "differs_at=1" is specified, a column will be added showing the first character position where the expected and actual results differ. Normally used on talk page of unit tests.
{{#invoke:Bananas/tests|run_tests}}
- preprocess_equals(text, expected): Gives a piece of wikitext to preprocess and an expected resulting value. Scripts and templates can be invoked in the same manner they would be in a page.
self:preprocess_equals('{{#invoke:Bananas | hello}}', 'Hello, world!')
- preprocess_equals_many(prefix, suffix, cases): Performs a series of preprocess_equals() calls on a set of given pairs. Automatically adds the given prefix and suffix to each text.
self:preprocess_equals_many('{{#invoke:BananasArgs | add |', '}}', { {'2|3', '5'}, {'-2|2', '0'}, })
- preprocess_equals_preprocess(text, expected): Gives two pieces of wikitext to preprocess and determines if they produce the same value. Useful for comparing scripts to existing templates.
self:preprocess_equals_preprocess('{{#invoke:Bananas | hello}}', '{{Hello}}')
- preprocess_equals_preprocess_many(prefix, suffix, cases): Performs a series of preprocess_equals_preprocess() calls on a set of given pairs. The prefix/suffix supplied for both arguments is added automatically. If in any case the second part is not specified, the first part will be used.
self:preprocess_equals_many('{{#invoke:Foo | spellnum |', '}}', '{{spellnum', '}}', { {'2'}, -- equivalent to {'2','2'}, {'-2', '-2.0'}, })
- equals(name, actual, expected): Gives a computed value and the expected value, and checks if they are equal. Useful for testing modules that are designed to be used by other modules rather than using #invoke.
self:equals('Simple addition', 2 + 2, 4)
คู่มือการใช้งานที่ปรากฏด้านบนนี้ดึงมาจาก (มอดูล:UnitTests/doc) (แก้ | ประวัติ) ผู้เขียนสามารถทำการทดลองได้ที่(กระบะทราย) (แก้ | ดูความแตกต่าง) และชุดทดสอบ (สร้าง) ของมอดูลนี้ |
-- UnitTester provides unit testing for other Lua scripts. For details see [[Wikipedia:Lua#Unit_testing]]. -- For user documentation see talk page. local UnitTester = {} local frame, tick, cross local result_table_header = "{|class=\"wikitable\"\n|+ %s\n! !! Text !! Expected !! Actual" local result_table_live_sandbox_header = "{|class=\"wikitable\"\n|+ %s\n! !! Test !! Live !! Sandbox !! Expected" local result_table = { n = 0 } local result_table_mt = { insert = function (self, ...) local n = self.n for i = 1, select('#', ...) do local val = select(i, ...) if val ~= nil then n = n + 1 self[n] = val end end self.n = n end, insert_format = function (self, ...) self:insert(string.format(...)) end, concat = table.concat } result_table_mt.__index = result_table_mt setmetatable(result_table, result_table_mt) local num_failures = 0 function first_difference(s1, s2) if s1 == s2 then return '' end local max = math.min(#s1, #s2) for i = 1, max do if s1:sub(i,i) ~= s2:sub(i,i) then return i end end return max + 1 end local function return_varargs(...) return ... end function UnitTester:preprocess_equals(text, expected, options) local actual = frame:preprocess(text) if actual == expected then result_table:insert('| ', tick) else result_table:insert('| ', cross) num_failures = num_failures + 1 end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or return_varargs local differs_at = self.differs_at and (' \n| ' .. first_difference(expected, actual)) or '' result_table:insert(' \n| ', mw.text.nowiki(text), ' \n| ', maybe_nowiki(expected), ' \n| ', maybe_nowiki(actual), differs_at, "\n|-\n") end function UnitTester:preprocess_equals_many(prefix, suffix, cases, options) for _, case in ipairs(cases) do self:preprocess_equals(prefix .. case[1] .. suffix, case[2], options) end end function UnitTester:preprocess_equals_preprocess(text1, text2, options) local actual = frame:preprocess(text1)-- <actual> and <expected> will be rendered in <result_table> local expected = frame:preprocess(text2) local actual_for_comp = actual-- copy of <actual> that may be modified to have same templatestyles stripmarker as <expected> for comparison local highlight-- boolean true to highlight mismatched renderings in Actual column of result if options and true == options.templatestyles then-- when module rendering has templatestyles strip markers, use ID from expected to prevent false test fail local pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-)(%x+)(%-QINU[^\127]*\127)'-- templatestyle stripmarker pattern local _, expected_stripmarker_id = expected:match(pattern)-- get templatestyles strip marker id from expected (the reference); ignore first capture in pattern if expected_stripmarker_id then actual_for_comp = actual_for_comp:gsub(pattern, '%1' .. expected_stripmarker_id .. '%3')-- replace actual id with expected id; ignore second capture in pattern end end -- option to ignore any strip marker when comparing actual to expected if options and true == options.stripmarker then local pattern = '(\127[^\127]*UNIQ%-%-%l+%-)(%x+)(%-%-?QINU[^\127]*\127)' local _, expected_stripmarker_id = expected:match(pattern) if expected_stripmarker_id then actual_for_comp = actual_for_comp:gsub(pattern, '%1' .. expected_stripmarker_id .. '%3') expected = expected:gsub(pattern, '%1' .. expected_stripmarker_id .. '%3') end end if actual_for_comp == expected then-- are the renderings the same result_table:insert('| ', tick) else result_table:insert('| ', cross)-- nope; mark as failure num_failures = num_failures + 1-- tally highlight=true-- and highlight the results table Actual column cell (so the failed test is more obvious) end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or return_varargs local differs_at = self.differs_at and (' \n| ' .. first_difference(expected, actual)) or '' result_table:insert(' \n| ', mw.text.nowiki(text1),-- the tested template nowikied ' \n| ', maybe_nowiki(expected),-- the expected version highlight and ' \n|style="background: #fc0;"| ' or ' \n| ',-- highlighted if test fail; not else maybe_nowiki(actual), differs_at,-- the actual rendering using its own template styles if that is an option "\n|-\n") end function UnitTester:preprocess_equals_compare(live, sandbox, expected, options) local live_text = frame:preprocess(live) local sandbox_text = frame:preprocess(sandbox) local highlight_live = false local highlight_sandbox = false if live_text == expected and sandbox_text == expected then result_table:insert('| ', tick) else result_table:insert('| ', cross) num_failures = num_failures + 1 if live_text ~= expected then highlight_live = true end if sandbox_text ~= expected then highlight_sandbox = true end end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or return_varargs local differs_at = self.differs_at and (' \n| ' .. first_difference(expected, live_text) or first_difference(expected, sandbox_text)) or '' result_table:insert( ' \n| ', mw.text.nowiki(live), highlight_live and ' \n|style="background: #fc0;"| ' or ' \n| ', maybe_nowiki(live_text), highlight_sandbox and ' \n|style="background: #fc0;"| ' or ' \n| ', maybe_nowiki(sandbox_text), ' \n| ', maybe_nowiki(expected), differs_at, "\n|-\n" ) end function UnitTester:preprocess_equals_preprocess_many(prefix1, suffix1, prefix2, suffix2, cases, options) for _, case in ipairs(cases) do self:preprocess_equals_preprocess(prefix1 .. case[1] .. suffix1, prefix2 .. (case[2] and case[2] or case[1]) .. suffix2, options) end end function UnitTester:preprocess_equals_sandbox_many(module, function_name, cases, options) for _, case in ipairs(cases) do local live = module .. "|" .. function_name .. "|" .. case[1] .. "}}" local sandbox = module .. "/sandbox|" .. function_name .. "|" .. case[1] .. "}}" self:preprocess_equals_compare(live, sandbox, case[2], options) end end function UnitTester:equals(name, actual, expected, options) if actual == expected then result_table:insert('| ', tick) else result_table:insert('| ', cross) num_failures = num_failures + 1 end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or return_varargs local differs_at = self.differs_at and (' \n| ' .. first_difference(expected, actual)) or '' local display = options and options.display or function(x) return x end result_table:insert(' \n| ', name, ' \n| ', maybe_nowiki(tostring(display(expected))), ' \n| ', maybe_nowiki(tostring(display(actual))), differs_at, "\n|-\n") end local function deep_compare(t1, t2, ignore_mt) local ty1 = type(t1) local ty2 = type(t2) if ty1 ~= ty2 then return false end if ty1 ~= 'table' and ty2 ~= 'table' then return t1 == t2 end local mt = getmetatable(t1) if not ignore_mt and mt and mt.__eq then return t1 == t2 end for k1, v1 in pairs(t1) do local v2 = t2[k1] if v2 == nil or not deep_compare(v1, v2) then return false end end for k2, v2 in pairs(t2) do local v1 = t1[k2] if v1 == nil or not deep_compare(v1, v2) then return false end end return true end function val_to_str(v) if type(v) == 'string' then v = mw.ustring.gsub(v, '\n', '\\n') if mw.ustring.match(mw.ustring.gsub(v, '[^\'"]', ''), '^"+$') then return "'" .. v .. "'" end return '"' .. mw.ustring.gsub(v, '"', '\\"' ) .. '"' else return type(v) == 'table' and table_to_str(v) or tostring(v) end end function table_key_to_str(k) if type(k) == 'string' and mw.ustring.match(k, '^[_%a][_%a%d]*$') then return k else return '[' .. val_to_str(k) .. ']' end end function table_to_str(tbl) local result, done = {}, {} for k, v in ipairs(tbl) do table.insert(result, val_to_str(v)) done[k] = true end for k, v in pairs(tbl) do if not done[k] then table.insert(result, table_key_to_str(k) .. '=' .. val_to_str(v)) end end return '{' .. table.concat(result, ',') .. '}' end function UnitTester:equals_deep(name, actual, expected, options) if deep_compare(actual, expected) then result_table:insert('| ', tick) else result_table:insert('| ', cross) num_failures = num_failures + 1 end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or return_varargs local actual_str = val_to_str(actual) local expected_str = val_to_str(expected) local differs_at = self.differs_at and (' \n| ' .. first_difference(expected_str, actual_str)) or '' result_table:insert(' \n| ', name, ' \n| ', maybe_nowiki(expected_str), ' \n| ', maybe_nowiki(actual_str), differs_at, "\n|-\n") end function UnitTester:iterate(examples, func) require 'libraryUtil'.checkType('iterate', 1, examples, 'table') if type(func) == 'string' then func = self[func] elseif type(func) ~= 'function' then error(("bad argument #2 to 'iterate' (expected function or string, got %s)") :format(type(func)), 2) end for i, example in ipairs(examples) do if type(example) == 'table' then func(self, unpack(example)) elseif type(example) == 'string' then self:heading(example) else error(('bad example #%d (expected table, got %s)') :format(i, type(example)), 2) end end end function UnitTester:heading(text) result_table:insert_format(' ! colspan="%u" style="text-align: left" | %s \n |- \n ', self.columns, text) end function UnitTester:run(frame_arg) frame = frame_arg self.frame = frame self.differs_at = frame.args['differs_at'] tick = frame:preprocess('{{Tick}}') cross = frame:preprocess('{{Cross}}') local table_header = result_table_header if frame.args['live_sandbox'] then table_header = result_table_live_sandbox_header end self.columns = 4 if self.differs_at then table_header = table_header .. ' !! Differs at' self.columns = self.columns + 1 end -- Sort results into alphabetical order. local self_sorted = {} for key, _ in pairs(self) do if key:find('^test') then table.insert(self_sorted, key) end end table.sort(self_sorted) -- Add results to the results table. for _, value in ipairs(self_sorted) do result_table:insert_format(table_header .. "\n|-\n", value) self[value](self) result_table:insert("|}\n") end return (num_failures == 0 and "<b style=\"color:#008000\">All tests passed.</b>" or "<b style=\"color:#800000\">" .. num_failures .. " tests failed.</b>[[Category:Failed Lua testcases using Module:UnitTests]]") .. "\n\n" .. frame:preprocess(result_table:concat()) end function UnitTester:new() local o = {} setmetatable(o, self) self.__index = self return o end local p = UnitTester:new() function p.run_tests(frame) return p:run(frame) end return p
wikipedia, แบบไทย, วิกิพีเดีย, วิกิ หนังสือ, หนังสือ, ห้องสมุด, บทความ, อ่าน, ดาวน์โหลด, ฟรี, ดาวน์โหลดฟรี, mp3, วิดีโอ, mp4, 3gp, jpg, jpeg, gif, png, รูปภาพ, เพลง, เพลง, หนัง, หนังสือ, เกม, เกม, มือถือ, โทรศัพท์, Android, iOS, Apple, โทรศัพท์โมบิล, Samsung, iPhone, Xiomi, Xiaomi, Redmi, Honor, Oppo, Nokia, Sonya, MI, PC, พีซี, web, เว็บ, คอมพิวเตอร์
niepnmxdulthithukpxngknthawrenuxngcakmikhwamesiyngsung krunaxphipraykarepliynaeplngid thanghnakhuy khunxacsngkhakhxaekikh ipyngphuduaelrabbephuxihaekikhidhakepnkaraekikhthiimmikarkhdkhanhruxmikhwamehnphxngsnbsnun khunyngsamarthkhxihelikpxngknhnaidkhumuxkarichnganmxdul du aek prawti langaekhch Module 1 invoke 1 function UnitTests provides a unit test facility that can be used by other scripts using require See for details Following is a sample from Module Bananas tests Unit tests for Module Bananas Click talk page to run tests local p require Module UnitTests function p test hello self preprocess equals invoke Bananas hello Hello world end return p The talk page Module talk Bananas tests executes it with invoke Bananas tests run tests Test methods like test hello above must begin with test Methods run tests differs at Runs all tests If differs at 1 is specified a column will be added showing the first character position where the expected and actual results differ Normally used on talk page of unit tests invoke Bananas tests run tests preprocess equals text expected Gives a piece of wikitext to preprocess and an expected resulting value Scripts and templates can be invoked in the same manner they would be in a page self preprocess equals invoke Bananas hello Hello world preprocess equals many prefix suffix cases Performs a series of preprocess equals calls on a set of given pairs Automatically adds the given prefix and suffix to each text self preprocess equals many invoke BananasArgs add 2 3 5 2 2 0 preprocess equals preprocess text expected Gives two pieces of wikitext to preprocess and determines if they produce the same value Useful for comparing scripts to existing templates self preprocess equals preprocess invoke Bananas hello Hello preprocess equals preprocess many prefix suffix cases Performs a series of preprocess equals preprocess calls on a set of given pairs The prefix suffix supplied for both arguments is added automatically If in any case the second part is not specified the first part will be used self preprocess equals many invoke Foo spellnum spellnum 2 equivalent to 2 2 2 2 0 equals name actual expected Gives a computed value and the expected value and checks if they are equal Useful for testing modules that are designed to be used by other modules rather than using invoke self equals Simple addition 2 2 4 khumuxkarichnganthipraktdanbnnidungmacak mxdul UnitTests doc aek prawti phuekhiynsamarththakarthdlxngidthikrabathray aek dukhwamaetktang aelachudthdsxb srang khxngmxdulni hnayxykhxngmxdulni UnitTester provides unit testing for other Lua scripts For details see Wikipedia Lua Unit testing For user documentation see talk page local UnitTester local frame tick cross local result table header class wikitable n s n Text Expected Actual local result table live sandbox header class wikitable n s n Test Live Sandbox Expected local result table n 0 local result table mt insert function self local n self n for i 1 select do local val select i if val nil then n n 1 self n val end end self n n end insert format function self self insert string format end concat table concat result table mt index result table mt setmetatable result table result table mt local num failures 0 function first difference s1 s2 if s1 s2 then return end local max math min s1 s2 for i 1 max do if s1 sub i i s2 sub i i then return i end end return max 1 end local function return varargs return end function UnitTester preprocess equals text expected options local actual frame preprocess text if actual expected then result table insert tick else result table insert cross num failures num failures 1 end local maybe nowiki options and options nowiki and mw text nowiki or return varargs local differs at self differs at and n first difference expected actual or result table insert n mw text nowiki text n maybe nowiki expected n maybe nowiki actual differs at n n end function UnitTester preprocess equals many prefix suffix cases options for case in ipairs cases do self preprocess equals prefix case 1 suffix case 2 options end end function UnitTester preprocess equals preprocess text1 text2 options local actual frame preprocess text1 lt actual gt and lt expected gt will be rendered in lt result table gt local expected frame preprocess text2 local actual for comp actual copy of lt actual gt that may be modified to have same templatestyles stripmarker as lt expected gt for comparison local highlight boolean true to highlight mismatched renderings in Actual column of result if options and true options templatestyles then when module rendering has templatestyles strip markers use ID from expected to prevent false test fail local pattern 127 127 UNIQ templatestyles x QINU 127 127 templatestyle stripmarker pattern local expected stripmarker id expected match pattern get templatestyles strip marker id from expected the reference ignore first capture in pattern if expected stripmarker id then actual for comp actual for comp gsub pattern 1 expected stripmarker id 3 replace actual id with expected id ignore second capture in pattern end end option to ignore any strip marker when comparing actual to expected if options and true options stripmarker then local pattern 127 127 UNIQ l x QINU 127 127 local expected stripmarker id expected match pattern if expected stripmarker id then actual for comp actual for comp gsub pattern 1 expected stripmarker id 3 expected expected gsub pattern 1 expected stripmarker id 3 end end if actual for comp expected then are the renderings the same result table insert tick else result table insert cross nope mark as failure num failures num failures 1 tally highlight true and highlight the results table Actual column cell so the failed test is more obvious end local maybe nowiki options and options nowiki and mw text nowiki or return varargs local differs at self differs at and n first difference expected actual or result table insert n mw text nowiki text1 the tested template nowikied n maybe nowiki expected the expected version highlight and n style background fc0 or n highlighted if test fail not else maybe nowiki actual differs at the actual rendering using its own template styles if that is an option n n end function UnitTester preprocess equals compare live sandbox expected options local live text frame preprocess live local sandbox text frame preprocess sandbox local highlight live false local highlight sandbox false if live text expected and sandbox text expected then result table insert tick else result table insert cross num failures num failures 1 if live text expected then highlight live true end if sandbox text expected then highlight sandbox true end end local maybe nowiki options and options nowiki and mw text nowiki or return varargs local differs at self differs at and n first difference expected live text or first difference expected sandbox text or result table insert n mw text nowiki live highlight live and n style background fc0 or n maybe nowiki live text highlight sandbox and n style background fc0 or n maybe nowiki sandbox text n maybe nowiki expected differs at n n end function UnitTester preprocess equals preprocess many prefix1 suffix1 prefix2 suffix2 cases options for case in ipairs cases do self preprocess equals preprocess prefix1 case 1 suffix1 prefix2 case 2 and case 2 or case 1 suffix2 options end end function UnitTester preprocess equals sandbox many module function name cases options for case in ipairs cases do local live module function name case 1 local sandbox module sandbox function name case 1 self preprocess equals compare live sandbox case 2 options end end function UnitTester equals name actual expected options if actual expected then result table insert tick else result table insert cross num failures num failures 1 end local maybe nowiki options and options nowiki and mw text nowiki or return varargs local differs at self differs at and n first difference expected actual or local display options and options display or function x return x end result table insert n name n maybe nowiki tostring display expected n maybe nowiki tostring display actual differs at n n end local function deep compare t1 t2 ignore mt local ty1 type t1 local ty2 type t2 if ty1 ty2 then return false end if ty1 table and ty2 table then return t1 t2 end local mt getmetatable t1 if not ignore mt and mt and mt eq then return t1 t2 end for k1 v1 in pairs t1 do local v2 t2 k1 if v2 nil or not deep compare v1 v2 then return false end end for k2 v2 in pairs t2 do local v1 t1 k2 if v1 nil or not deep compare v1 v2 then return false end end return true end function val to str v if type v string then v mw ustring gsub v n n if mw ustring match mw ustring gsub v then return v end return mw ustring gsub v else return type v table and table to str v or tostring v end end function table key to str k if type k string and mw ustring match k a a d then return k else return val to str k end end function table to str tbl local result done for k v in ipairs tbl do table insert result val to str v done k true end for k v in pairs tbl do if not done k then table insert result table key to str k val to str v end end return table concat result end function UnitTester equals deep name actual expected options if deep compare actual expected then result table insert tick else result table insert cross num failures num failures 1 end local maybe nowiki options and options nowiki and mw text nowiki or return varargs local actual str val to str actual local expected str val to str expected local differs at self differs at and n first difference expected str actual str or result table insert n name n maybe nowiki expected str n maybe nowiki actual str differs at n n end function UnitTester iterate examples func require libraryUtil checkType iterate 1 examples table if type func string then func self func elseif type func function then error bad argument 2 to iterate expected function or string got s format type func 2 end for i example in ipairs examples do if type example table then func self unpack example elseif type example string then self heading example else error bad example d expected table got s format i type example 2 end end end function UnitTester heading text result table insert format colspan u style text align left s n n self columns text end function UnitTester run frame arg frame frame arg self frame frame self differs at frame args differs at tick frame preprocess Tick cross frame preprocess Cross local table header result table header if frame args live sandbox then table header result table live sandbox header end self columns 4 if self differs at then table header table header Differs at self columns self columns 1 end Sort results into alphabetical order local self sorted for key in pairs self do if key find test then table insert self sorted key end end table sort self sorted Add results to the results table for value in ipairs self sorted do result table insert format table header n n value self value self result table insert n end return num failures 0 and lt b style color 008000 gt All tests passed lt b gt or lt b style color 800000 gt num failures tests failed lt b gt Category Failed Lua testcases using Module UnitTests n n frame preprocess result table concat end function UnitTester new local o setmetatable o self self index self return o end local p UnitTester new function p run tests frame return p run frame end return p