File

tests/test_util_async.lua @ 7437:ff74188488ab

tests: Add initial tests for util.async
author Matthew Wild <mwild1@gmail.com>
date Sun, 22 May 2016 20:06:51 +0100
child 8209:39f24de4f53f
line wrap: on
line source


-- Test passing nil to runner
-- Test runners work correctly after errors (coroutine gets recreated)
-- What happens if an error is thrown, but more items are in the queue? (I think runner might stall)
-- Test errors thrown halfway through a queue
-- Multiple runners

function runner(new_runner, async)
	local function new(func)
		local log = {};
		return new_runner(func, setmetatable({}, {
			__index = function (_, event)
				return function (runner, err)
					print("event", event, err)
					table.insert(log, { event = event, err = err });
				end;
			end;
		})), log;
	end
	
	--------------------
	local r, l = new(function (item) assert(type(item) == "number") end);
	r:run(1);
	r:run(2);
	for k, v in ipairs(l) do print(k,v) end

	--------------------
	local wait, done;

	local r, l = new(function (item)
		assert(type(item) == "number")
		if item == 3 then
			wait, done = async.waiter();
			wait();
		end
	end);
	
	r:run(1);
	assert(r.state == "ready");
	r:run(2);
	assert(r.state == "ready");
	r:run(3);
	assert(r.state == "waiting");
	done();
	assert(r.state == "ready");
	for k, v in ipairs(l) do print(k,v) end

	--------------------
	local wait, done;
	local last_item = 0;
	local r, l = new(function (item)
		assert(type(item) == "number")
		assert(item == last_item + 1);
		last_item = item;
		if item == 3 then
			wait, done = async.waiter();
			wait();
		end
	end);
	
	r:run(1);
	assert(r.state == "ready");
	r:run(2);
	assert(r.state == "ready");
	r:run(3);
	assert(r.state == "waiting");
	r:run(4);
	assert(r.state == "waiting");
	done();
	assert(r.state == "ready");
	for k, v in ipairs(l) do print(k,v) end

	--------------------
	local wait, done;
	local last_item = 0;
	local r, l = new(function (item)
		assert(type(item) == "number")
		assert((item == last_item + 1) or item == 3);
		last_item = item;
		if item == 3 then
			wait, done = async.waiter();
			wait();
		end
	end);
	
	r:run(1);
	assert(r.state == "ready");
	r:run(2);
	assert(r.state == "ready");
	
	local dones = {};
	r:run(3);
	assert(r.state == "waiting");
	r:run(3);
	assert(r.state == "waiting");
	r:run(3);
	assert(r.state == "waiting");
	r:run(4);
	assert(r.state == "waiting");

	for i = 1, 3 do
		done();
		if i < 3 then
			assert(r.state == "waiting");
		end
	end

	assert(r.state == "ready");
	for k, v in ipairs(l) do print(k,v) end

	--------------------
	local wait, done;
	local last_item = 0;
	local r, l = new(function (item)
		assert(type(item) == "number")
		assert((item == last_item + 1) or item == 3);
		last_item = item;
		if item == 3 then
			wait, done = async.waiter();
			wait();
		end
	end);
	
	r:run(1);
	assert(r.state == "ready");
	r:run(2);
	assert(r.state == "ready");
	
	local dones = {};
	r:run(3);
	assert(r.state == "waiting");
	r:run(3);
	assert(r.state == "waiting");

	for i = 1, 2 do
		done();
		if i < 2 then
			assert(r.state == "waiting");
		end
	end

	assert(r.state == "ready");
	r:run(4);
	assert(r.state == "ready");

	assert(r.state == "ready");
	for k, v in ipairs(l) do print(k,v) end
end