mirror of https://github.com/bjc/prosody
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.0 KiB
148 lines
3.0 KiB
|
|
-- 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
|
|
|