Mercurial > prosody-hg
comparison spec/util_async_spec.lua @ 8630:deade38ffbbd
util.async: tests: slight modifications to allow more code reuse in tests
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 19 Mar 2018 16:24:42 +0000 |
| parents | e88744fa0985 |
| children | 1daabc077393 |
comparison
equal
deleted
inserted
replaced
| 8629:ddb04cacb8b1 | 8630:deade38ffbbd |
|---|---|
| 7 require "util.logger".add_simple_sink(print); | 7 require "util.logger".add_simple_sink(print); |
| 8 else | 8 else |
| 9 print = function () end | 9 print = function () end |
| 10 end | 10 end |
| 11 | 11 |
| 12 local function mock_watchers() | 12 local function mock_watchers(event_log) |
| 13 local function generic_logging_watcher(name) | |
| 14 return function (...) | |
| 15 table.insert(event_log, { name = name, n = select("#", ...)-1, select(2, ...) }); | |
| 16 end; | |
| 17 end; | |
| 13 return setmetatable(mock{ | 18 return setmetatable(mock{ |
| 14 ready = function () end; | 19 ready = generic_logging_watcher("ready"); |
| 15 waiting = function () end; | 20 waiting = generic_logging_watcher("waiting"); |
| 16 error = function () end; | 21 error = generic_logging_watcher("error"); |
| 17 }, { | 22 }, { |
| 18 __index = function (_, event) | 23 __index = function (_, event) |
| 19 -- Unexpected watcher called | 24 -- Unexpected watcher called |
| 20 assert(false); | 25 assert(false); |
| 21 end; | 26 end; |
| 22 }) | 27 }) |
| 23 end | 28 end |
| 24 | 29 |
| 25 local function new(func, name) | 30 local function new(func, name) |
| 26 local log = {}; | 31 local event_log = {}; |
| 27 return async.runner(func, mock_watchers()), log; | 32 local spy_func = spy.new(func); |
| 33 return async.runner(spy_func, mock_watchers(event_log)), event_log, spy_func; | |
| 28 end | 34 end |
| 29 describe("#runner", function() | 35 describe("#runner", function() |
| 30 it("should work", function() | 36 it("should work", function() |
| 31 local r, l = new(function (item) assert(type(item) == "number") end); | 37 local r, l = new(function (item) assert(type(item) == "number") end); |
| 32 r:run(1); | 38 r:run(1); |
| 535 end); | 541 end); |
| 536 | 542 |
| 537 it("should support multiple done() calls", function () | 543 it("should support multiple done() calls", function () |
| 538 local processed_item; | 544 local processed_item; |
| 539 local wait, done; | 545 local wait, done; |
| 540 local rf = spy.new(function (item) | 546 local r, _, rf = new(function (item) |
| 541 wait, done = async.waiter(4); | 547 wait, done = async.waiter(4); |
| 542 wait(); | 548 wait(); |
| 543 processed_item = item; | 549 processed_item = item; |
| 544 end); | 550 end); |
| 545 local r = async.runner(rf, mock_watchers()); | |
| 546 r:run("test"); | 551 r:run("test"); |
| 547 for i = 1, 3 do | 552 for i = 1, 3 do |
| 548 done(); | 553 done(); |
| 549 assert.equal(r.state, "waiting"); | 554 assert.equal(r.state, "waiting"); |
| 550 assert.is_nil(processed_item); | 555 assert.is_nil(processed_item); |
| 556 end); | 561 end); |
| 557 | 562 |
| 558 it("should not allow done() to be called more than specified", function () | 563 it("should not allow done() to be called more than specified", function () |
| 559 local processed_item; | 564 local processed_item; |
| 560 local wait, done; | 565 local wait, done; |
| 561 local rf = spy.new(function (item) | 566 local r, _, rf = new(function (item) |
| 562 wait, done = async.waiter(4); | 567 wait, done = async.waiter(4); |
| 563 wait(); | 568 wait(); |
| 564 processed_item = item; | 569 processed_item = item; |
| 565 end); | 570 end); |
| 566 local r = async.runner(rf, mock_watchers()); | |
| 567 r:run("test"); | 571 r:run("test"); |
| 568 for i = 1, 4 do | 572 for i = 1, 4 do |
| 569 done(); | 573 done(); |
| 570 end | 574 end |
| 571 assert.has_error(done);; | 575 assert.has_error(done);; |
| 574 assert.spy(r.watchers.error).was_not.called(); | 578 assert.spy(r.watchers.error).was_not.called(); |
| 575 end); | 579 end); |
| 576 | 580 |
| 577 it("should allow done() to be called before wait()", function () | 581 it("should allow done() to be called before wait()", function () |
| 578 local processed_item; | 582 local processed_item; |
| 579 local rf = spy.new(function (item) | 583 local r, _, rf = new(function (item) |
| 580 local wait, done = async.waiter(); | 584 local wait, done = async.waiter(); |
| 581 done(); | 585 done(); |
| 582 wait(); | 586 wait(); |
| 583 processed_item = item; | 587 processed_item = item; |
| 584 end); | 588 end); |
| 585 local r = async.runner(rf, mock_watchers()); | |
| 586 r:run("test"); | 589 r:run("test"); |
| 587 assert.equal(processed_item, "test"); | 590 assert.equal(processed_item, "test"); |
| 588 assert.equal(r.state, "ready"); | 591 assert.equal(r.state, "ready"); |
| 589 -- Since the observable state did not change, | 592 -- Since the observable state did not change, |
| 590 -- the watchers should not have been called | 593 -- the watchers should not have been called |
