local beholder = require 'beholder' describe("Unit", function() before(function() beholder.reset() end) describe(".observe", function() it("notices simple events so that trigger works", function() local counter = 0 beholder.observe("EVENT", function() counter = counter + 1 end) beholder.trigger("EVENT") assert_equal(counter, 1) end) it("remembers if more than one action is associated to the same event", function() local counter1, counter2 = 0,0 beholder.observe("EVENT", function() counter1 = counter1 + 1 end) beholder.observe("EVENT", function() counter2 = counter2 + 1 end) beholder.trigger("EVENT") assert_equal(counter1, 1) assert_equal(counter2, 1) end) it("allows observing composed events", function() local counter = 0 beholder.observe("KEYPRESS", "start", function() counter = counter + 1 end) beholder.trigger("KEYPRESS", "start") assert_equal(counter, 1) end) it("observes all events with the nil event", function() local counter = 0 beholder.observe(function(_,x) counter = counter + x end) beholder.trigger("FOO", 1) beholder.trigger("BAR", 2) assert_equal(3, counter) end) it("throws an error if called without at least one parameter", function() assert_error(function() beholder.observe() end) end) it("does not store hard references to variables", function() local counter = 0 local x = {} beholder.observe(x, function() counter = counter + 1 end) beholder.triggerAll() x = nil collectgarbage("collect") beholder.triggerAll() assert_equal(1, counter) end) end) describe(".observeSubject", function() it("throws an error if subject is nil", function() assert_error(function() beholder.observeSubject(nil, 'blah') end) end) it("notices simple events so that trigger works", function() local counter = 0 local button = {} beholder.observeSubject(button, "PUSH", function() counter = counter + 1 end) beholder.trigger("PUSH") assert_equal(counter, 1) end) it("remembers if more than one action is associated to the same event", function() local counter1, counter2 = 0,0 local button = {} beholder.observeSubject(button, "PUSH", function() counter1 = counter1 + 1 end) beholder.observeSubject(button, "PUSH", function() counter2 = counter2 + 1 end) beholder.trigger("PUSH") assert_equal(counter1, 1) assert_equal(counter2, 1) end) it("allows observing composed events", function() local counter = 0 local button = {} beholder.observeSubject(button, "PUSH", "start", function() counter = counter + 1 end) beholder.trigger("PUSH", "start") assert_equal(counter, 1) end) it("observes all events with the nil event", function() local counter = 0 local button = {} beholder.observeSubject(button, function(_,x) counter = counter + x end) beholder.trigger("FOO", 1) beholder.trigger("BAR", 2) assert_equal(3, counter) end) it("does not store hard references to variables", function() local counter = 0 local x = {} local button = {} beholder.observeSubject(button, x, function() counter = counter + 1 end) beholder.triggerAll() x = nil collectgarbage("collect") beholder.triggerAll() assert_equal(1, counter) end) it("does not react to triggers once the subject has been garbage-collected", function() local counter = 0 local button = {} beholder.observeSubject(button, "PUSH", function() counter = counter + 1 end) beholder.trigger("PUSH") assert_equal(1, counter) button = nil collectgarbage("collect") beholder.trigger("PUSH") assert_equal(1, counter) end) end) describe(".stopObserving", function() it("stops noticing events so trigger doesn't work any more", function() local counter = 0 local id = beholder.observe("EVENT", function() counter = counter + 1 end) beholder.trigger("EVENT") beholder.stopObserving(id) beholder.trigger("EVENT") assert_equal(counter, 1) end) it("stops observing one id without disturbing the others", function() local counter1, counter2 = 0,0 local id1 = beholder.observe("EVENT", function() counter1 = counter1 + 1 end) beholder.observe("EVENT", function() counter2 = counter2 + 1 end) beholder.trigger("EVENT") assert_equal(counter1, 1) assert_equal(counter2, 1) beholder.stopObserving(id1) beholder.trigger("EVENT") assert_equal(counter1, 1) assert_equal(counter2, 2) end) it("passes parameters to the actions", function() local counter = 0 beholder.observe("EVENT", function(x) counter = counter + x end) beholder.trigger("EVENT", 1) assert_equal(counter, 1) beholder.trigger("EVENT", 5) assert_equal(counter, 6) end) it("does not raise an error when stopping observing an inexisting event", function() assert_not_error(function() beholder.stopObserving({}) end) end) it("returns false when no action was found for an id", function() assert_equal(false, beholder.stopObserving({})) end) it("returns true when an action was found and removed", function() local id = beholder.observe("X", function() end) assert_true(beholder.stopObserving(id)) end) end) describe(".trigger", function() it("does not error on random stuff", function() assert_not_error(function() beholder.trigger("FOO") end) end) it("returns false on events with no actions", function() assert_equal(false, beholder.trigger("FOO")) end) it("returns false if there was a node with no actions", function() beholder.observe("ONE","TWO", function() end) assert_equal(false, beholder.trigger("ONE")) end) it("returns the number of actions executed", function() beholder.observe("X", function() end) beholder.observe("X", function() end) assert_equal(2, beholder.trigger("X")) end) it("triggers callbacks within the nil event only", function() local counter = 0 beholder.observe("X", function() counter = counter + 10 end) beholder.observe(function() counter = counter + 5 end) beholder.trigger() assert_equal(5, counter) 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) end)