summaryrefslogtreecommitdiff
path: root/tests/test_utils
diff options
context:
space:
mode:
authorruki <[email protected]>2019-06-09 15:58:33 +0800
committerGitHub <[email protected]>2019-06-09 15:58:33 +0800
commit3a1db57753528053ab1c457675257efe7250bc87 (patch)
treef6a0a74de240153123268fd483e3cdd3d0ee0050 /tests/test_utils
parente165a8e43abed4eb2eca64c3b5adefb57cd65600 (diff)
parent8049d92b3e9aef35e4f124e5ae361bdd1f5c5435 (diff)
Merge pull request #444 from OpportunityLiu/test
Improve test library
Diffstat (limited to 'tests/test_utils')
-rw-r--r--tests/test_utils/build.lua37
-rw-r--r--tests/test_utils/check.lua38
-rw-r--r--tests/test_utils/print_error.lua31
-rw-r--r--tests/test_utils/test_assert.lua70
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