scansion/console.lua

Wed, 12 Sep 2018 10:57:23 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Wed, 12 Sep 2018 10:57:23 +0100
changeset 145
df4faaa2d36f
parent 133
e087dd875160
child 146
885fa9f5929d
permissions
-rw-r--r--

scansion.console: Support for indentation in lines() helper

local pretty = require "scansion.pretty".new({});

local function lines(l, indent)
	return table.concat(l, "\n"..string.rep(" ", indent or 0));
end

local handlers = {
	["script"] = function (data)
		return "TEST: "..(data.title or data.filename or "untitled");
	end;
	["test-passed"] = function ()
		return "PASS";
	end;
	["test-failed"] = function (data)
		local error_text;
		if data.error and data.error.type == "unexpected-stanza" then
			error_text = "Received unexpected stanza:\n\n"..pretty(data.error.data.stanza, 4);
			if data.error.data.expected then
				error_text = error_text.."\n\nExpected:\n\n"..pretty(data.error.data.expected, 4);
			end
		else
			error_text = tostring(data.error);
		end
		return "FAIL: "..error_text
	end;
	["test-error"] = function (data)
		return "ERROR: "..tostring(data.error);
	end;

	["action"] = function (data)
		local action = data.action;
		local obj_type = data.object_type;
		local l = {};
		if data.annotation then
			table.insert(l, action.annotation);
		end
		table.insert(l, data.object.." "..action);
		if data.extra and obj_type == "client" and (action == "sends" or action == "receives") then
			table.insert(l, "\n"..pretty(lines(data.extra), 4).."\n");
		end
		return lines(l);
	end;

	["end"] = function (data)
		local r = {};

		local all_results = {};
		for k, v in pairs(data.summary.all) do
			table.insert(all_results, v);
		end
		table.sort(all_results, function (a, b) return a.name < b.name end);

		print("");
		print("Summary");
		print("-------");

		for _, test_result in ipairs(all_results) do
			print("", test_result.status, test_result.name);
		end

		print("");

		for _, test_result in ipairs{ "ok", "fail", "error", "total" } do
			local count = data.summary[test_result] and #data.summary[test_result] or 0;
			table.insert(r, tostring(count).." "..test_result);
		end
		return table.concat(r, " / ");
	end;
};

local quiet_handlers = { "test-failed", "test-error" };

local function new(config)
	local h = {};
	if config.quiet then
		for _, handler_name in ipairs(quiet_handlers) do
			h[handler_name] = handlers[handler_name];
		end
		if config.summary then
			h["end"] = handlers["end"];
		end
	else
		h = handlers;
	end
	return h;
end

return {
	new = new;
}

mercurial