aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--spec/util_events_spec.lua38
-rw-r--r--util/events.lua20
2 files changed, 57 insertions, 1 deletions
diff --git a/spec/util_events_spec.lua b/spec/util_events_spec.lua
index fee60f8f..95303cce 100644
--- a/spec/util_events_spec.lua
+++ b/spec/util_events_spec.lua
@@ -208,5 +208,43 @@ describe("util.events", function ()
assert.spy(h).was_called(2);
end);
end);
+
+ describe("debug hooks", function ()
+ it("should get called", function ()
+ local d = spy.new(function (handler, event_name, event_data)
+ return handler(event_data);
+ end);
+
+ e.add_handler("myevent", h);
+ e.fire_event("myevent");
+
+ assert.spy(h).was_called(1);
+ assert.spy(d).was_called(0);
+
+ assert.is_nil(e.set_debug_hook(d));
+
+ e.fire_event("myevent", { mydata = true });
+
+ assert.spy(h).was_called(2);
+ assert.spy(d).was_called(1);
+ assert.spy(d).was_called_with(h, "myevent", { mydata = true });
+
+ assert.equal(d, e.set_debug_hook(nil));
+
+ e.fire_event("myevent", { mydata = false });
+
+ assert.spy(h).was_called(3);
+ assert.spy(d).was_called(1);
+ end);
+ it("setting should return any existing debug hook", function ()
+ local function f() end
+ local function g() end
+ assert.is_nil(e.set_debug_hook(f));
+ assert.is_equal(f, e.set_debug_hook(g));
+ assert.is_equal(g, e.set_debug_hook(f));
+ assert.is_equal(f, e.set_debug_hook(nil));
+ assert.is_nil(e.set_debug_hook(f));
+ end);
+ end);
end);
end);
diff --git a/util/events.lua b/util/events.lua
index 0bf0ddcb..5205a457 100644
--- a/util/events.lua
+++ b/util/events.lua
@@ -26,6 +26,8 @@ local function new()
local wrappers = {};
-- Event map: event_map[handler_function] = priority_number
local event_map = {};
+ -- Debug hook, if any
+ local active_debug_hook = nil;
-- Called on-demand to build handlers entries
local function _rebuild_index(self, event)
local _handlers = event_map[event];
@@ -74,11 +76,16 @@ local function new()
end;
local function _fire_event(event_name, event_data)
local h = handlers[event_name];
- if h then
+ if h and not active_debug_hook then
for i=1,#h do
local ret = h[i](event_data);
if ret ~= nil then return ret; end
end
+ elseif h and active_debug_hook then
+ for i=1,#h do
+ local ret = active_debug_hook(h[i], event_name, event_data);
+ if ret ~= nil then return ret; end
+ end
end
end;
local function fire_event(event_name, event_data)
@@ -140,6 +147,13 @@ local function new()
end
end
end
+
+ local function set_debug_hook(new_hook)
+ local old_hook = active_debug_hook;
+ active_debug_hook = new_hook;
+ return old_hook;
+ end
+
return {
add_handler = add_handler;
remove_handler = remove_handler;
@@ -150,8 +164,12 @@ local function new()
add_handler = add_wrapper;
remove_handler = remove_wrapper;
};
+
add_wrapper = add_wrapper;
remove_wrapper = remove_wrapper;
+
+ set_debug_hook = set_debug_hook;
+
fire_event = fire_event;
_handlers = handlers;
_event_map = event_map;