UNPKG

dvbcss-clocks

Version:

Javascript library implementing clock objects for modelling timelines. Useful in DVB CSS implementations.

206 lines (164 loc) 7.78 kB
/**************************************************************************** * Copyright 2017 British Broadcasting Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *****************************************************************************/ var OffsetClock = require("OffsetClock"); var CorrelatedClock = require("CorrelatedClock"); var DateNowClock = require("DateNowClock"); describe("OffsetClock", function() { it("exists", function() { expect(OffsetClock).toBeDefined(); }); it("takes a parent clock as an argument", function() { var root = new DateNowClock(); var oc = new OffsetClock(root); expect(oc.parent).toBe(root); }); it("defaults to an offset of zero", function() { var root = new DateNowClock(); var oc = new OffsetClock(root); expect(oc.offset).toBe(0); }); it("can be configured with an offset at creation by specifying an 'offset' property of the 2nd argument.", function() { var root = new DateNowClock(); var oc = new OffsetClock(root, {"offset":75}); expect(oc.offset).toBe(75); }); it("has speed 1 and cannot be changed", function() { var root = new DateNowClock(); var oc = new OffsetClock(root, {"offset":75}); expect(oc.speed).toEqual(1); expect(oc.getSpeed()).toEqual(1); expect(function() { oc.speed = 5; }).toThrow(); expect(oc.speed).toEqual(1); expect(oc.getSpeed()).toEqual(1); expect(function() { oc.setSpeed(5); }).toThrow(); expect(oc.speed).toEqual(1); expect(oc.getSpeed()).toEqual(1); }); it("has tick rate of the parent and cannot be changed", function() { var root = new DateNowClock(); var oc = new OffsetClock(root, {"offset":75}); expect(oc.tickRate).toEqual(root.tickRate); expect(oc.getTickRate()).toEqual(root.tickRate); expect(function() { oc.tickRate = 5; }).toThrow(); expect(oc.tickRate).toEqual(root.tickRate); expect(oc.getTickRate()).toEqual(root.tickRate); expect(function() { oc.setTickRate(5); }).toThrow(); expect(oc.tickRate).toEqual(root.tickRate); expect(oc.getTickRate()).toEqual(root.tickRate); }); it("still has speed 1 even if parent speed is not 1", function() { var root = new DateNowClock(); var cc = new CorrelatedClock(root, {tickrate:1000}); var oc = new OffsetClock(cc, {offset:50}); cc.speed = 5; expect(oc.speed).toEqual(1); }); describe("offset behaviour is expected to work as follows:", function() { var root = new DateNowClock(); var parent = new CorrelatedClock(root, {tickRate:1000}); var altParent = new CorrelatedClock(root, {tickRate:50}); beforeEach(function() { jasmine.clock().install(); jasmine.clock().mockDate(); parent.speed = 1; }); afterEach(function() { jasmine.clock().uninstall(); }); it("correctly applies the offset when effectivespeed of parent is 1", function() { var OC_AHEAD_BY=50; var oc = new OffsetClock(parent, {"offset":OC_AHEAD_BY}); parent.speed = 1; var t = oc.now(); // advance time and see if OffsetClock was indeed ahead by OC_AHEAD_BY milliseconds jasmine.clock().tick(OC_AHEAD_BY); var t2 = parent.now(); expect(t).toEqual(t2); }); it("correctly applies the offset (by scaling it to nothing) when effective speed of parent is 0", function() { var OC_AHEAD_BY=98; var oc = new OffsetClock(parent, {"offset":OC_AHEAD_BY}); parent.speed = 0; var t = oc.now(); // advance time and see if OffsetClock was indeed ahead by OC_AHEAD_BY milliseconds jasmine.clock().tick(OC_AHEAD_BY); var t2 = parent.now(); expect(t).toEqual(t2); }); it("correctly applies the offset (by scaling it proportional to teh speed) when effective speed of parent is > 1", function() { var OC_AHEAD_BY=20; var oc = new OffsetClock(parent, {"offset":OC_AHEAD_BY}); parent.speed = 2.7; var t = oc.now(); // advance time and see if OffsetClock was indeed ahead by OC_AHEAD_BY milliseconds jasmine.clock().tick(OC_AHEAD_BY); var t2 = parent.now(); expect(t).toBeCloseTo(t2); }); it("correctly applies no offset if set to zero", function() { var oc = new OffsetClock(parent, {"offset":0}); expect(oc.now()).toEqual(parent.now()); }); it("will allow the offset to be changed", function() { var oc = new OffsetClock(parent, {"offset":40}); expect(oc.now()).toEqual(parent.now() + 40); oc.offset = 65; expect(oc.now()).toEqual(parent.now() + 65); }); it("will still correctly apply the offset if the parent is changed", function() { var oc = new OffsetClock(parent, {"offset":40}); expect(oc.getParent()).toEqual(parent); expect(oc.now()).toEqual(parent.now() + 40); oc.setParent(altParent); expect(oc.getParent()).toEqual(altParent); expect(oc.now()).toEqual(altParent.now() + 2); }); it("causes a notification if the parent is changed", function() { var oc = new OffsetClock(parent, {"offset":40}); var dep = jasmine.createSpy('onchange'); oc.on("change", dep); expect(dep).not.toHaveBeenCalled(); oc.setParent(altParent); expect(dep).toHaveBeenCalledWith(oc); }); it("correctly applies the offset if it is negative", function() { var OC_BEHIND_BY = 50; var oc = new OffsetClock(parent, {"offset":OC_BEHIND_BY}); parent.speed = 1; var t = oc.now(); // advance time and see if OffsetClock was indeed ahead by OC_AHEAD_BY milliseconds jasmine.clock().tick(OC_BEHIND_BY); var t2 = parent.now(); expect(t).toBeCloseTo(t2); }); it("correctly converts to root time", function() { var OC_AHEAD_BY = 124; var oc = new OffsetClock(parent, {offset:OC_AHEAD_BY}); var t = 1285.2; var rt = oc.toRootTime(t); var rt2 = parent.toRootTime(t); expect(rt + OC_AHEAD_BY/1000*root.tickRate).toEqual(rt2); }); it("correctly converts from root time", function() { var OC_AHEAD_BY = 124; var oc = new OffsetClock(parent, {offset:OC_AHEAD_BY}); var rt = 22849128; var t = oc.fromRootTime(rt); var t2 = parent.fromRootTime(rt + OC_AHEAD_BY/1000*root.tickRate); expect(t).toEqual(t2); }); }); });