"use strict" var o = require("../../ospec/ospec") var domMock = require("../../test-utils/domMock") var throttleMocker = require("../../test-utils/throttleMock") var apiRedraw = require("../../api/redraw") // Because Node doesn't have this. if (typeof requestAnimationFrame !== "function") { global.requestAnimationFrame = (function (delay, last) { return function(callback) { var elapsed = Date.now() - last return setTimeout(function() { callback() last = Date.now() }, delay - elapsed) } })(16, 0) } o.spec("redrawService", function() { var root, redrawService, $document o.beforeEach(function() { var $window = domMock() root = $window.document.body redrawService = apiRedraw($window) $document = $window.document }) o("shouldn't error if there are no renderers", function() { redrawService.redraw() }) o("honours throttleMock", function() { var throttleMock = throttleMocker() redrawService = apiRedraw(domMock(), throttleMock.throttle) var spy = o.spy() redrawService.subscribe(root, spy) o(spy.callCount).equals(1) redrawService.redraw() o(spy.callCount).equals(1) throttleMock.fire() o(spy.callCount).equals(2) }) o("should run a single renderer entry", function(done) { var spy = o.spy() redrawService.subscribe(root, spy) o(spy.callCount).equals(1) redrawService.redraw() redrawService.redraw() redrawService.redraw() o(spy.callCount).equals(1) setTimeout(function() { o(spy.callCount).equals(2) done() }, 20) }) o("should run all renderer entries", function(done) { var el1 = $document.createElement("div") var el2 = $document.createElement("div") var el3 = $document.createElement("div") var spy1 = o.spy() var spy2 = o.spy() var spy3 = o.spy() redrawService.subscribe(el1, spy1) redrawService.subscribe(el2, spy2) redrawService.subscribe(el3, spy3) redrawService.redraw() o(spy1.callCount).equals(1) o(spy2.callCount).equals(1) o(spy3.callCount).equals(1) redrawService.redraw() o(spy1.callCount).equals(1) o(spy2.callCount).equals(1) o(spy3.callCount).equals(1) setTimeout(function() { o(spy1.callCount).equals(2) o(spy2.callCount).equals(2) o(spy3.callCount).equals(2) done() }, 20) }) o("should stop running after unsubscribe", function(done) { var spy = o.spy() redrawService.subscribe(root, spy) o(spy.callCount).equals(1) redrawService.unsubscribe(root) redrawService.redraw() o(spy.callCount).equals(1) setTimeout(function() { o(spy.callCount).equals(1) done() }, 20) }) o("should invoke remove callback on unsubscribe", function() { var spy = o.spy() var onremove = o.spy() redrawService.subscribe(root, spy, onremove) o(spy.callCount).equals(1) redrawService.unsubscribe(root) o(spy.callCount).equals(1) o(onremove.callCount).equals(1) }) o("should stop running after unsubscribe, even if it occurs after redraw is requested", function(done) { var spy = o.spy() redrawService.subscribe(root, spy) o(spy.callCount).equals(1) redrawService.redraw() redrawService.unsubscribe(root) o(spy.callCount).equals(1) setTimeout(function() { o(spy.callCount).equals(1) done() }, 20) }) o("does nothing on invalid unsubscribe", function(done) { var spy = o.spy() redrawService.subscribe(root, spy) o(spy.callCount).equals(1) redrawService.unsubscribe(null) redrawService.redraw() setTimeout(function() { o(spy.callCount).equals(2) done() }, 20) }) o("redraw.sync() redraws all roots synchronously", function() { var el1 = $document.createElement("div") var el2 = $document.createElement("div") var el3 = $document.createElement("div") var spy1 = o.spy() var spy2 = o.spy() var spy3 = o.spy() redrawService.subscribe(el1, spy1) redrawService.subscribe(el2, spy2) redrawService.subscribe(el3, spy3) o(spy1.callCount).equals(1) o(spy2.callCount).equals(1) o(spy3.callCount).equals(1) redrawService.redraw.sync() o(spy1.callCount).equals(2) o(spy2.callCount).equals(2) o(spy3.callCount).equals(2) redrawService.redraw.sync() o(spy1.callCount).equals(3) o(spy2.callCount).equals(3) o(spy3.callCount).equals(3) }) })