diff options
| author | ruki <[email protected]> | 2019-06-09 15:58:33 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2019-06-09 15:58:33 +0800 |
| commit | 3a1db57753528053ab1c457675257efe7250bc87 (patch) | |
| tree | f6a0a74de240153123268fd483e3cdd3d0ee0050 /tests/test_utils | |
| parent | e165a8e43abed4eb2eca64c3b5adefb57cd65600 (diff) | |
| parent | 8049d92b3e9aef35e4f124e5ae361bdd1f5c5435 (diff) | |
Merge pull request #444 from OpportunityLiu/test
Improve test library
Diffstat (limited to 'tests/test_utils')
| -rw-r--r-- | tests/test_utils/build.lua | 37 | ||||
| -rw-r--r-- | tests/test_utils/check.lua | 38 | ||||
| -rw-r--r-- | tests/test_utils/print_error.lua | 31 | ||||
| -rw-r--r-- | tests/test_utils/test_assert.lua | 70 |
4 files changed, 176 insertions, 0 deletions
diff --git a/tests/test_utils/build.lua b/tests/test_utils/build.lua new file mode 100644 index 000000000..7725f1ddc --- /dev/null +++ b/tests/test_utils/build.lua @@ -0,0 +1,37 @@ +-- imports +import("privilege.sudo") + +-- main entry +function main(argv) + + -- check global config + os.exec("xmake g -c") + + -- generic? + os.exec("xmake f -c") + os.exec("xmake") + os.exec("xmake p -D") + if os.host() ~= "windows" then + os.exec("xmake install -o /tmp -a -D") + os.exec("xmake uninstall --installdir=/tmp -D") + end + os.exec("xmake c -D") + os.exec("xmake f --mode=debug -D") + os.exec("xmake m -b") + os.exec("xmake -r -a -D") + os.exec("xmake m -e buildtest") + os.exec("xmake m -l") + os.exec("xmake m buildtest") + if sudo.has() then + sudo.exec("xmake install --all -D") + sudo.exec("xmake uninstall -D") + end + os.exec("xmake m -d buildtest") + + -- test iphoneos? + if argv and argv.iphoneos then + if os.host() == "macosx" then + os.exec("xmake m package -p iphoneos") + end + end +end diff --git a/tests/test_utils/check.lua b/tests/test_utils/check.lua new file mode 100644 index 000000000..bc9ddb6b6 --- /dev/null +++ b/tests/test_utils/check.lua @@ -0,0 +1,38 @@ + + +function _tablelength(table) + local count = 0 + for _ in pairs(table) do count = count + 1 end + return count +end + +function _get_rep(value) + if type(value) == "nil" then return "(nil)" end + if type(value) == "string" then return "`" .. value .. "`" end + return tostring(value) +end + +function same(actual, expacted) + return actual == expacted, _get_rep(actual), _get_rep(expacted) +end + +function equal(actual, expacted) + local same, ap, ep = same(actual, expacted) + if same then return true, ap, ep end + if type(expacted) == "table" and type(actual) == "table" then + local al = _tablelength(actual) + local el = _tablelength(expacted) + if al ~= el then + return false, vformat("{...(%d elements)}", al), vformat("{...(%d elements)}", el) + end + for k, v in pairs(expacted) do + local av = actual[k] + local eq, app, epp = equal(av, v) + if not eq then + return false, vformat("{[%s] = %s, ...}", k, app), vformat("{[%s] = %s, ...}", k, epp) + end + end + return true, "{...}", "{...}" + end + return false, ap, ep +end
\ No newline at end of file diff --git a/tests/test_utils/print_error.lua b/tests/test_utils/print_error.lua new file mode 100644 index 000000000..dcf1e82bb --- /dev/null +++ b/tests/test_utils/print_error.lua @@ -0,0 +1,31 @@ + +function main(t, message, funcs_or_filename, abort_reason) + local funcs = nil + if type(funcs_or_filename) == "function" then + funcs = { debug.getinfo(funcs_or_filename) } + elseif type(funcs_or_filename) == "table" then + funcs = {} + for _, v in ipairs(funcs_or_filename) do + table.insert(funcs, debug.getinfo(v)) + end + else + assert(type(funcs_or_filename) == "string") + funcs = {} + local uplevel = 2 + local func = nil + repeat + func = debug.getinfo(uplevel) + if (func and func.source:endswith(funcs_or_filename)) then + table.insert(funcs, func) + end + uplevel = uplevel + 1 + until func == nil + end + cprint(">> ${red}test failed:${reset} %s", message) + for _, func in ipairs(funcs) do + local line = (func.currentline >= 0) and func.currentline or func.linedefined + local name = (func.func == t.func) and t.funcname or func.name or "(anonymous)" + cprint(">> function %s ${underline}%s${reset}:${bright}%d${reset}", name, func.source, line) + end + raise("aborting because of ${red}%s${reset} ...", abort_reason or "failed assertion") +end
\ No newline at end of file diff --git a/tests/test_utils/test_assert.lua b/tests/test_utils/test_assert.lua new file mode 100644 index 000000000..42a276d87 --- /dev/null +++ b/tests/test_utils/test_assert.lua @@ -0,0 +1,70 @@ + +import("print_error") +import("check") + +local test_assert = { print_error = print_error.main } + +function test_assert:require(value) + if not value then + self:print_error(vformat("require ${green}true${reset} but got ${red}%s${reset}", value), self.filename) + end +end + +function test_assert:require_not(value) + if value then + self:print_error(vformat("require ${green}false${reset} but got ${red}%s${reset}", value), self.filename) + end +end + +function test_assert:are_same(actual, expacted) + local r, ap, ep = check.same(actual, expacted) + if not r then + self:print_error(format("expacted: ${green}%s${reset}, actual ${red}%s${reset}", ep, ap), self.filename) + end +end + +function test_assert:are_not_same(actual, expacted) + local r, ap, ep = check.same(actual, expacted) + if r then + self:print_error(format("expacted: ${green}%s${reset}, actual ${red}%s${reset}", ep, ap), self.filename) + end +end + + +function test_assert:are_equal(actual, expacted) + local r, ap, ep = check.equal(actual, expacted) + if not r then + self:print_error(format("expacted: ${green}%s${reset}, actual ${red}%s${reset}", ep, ap), self.filename) + end +end + +function test_assert:are_not_equal(actual, expacted) + local r, ap, ep = check.equal(actual, expacted) + if r then + self:print_error(format("expacted: ${green}%s${reset}, actual ${red}%s${reset}", ep, ap), self.filename) + end +end + +test_assert._will_raise_stack = {} +function test_assert:will_raise(func, message_pattern) + table.insert(self._will_raise_stack, 1, debug.getinfo(2).func) + try{ + func, + finally{ + function (ok, error) + local funcs = { func, unpack(self._will_raise_stack) } + if ok then + self:print_error("expected raise but finished successfully", funcs) + elseif message_pattern and not string.find(error, message_pattern) then + self:print_error(format("expected raise with message ${green}%s${reset} but got ${red}%s${reset}", message_pattern, error), funcs) + end + end + } + } + table.remove(self._will_raise_stack, 1) +end + +function main(context) + table.join2(context, test_assert) + return context +end
\ No newline at end of file |
