diff --git a/telescope.lua b/telescope.lua index 7250653..08a85c2 100644 --- a/telescope.lua +++ b/telescope.lua @@ -12,6 +12,12 @@ local compat_env = require 'telescope.compat_env' local getfenv = _G.getfenv or compat_env.getfenv local setfenv = _G.setfenv or compat_env.setfenv +local red = string.char(27) .. '[31m' +local blue = string.char(27) .. '[34m' +local green = string.char(27) .. '[32m' +local yellow = string.char(27) .. '[33m' +local grey = string.char(27) .. '[37m' +local normal = string.char(27) .. '[0m' local _VERSION = "0.6.0" @@ -52,6 +58,14 @@ local status_labels = { [status_codes.unassertive] = 'U' } +local status_colors = { + [status_codes.err] = red, + [status_codes.fail] = red, + [status_codes.pass] = green, + [status_codes.pending] = blue, + [status_codes.unassertive] = yellow +} + --- The default names for context blocks. It defaults to "context", "spec" and -- "describe." -- @name context_aliases @@ -155,7 +169,7 @@ local function make_assertion(name, message, func) local a = {} local args = {...} local nargs = select('#', ...) - if nargs > num_vars then + if nargs > num_vars then local userErrorMessage = args[num_vars+1] if type(userErrorMessage) == "string" then return(assertion_message_prefix .. userErrorMessage) @@ -443,12 +457,12 @@ local function run(contexts, callbacks, test_filter) table.sort(ancestors) -- this "before" is the test callback passed into the runner invoke_callback("before", result) - + -- run all the "before" blocks/functions for _, a in ipairs(ancestors) do - if contexts[a].before then + if contexts[a].before then setfenv(contexts[a].before, env) - contexts[a].before() + contexts[a].before() end end @@ -465,9 +479,9 @@ local function run(contexts, callbacks, test_filter) -- Run all the "after" blocks/functions table.reverse(ancestors) for _, a in ipairs(ancestors) do - if contexts[a].after then + if contexts[a].after then setfenv(contexts[a].after, env) - contexts[a].after() + contexts[a].after() end end @@ -482,8 +496,9 @@ end --- Return a detailed report for each context, with the status of each test. -- @param contexts The contexts returned by load_contexts. -- @param results The results returned by run. +-- @param use_color Add console colors to report -- @function test_report -local function test_report(contexts, results) +local function test_report(contexts, results, use_color) local buffer = {} local leading_space = " " @@ -514,8 +529,9 @@ local function test_report(contexts, results) if item.context then table.insert(buffer, context_name_format:format(space() .. name .. ':')) elseif results[i] then - table.insert(buffer, function_name_format:format(space() .. name) .. - status_format:format(results[i].status_label)) + local color = use_color and status_colors[results[i].status_code] or "" + table.insert(buffer, color .. function_name_format:format(space() .. name) .. + status_format:format(results[i].status_label) .. (use_color and normal or "")) end end add_divider() @@ -545,35 +561,37 @@ end -- pending, tests, unassertive. -- @param contexts The contexts returned by load_contexts. -- @param results The results returned by run. +-- @param use_color Add console colors to report -- @function summary_report -local function summary_report(contexts, results) +local function summary_report(contexts, results, use_color) local r = { - assertions = 0, - errors = 0, - failed = 0, - passed = 0, - pending = 0, - tests = 0, - unassertive = 0 + assertions = { count = 0, color = normal }, + errors = { count = 0, color = status_colors[status_codes.err] }, + failed = { count = 0, color = status_colors[status_codes.fail] }, + passed = { count = 0, color = status_colors[status_codes.pass] }, + pending = { count = 0, color = status_colors[status_codes.pending] }, + tests = { count = 0, color = normal }, + unassertive = { count = 0, color = status_colors[status_codes.unassertive] }, } for _, v in pairs(results) do - r.tests = r.tests + 1 - r.assertions = r.assertions + v.assertions_invoked - if v.status_code == status_codes.err then r.errors = r.errors + 1 - elseif v.status_code == status_codes.fail then r.failed = r.failed + 1 - elseif v.status_code == status_codes.pass then r.passed = r.passed + 1 - elseif v.status_code == status_codes.pending then r.pending = r.pending + 1 - elseif v.status_code == status_codes.unassertive then r.unassertive = r.unassertive + 1 + r.tests.count = r.tests.count + 1 + r.assertions.count = r.assertions.count + v.assertions_invoked + if v.status_code == status_codes.err then r.errors.count = r.errors.count + 1 + elseif v.status_code == status_codes.fail then r.failed.count = r.failed.count + 1 + elseif v.status_code == status_codes.pass then r.passed.count = r.passed.count + 1 + elseif v.status_code == status_codes.pending then r.pending.count = r.pending.count + 1 + elseif v.status_code == status_codes.unassertive then r.unassertive.count = r.unassertive.count + 1 end end local buffer = {} - for _, k in ipairs({"tests", "passed", "assertions", "failed", "errors", "unassertive", "pending"}) do - local number = r[k] + for _, k in ipairs({ "tests", "passed", "failed", "errors", "assertions", "unassertive", "pending" }) do + local number = r[k].count local label = k + local color = use_color and r[k].color or "" if number == 1 then label = label:gsub("s$", "") end - table.insert(buffer, ("%d %s"):format(number, label)) + table.insert(buffer, ("%s%d %s%s"):format(color, number, label, use_color and normal or "")) end return table.concat(buffer, " "), r end diff --git a/tsc b/tsc index a9ec753..3bc5ccc 100755 --- a/tsc +++ b/tsc @@ -161,6 +161,7 @@ Options: -s --silent Don't show any output -h,-? --help Show this text -v --version Show version + -C --color Use console colors in report -c --luacov Output a coverage file using Luacov (http://luacov.luaforge.net/) --load= Load a Lua file before executing command --name= Only run tests whose name matches a Lua string pattern @@ -272,10 +273,10 @@ end local buffer = {} local results = telescope.run(contexts, callbacks, test_pattern) -local summary, data = telescope.summary_report(contexts, results) +local summary, data = telescope.summary_report(contexts, results, opts.C or opts.color) if opts.f or opts.full then - table.insert(buffer, telescope.test_report(contexts, results)) + table.insert(buffer, telescope.test_report(contexts, results, opts.C or opts.color)) end if not opts.s and not opts.silent then