Files
lua-matrix/test/eventable.lua
Adrian Perez de Castro fc99710658 Improvements to matrix.eventable
* Support debug-logging to stderr by defining the MATRIX_EVENTABLE_DEBUG_LOG
  environment variable.
* Support for unhooking handlers from events.
* Simplify the low-level interface: eventable.functions() now returns the
  created functions directly, cutting down on an intermediate table.
* A new eventable.object() allows adding :hook(), :unhook() and :fire()
  methods to any table. Firing events always sends the table itself as first
  event parameter when firing any event.
2016-07-01 04:55:16 +03:00

74 lines
1.8 KiB
Lua

--
-- eventable.lua
-- Copyright (C) 2016 Adrian Perez <aperez@igalia.com>
--
-- Distributed under terms of the MIT license.
--
local eventable = require "matrix.eventable"
do -- Simple event
local fire, hook = assert(eventable())
local flag = false
hook("foo", function () flag = true end)
fire("foo")
assert(flag)
end
do -- Stop at first handler that returns some value
local fire, hook = assert(eventable())
local flag1, flag2, flag3 = false, false, false
hook("foo", function () flag1 = true end)
hook("foo", function () flag2 = true ; return 42 end)
hook("foo", function () flag3 = true ; return 0 end)
assert(fire("foo") == 42)
assert(flag1 == true)
assert(flag2 == true)
assert(flag3 == false)
end
do -- Arguments to eventable() are passed to handlers
local obj = { answer = 42 }
local fire, hook = assert(eventable(obj))
hook("foo", function (o)
assert(o == obj)
assert(o.answer == 42)
o.answer = 0 -- Mutate
end)
fire("foo")
assert(obj.answer == 0)
end
do -- Multiple arguments passed to eventable
local fire, hook = assert(eventable(42, "bar", nil, { v=10 }))
hook("foo", function (a, s, n, o)
assert(a == 42)
assert(s == "bar")
assert(n == nil)
assert(o.v == 10)
end)
fire("foo")
end
do -- Unhooking should work
local flag1, flag2 = false, false
local h1 = function () flag1 = true end
local h2 = function () flag2 = true end
local fire, hook, unhook = assert(eventable())
hook("foo", h1)
hook("foo", h2)
fire("foo")
assert(flag1 == true)
assert(flag2 == true)
flag1, flag2 = false, false
unhook("foo", h2)
fire("foo")
assert(flag1 == true)
assert(flag2 == false)
flag1, flag2 = false, false
unhook("foo")
end