1 | import QUnit from 'qunit';
|
2 | import AdCueTags from '../src/ad-cue-tags';
|
3 | import window from 'global/window';
|
4 |
|
5 | QUnit.module('AdCueTags', {
|
6 | beforeEach() {
|
7 | this.track = {
|
8 | cues: [],
|
9 | addCue(cue) {
|
10 | this.cues.push(cue);
|
11 | },
|
12 | clearTrack() {
|
13 | this.cues = [];
|
14 | }
|
15 | };
|
16 | }
|
17 | });
|
18 |
|
19 | QUnit.test('update tag cues', function(assert) {
|
20 |
|
21 | let testCue = new window.VTTCue(0, 10, 'test');
|
22 |
|
23 | this.track.addCue(testCue);
|
24 |
|
25 | AdCueTags.updateAdCues({}, this.track);
|
26 |
|
27 | assert.equal(this.track.cues.length,
|
28 | 1,
|
29 | 'does not change cues if media does not have segment property');
|
30 | assert.equal(this.track.cues[0],
|
31 | testCue,
|
32 | 'does not change cues if media does not have segment property');
|
33 |
|
34 | AdCueTags.updateAdCues({
|
35 | segments: []
|
36 | }, this.track);
|
37 |
|
38 | assert.equal(this.track.cues.length,
|
39 | 1,
|
40 | 'does not remove cues even if no segments in playlist');
|
41 |
|
42 | this.track.clearTrack();
|
43 |
|
44 | AdCueTags.updateAdCues({
|
45 | segments: [{
|
46 | duration: 5.1,
|
47 | cueOut: '11.5'
|
48 | }, {
|
49 | duration: 6.4,
|
50 | cueOutCont: '5.1/11.5'
|
51 | }, {
|
52 | duration: 6,
|
53 | cueIn: ''
|
54 | }]
|
55 | }, this.track, 10);
|
56 |
|
57 | assert.equal(this.track.cues.length, 1, 'adds a single cue for entire ad');
|
58 |
|
59 | testCue = this.track.cues[0];
|
60 | assert.equal(testCue.startTime, 10, 'cue starts at 10');
|
61 | assert.equal(testCue.endTime, 21.5, 'cue ends at start time plus duration');
|
62 |
|
63 | this.track.clearTrack();
|
64 |
|
65 | AdCueTags.updateAdCues({
|
66 | segments: [{
|
67 | duration: 10,
|
68 | cueOutCont: '10/30'
|
69 | }, {
|
70 | duration: 10,
|
71 | cueOutCont: '20/30'
|
72 | }, {
|
73 | duration: 10,
|
74 | cueIn: ''
|
75 | }]
|
76 | }, this.track);
|
77 |
|
78 | assert.equal(this.track.cues.length, 1,
|
79 | 'adds a single cue for entire ad when entering mid cue-out-cont');
|
80 |
|
81 | testCue = this.track.cues[0];
|
82 | assert.equal(testCue.startTime, 0, 'cue starts at 0');
|
83 | assert.equal(testCue.endTime, 20, 'cue ends at start time plus duration');
|
84 | assert.equal(testCue.adStartTime, -10, 'cue ad starts at -10');
|
85 | assert.equal(testCue.adEndTime, 20, 'cue ad ends at 20');
|
86 | });
|
87 |
|
88 | QUnit.test('update incomplete cue in live playlist situation', function(assert) {
|
89 | AdCueTags.updateAdCues({
|
90 | segments: [
|
91 | {
|
92 | duration: 10,
|
93 | cueOut: '30'
|
94 | },
|
95 | {
|
96 | duration: 10,
|
97 | cueOutCont: '10/30'
|
98 | }
|
99 | ]
|
100 | }, this.track, 10);
|
101 |
|
102 | assert.equal(this.track.cues.length, 1, 'adds a single cue for new ad');
|
103 |
|
104 | let testCue = this.track.cues[0];
|
105 |
|
106 | assert.equal(testCue.startTime, 10, 'cue starts at 10');
|
107 | assert.equal(testCue.endTime, 30, 'cue ends at start time plus segment durations');
|
108 | assert.equal(testCue.adStartTime, 10, 'cue ad starts at 10');
|
109 | assert.equal(testCue.adEndTime, 40, 'cue ad ends at 40');
|
110 |
|
111 | AdCueTags.updateAdCues({
|
112 | segments: [
|
113 | {
|
114 | duration: 10,
|
115 | cueOutCont: '10/30'
|
116 | },
|
117 | {
|
118 | duration: 10,
|
119 | cueOutCont: '20/30'
|
120 | }
|
121 | ]
|
122 | }, this.track, 20);
|
123 |
|
124 | assert.equal(this.track.cues.length, 1, 'did not remove cue or add a new one');
|
125 |
|
126 | assert.equal(testCue.startTime, 10, 'cue still starts at 10');
|
127 | assert.equal(testCue.endTime, 40, 'cue end updated to include next segment duration');
|
128 | assert.equal(testCue.adStartTime, 10, 'cue ad still starts at 10');
|
129 | assert.equal(testCue.adEndTime, 40, 'cue ad still ends at 40');
|
130 |
|
131 | AdCueTags.updateAdCues({
|
132 | segments: [
|
133 | {
|
134 | duration: 10,
|
135 | cueOutCont: '20/30'
|
136 | },
|
137 | {
|
138 | duration: 10,
|
139 | cueIn: ''
|
140 | }
|
141 | ]
|
142 | }, this.track, 30);
|
143 |
|
144 | assert.equal(this.track.cues.length, 1, 'did not remove cue or add a new one');
|
145 |
|
146 | assert.equal(testCue.startTime, 10, 'cue still starts at 10');
|
147 | assert.equal(testCue.endTime, 40, 'cue end still 40');
|
148 | assert.equal(testCue.adStartTime, 10, 'cue ad still starts at 10');
|
149 | assert.equal(testCue.adEndTime, 40, 'cue ad still ends at 40');
|
150 | });
|
151 |
|
152 | QUnit.test('adjust cue end time in event of early CUE-IN', function(assert) {
|
153 | AdCueTags.updateAdCues({
|
154 | segments: [
|
155 | {
|
156 | duration: 10,
|
157 | cueOut: '30'
|
158 | },
|
159 | {
|
160 | duration: 10,
|
161 | cueOutCont: '10/30'
|
162 | },
|
163 | {
|
164 | duration: 10,
|
165 | cueOutCont: '20/30'
|
166 | }
|
167 | ]
|
168 | }, this.track, 10);
|
169 |
|
170 | assert.equal(this.track.cues.length, 1, 'adds a single cue for new ad');
|
171 |
|
172 | let testCue = this.track.cues[0];
|
173 |
|
174 | assert.equal(testCue.startTime, 10, 'cue starts at 10');
|
175 | assert.equal(testCue.endTime, 40, 'cue ends at start time plus segment durations');
|
176 | assert.equal(testCue.adStartTime, 10, 'cue ad starts at 10');
|
177 | assert.equal(testCue.adEndTime, 40, 'cue ad ends at 40');
|
178 |
|
179 | AdCueTags.updateAdCues({
|
180 | segments: [
|
181 | {
|
182 | duration: 10,
|
183 | cueOutCont: '10/30'
|
184 | },
|
185 | {
|
186 | duration: 10,
|
187 | cueIn: ''
|
188 | },
|
189 | {
|
190 | duration: 10
|
191 | }
|
192 | ]
|
193 | }, this.track, 20);
|
194 |
|
195 | assert.equal(this.track.cues.length, 1, 'did not remove cue or add a new one');
|
196 |
|
197 | assert.equal(testCue.startTime, 10, 'cue still starts at 10');
|
198 | assert.equal(testCue.endTime, 30, 'cue end updated to 30');
|
199 | assert.equal(testCue.adStartTime, 10, 'cue ad still starts at 10');
|
200 | assert.equal(testCue.adEndTime, 30,
|
201 | 'cue ad end updated to 30 to account for early cueIn');
|
202 | });
|
203 |
|
204 | QUnit.test('correctly handle multiple ad cues', function(assert) {
|
205 | AdCueTags.updateAdCues({
|
206 | segments: [
|
207 | {
|
208 | duration: 10
|
209 | },
|
210 | {
|
211 | duration: 10
|
212 | },
|
213 | {
|
214 | duration: 10
|
215 | },
|
216 | {
|
217 | duration: 10,
|
218 | cueOut: '30'
|
219 | },
|
220 | {
|
221 | duration: 10,
|
222 | cueOutCont: '10/30'
|
223 | },
|
224 | {
|
225 | duration: 10,
|
226 | cueOutCont: '20/30'
|
227 | },
|
228 | {
|
229 | duration: 10,
|
230 | cueIn: ''
|
231 | },
|
232 | {
|
233 | duration: 10
|
234 | },
|
235 | {
|
236 | duration: 10
|
237 | },
|
238 | {
|
239 | duration: 10
|
240 | },
|
241 | {
|
242 | duration: 10,
|
243 | cueOut: '20'
|
244 | },
|
245 | {
|
246 | duration: 10,
|
247 | cueOutCont: '10/20'
|
248 | },
|
249 | {
|
250 | duration: 10,
|
251 | cueIn: ''
|
252 | },
|
253 | {
|
254 | duration: 10
|
255 | }
|
256 | ]
|
257 | }, this.track);
|
258 |
|
259 | assert.equal(this.track.cues.length, 2, 'correctly created 2 cues for the ads');
|
260 | assert.equal(this.track.cues[0].startTime, 30, 'cue created at correct start time');
|
261 | assert.equal(this.track.cues[0].endTime, 60, 'cue has correct end time');
|
262 | assert.equal(this.track.cues[0].adStartTime, 30, 'cue has correct ad start time');
|
263 | assert.equal(this.track.cues[0].adEndTime, 60, 'cue has correct ad end time');
|
264 | assert.equal(this.track.cues[1].startTime, 100, 'cue created at correct start time');
|
265 | assert.equal(this.track.cues[1].endTime, 120, 'cue has correct end time');
|
266 | assert.equal(this.track.cues[1].adStartTime, 100, 'cue has correct ad start time');
|
267 | assert.equal(this.track.cues[1].adEndTime, 120, 'cue has correct ad end time');
|
268 | });
|
269 |
|
270 | QUnit.test('findAdCue returns correct cue', function(assert) {
|
271 | this.track.cues = [
|
272 | {
|
273 | adStartTime: 0,
|
274 | adEndTime: 30
|
275 | },
|
276 | {
|
277 | adStartTime: 45,
|
278 | adEndTime: 55
|
279 | },
|
280 | {
|
281 | adStartTime: 100,
|
282 | adEndTime: 120
|
283 | }
|
284 | ];
|
285 |
|
286 | let cue;
|
287 |
|
288 | cue = AdCueTags.findAdCue(this.track, 15);
|
289 | assert.equal(cue.adStartTime, 0, 'returned correct cue');
|
290 |
|
291 | cue = AdCueTags.findAdCue(this.track, 40);
|
292 | assert.equal(cue, null, 'cue not found, returned null');
|
293 |
|
294 | cue = AdCueTags.findAdCue(this.track, 120);
|
295 | assert.equal(cue.adStartTime, 100, 'returned correct cue');
|
296 |
|
297 | cue = AdCueTags.findAdCue(this.track, 45);
|
298 | assert.equal(cue.adStartTime, 45, 'returned correct cue');
|
299 | });
|