SyntaxGameServer/RCCService2020/ExtraContent/LuaPackages/ErrorReporters/Backtrace/BacktraceReport.spec.lua

197 lines
4.9 KiB
Lua

return function()
local BacktraceReport = require(script.Parent.BacktraceReport)
local CorePackages = game:GetService("CorePackages")
local tutils = require(CorePackages.Packages.tutils)
describe(".new", function()
it("should return a valid report", function()
local report = BacktraceReport.new()
local isValid = report:validate()
expect(isValid).to.equal(true)
end)
end)
describe(":validate", function()
it("should return false if the report has registers but no arch information, true otherwise", function()
local report = BacktraceReport.new()
report.threads = {
default = {
stack = {
[1] = {
registers = {
rax = "16045690984833335023",
},
}
},
},
}
expect(report:validate()).to.equal(false)
-- invalid arch
report.arch = {
name = "x64",
regsiters = nil,
}
expect(report:validate()).to.equal(false)
-- correct arch
report.arch = {
name = "x64",
registers = {
rax = "u64",
},
}
expect(report:validate()).to.equal(true)
end)
end)
describe("IAnnotations", function()
local IAnnotations = BacktraceReport.IAnnotations
it("should return false if not a table", function()
local result = IAnnotations("string")
expect(result).to.equal(false)
end)
it("should return false if a non-table value is not string, number, or boolean", function()
local result = IAnnotations({
Value = function() end,
})
expect(result).to.equal(false)
result = IAnnotations({
Value = "ha",
Value2 = 1,
Value3 = false,
Recursive = {
Value11 = "haha",
MoreRecursive = {
Value12 = "hahaha",
Value22 = function() end,
},
},
})
expect(result).to.equal(false)
end)
it("should return true for an empty table", function()
expect(IAnnotations({})).to.equal(true)
end)
it("should return true if a non-table value is either string, number, or boolean", function()
local result = IAnnotations({
Value = "ha",
Value2 = 1,
Value3 = false,
Recursive = {
Value11 = "haha",
Value21 = 2,
Array = {
[1] = "hahaha",
[2] = 3,
[3] = true,
},
},
})
expect(result).to.equal(true)
end)
end)
describe(":addAttributes", function()
it("should correctly add attributes", function()
local report = BacktraceReport.new()
report:addAttributes({
att1 = 1,
})
expect(tutils.fieldCount(report.attributes)).to.equal(1)
expect(report.attributes.att1).to.equal(1)
report:addAttributes({
att1 = 2,
att2 = false,
att3 = "test",
})
expect(tutils.fieldCount(report.attributes)).to.equal(3)
expect(report.attributes.att1).to.equal(2)
expect(report.attributes.att2).to.equal(false)
expect(report.attributes.att3).to.equal("test")
end)
end)
describe(":addAnnotations", function()
it("should correctly add annotations", function()
local environmentVariables = {
ENV_VAR_EXAMPLE = "example",
}
local dependencies = {
Roact = {
version = "0.2.0",
},
Otter = {
version = "0.1.0",
},
}
local report = BacktraceReport.new()
report:addAnnotations({
EnvironmentVariables = environmentVariables,
})
expect(tutils.fieldCount(report.annotations)).to.equal(1)
expect(tutils.deepEqual(report.annotations.EnvironmentVariables, environmentVariables)).to.equal(true)
report:addAnnotations({
SomeProperty = true,
Dependencies = dependencies,
})
expect(tutils.fieldCount(report.annotations)).to.equal(3)
expect(tutils.deepEqual(report.annotations.EnvironmentVariables, environmentVariables)).to.equal(true)
expect(report.annotations.SomeProperty).to.equal(true)
expect(tutils.deepEqual(report.annotations.Dependencies, dependencies)).to.equal(true)
end)
end)
describe(":addStackToThread", function()
it("should correctly add stack to the thread with the name provided", function()
local stack1 = {
[1] = {
line = "100",
funcName = "field testError",
sourceCode = "1",
}
}
local stack2 = {
[1] = {
line = "110",
funcName = "field ?",
sourceCode = "2",
}
}
local report = BacktraceReport.new()
report:addStackToThread(stack1, "main")
expect(tutils.fieldCount(report.threads)).to.equal(1)
expect(tutils.deepEqual(report.threads.main.stack, stack1)).to.equal(true)
report:addStackToThread(stack2, "1")
expect(tutils.fieldCount(report.threads)).to.equal(2)
expect(tutils.deepEqual(report.threads.main.stack, stack1)).to.equal(true)
expect(tutils.deepEqual(report.threads["1"].stack, stack2)).to.equal(true)
end)
end)
describe(".fromMessageAndStack", function()
it("should return a valid report", function()
local report = BacktraceReport.fromMessageAndStack("index nil", "Script 'Workspace.Script', Line 3")
local isValid = report:validate()
expect(isValid).to.equal(true)
end)
end)
end