aboutsummaryrefslogtreecommitdiffstats
path: root/test/ng/rootScopeSpec.js
diff options
context:
space:
mode:
authorIgor Minar2014-01-02 14:39:24 -0800
committerIgor Minar2014-01-02 15:28:56 -0800
commit884ef0dbcdfe614cedc824d079361b53e675d033 (patch)
treea7c8d853935cf32876cd2408fff3e0e5a215c06e /test/ng/rootScopeSpec.js
parent010413f90a9352a5aab1e7517a58eab5f30f2b06 (diff)
downloadangular.js-884ef0dbcdfe614cedc824d079361b53e675d033.tar.bz2
fix(Scope): don't let watch deregistration mess up the dirty-checking digest loop
Closes #5525
Diffstat (limited to 'test/ng/rootScopeSpec.js')
-rw-r--r--test/ng/rootScopeSpec.js47
1 files changed, 47 insertions, 0 deletions
diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js
index 78cf9aa5..e47111e2 100644
--- a/test/ng/rootScopeSpec.js
+++ b/test/ng/rootScopeSpec.js
@@ -405,6 +405,53 @@ describe('Scope', function() {
$rootScope.$apply('remove = true');
}).not.toThrow();
}));
+
+
+ it('should not mess up the digest loop if deregistration happens during digest', inject(
+ function($rootScope, log) {
+
+ // we are testing this due to regression #5525 which is related to how the digest loops lastDirtyWatch
+ // short-circuiting optimization works
+
+ // scenario: watch1 deregistering watch1
+ var scope = $rootScope.$new();
+ var deregWatch1 = scope.$watch(log.fn('watch1'), function() { deregWatch1(); log('watchAction1'); });
+ scope.$watch(log.fn('watch2'), log.fn('watchAction2'));
+ scope.$watch(log.fn('watch3'), log.fn('watchAction3'));
+
+ $rootScope.$digest();
+
+ expect(log).toEqual(['watch1', 'watchAction1', 'watch2', 'watchAction2', 'watch3', 'watchAction3',
+ 'watch2', 'watch3']);
+ scope.$destroy();
+ log.reset();
+
+
+ // scenario: watch1 deregistering watch2
+ scope = $rootScope.$new();
+ scope.$watch(log.fn('watch1'), function() { deregWatch2(); log('watchAction1'); });
+ var deregWatch2 = scope.$watch(log.fn('watch2'), log.fn('watchAction2'));
+ scope.$watch(log.fn('watch3'), log.fn('watchAction3'));
+
+ $rootScope.$digest();
+
+ expect(log).toEqual(['watch1', 'watchAction1', 'watch1', 'watch3', 'watchAction3',
+ 'watch1', 'watch3']);
+ scope.$destroy();
+ log.reset();
+
+
+ // scenario: watch2 deregistering watch1
+ scope = $rootScope.$new();
+ deregWatch1 = scope.$watch(log.fn('watch1'), log.fn('watchAction1'));
+ scope.$watch(log.fn('watch2'), function() { deregWatch1(); log('watchAction2'); });
+ scope.$watch(log.fn('watch3'), log.fn('watchAction3'));
+
+ $rootScope.$digest();
+
+ expect(log).toEqual(['watch1', 'watchAction1', 'watch2', 'watchAction2', 'watch3', 'watchAction3',
+ 'watch2', 'watch3']);
+ }));
});