You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

281 lines
7.6 KiB

--[[
//////////////////////////////////////////////////////////////////////////
// date : 2013-5-4
// auth : macroli(idehong@gmail.com)
// ver : 0.3
// desc : output
//////////////////////////////////////////////////////////////////////////
--]]
------------------------------------------------------------------------------
--module(..., package.seeall)
-- for test output
local TestOutPutBase = {}
function TestOutPutBase:new(oo)
local o = oo or {}
setmetatable(o, self)
self.__index = self
return o
end
function TestOutPutBase.FilterInfo(self, ...)
end
function TestOutPutBase.BeginCase(self, strLabelName)
end
function TestOutPutBase.EndCase(self, bRun, bSuccess, iTime, strLabelName)
end
function TestOutPutBase.BeginSuite(self, iNumber, strSuiteName)
end
function TestOutPutBase.EndSuite(self, iNumber, strSuiteName, iTime, iFailedNum)
end
function TestOutPutBase.BeginGroupSuite(self, iCaseNum, iSuiteNum)
end
function TestOutPutBase.EndGroupSuite(self, iCaseNum, iSuiteNum, iTime, iFailedNum, iStartTime)
end
function TestOutPutBase.BeginGroupEnv(self, strTip)
end
function TestOutPutBase.EndGroupEnv(self, strTip)
end
function TestOutPutBase.FailedTxt(self, ...)
end
function TestOutPutBase.StaticInfo(self)
end
function TestOutPutBase.GetStaticInfo(self)
end
function TestOutPutBase.Message(self, ...)
print( self:mergerTxt(...) )
end
function TestOutPutBase.mergerTxt(self, ...)
return string.format(...)
end
-- for test output
CmdTestOutPut = TestOutPutBase:new()
function CmdTestOutPut:new(oo)
local o = oo or {}
o.output = {
labelNum = 10,
fmt = { left = "[%-10s]", right = "[%10s]", },
label = { run = {label=" RUN", fmt="left",}, ok = {label="OK ", fmt="right",}, failed = {label=" FAILED", fmt="left",},
passed = {label=" PASSED", fmt="left",},
split = {label="----------", fmt="right",},
group = {label="==========", fmt="right",},
},
}
o.stat = {
iTotalCase = 0, iTotalSuite = 0, iTotalPassed = 0,
tFailedName = {},
iCurrCaseCount = 0,
}
setmetatable(o, self)
self.__index = self
return o
end
function CmdTestOutPut.outerList(self, strFun, ...)
if not self.outer then return end
for i, v in pairs(self.outer) do
v[strFun](v, ...)
end
end
function CmdTestOutPut.FilterInfo(self, ...)
self:Message(...)
self:outerList("FilterInfo", ...)
end
function CmdTestOutPut.BeginCase(self, strLabelName)
self.stat.iCurrCaseCount = 1 + self.stat.iCurrCaseCount
self:Message("%s %s", self:getFMTStr("run", string.format(" %d%%", math.floor(self.stat.iCurrCaseCount*100/self.stat.iTotalCase))), strLabelName)
self:outerList("BeginCase", strLabelName)
end
function CmdTestOutPut.EndCase(self, bRun, bSuccess, iTime, strLabelName)
if not bRun then return end
if bSuccess then
self.stat.iTotalPassed = 1 + self.stat.iTotalPassed
self:Message("%s %s (%f ms)", self:getFMTStr("ok"), strLabelName, iTime)
else
table.insert(self.stat.tFailedName, strLabelName)
self:Message("%s %s (%f ms)", self:getFMTStr("failed"), strLabelName, iTime)
end
self:outerList("EndCase", bRun, bSuccess, iTime, strLabelName)
end
function CmdTestOutPut.BeginSuite(self, iNumber, strSuiteName)
self:Message("%s %d tests from %s.", self:getFMTStr("split"), iNumber, strSuiteName)
self:outerList("BeginSuite", iNumber, strSuiteName)
end
function CmdTestOutPut.EndSuite(self, iNumber, strSuiteName, iTime, iFailedNum)
self:Message("%s %d tests from %s (%f ms total).\n", self:getFMTStr("split"), iNumber, strSuiteName, iTime)
self:outerList("EndSuite", iNumber, strSuiteName, iTime, iFailedNum)
end
function CmdTestOutPut.BeginGroupSuite(self, iCaseNum, iSuiteNum)
self.stat = {
iTotalCase = iCaseNum, iTotalSuite = iSuiteNum, iTotalPassed = 0,
tFailedName = {},
iCurrCaseCount = 0,
}
self:Message("%s Running %d tests from %d test cases", self:getFMTStr("group"), iCaseNum, iSuiteNum)
self:outerList("BeginGroupSuite", iCaseNum, iSuiteNum)
end
function CmdTestOutPut.EndGroupSuite(self, iTime)
self:Message("%s Running %d tests from %d test cases ran. (%f ms total)", self:getFMTStr("group"), self.stat.iTotalCase, self.stat.iTotalSuite, iTime)
self:outerList("EndGroupSuite", iTime)
end
function CmdTestOutPut.BeginGroupEnv(self)
self:Message("%s Global test environment set-up.", self:getFMTStr("split"))
end
function CmdTestOutPut.EndGroupEnv(self)
self:Message("%s Global test environment tear-down.", self:getFMTStr("split"))
end
function CmdTestOutPut.FailedTxt(self, ...)
self:Message(...)
self:outerList("FailedTxt", ...)
end
function TestOutPutBase.Message(self, ...)
if not self.silence then print( self:mergerTxt(...) ) end
end
function CmdTestOutPut.StaticInfo(self)
self:Message("%s %d tests.", self:getFMTStr("passed"), self.stat.iTotalPassed)
local iFailedNum = #self.stat.tFailedName
if iFailedNum <= 0 then return end
self:Message("%s %d tests, listed below:", self:getFMTStr("failed"), iFailedNum)
for k, v in pairs(self.stat.tFailedName) do
self:Message("%s %s", self:getFMTStr("failed"), v)
end
self:outerList("StaticInfo")
error(string.format("%d SUITES, %d TESTS, %d FAILED", self.stat.iTotalSuite, self.stat.iTotalCase, iFailedNum))
end
function CmdTestOutPut.GetStaticInfo(self)
local iFailedNum = #self.stat.tFailedName
return {iTotalSuite=self.stat.iTotalSuite, iTotalCase=self.stat.iTotalCase, iFailedNum=iFailedNum}
end
function CmdTestOutPut.getFMTStr(self, label, addvalue)
local tObj = self.output.label[label]
if addvalue then
return string.format(self.output.fmt[tObj.fmt], tObj.label .. addvalue)
else
return string.format(self.output.fmt[tObj.fmt], tObj.label)
end
end
--------------------------------------------------------------------------------
CAllCaseListOutPut = TestOutPutBase:new()
function CAllCaseListOutPut:new(oo)
local o = oo or {}
o.data = {f=false}
setmetatable(o, self)
self.__index = self
return o
end
function CAllCaseListOutPut.BeginCase(self, strLabelName)
self:Message(strLabelName)
end
function CAllCaseListOutPut.EndSuite(self, iNumber, strSuiteName, iTime, iFailedNum)
if self.data.f then self.data.f:flush() end
end
function CAllCaseListOutPut.BeginGroupSuite(self, iCaseNum, iSuiteNum)
f = io.open(self.filename, "w+b")
if not f then return end
self.data.f = f
end
function CAllCaseListOutPut.EndGroupSuite(self, iCaseNum, iSuiteNum, iTime, iFailedNum, iStartTime)
if self.data.f then
self.data.f:close()
self.data.f = false
end
end
function CAllCaseListOutPut.Message(self, ...)
if self.data.f then self.data.f:write(self:mergerTxt(...) .. "\r\n") end
end
CFailedCaseListOutPut = TestOutPutBase:new()
function CFailedCaseListOutPut:new(oo)
local o = oo or {}
o.data = {f=false}
setmetatable(o, self)
self.__index = self
return o
end
function CFailedCaseListOutPut.EndCase(self, bRun, bSuccess, iTime, strLabelName)
if bRun and not bSuccess then
self:Message(strLabelName .. "\r\n\r\n")
end
end
function CFailedCaseListOutPut.EndSuite(self, iNumber, strSuiteName, iTime, iFailedNum)
if self.data.f then self.data.f:flush() end
end
function CFailedCaseListOutPut.BeginGroupSuite(self, iCaseNum, iSuiteNum)
f = io.open(self.filename, "w+b")
if not f then return end
self.data.f = f
end
function CFailedCaseListOutPut.EndGroupSuite(self, iCaseNum, iSuiteNum, iTime, iFailedNum, iStartTime)
if self.data.f then
self.data.f:close()
self.data.f = false
end
end
function CFailedCaseListOutPut.FailedTxt(self, ...)
self:Message(...)
end
function CFailedCaseListOutPut.Message(self, ...)
if self.data.f then self.data.f:write(self:mergerTxt(...) .. "\r\n") end
end