123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- ---
- -- test_assertions.lua
- --
- -- Assertion functions for unit tests.
- --
- -- Author Jason Perkins
- -- Copyright (c) 2008-2016 Jason Perkins and the Premake project.
- ---
- local p = premake
- local m = p.modules.self_test
- local _ = {}
- function m.capture(expected)
- local actual = p.captured() .. p.eol()
- -- create line-by-line iterators for both values
- local ait = actual:gmatch("(.-)" .. p.eol())
- local eit = expected:gmatch("(.-)\n")
- -- compare each value line by line
- local linenum = 1
- local atxt = ait()
- local etxt = eit()
- while etxt do
- if (etxt ~= atxt) then
- m.fail("(%d) expected:\n%s\n...but was:\n%s\nfulltext:\n%s", linenum, etxt, atxt, actual)
- end
- linenum = linenum + 1
- atxt = ait()
- etxt = eit()
- end
- end
- function m.closedfile(expected)
- if expected and not m.value_closedfile then
- m.fail("expected file to be closed")
- elseif not expected and m.value_closedfile then
- m.fail("expected file to remain open")
- end
- end
- function m.contains(expected, actual)
- if type(expected) == "table" then
- for i, v in ipairs(expected) do
- m.contains(v, actual)
- end
- elseif not table.contains(actual, expected) then
- m.fail("expected value %s not found", expected)
- end
- end
- function m.excludes(expected, actual)
- if type(expected) == "table" then
- for i, v in ipairs(expected) do
- m.excludes(v, actual)
- end
- elseif table.contains(actual, expected) then
- m.fail("excluded value %s found", expected)
- end
- end
- function m.fail(format, ...)
- -- if format is a number then it is the stack depth
- local depth = 3
- local arg = {...}
- if type(format) == "number" then
- depth = depth + format
- format = table.remove(arg, 1)
- end
- -- convert nils into something more usefuls
- for i = 1, #arg do
- if (arg[i] == nil) then
- arg[i] = "(nil)"
- elseif (type(arg[i]) == "table") then
- arg[i] = "{" .. table.concat(arg[i], ", ") .. "}"
- end
- end
- local msg = string.format(format, table.unpack(arg))
- error(debug.traceback(msg, depth), depth)
- end
- function m.filecontains(expected, fn)
- local f = io.open(fn)
- local actual = f:read("*a")
- f:close()
- if (expected ~= actual) then
- m.fail("expected %s but was %s", expected, actual)
- end
- end
- function m.hasoutput()
- local actual = p.captured()
- if actual == "" then
- m.fail("expected output, received none");
- end
- end
- function m.isemptycapture()
- local actual = p.captured()
- if actual ~= "" then
- m.fail("expected empty capture, but was %s", actual);
- end
- end
- function m.isequal(expected, actual, depth)
- depth = depth or 0
- if type(expected) == "table" then
- if expected and not actual then
- m.fail(depth, "expected table, got nil")
- end
- if #expected < #actual then
- m.fail(depth, "expected %d items, got %d", #expected, #actual)
- end
- for k,v in pairs(expected) do
- m.isequal(expected[k], actual[k], depth + 1)
- end
- else
- if (expected ~= actual) then
- m.fail(depth, "expected %s but was %s", expected, actual or "nil")
- end
- end
- return true
- end
- function m.isfalse(value)
- if (value) then
- m.fail("expected false but was true")
- end
- end
- function m.isnil(value)
- if (value ~= nil) then
- m.fail("expected nil but was " .. tostring(value))
- end
- end
- function m.isnotnil(value)
- if (value == nil) then
- m.fail("expected not nil")
- end
- end
- function m.issame(expected, action)
- if expected ~= action then
- m.fail("expected same value")
- end
- end
- function m.istrue(value)
- if (not value) then
- m.fail("expected true but was false")
- end
- end
- function m.missing(value, actual)
- if table.contains(actual, value) then
- m.fail("unexpected value %s found", value)
- end
- end
- function m.openedfile(fname)
- if fname ~= m.value_openedfilename then
- local msg = "expected to open file '" .. fname .. "'"
- if m.value_openedfilename then
- msg = msg .. ", got '" .. m.value_openedfilename .. "'"
- end
- m.fail(msg)
- end
- end
- function m.success(fn, ...)
- local ok, err = pcall(fn, ...)
- if not ok then
- m.fail("call failed: " .. err)
- end
- end
- function m.stderr(expected)
- if not expected and m.stderr_capture then
- m.fail("Unexpected: " .. m.stderr_capture)
- elseif expected then
- if not m.stderr_capture or not m.stderr_capture:find(expected) then
- m.fail(string.format("expected '%s'; got %s", expected, m.stderr_capture or "(nil)"))
- end
- end
- end
- function m.notstderr(expected)
- if not expected and not m.stderr_capture then
- m.fail("Expected output on stderr; none received")
- elseif expected then
- if m.stderr_capture and m.stderr_capture:find(expected) then
- m.fail(string.format("stderr contains '%s'; was %s", expected, m.stderr_capture))
- end
- end
- end
|