Skip to content

Commit 4b105c2

Browse files
committed
test($rootScope): test removal of event listerns during event broadcast
1 parent 21a2f4b commit 4b105c2

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

test/ng/rootScopeSpec.js

+92
Original file line numberDiff line numberDiff line change
@@ -2316,6 +2316,98 @@ 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 remove1 = $rootScope.$on('abc', function() { remove1() });
2336+
2337+
var listener2 = jasmine.createSpy();
2338+
var remove2 = $rootScope.$on('abc', listener2);
2339+
2340+
var listener3 = jasmine.createSpy();
2341+
var remove3 = $rootScope.$on('abc', listener3);
2342+
2343+
$rootScope.$broadcast('abc');
2344+
expect(listener1).toHaveBeenCalled();
2345+
expect(listener2).toHaveBeenCalled();
2346+
expect(listener3).toHaveBeenCalled();
2347+
2348+
listener1.calls.reset();
2349+
listener2.calls.reset();
2350+
listener3.calls.reset();
2351+
2352+
$rootScope.$broadcast('abc');
2353+
expect(listener1).not.toHaveBeenCalled();
2354+
expect(listener2).toHaveBeenCalled();
2355+
expect(listener3).toHaveBeenCalled();
2356+
}));
2357+
2358+
2359+
it('should call all listeners when removing previous', inject(function($rootScope) {
2360+
var listener1 = jasmine.createSpy();
2361+
var remove1 = $rootScope.$on('abc', listener1);
2362+
2363+
var listener2 = jasmine.createSpy().and.callFake(remove1);
2364+
var remove2 = $rootScope.$on('abc', listener2);
2365+
2366+
var listener3 = jasmine.createSpy();
2367+
var remove3 = $rootScope.$on('abc', listener3);
2368+
2369+
$rootScope.$broadcast('abc');
2370+
expect(listener1).toHaveBeenCalled();
2371+
expect(listener2).toHaveBeenCalled();
2372+
expect(listener3).toHaveBeenCalled();
2373+
2374+
listener1.calls.reset();
2375+
listener2.calls.reset();
2376+
listener3.calls.reset();
2377+
2378+
$rootScope.$broadcast('abc');
2379+
expect(listener1).not.toHaveBeenCalled();
2380+
expect(listener2).toHaveBeenCalled();
2381+
expect(listener3).toHaveBeenCalled();
2382+
}));
2383+
2384+
2385+
it('should not call listener when removed by previous', inject(function($rootScope) {
2386+
var listener1 = jasmine.createSpy();
2387+
var remove1 = $rootScope.$on('abc', listener1);
2388+
2389+
var listener2 = jasmine.createSpy().and.callFake(function() { remove3(); });
2390+
var remove2 = $rootScope.$on('abc', listener2);
2391+
2392+
var listener3 = jasmine.createSpy();
2393+
var remove3 = $rootScope.$on('abc', listener3);
2394+
2395+
$rootScope.$broadcast('abc');
2396+
expect(listener1).toHaveBeenCalled();
2397+
expect(listener2).toHaveBeenCalled();
2398+
expect(listener3).not.toHaveBeenCalled();
2399+
2400+
listener1.calls.reset();
2401+
listener2.calls.reset();
2402+
listener3.calls.reset();
2403+
2404+
$rootScope.$broadcast('abc');
2405+
expect(listener1).toHaveBeenCalled();
2406+
expect(listener2).toHaveBeenCalled();
2407+
expect(listener3).not.toHaveBeenCalled();
2408+
}));
2409+
2410+
23192411
it('should decrement ancestor $$listenerCount entries', inject(function($rootScope) {
23202412
var child1 = $rootScope.$new(),
23212413
child2 = child1.$new(),

0 commit comments

Comments
 (0)