Skip to content

Commit

Permalink
Add numListeners property to the signals.
Browse files Browse the repository at this point in the history
  • Loading branch information
richardlord committed Apr 22, 2013
1 parent 2649775 commit e976b65
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 2 deletions.
9 changes: 9 additions & 0 deletions src/ash/signals/SignalBase.as
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package ash.signals
private var toAddHead : ListenerNode;
private var toAddTail : ListenerNode;
private var dispatching : Boolean;
private var _numListeners : int = 0;

public function SignalBase()
{
Expand Down Expand Up @@ -52,6 +53,11 @@ package ash.signals
}
listenerNodePool.releaseCache();
}

public function get numListeners() : int
{
return _numListeners;
}

public function add( listener : Function ) : void
{
Expand Down Expand Up @@ -106,6 +112,7 @@ package ash.signals
tail = node;
}
}
_numListeners++;
}

public function remove( listener : Function ) : void
Expand Down Expand Up @@ -146,6 +153,7 @@ package ash.signals
{
listenerNodePool.dispose( node );
}
_numListeners--;
}
}

Expand All @@ -161,6 +169,7 @@ package ash.signals
tail = null;
toAddHead = null;
toAddTail = null;
_numListeners = 0;
}
}
}
2 changes: 1 addition & 1 deletion test/src/ash/AllTests.as
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ import ash.fsm.EntityStateMachineTests;
public var componentInstanceProviderTests : ComponentInstanceProviderTests;
public var componentTypeProviderTests : ComponentTypeProviderTests;
public var componentSingletonProviderTests : ComponentSingletonProviderTests;
public var dynamicComponentProviderTests : DynamicComponentProviderTests;
public var dynamicComponentProviderTests : DynamicComponentProviderTests;
}
}
72 changes: 71 additions & 1 deletion test/src/ash/signals/SignalTest.as
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,16 @@ package ash.signals
}

[Test]
public function newSignalHasNoListeners():void
public function newSignalHasNullHead():void
{
assertThat( signal.head, nullValue() );
}

[Test]
public function newSignalHasListenersCountZero():void
{
assertThat( signal.numListeners, equalTo( 0 ) );
}

[Test]
public function addListenerThenDispatchShouldCallIt() : void
Expand All @@ -38,6 +44,13 @@ package ash.signals
dispatchSignal();
}

[Test]
public function addListenerThenListenersCountIsOne():void
{
signal.add( newEmptyHandler() );
assertThat( signal.numListeners, equalTo( 1 ) );
}

[Test]
public function addListenerThenRemoveThenDispatchShouldNotCallListener() : void
{
Expand All @@ -46,6 +59,14 @@ package ash.signals
dispatchSignal();
}

[Test]
public function addListenerThenRemoveThenListenersCountIsZero():void
{
signal.add( failIfCalled );
signal.remove( failIfCalled );
assertThat( signal.numListeners, equalTo( 0 ) );
}

[Test]
public function removeFunctionNotInListenersShouldNotThrowError() : void
{
Expand All @@ -69,6 +90,14 @@ package ash.signals
dispatchSignal();
}

[Test]
public function add2ListenersThenListenersCountIsTwo():void
{
signal.add( newEmptyHandler() );
signal.add( newEmptyHandler() );
assertThat( signal.numListeners, equalTo( 2 ) );
}

[Test]
public function add2ListenersRemove1stThenDispatchShouldCall2ndNot1stListener() : void
{
Expand All @@ -87,6 +116,15 @@ package ash.signals
dispatchSignal();
}

[Test]
public function add2ListenersThenRemove1ThenListenersCountIsOne():void
{
signal.add( newEmptyHandler() );
signal.add( failIfCalled );
signal.remove( failIfCalled );
assertThat( signal.numListeners, equalTo( 1 ) );
}

[Test]
public function addSameListenerTwiceShouldOnlyAddItOnce() : void
{
Expand All @@ -105,6 +143,14 @@ package ash.signals
signal.add( listener );
signal.add( listener );
}

[Test]
public function addSameListenerTwiceThenListenersCountIsOne():void
{
signal.add( failIfCalled );
signal.add( failIfCalled );
assertThat( signal.numListeners, equalTo( 1 ) );
}

[Test]
public function dispatch2Listeners1stListenerRemovesItselfThen2ndListenerIsStillCalled() : void
Expand Down Expand Up @@ -139,6 +185,21 @@ package ash.signals
signal.add( failIfCalled );
}

[Test]
public function addingAListenerDuringDispatchIncrementsListenersCount() : void
{
signal.add( addListenerDuringDispatchToTestCount );
dispatchSignal();
assertThat( signal.numListeners, equalTo( 2 ) );
}

private function addListenerDuringDispatchToTestCount() : void
{
assertThat( signal.numListeners, equalTo( 1 ) );
signal.add( newEmptyHandler() );
assertThat( signal.numListeners, equalTo( 2 ) );
}

[Test]
public function dispatch2Listeners2ndListenerRemoves1stThen1stListenerIsNotCalled() : void
{
Expand All @@ -161,6 +222,15 @@ package ash.signals
assertThat( signal.head, nullValue() );
}

[Test]
public function add2ListenersThenRemoveAllThenListenerCountIsZero():void
{
signal.add( newEmptyHandler() );
signal.add( newEmptyHandler() );
signal.removeAll();
assertThat( signal.numListeners, equalTo( 0 ) );
}

[Test]
public function removeAllDuringDispatchShouldStopAll():void
{
Expand Down

0 comments on commit e976b65

Please sign in to comment.