UNPKG

shaka-player

Version:
125 lines (106 loc) 4.08 kB
/*! @license * Shaka Player * Copyright 2016 Google LLC * SPDX-License-Identifier: Apache-2.0 */ goog.require('shaka.media.RegionTimeline'); goog.require('shaka.test.Util'); describe('RegionTimeline', () => { /** @type {!shaka.media.RegionTimeline} */ let timeline; /** @type {!jasmine.Spy} */ let onNewRegion; /** @type {!jasmine.Spy} */ let onSeekRange; beforeEach(() => { onNewRegion = jasmine.createSpy('onNewRegion'); onSeekRange = jasmine.createSpy('onSeekRange'); onSeekRange.and.returnValue({start: 0, end: 100}); timeline = new shaka.media.RegionTimeline( shaka.test.Util.spyFunc(onSeekRange)); timeline.setListeners(shaka.test.Util.spyFunc(onNewRegion)); }); afterEach(() => { timeline.release(); }); it('stores unique scheme id uri', () => { // Add regions with unique scheme id uri timeline.addRegion(createRegion('urn:foo', 'my-region', 0, 10)); timeline.addRegion(createRegion('urn:bar', 'my-region', 0, 10)); expect(onNewRegion).toHaveBeenCalledTimes(2); }); it('stores unique event id', () => { // Add regions with unique event id timeline.addRegion(createRegion('urn:foo', 'my-region-1', 0, 10)); timeline.addRegion(createRegion('urn:foo', 'my-region-2', 0, 10)); expect(onNewRegion).toHaveBeenCalledTimes(2); }); it('stores unique start time', () => { // Add regions with unique start time timeline.addRegion(createRegion('urn:foo', 'my-region', 0, 10)); timeline.addRegion(createRegion('urn:foo', 'my-region', 5, 10)); expect(onNewRegion).toHaveBeenCalledTimes(2); }); it('stores unique end time', () => { // Add regions with unique end time timeline.addRegion(createRegion('urn:foo', 'my-region', 0, 10)); timeline.addRegion(createRegion('urn:foo', 'my-region', 0, 15)); expect(onNewRegion).toHaveBeenCalledTimes(2); }); it('dedups identical regions', () => { // Add two identical regions and verify only one is stored timeline.addRegion(createRegion('urn:foo', 'my-region', 0, 10)); timeline.addRegion(createRegion('urn:foo', 'my-region', 0, 10)); expect(onNewRegion).toHaveBeenCalledTimes(1); }); it('verifies region data integrity', () => { // Add a few regions and verify data integrity const region1 = createRegion('urn:foo', 'my-region-1', 0, 10); const region2 = createRegion('urn:foo', 'my-region-2', 11, 20); const region3 = createRegion('urn:foo', 'my-region-3', 21, 30); timeline.addRegion(region1); timeline.addRegion(region2); timeline.addRegion(region3); const uniqueRegions = Array.from(timeline.regions()); expect(uniqueRegions).toEqual([ region1, region2, region3, ]); }); it('filters out regions that end before the start of the seek range', async () => { onSeekRange.and.returnValue({start: 5, end: 100}); const region1 = createRegion('urn:foo', 'my-region', 0, 3); const region2 = createRegion('urn:foo', 'my-region', 3, 10); const region3 = createRegion('urn:foo', 'my-region', 5, 10); timeline.addRegion(region1); timeline.addRegion(region2); timeline.addRegion(region3); expect(onNewRegion).toHaveBeenCalledTimes(3); let regions = Array.from(timeline.regions()); expect(regions.length).toBe(3); // Give the timeline time to filter regions await shaka.test.Util.delay( shaka.media.RegionTimeline.REGION_FILTER_INTERVAL * 2); regions = Array.from(timeline.regions()); expect(regions).toEqual([region2, region3]); }); /** * @param {string} schemeIdUri * @param {string} id * @param {number} startTimeSeconds * @param {number} endTimeSeconds * @return {shaka.extern.TimelineRegionInfo} */ function createRegion(schemeIdUri, id, startTimeSeconds, endTimeSeconds) { return { schemeIdUri: schemeIdUri, id: id, value: '', startTime: startTimeSeconds, endTime: endTimeSeconds, eventElement: null, }; } });