查看“模块:UnitTests”的源代码
←
模块:UnitTests
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
-- 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! !! Text !! Expected !! Actual" local result_table = '' 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 function UnitTester:preprocess_equals(text, expected, options) local actual = frame:preprocess(text) if actual == expected then result_table = result_table .. '| ' .. tick else result_table = result_table .. '| ' .. cross num_failures = num_failures + 1 end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or function(...) return ... end local differs_at = self.differs_at and (' \n| ' .. first_difference(expected, actual)) or '' result_table = result_table .. ' \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) local expected = frame:preprocess(text2) if actual == expected then result_table = result_table .. '| ' .. tick else result_table = result_table .. '| ' .. cross num_failures = num_failures + 1 end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or function(...) return ... end local differs_at = self.differs_at and (' \n| ' .. first_difference(expected, actual)) or '' result_table = result_table .. ' \n| ' .. mw.text.nowiki(text1) .. ' \n| ' .. maybe_nowiki(expected) .. ' \n| ' .. maybe_nowiki(actual) .. 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:equals(name, actual, expected, options) if actual == expected then result_table = result_table .. '| ' .. tick else result_table = result_table .. '| ' .. cross num_failures = num_failures + 1 end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or function(...) return ... end local differs_at = self.differs_at and (' \n| ' .. first_difference(expected, actual)) or '' result_table = result_table .. ' \n| ' .. name .. ' \n| ' .. maybe_nowiki(tostring(expected)) .. ' \n| ' .. maybe_nowiki(tostring(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 = result_table .. '| ' .. tick else result_table = result_table .. '| ' .. cross num_failures = num_failures + 1 end local maybe_nowiki = (options and options.nowiki) and mw.text.nowiki or function(...) return ... end 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 = result_table .. ' \n| ' .. name .. ' \n| ' .. maybe_nowiki(expected_str) .. ' \n| ' .. maybe_nowiki(actual_str) .. differs_at .. "\n|-\n" 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 self.differs_at then table_header = table_header .. ' !! Differs at' end -- Sort results into alphabetical order. local self_sorted = {} for key,value 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 i,value in ipairs(self_sorted) do result_table = result_table .. "\n\n'''" .. value .. "''':\n" .. table_header .. "\n|-\n" self[value](self) result_table = result_table .. "|}" end return (num_failures == 0 and '<strong style="color:#008000;">All tests passed.</strong>' or '<strong class="error" style="font-size:100%;">' .. num_failures .. ' tests failed.</strong>') .. frame:preprocess(result_table) 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
本页使用的模板:
模块:UnitTests/doc
(
查看源代码
)
返回
模块:UnitTests
。
导航菜单
个人工具
登录
命名空间
模块
讨论
English
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
学习园地
新人须知
教程整合
论坛百科
SS分区介绍
论坛设定
论坛文化
传奇殿堂
SS大事年表
SS大学图书馆
维基事务
基本规则
新手指南——技术
新手指南——内容
wiki语法手册
规范全集
工具
链入页面
相关更改
特殊页面
页面信息