2 Copyright (C) 2012-2013 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include <boost/test/unit_test.hpp>
21 #include "subtitle_asset.h"
24 using boost::shared_ptr;
26 /* Load a subtitle asset from XML and check that it is read correctly */
27 BOOST_AUTO_TEST_CASE (subtitles1)
29 libdcp::SubtitleAsset subs ("test/data", "subs1.xml");
31 BOOST_CHECK_EQUAL (subs.language(), "French");
33 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 6, 1, 250), libdcp::Time (0, 0, 6, 2, 250));
34 BOOST_CHECK_EQUAL (s.size(), 1);
35 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
38 libdcp::Color (255, 255, 255),
40 libdcp::Time (0, 0, 5, 198, 250),
41 libdcp::Time (0, 0, 7, 115, 250),
43 libdcp::VERTICAL_BOTTOM,
44 libdcp::HORIZONTAL_CENTER,
45 "My jacket was Idi Amin's",
47 libdcp::Color (0, 0, 0),
48 libdcp::Time (0, 0, 0, 1, 250),
49 libdcp::Time (0, 0, 0, 1, 250)
52 s = subs.subtitles_during (libdcp::Time (0, 0, 7, 190, 250), libdcp::Time (0, 0, 7, 191, 250));
53 BOOST_CHECK_EQUAL (s.size(), 2);
54 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
57 libdcp::Color (255, 255, 255),
59 libdcp::Time (0, 0, 7, 177, 250),
60 libdcp::Time (0, 0, 11, 31, 250),
62 libdcp::VERTICAL_BOTTOM,
63 libdcp::HORIZONTAL_CENTER,
64 "My corset was H.M. The Queen's",
66 libdcp::Color (0, 0, 0),
67 libdcp::Time (0, 0, 0, 1, 250),
68 libdcp::Time (0, 0, 0, 1, 250)
70 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
73 libdcp::Color (255, 255, 255),
75 libdcp::Time (0, 0, 7, 177, 250),
76 libdcp::Time (0, 0, 11, 31, 250),
78 libdcp::VERTICAL_BOTTOM,
79 libdcp::HORIZONTAL_CENTER,
82 libdcp::Color (0, 0, 0),
83 libdcp::Time (0, 0, 0, 1, 250),
84 libdcp::Time (0, 0, 0, 1, 250)
87 s = subs.subtitles_during (libdcp::Time (0, 0, 11, 95, 250), libdcp::Time (0, 0, 11, 96, 250));
88 BOOST_CHECK_EQUAL (s.size(), 1);
89 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
92 libdcp::Color (255, 255, 255),
94 libdcp::Time (0, 0, 11, 94, 250),
95 libdcp::Time (0, 0, 13, 63, 250),
97 libdcp::VERTICAL_BOTTOM,
98 libdcp::HORIZONTAL_CENTER,
99 "Once belonged to the Shah",
101 libdcp::Color (0, 0, 0),
102 libdcp::Time (0, 0, 0, 1, 250),
103 libdcp::Time (0, 0, 0, 1, 250)
106 s = subs.subtitles_during (libdcp::Time (0, 0, 14, 42, 250), libdcp::Time (0, 0, 14, 43, 250));
107 BOOST_CHECK_EQUAL (s.size(), 1);
108 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
111 libdcp::Color (255, 255, 255),
113 libdcp::Time (0, 0, 13, 104, 250),
114 libdcp::Time (0, 0, 15, 177, 250),
116 libdcp::VERTICAL_BOTTOM,
117 libdcp::HORIZONTAL_CENTER,
118 "And these are Roy Hattersley's jeans",
120 libdcp::Color (0, 0, 0),
121 libdcp::Time (0, 0, 0, 1, 250),
122 libdcp::Time (0, 0, 0, 1, 250)
126 /** And similarly for another one */
127 BOOST_AUTO_TEST_CASE (subtitles2)
129 libdcp::SubtitleAsset subs ("test/data", "subs2.xml");
131 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 42, 100, 250), libdcp::Time (0, 0, 42, 101, 250));
132 BOOST_CHECK_EQUAL (s.size(), 2);
133 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
136 libdcp::Color (255, 255, 255),
138 libdcp::Time (0, 0, 41, 62, 250),
139 libdcp::Time (0, 0, 43, 52, 250),
141 libdcp::VERTICAL_TOP,
142 libdcp::HORIZONTAL_CENTER,
143 "At afternoon tea with John Peel",
145 libdcp::Color (0, 0, 0),
146 libdcp::Time (0, 0, 0, 0, 250),
147 libdcp::Time (0, 0, 0, 0, 250)
149 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
152 libdcp::Color (255, 255, 255),
154 libdcp::Time (0, 0, 41, 62, 250),
155 libdcp::Time (0, 0, 43, 52, 250),
157 libdcp::VERTICAL_TOP,
158 libdcp::HORIZONTAL_CENTER,
159 "I enquired if his accent was real",
161 libdcp::Color (0, 0, 0),
162 libdcp::Time (0, 0, 0, 0, 250),
163 libdcp::Time (0, 0, 0, 0, 250)
166 s = subs.subtitles_during (libdcp::Time (0, 0, 50, 50, 250), libdcp::Time (0, 0, 50, 51, 250));
167 BOOST_CHECK_EQUAL (s.size(), 2);
168 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
171 libdcp::Color (255, 255, 255),
173 libdcp::Time (0, 0, 50, 42, 250),
174 libdcp::Time (0, 0, 52, 21, 250),
176 libdcp::VERTICAL_TOP,
177 libdcp::HORIZONTAL_CENTER,
178 "He said \"out of the house",
180 libdcp::Color (0, 0, 0),
181 libdcp::Time (0, 0, 0, 0, 250),
182 libdcp::Time (0, 0, 0, 0, 250)
184 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
187 libdcp::Color (255, 255, 255),
189 libdcp::Time (0, 0, 50, 42, 250),
190 libdcp::Time (0, 0, 52, 21, 250),
192 libdcp::VERTICAL_TOP,
193 libdcp::HORIZONTAL_CENTER,
194 "I'm incredibly scouse",
196 libdcp::Color (0, 0, 0),
197 libdcp::Time (0, 0, 0, 0, 250),
198 libdcp::Time (0, 0, 0, 0, 250)
201 s = subs.subtitles_during (libdcp::Time (0, 1, 2, 300, 250), libdcp::Time (0, 1, 2, 301, 250));
202 BOOST_CHECK_EQUAL (s.size(), 2);
203 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
206 libdcp::Color (255, 255, 255),
208 libdcp::Time (0, 1, 2, 208, 250),
209 libdcp::Time (0, 1, 4, 10, 250),
211 libdcp::VERTICAL_TOP,
212 libdcp::HORIZONTAL_CENTER,
213 "At home it depends how I feel.\"",
215 libdcp::Color (0, 0, 0),
216 libdcp::Time (0, 0, 0, 0, 250),
217 libdcp::Time (0, 0, 0, 0, 250)
219 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
222 libdcp::Color (255, 255, 255),
224 libdcp::Time (0, 1, 2, 208, 250),
225 libdcp::Time (0, 1, 4, 10, 250),
227 libdcp::VERTICAL_TOP,
228 libdcp::HORIZONTAL_CENTER,
229 "I spent a long weekend in Brighton",
231 libdcp::Color (0, 0, 0),
232 libdcp::Time (0, 0, 0, 0, 250),
233 libdcp::Time (0, 0, 0, 0, 250)
236 s = subs.subtitles_during (libdcp::Time (0, 1, 15, 50, 250), libdcp::Time (0, 1, 15, 51, 250));
237 BOOST_CHECK_EQUAL (s.size(), 2);
238 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
241 libdcp::Color (255, 255, 255),
243 libdcp::Time (0, 1, 15, 42, 250),
244 libdcp::Time (0, 1, 16, 42, 250),
246 libdcp::VERTICAL_TOP,
247 libdcp::HORIZONTAL_CENTER,
248 "With the legendary Miss Enid Blyton",
250 libdcp::Color (0, 0, 0),
251 libdcp::Time (0, 0, 0, 0, 250),
252 libdcp::Time (0, 0, 0, 0, 250)
254 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
257 libdcp::Color (255, 255, 255),
259 libdcp::Time (0, 1, 15, 42, 250),
260 libdcp::Time (0, 1, 16, 42, 250),
262 libdcp::VERTICAL_TOP,
263 libdcp::HORIZONTAL_CENTER,
264 "She said \"you be Noddy",
266 libdcp::Color (0, 0, 0),
267 libdcp::Time (0, 0, 0, 0, 250),
268 libdcp::Time (0, 0, 0, 0, 250)
271 s = subs.subtitles_during (libdcp::Time (0, 1, 27, 200, 250), libdcp::Time (0, 1, 27, 201, 250));
272 BOOST_CHECK_EQUAL (s.size(), 2);
273 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
276 libdcp::Color (255, 255, 255),
278 libdcp::Time (0, 1, 27, 115, 250),
279 libdcp::Time (0, 1, 28, 208, 250),
281 libdcp::VERTICAL_TOP,
282 libdcp::HORIZONTAL_CENTER,
283 "That curious creature the Sphinx",
285 libdcp::Color (0, 0, 0),
286 libdcp::Time (0, 0, 0, 0, 250),
287 libdcp::Time (0, 0, 0, 0, 250)
289 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
292 libdcp::Color (255, 255, 255),
294 libdcp::Time (0, 1, 27, 115, 250),
295 libdcp::Time (0, 1, 28, 208, 250),
297 libdcp::VERTICAL_TOP,
298 libdcp::HORIZONTAL_CENTER,
299 "Is smarter than anyone thinks",
301 libdcp::Color (0, 0, 0),
302 libdcp::Time (0, 0, 0, 0, 250),
303 libdcp::Time (0, 0, 0, 0, 250)
306 s = subs.subtitles_during (libdcp::Time (0, 1, 42, 300, 250), libdcp::Time (0, 1, 42, 301, 250));
307 BOOST_CHECK_EQUAL (s.size(), 2);
308 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
311 libdcp::Color (255, 255, 255),
313 libdcp::Time (0, 1, 42, 229, 250),
314 libdcp::Time (0, 1, 45, 62, 250),
316 libdcp::VERTICAL_TOP,
317 libdcp::HORIZONTAL_CENTER,
318 "It sits there and smirks",
320 libdcp::Color (0, 0, 0),
321 libdcp::Time (0, 0, 0, 0, 250),
322 libdcp::Time (0, 0, 0, 0, 250)
324 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
327 libdcp::Color (255, 255, 255),
329 libdcp::Time (0, 1, 42, 229, 250),
330 libdcp::Time (0, 1, 45, 62, 250),
332 libdcp::VERTICAL_TOP,
333 libdcp::HORIZONTAL_CENTER,
334 "And you don't think it works",
336 libdcp::Color (0, 0, 0),
337 libdcp::Time (0, 0, 0, 0, 250),
338 libdcp::Time (0, 0, 0, 0, 250)
341 s = subs.subtitles_during (libdcp::Time (0, 1, 45, 200, 250), libdcp::Time (0, 1, 45, 201, 250));
342 BOOST_CHECK_EQUAL (s.size(), 2);
343 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
346 libdcp::Color (255, 255, 255),
348 libdcp::Time (0, 1, 45, 146, 250),
349 libdcp::Time (0, 1, 47, 94, 250),
351 libdcp::VERTICAL_TOP,
352 libdcp::HORIZONTAL_CENTER,
353 "Then when you're not looking, it winks.",
355 libdcp::Color (0, 0, 0),
356 libdcp::Time (0, 0, 0, 0, 250),
357 libdcp::Time (0, 0, 0, 0, 250)
359 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
362 libdcp::Color (255, 255, 255),
364 libdcp::Time (0, 1, 45, 146, 250),
365 libdcp::Time (0, 1, 47, 94, 250),
367 libdcp::VERTICAL_TOP,
368 libdcp::HORIZONTAL_CENTER,
369 "When it snows you will find Sister Sledge",
371 libdcp::Color (0, 0, 0),
372 libdcp::Time (0, 0, 0, 0, 250),
373 libdcp::Time (0, 0, 0, 0, 250)
376 s = subs.subtitles_during (libdcp::Time (0, 1, 47, 249, 250), libdcp::Time (0, 1, 47, 250, 250));
377 BOOST_CHECK_EQUAL (s.size(), 2);
378 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
381 libdcp::Color (255, 255, 255),
383 libdcp::Time (0, 1, 47, 146, 250),
384 libdcp::Time (0, 1, 48, 167, 250),
386 libdcp::VERTICAL_TOP,
387 libdcp::HORIZONTAL_CENTER,
388 "Out mooning, at night, on the ledge",
390 libdcp::Color (0, 0, 0),
391 libdcp::Time (0, 0, 0, 0, 250),
392 libdcp::Time (0, 0, 0, 0, 250)
394 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
397 libdcp::Color (255, 255, 255),
399 libdcp::Time (0, 1, 47, 146, 250),
400 libdcp::Time (0, 1, 48, 167, 250),
402 libdcp::VERTICAL_TOP,
403 libdcp::HORIZONTAL_CENTER,
406 libdcp::Color (0, 0, 0),
407 libdcp::Time (0, 0, 0, 0, 250),
408 libdcp::Time (0, 0, 0, 0, 250)
411 s = subs.subtitles_during (libdcp::Time (0, 2, 6, 210, 250), libdcp::Time (0, 2, 6, 211, 250));
412 BOOST_CHECK_EQUAL (s.size(), 2);
413 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
416 libdcp::Color (255, 255, 255),
418 libdcp::Time (0, 2, 5, 208, 250),
419 libdcp::Time (0, 2, 7, 31, 250),
421 libdcp::VERTICAL_TOP,
422 libdcp::HORIZONTAL_CENTER,
425 libdcp::Color (0, 0, 0),
426 libdcp::Time (0, 0, 0, 0, 250),
427 libdcp::Time (0, 0, 0, 0, 250)
429 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
432 libdcp::Color (255, 255, 255),
434 libdcp::Time (0, 2, 5, 208, 250),
435 libdcp::Time (0, 2, 7, 31, 250),
437 libdcp::VERTICAL_TOP,
438 libdcp::HORIZONTAL_CENTER,
441 libdcp::Color (0, 0, 0),
442 libdcp::Time (0, 0, 0, 0, 250),
443 libdcp::Time (0, 0, 0, 0, 250)
447 /* A very simple SMPTE one */
448 BOOST_AUTO_TEST_CASE (subtitles3)
450 libdcp::SubtitleAsset subs ("test/data", "subs3.xml");
452 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 0, 0, 25), libdcp::Time (0, 0, 7, 0, 25));
454 BOOST_REQUIRE_EQUAL (s.size(), 1);
455 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
458 libdcp::Color (255, 255, 255),
460 libdcp::Time (0, 0, 4, 21, 25),
461 libdcp::Time (0, 0, 6, 5, 25),
463 libdcp::VERTICAL_BOTTOM,
464 libdcp::HORIZONTAL_CENTER,
467 libdcp::Color (0, 0, 0),
468 libdcp::Time (0, 0, 0, 0, 25),
469 libdcp::Time (0, 0, 0, 0, 25)
473 /* <Font italic="yes"> in the middle of a string */
474 BOOST_AUTO_TEST_CASE (subtitles4)
476 libdcp::SubtitleAsset subs ("test/data", "subs4.xml");
478 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 0, 0, 25), libdcp::Time (0, 0, 7, 0, 25));
480 BOOST_REQUIRE_EQUAL (s.size(), 1);
481 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
484 libdcp::Color (255, 255, 255),
486 libdcp::Time (0, 0, 4, 21, 25),
487 libdcp::Time (0, 0, 6, 5, 25),
489 libdcp::VERTICAL_BOTTOM,
490 libdcp::HORIZONTAL_CENTER,
491 "Hello <i>there</i> world",
493 libdcp::Color (0, 0, 0),
494 libdcp::Time (0, 0, 0, 0, 25),
495 libdcp::Time (0, 0, 0, 0, 25)