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

Commit d1e971b

Browse files
committed
test($rootScope): test removal of event listeners during event broadcast
1 parent 21a2f4b commit d1e971b

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

test/ng/rootScopeSpec.js

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

23182318

2319+
// See issue https://github.com/angular/angular.js/issues/16135
2320+
it('should deallocate the listener array entry', inject(function($rootScope) {
2321+
var remove1 = $rootScope.$on('abc', noop);
2322+
$rootScope.$on('abc', noop);
2323+
2324+
expect($rootScope.$$listeners['abc'].length).toBe(2);
2325+
expect(0 in $rootScope.$$listeners['abc']).toBe(true);
2326+
2327+
remove1();
2328+
2329+
expect($rootScope.$$listeners['abc'].length).toBe(2);
2330+
expect(0 in $rootScope.$$listeners['abc']).toBe(false);
2331+
}));
2332+
2333+
2334+
it('should call next listener when removing current', inject(function($rootScope) {
2335+
var listener1 = jasmine.createSpy().and.callFake(function() { remove1(); });
2336+
var remove1 = $rootScope.$on('abc', listener1);
2337+
2338+
var listener2 = jasmine.createSpy();
2339+
var remove2 = $rootScope.$on('abc', listener2);
2340+
2341+
var listener3 = jasmine.createSpy();
2342+
var remove3 = $rootScope.$on('abc', listener3);
2343+
2344+
$rootScope.$broadcast('abc');
2345+
expect(listener1).toHaveBeenCalled();
2346+
expect(listener2).toHaveBeenCalled();
2347+
expect(listener3).toHaveBeenCalled();
2348+
2349+
listener1.calls.reset();
2350+
listener2.calls.reset();
2351+
listener3.calls.reset();
2352+
2353+
$rootScope.$broadcast('abc');
2354+
expect(listener1).not.toHaveBeenCalled();
2355+
expect(listener2).toHaveBeenCalled();
2356+
expect(listener3).toHaveBeenCalled();
2357+
}));
2358+
2359+
2360+
it('should call all listeners when removing previous', inject(function($rootScope) {
2361+
var listener1 = jasmine.createSpy();
2362+
var remove1 = $rootScope.$on('abc', listener1);
2363+
2364+
var listener2 = jasmine.createSpy().and.callFake(remove1);
2365+
var remove2 = $rootScope.$on('abc', listener2);
2366+
2367+
var listener3 = jasmine.createSpy();
2368+
var remove3 = $rootScope.$on('abc', listener3);
2369+
2370+
$rootScope.$broadcast('abc');
2371+
expect(listener1).toHaveBeenCalled();
2372+
expect(listener2).toHaveBeenCalled();
2373+
expect(listener3).toHaveBeenCalled();
2374+
2375+
listener1.calls.reset();
2376+
listener2.calls.reset();
2377+
listener3.calls.reset();
2378+
2379+
$rootScope.$broadcast('abc');
2380+
expect(listener1).not.toHaveBeenCalled();
2381+
expect(listener2).toHaveBeenCalled();
2382+
expect(listener3).toHaveBeenCalled();
2383+
}));
2384+
2385+
2386+
it('should not call listener when removed by previous', inject(function($rootScope) {
2387+
var listener1 = jasmine.createSpy();
2388+
var remove1 = $rootScope.$on('abc', listener1);
2389+
2390+
var listener2 = jasmine.createSpy().and.callFake(function() { remove3(); });
2391+
var remove2 = $rootScope.$on('abc', listener2);
2392+
2393+
var listener3 = jasmine.createSpy();
2394+
var remove3 = $rootScope.$on('abc', listener3);
2395+
2396+
$rootScope.$broadcast('abc');
2397+
expect(listener1).toHaveBeenCalled();
2398+
expect(listener2).toHaveBeenCalled();
2399+
expect(listener3).not.toHaveBeenCalled();
2400+
2401+
listener1.calls.reset();
2402+
listener2.calls.reset();
2403+
listener3.calls.reset();
2404+
2405+
$rootScope.$broadcast('abc');
2406+
expect(listener1).toHaveBeenCalled();
2407+
expect(listener2).toHaveBeenCalled();
2408+
expect(listener3).not.toHaveBeenCalled();
2409+
}));
2410+
2411+
23192412
it('should decrement ancestor $$listenerCount entries', inject(function($rootScope) {
23202413
var child1 = $rootScope.$new(),
23212414
child2 = child1.$new(),

0 commit comments

Comments
 (0)