changed behaviour of trigger(). Added triggerAll().

This commit is contained in:
Enrique García 2011-10-30 13:52:14 +01:00
parent 2daff1538b
commit 1565149a8b
4 changed files with 72 additions and 19 deletions

View File

@ -94,14 +94,25 @@ Similarly, you can add an action that will be triggered for any player detection
<pre>Beholder:observe('PLAYERDETECTION', function(player,x,y) print(player.no," detected at ",x,y)</pre> <pre>Beholder:observe('PLAYERDETECTION', function(player,x,y) print(player.no," detected at ",x,y)</pre>
h1. The nil event
If you want to detect all signals raised (i.e. for logging and debugging) you can do so by observing the "empty" event - simply pass a function to observe, without adding any more params: If you want to detect all signals raised (i.e. for logging and debugging) you can do so by observing the "empty" event - simply pass a function to observe, without adding any more params:
<pre>Beholder:observe(function(...) log("Event triggered", ...) end)</pre> <pre>Beholder:observe(function(...) log("Event triggered", ...) end)</pre>
Similarly, you could use this to trigger all observed events (again, this will be useful mostly for debugging): If you want to trigger the events attached only to the nil event, you can do so by calling trigger without params:
<pre>Beholder:trigger()</pre> <pre>Beholder:trigger()</pre>
h1. Triggering all callbacks
You can use the @triggerAll@ method to trigger all observed events (this will be useful mostly for debugging):
<pre>Beholder:triggerAll(...)</pre>
Note that you can pass parameters to @triggerAll@. These will be passed to all callbacks (make sure that they are prepared for this, or you will get errors).
h1. Installation h1. Installation
If you are going to use it, make sure that you have downloaded and installed "middleclass":https://github.com/kikito/middleclass If you are going to use it, make sure that you have downloaded and installed "middleclass":https://github.com/kikito/middleclass

View File

@ -7,6 +7,10 @@
local beholder = {} local beholder = {}
local function falseIfZero(n)
return n > 0 and n
end
local function copy(t) local function copy(t)
local c={} local c={}
for i=1,#t do c[i]=t[i] end for i=1,#t do c[i]=t[i] end
@ -37,7 +41,6 @@ end
local function executeNodeCallbacks(node, params) local function executeNodeCallbacks(node, params)
local counter = 0 local counter = 0
params = params or {}
for _,callback in pairs(node.callbacks) do for _,callback in pairs(node.callbacks) do
callback(unpack(params)) callback(unpack(params))
counter = counter + 1 counter = counter + 1
@ -45,10 +48,10 @@ local function executeNodeCallbacks(node, params)
return counter return counter
end end
local function executeAllCallbacks(node) local function executeAllCallbacks(node, params)
local counter = executeNodeCallbacks(node) local counter = executeNodeCallbacks(node, params)
for _,child in pairs(node.children) do for _,child in pairs(node.children) do
counter = counter + executeAllCallbacks(child) counter = counter + executeAllCallbacks(child, params)
end end
return counter return counter
end end
@ -95,9 +98,11 @@ function beholder:stopObserving(id)
end end
function beholder:trigger(...) function beholder:trigger(...)
local event = {...} return falseIfZero( executeEventCallbacks(self._root, {...}) )
local counter = (#event == 0) and executeAllCallbacks(self._root) or executeEventCallbacks(self._root, event) end
return counter > 0 and counter
function beholder:triggerAll(...)
return falseIfZero( executeAllCallbacks(self._root, {...}) )
end end
beholder:reset() beholder:reset()

View File

@ -88,10 +88,29 @@ describe("Acceptance", function()
beholder:stopObserving(id) beholder:stopObserving(id)
beholder:observe("BAZ", function() counter = counter + 1 end) beholder:observe(function() counter = 10 end)
beholder:trigger() beholder:trigger()
assert_equal(4, counter) assert_equal(10, counter)
end)
test("triggering all events", function()
local even = 0
local uneven = 1
beholder:observe("EVEN", function(x) even = even + 2*x end)
beholder:observe("UNEVEN", function(x) uneven = uneven + 2*x end)
beholder:triggerAll(1)
assert_equal(even, 2)
assert_equal(uneven, 3)
beholder:triggerAll(2)
assert_equal(even, 6)
assert_equal(uneven, 7)
end) end)

View File

@ -116,20 +116,38 @@ describe("Unit", function()
assert_equal(2, beholder:trigger("X")) assert_equal(2, beholder:trigger("X"))
end) end)
it("triggers any observation with the nil event", function() it("triggers callbacks within the nil event only", function()
local counter = 0 local counter = 0
beholder:observe("X", function() counter = counter + 1 end) beholder:observe("X", function() counter = counter + 10 end)
beholder:observe("Y", 1, function() counter = counter + 2 end) beholder:observe(function() counter = counter + 5 end)
beholder:trigger() beholder:trigger()
assert_equal(3, counter) assert_equal(5, counter)
end)
end) end)
describe(":triggerAll", function()
it("calls all registered callbacks", function()
local counter = 0
beholder:observe("X", function() counter = counter + 1 end)
beholder:triggerAll()
assert_equal(1, counter)
end)
it("passes parameters to callbacks", function()
local counter = 0
beholder:observe(function(x) counter = counter + x end)
beholder:triggerAll(2)
assert_equal(2, counter)
end)
it("returns false if no actions where found", function()
assert_false(beholder:triggerAll())
end)
it("returns the number of actions executed", function()
beholder:observe("X", function() end)
beholder:observe("Y", function() end)
assert_equal(2, beholder:triggerAll())
end) end)
describe(":reset", function()
end) end)