aboutsummaryrefslogtreecommitdiffstats
path: root/test/ng/rootScopeSpec.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/ng/rootScopeSpec.js')
-rw-r--r--test/ng/rootScopeSpec.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js
index 9830d981..ee7fb796 100644
--- a/test/ng/rootScopeSpec.js
+++ b/test/ng/rootScopeSpec.js
@@ -708,6 +708,74 @@ describe('Scope', function() {
});
+ it('should allow removing event listener inside a listener on $emit', function() {
+ var spy1 = jasmine.createSpy('1st listener');
+ var spy2 = jasmine.createSpy('2nd listener');
+ var spy3 = jasmine.createSpy('3rd listener');
+
+ var remove1 = child.$on('evt', spy1);
+ var remove2 = child.$on('evt', spy2);
+ var remove3 = child.$on('evt', spy3);
+
+ spy1.andCallFake(remove1);
+
+ expect(child.$$listeners['evt'].length).toBe(3);
+
+ // should call all listeners and remove 1st
+ child.$emit('evt');
+ expect(spy1).toHaveBeenCalledOnce();
+ expect(spy2).toHaveBeenCalledOnce();
+ expect(spy3).toHaveBeenCalledOnce();
+ expect(child.$$listeners['evt'].length).toBe(3); // cleanup will happen on next $emit
+
+ spy1.reset();
+ spy2.reset();
+ spy3.reset();
+
+ // should call only 2nd because 1st was already removed and 2nd removes 3rd
+ spy2.andCallFake(remove3);
+ child.$emit('evt');
+ expect(spy1).not.toHaveBeenCalled();
+ expect(spy2).toHaveBeenCalledOnce();
+ expect(spy3).not.toHaveBeenCalled();
+ expect(child.$$listeners['evt'].length).toBe(1);
+ });
+
+
+ it('should allow removing event listener inside a listener on $broadcast', function() {
+ var spy1 = jasmine.createSpy('1st listener');
+ var spy2 = jasmine.createSpy('2nd listener');
+ var spy3 = jasmine.createSpy('3rd listener');
+
+ var remove1 = child.$on('evt', spy1);
+ var remove2 = child.$on('evt', spy2);
+ var remove3 = child.$on('evt', spy3);
+
+ spy1.andCallFake(remove1);
+
+ expect(child.$$listeners['evt'].length).toBe(3);
+
+ // should call all listeners and remove 1st
+ child.$broadcast('evt');
+ expect(spy1).toHaveBeenCalledOnce();
+ expect(spy2).toHaveBeenCalledOnce();
+ expect(spy3).toHaveBeenCalledOnce();
+ expect(child.$$listeners['evt'].length).toBe(3); //cleanup will happen on next $broadcast
+
+ spy1.reset();
+ spy2.reset();
+ spy3.reset();
+
+ // should call only 2nd because 1st was already removed and 2nd removes 3rd
+ spy2.andCallFake(remove3);
+ child.$broadcast('evt');
+ expect(spy1).not.toHaveBeenCalled();
+ expect(spy2).toHaveBeenCalledOnce();
+ expect(spy3).not.toHaveBeenCalled();
+ expect(child.$$listeners['evt'].length).toBe(1);
+ });
+
+
describe('event object', function() {
it('should have methods/properties', function() {
var event;