diff --git a/platform/commonUI/general/test/directives/MCTResizeSpec.js b/platform/commonUI/general/test/directives/MCTResizeSpec.js index 4f07701d50..b320d5e881 100644 --- a/platform/commonUI/general/test/directives/MCTResizeSpec.js +++ b/platform/commonUI/general/test/directives/MCTResizeSpec.js @@ -14,7 +14,7 @@ define( beforeEach(function () { mockTimeout = jasmine.createSpy("$timeout"); - mockScope = jasmine.createSpyObj("$scope", ["$eval"]); + mockScope = jasmine.createSpyObj("$scope", ["$eval", "$on"]); testElement = { offsetWidth: 100, offsetHeight: 200 }; testAttrs = { mctResize: "some-expr" }; @@ -63,6 +63,32 @@ define( ); }); + it("stops size checking for size changes after destroy", function () { + mctResize.link(mockScope, [testElement], testAttrs); + + // First, make sure there's a $destroy observer + expect(mockScope.$on) + .toHaveBeenCalledWith("$destroy", jasmine.any(Function)); + + // Should have scheduled the first timeout + expect(mockTimeout.calls.length).toEqual(1); + + // Fire the timeout + mockTimeout.mostRecentCall.args[0](); + + // Should have scheduled another timeout + expect(mockTimeout.calls.length).toEqual(2); + + // Broadcast a destroy event + mockScope.$on.mostRecentCall.args[1](); + + // Fire the timeout + mockTimeout.mostRecentCall.args[0](); + + // Should NOT have scheduled another timeout + expect(mockTimeout.calls.length).toEqual(2); + }); + }); } ); \ No newline at end of file diff --git a/platform/features/plot/test/MCTChartSpec.js b/platform/features/plot/test/MCTChartSpec.js index 84d6a27368..837f8d0ef7 100644 --- a/platform/features/plot/test/MCTChartSpec.js +++ b/platform/features/plot/test/MCTChartSpec.js @@ -15,6 +15,7 @@ define( mockElement, mockCanvas, mockGL, + mockCancelInterval, mctChart; beforeEach(function () { @@ -23,9 +24,10 @@ define( mockLog = jasmine.createSpyObj("$log", ["warn", "info", "debug"]); mockScope = - jasmine.createSpyObj("$scope", ["$watchCollection"]); + jasmine.createSpyObj("$scope", ["$watchCollection", "$on"]); mockElement = jasmine.createSpyObj("element", ["find"]); + mockCancelInterval = jasmine.createSpy("cancelInterval"); // mct-chart uses GLChart, so it needs WebGL API @@ -70,6 +72,7 @@ define( mockElement.find.andReturn([mockCanvas]); mockCanvas.getContext.andReturn(mockGL); + mockInterval.andReturn(mockCancelInterval); mctChart = new MCTChart(mockInterval, mockLog); }); @@ -150,6 +153,26 @@ define( expect(mockLog.warn).not.toHaveBeenCalled(); }); + // Avoid resource leaks + it("stops polling for size changes on destroy", function () { + mctChart.link(mockScope, mockElement); + + // Should be listening for a destroy event + expect(mockScope.$on).toHaveBeenCalledWith( + "$destroy", + jasmine.any(Function) + ); + + // Precondition - interval still active + expect(mockCancelInterval).not.toHaveBeenCalled(); + + // Broadcast a $destroy + mockScope.$on.mostRecentCall.args[1](); + + // Should have stopped the interval + expect(mockCancelInterval).toHaveBeenCalled(); + }); + }); } ); \ No newline at end of file