summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/luv/lib/tap.lua
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/luv/lib/tap.lua')
-rw-r--r--3rdparty/luv/lib/tap.lua165
1 files changed, 165 insertions, 0 deletions
diff --git a/3rdparty/luv/lib/tap.lua b/3rdparty/luv/lib/tap.lua
new file mode 100644
index 00000000000..d1cfb59c249
--- /dev/null
+++ b/3rdparty/luv/lib/tap.lua
@@ -0,0 +1,165 @@
+local uv = require('luv')
+local dump = require('lib/utils').dump
+local stdout = require('lib/utils').stdout
+
+local function protect(...)
+ local n = select('#', ...)
+ local arguments = {...}
+ for i = 1, n do
+ arguments[i] = tostring(arguments[i])
+ end
+
+ local text = table.concat(arguments, "\t")
+ text = " " .. string.gsub(text, "\n", "\n ")
+ print(text)
+end
+
+local function pprotect(...)
+ local n = select('#', ...)
+ local arguments = { ... }
+
+ for i = 1, n do
+ arguments[i] = dump(arguments[i])
+ end
+
+ protect(table.concat(arguments, "\t"))
+end
+
+
+local tests = {};
+
+local function run()
+ local passed = 0
+
+ if #tests < 1 then
+ error("No tests specified!")
+ end
+
+ print("1.." .. #tests)
+ for i = 1, #tests do
+ local test = tests[i]
+ local cwd = uv.cwd()
+ local pass, err = xpcall(function ()
+ local expected = 0
+ local function expect(fn, count)
+ expected = expected + (count or 1)
+ return function (...)
+ expected = expected - 1
+ local ret = fn(...)
+ collectgarbage()
+ return ret
+ end
+ end
+ test.fn(protect, pprotect, expect, uv)
+ collectgarbage()
+ uv.run()
+ collectgarbage()
+ if expected > 0 then
+ error("Missing " .. expected .. " expected call" .. (expected == 1 and "" or "s"))
+ elseif expected < 0 then
+ error("Found " .. -expected .. " unexpected call" .. (expected == -1 and "" or "s"))
+ end
+ collectgarbage()
+ local unclosed = 0
+ uv.walk(function (handle)
+ if handle == stdout then return end
+ unclosed = unclosed + 1
+ print("UNCLOSED", handle)
+ end)
+ if unclosed > 0 then
+ error(unclosed .. " unclosed handle" .. (unclosed == 1 and "" or "s"))
+ end
+ if uv.cwd() ~= cwd then
+ error("Test moved cwd from " .. cwd .. " to " .. uv.cwd())
+ end
+ collectgarbage()
+ end, debug.traceback)
+
+ -- Flush out any more opened handles
+ uv.stop()
+ uv.walk(function (handle)
+ if handle == stdout then return end
+ if not uv.is_closing(handle) then uv.close(handle) end
+ end)
+ uv.run()
+ uv.chdir(cwd)
+
+ if pass then
+ print("ok " .. i .. " " .. test.name)
+ passed = passed + 1
+ else
+ protect(err)
+ print("not ok " .. i .. " " .. test.name)
+ end
+ end
+
+ local failed = #tests - passed
+ if failed == 0 then
+ print("# All tests passed")
+ else
+ print("#" .. failed .. " failed test" .. (failed == 1 and "" or "s"))
+ end
+
+ -- Close all then handles, including stdout
+ uv.walk(uv.close)
+ uv.run()
+
+ os.exit(-failed)
+end
+
+local single = true
+local prefix
+
+local function tap(suite)
+
+ if type(suite) == "function" then
+ -- Pass in suite directly for single mode
+ suite(function (name, fn)
+ if prefix then
+ name = prefix .. ' - ' .. name
+ end
+ tests[#tests + 1] = {
+ name = name,
+ fn = fn
+ }
+ end)
+ prefix = nil
+ elseif type(suite) == "string" then
+ prefix = suite
+ single = false
+ else
+ -- Or pass in false to collect several runs of tests
+ -- And then pass in true in a later call to flush tests queue.
+ single = suite
+ end
+
+ if single then run() end
+
+end
+
+
+--[[
+-- Sample Usage
+
+local passed, failed, total = tap(function (test)
+
+ test("add 1 to 2", function(print)
+ print("Adding 1 to 2")
+ assert(1 + 2 == 3)
+ end)
+
+ test("close handle", function (print, p, expect, uv)
+ local handle = uv.new_timer()
+ uv.close(handle, expect(function (self)
+ assert(self == handle)
+ end))
+ end)
+
+ test("simulate failure", function ()
+ error("Oopsie!")
+ end)
+
+end)
+]]
+
+return tap