Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit c15c8a1

Browse files
committed
test($rootScope): test removal of event listeners during event broadcast
1 parent 9871ada commit c15c8a1

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

test/ng/rootScopeSpec.js

+84
Original file line numberDiff line numberDiff line change
@@ -2316,6 +2316,90 @@ describe('Scope', function() {
23162316
}));
23172317

23182318

2319+
it('should call next listener after removing the current listener via its own handler', inject(function($rootScope) {
2320+
var listener1 = jasmine.createSpy('listener1').and.callFake(function() { remove1(); });
2321+
var remove1 = $rootScope.$on('abc', listener1);
2322+
2323+
var listener2 = jasmine.createSpy('listener2');
2324+
var remove2 = $rootScope.$on('abc', listener2);
2325+
2326+
var listener3 = jasmine.createSpy('listener3');
2327+
var remove3 = $rootScope.$on('abc', listener3);
2328+
2329+
$rootScope.$broadcast('abc');
2330+
expect(listener1).toHaveBeenCalled();
2331+
expect(listener2).toHaveBeenCalled();
2332+
expect(listener3).toHaveBeenCalled();
2333+
2334+
listener1.calls.reset();
2335+
listener2.calls.reset();
2336+
listener3.calls.reset();
2337+
2338+
$rootScope.$broadcast('abc');
2339+
expect(listener1).not.toHaveBeenCalled();
2340+
expect(listener2).toHaveBeenCalled();
2341+
expect(listener3).toHaveBeenCalled();
2342+
}));
2343+
2344+
2345+
it('should call all subsequent listeners when a previous listener is removed via a handler', inject(function($rootScope) {
2346+
var listener1 = jasmine.createSpy();
2347+
var remove1 = $rootScope.$on('abc', listener1);
2348+
2349+
var listener2 = jasmine.createSpy().and.callFake(remove1);
2350+
var remove2 = $rootScope.$on('abc', listener2);
2351+
2352+
var listener3 = jasmine.createSpy();
2353+
var remove3 = $rootScope.$on('abc', listener3);
2354+
2355+
$rootScope.$broadcast('abc');
2356+
expect(listener1).toHaveBeenCalled();
2357+
expect(listener2).toHaveBeenCalled();
2358+
expect(listener3).toHaveBeenCalled();
2359+
2360+
listener1.calls.reset();
2361+
listener2.calls.reset();
2362+
listener3.calls.reset();
2363+
2364+
$rootScope.$broadcast('abc');
2365+
expect(listener1).not.toHaveBeenCalled();
2366+
expect(listener2).toHaveBeenCalled();
2367+
expect(listener3).toHaveBeenCalled();
2368+
}));
2369+
2370+
2371+
it('should not call listener when removed by previous', inject(function($rootScope) {
2372+
var listener1 = jasmine.createSpy('listener1');
2373+
var remove1 = $rootScope.$on('abc', listener1);
2374+
2375+
var listener2 = jasmine.createSpy('listener2').and.callFake(function() { remove3(); });
2376+
var remove2 = $rootScope.$on('abc', listener2);
2377+
2378+
var listener3 = jasmine.createSpy('listener3');
2379+
var remove3 = $rootScope.$on('abc', listener3);
2380+
2381+
var listener4 = jasmine.createSpy('listener4');
2382+
var remove4 = $rootScope.$on('abc', listener4);
2383+
2384+
$rootScope.$broadcast('abc');
2385+
expect(listener1).toHaveBeenCalled();
2386+
expect(listener2).toHaveBeenCalled();
2387+
expect(listener3).not.toHaveBeenCalled();
2388+
expect(listener4).toHaveBeenCalled();
2389+
2390+
listener1.calls.reset();
2391+
listener2.calls.reset();
2392+
listener3.calls.reset();
2393+
listener4.calls.reset();
2394+
2395+
$rootScope.$broadcast('abc');
2396+
expect(listener1).toHaveBeenCalled();
2397+
expect(listener2).toHaveBeenCalled();
2398+
expect(listener3).not.toHaveBeenCalled();
2399+
expect(listener4).toHaveBeenCalled();
2400+
}));
2401+
2402+
23192403
it('should decrement ancestor $$listenerCount entries', inject(function($rootScope) {
23202404
var child1 = $rootScope.$new(),
23212405
child2 = child1.$new(),

0 commit comments

Comments
 (0)