.emit
raises an error when called with more than two parameters
assert.raises 'parameter', -> signal.emit 'foo', {}, 2
raises an error when the second parameter is not a table
assert.raises 'table', -> signal.emit 'foo', 2
returns false if no handlers returned true
assert.is_false signal.emit 'foo'
signal.connect 'foo', -> 'this is fortunately not true'
assert.is_false signal.emit 'foo'
invokes all handlers in their own coroutines
coros = {}
coro_register = ->
co, main = coroutine.running!
coros[co] = true unless main
handler1 = spy.new coro_register
handler2 = spy.new coro_register
signal.connect 'foo', handler1
signal.connect 'foo', handler2
signal.emit 'foo'
assert.equal 2, #[v for _, v in pairs coros]
(when a handler returns .abort)
skips invoking subsequent handlers
handler2 = spy.new -> true
signal.connect 'foo', -> signal.abort
signal.connect 'foo', handler2
signal.emit 'foo'
assert.spy(handler2).was.not_called!
returns .abort
signal.connect 'foo', -> signal.abort
assert.equals signal.abort, signal.emit 'foo'
(when a handler raises an error)
logs an error message
signal.connect 'foo', -> error 'BOOM'
signal.emit 'foo'
assert.match log.last_error.message, 'BOOM'
continues processing subsequent handlers
handler2 = spy.new -> true
signal.connect 'foo', -> error 'BOOM'
signal.connect 'foo', handler2
signal.emit 'foo'
assert.spy(handler2).was_called!
(when a handler yields)
continues on invoking subsequent handlers
handler2 = spy.new -> true
signal.connect 'foo', -> coroutine.yield false
signal.connect 'foo', handler2
signal.emit 'foo'
assert.spy(handler2).was_called!
returns false
signal.connect 'foo', -> coroutine.yield true
assert.is_false signal.emit 'foo'