SyntaxGameServer/RCCService2018/content/Rhodium/Modules/Test4R/TestPlanner.lua

70 lines
1.8 KiB
Lua

local Enums = require(script.Parent.Enums)
local TestNode = require(script.Parent.TestNode)
local createModdableFunction = require(script.Parent.createModdableFunction)
local TestPlanner = {}
TestPlanner.__index = TestPlanner
local function doPlan(currentNode, method, env)
local currentEnv = getfenv(method)
for key, value in pairs(env) do
currentEnv[key] = value
end
local success, result = xpcall(method, function(err)
return err .. "\n" .. debug.traceback()
end)
if not success then
currentNode.loadSuccess = false
currentNode.errorMessage = result
end
end
local validModifiers = {
protected = Enums.Modifier.Protect,
skipped = Enums.Modifier.Skip,
}
local function createEnv(currentNode)
local function describe(modifiers, text, callback)
local testNode = TestNode.new(text, Enums.Type.Describe, modifiers)
currentNode:addChild(testNode)
currentNode = testNode
local success, result = xpcall(callback, function(err)
return err .. "\n" .. debug.traceback()
end)
if not success then
testNode.loadSuccess = false
testNode.errorMessage = result
end
currentNode = currentNode.parent
end
local function step(modifiers, text, callback)
local testNode = TestNode.new(text, Enums.Type.Step, modifiers)
testNode.callback = callback
currentNode:addChild(testNode)
end
local env = {}
env.describe = createModdableFunction(validModifiers, describe)
env.step = createModdableFunction(validModifiers, step)
env.skip = function()
currentNode.modifiers[Enums.Modifier.Skip] = true
end
env.include = function(method)
doPlan(currentNode, method, env)
end
return env
end
function TestPlanner.plan(method)
local currentNode = TestNode.new("Root", Enums.Type.Describe)
local env = createEnv(currentNode)
doPlan(currentNode, method, env)
return currentNode
end
return TestPlanner