diff --git a/src/bindx/BindSignal.hx b/src/bindx/BindSignal.hx index 2992838..d29bca7 100644 --- a/src/bindx/BindSignal.hx +++ b/src/bindx/BindSignal.hx @@ -220,7 +220,8 @@ class Signal { public function add(listener:T):Void { var pos = listeners.indexOf(listener); - if (pos == -1) checkLock(); else listeners.splice(pos, 1); + checkLock(); + if (pos > -1) listeners.splice(pos, 1); listeners.push(listener); } diff --git a/test/SignalTest.hx b/test/SignalTest.hx index 77cf1aa..8b882bf 100644 --- a/test/SignalTest.hx +++ b/test/SignalTest.hx @@ -49,6 +49,52 @@ class SignalTest extends BuddySuite { callNum.should.be(3); }); + it("signal should correct add/remove listeners", { + function listener2(_, _) { + callNum ++; + } + + function listener(_, _) { + fs.add(listener2); + callNum++; + } + + fs.add(listener); + fs.dispatch(null, null); + + callNum.should.be(1); // 1 listener only + + fs.dispatch(null, null); + + callNum.should.be(3); // listener2 added + + fs.remove(listener2); + fs.dispatch(null, null); + + callNum.should.be(4); // listener2 removed + + fs.removeAll(); + fs.dispatch(null, null); + + callNum.should.be(4); // all listeners removed + }); + + it("signal should correct dispatch in listener", { + function listener(_, _) { + fs.remove(listener); + fs.dispatch(null, null); + callNum++; + } + var callNum2 = 0; + function listener2(_, _) callNum2++; + + fs.add(listener); + fs.add(listener2); + fs.dispatch(null, null); + + callNum.should.be(1); + callNum2.should.be(2); + }); }); describe("MethodSignal functionality tests", {