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),
44 "My jacket was Idi Amin's",
46 libdcp::Color (0, 0, 0),
47 libdcp::Time (0, 0, 0, 1, 250),
48 libdcp::Time (0, 0, 0, 1, 250)
51 s = subs.subtitles_during (libdcp::Time (0, 0, 7, 190, 250), libdcp::Time (0, 0, 7, 191, 250));
52 BOOST_CHECK_EQUAL (s.size(), 2);
53 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
56 libdcp::Color (255, 255, 255),
58 libdcp::Time (0, 0, 7, 177, 250),
59 libdcp::Time (0, 0, 11, 31, 250),
62 "My corset was H.M. The Queen's",
64 libdcp::Color (0, 0, 0),
65 libdcp::Time (0, 0, 0, 1, 250),
66 libdcp::Time (0, 0, 0, 1, 250)
68 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
71 libdcp::Color (255, 255, 255),
73 libdcp::Time (0, 0, 7, 177, 250),
74 libdcp::Time (0, 0, 11, 31, 250),
79 libdcp::Color (0, 0, 0),
80 libdcp::Time (0, 0, 0, 1, 250),
81 libdcp::Time (0, 0, 0, 1, 250)
84 s = subs.subtitles_during (libdcp::Time (0, 0, 11, 95, 250), libdcp::Time (0, 0, 11, 96, 250));
85 BOOST_CHECK_EQUAL (s.size(), 1);
86 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
89 libdcp::Color (255, 255, 255),
91 libdcp::Time (0, 0, 11, 94, 250),
92 libdcp::Time (0, 0, 13, 63, 250),
95 "Once belonged to the Shah",
97 libdcp::Color (0, 0, 0),
98 libdcp::Time (0, 0, 0, 1, 250),
99 libdcp::Time (0, 0, 0, 1, 250)
102 s = subs.subtitles_during (libdcp::Time (0, 0, 14, 42, 250), libdcp::Time (0, 0, 14, 43, 250));
103 BOOST_CHECK_EQUAL (s.size(), 1);
104 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
107 libdcp::Color (255, 255, 255),
109 libdcp::Time (0, 0, 13, 104, 250),
110 libdcp::Time (0, 0, 15, 177, 250),
113 "And these are Roy Hattersley's jeans",
115 libdcp::Color (0, 0, 0),
116 libdcp::Time (0, 0, 0, 1, 250),
117 libdcp::Time (0, 0, 0, 1, 250)
121 /** And similarly for another one */
122 BOOST_AUTO_TEST_CASE (subtitles2)
124 libdcp::SubtitleAsset subs ("test/data", "subs2.xml");
126 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 42, 100, 250), libdcp::Time (0, 0, 42, 101, 250));
127 BOOST_CHECK_EQUAL (s.size(), 2);
128 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
131 libdcp::Color (255, 255, 255),
133 libdcp::Time (0, 0, 41, 62, 250),
134 libdcp::Time (0, 0, 43, 52, 250),
137 "At afternoon tea with John Peel",
139 libdcp::Color (0, 0, 0),
140 libdcp::Time (0, 0, 0, 0, 250),
141 libdcp::Time (0, 0, 0, 0, 250)
143 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
146 libdcp::Color (255, 255, 255),
148 libdcp::Time (0, 0, 41, 62, 250),
149 libdcp::Time (0, 0, 43, 52, 250),
152 "I enquired if his accent was real",
154 libdcp::Color (0, 0, 0),
155 libdcp::Time (0, 0, 0, 0, 250),
156 libdcp::Time (0, 0, 0, 0, 250)
159 s = subs.subtitles_during (libdcp::Time (0, 0, 50, 50, 250), libdcp::Time (0, 0, 50, 51, 250));
160 BOOST_CHECK_EQUAL (s.size(), 2);
161 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
164 libdcp::Color (255, 255, 255),
166 libdcp::Time (0, 0, 50, 42, 250),
167 libdcp::Time (0, 0, 52, 21, 250),
170 "He said \"out of the house",
172 libdcp::Color (0, 0, 0),
173 libdcp::Time (0, 0, 0, 0, 250),
174 libdcp::Time (0, 0, 0, 0, 250)
176 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
179 libdcp::Color (255, 255, 255),
181 libdcp::Time (0, 0, 50, 42, 250),
182 libdcp::Time (0, 0, 52, 21, 250),
185 "I'm incredibly scouse",
187 libdcp::Color (0, 0, 0),
188 libdcp::Time (0, 0, 0, 0, 250),
189 libdcp::Time (0, 0, 0, 0, 250)
192 s = subs.subtitles_during (libdcp::Time (0, 1, 2, 300, 250), libdcp::Time (0, 1, 2, 301, 250));
193 BOOST_CHECK_EQUAL (s.size(), 2);
194 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
197 libdcp::Color (255, 255, 255),
199 libdcp::Time (0, 1, 2, 208, 250),
200 libdcp::Time (0, 1, 4, 10, 250),
203 "At home it depends how I feel.\"",
205 libdcp::Color (0, 0, 0),
206 libdcp::Time (0, 0, 0, 0, 250),
207 libdcp::Time (0, 0, 0, 0, 250)
209 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
212 libdcp::Color (255, 255, 255),
214 libdcp::Time (0, 1, 2, 208, 250),
215 libdcp::Time (0, 1, 4, 10, 250),
218 "I spent a long weekend in Brighton",
220 libdcp::Color (0, 0, 0),
221 libdcp::Time (0, 0, 0, 0, 250),
222 libdcp::Time (0, 0, 0, 0, 250)
225 s = subs.subtitles_during (libdcp::Time (0, 1, 15, 50, 250), libdcp::Time (0, 1, 15, 51, 250));
226 BOOST_CHECK_EQUAL (s.size(), 2);
227 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
230 libdcp::Color (255, 255, 255),
232 libdcp::Time (0, 1, 15, 42, 250),
233 libdcp::Time (0, 1, 16, 42, 250),
236 "With the legendary Miss Enid Blyton",
238 libdcp::Color (0, 0, 0),
239 libdcp::Time (0, 0, 0, 0, 250),
240 libdcp::Time (0, 0, 0, 0, 250)
242 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
245 libdcp::Color (255, 255, 255),
247 libdcp::Time (0, 1, 15, 42, 250),
248 libdcp::Time (0, 1, 16, 42, 250),
251 "She said \"you be Noddy",
253 libdcp::Color (0, 0, 0),
254 libdcp::Time (0, 0, 0, 0, 250),
255 libdcp::Time (0, 0, 0, 0, 250)
258 s = subs.subtitles_during (libdcp::Time (0, 1, 27, 200, 250), libdcp::Time (0, 1, 27, 201, 250));
259 BOOST_CHECK_EQUAL (s.size(), 2);
260 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
263 libdcp::Color (255, 255, 255),
265 libdcp::Time (0, 1, 27, 115, 250),
266 libdcp::Time (0, 1, 28, 208, 250),
269 "That curious creature the Sphinx",
271 libdcp::Color (0, 0, 0),
272 libdcp::Time (0, 0, 0, 0, 250),
273 libdcp::Time (0, 0, 0, 0, 250)
275 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
278 libdcp::Color (255, 255, 255),
280 libdcp::Time (0, 1, 27, 115, 250),
281 libdcp::Time (0, 1, 28, 208, 250),
284 "Is smarter than anyone thinks",
286 libdcp::Color (0, 0, 0),
287 libdcp::Time (0, 0, 0, 0, 250),
288 libdcp::Time (0, 0, 0, 0, 250)
291 s = subs.subtitles_during (libdcp::Time (0, 1, 42, 300, 250), libdcp::Time (0, 1, 42, 301, 250));
292 BOOST_CHECK_EQUAL (s.size(), 2);
293 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
296 libdcp::Color (255, 255, 255),
298 libdcp::Time (0, 1, 42, 229, 250),
299 libdcp::Time (0, 1, 45, 62, 250),
302 "It sits there and smirks",
304 libdcp::Color (0, 0, 0),
305 libdcp::Time (0, 0, 0, 0, 250),
306 libdcp::Time (0, 0, 0, 0, 250)
308 BOOST_CHECK_EQUAL (*(s.back().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),
317 "And you don't think it works",
319 libdcp::Color (0, 0, 0),
320 libdcp::Time (0, 0, 0, 0, 250),
321 libdcp::Time (0, 0, 0, 0, 250)
324 s = subs.subtitles_during (libdcp::Time (0, 1, 45, 200, 250), libdcp::Time (0, 1, 45, 201, 250));
325 BOOST_CHECK_EQUAL (s.size(), 2);
326 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
329 libdcp::Color (255, 255, 255),
331 libdcp::Time (0, 1, 45, 146, 250),
332 libdcp::Time (0, 1, 47, 94, 250),
335 "Then when you're not looking, it winks.",
337 libdcp::Color (0, 0, 0),
338 libdcp::Time (0, 0, 0, 0, 250),
339 libdcp::Time (0, 0, 0, 0, 250)
341 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
344 libdcp::Color (255, 255, 255),
346 libdcp::Time (0, 1, 45, 146, 250),
347 libdcp::Time (0, 1, 47, 94, 250),
350 "When it snows you will find Sister Sledge",
352 libdcp::Color (0, 0, 0),
353 libdcp::Time (0, 0, 0, 0, 250),
354 libdcp::Time (0, 0, 0, 0, 250)
357 s = subs.subtitles_during (libdcp::Time (0, 1, 47, 249, 250), libdcp::Time (0, 1, 47, 250, 250));
358 BOOST_CHECK_EQUAL (s.size(), 2);
359 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
362 libdcp::Color (255, 255, 255),
364 libdcp::Time (0, 1, 47, 146, 250),
365 libdcp::Time (0, 1, 48, 167, 250),
368 "Out mooning, at night, on the ledge",
370 libdcp::Color (0, 0, 0),
371 libdcp::Time (0, 0, 0, 0, 250),
372 libdcp::Time (0, 0, 0, 0, 250)
374 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
377 libdcp::Color (255, 255, 255),
379 libdcp::Time (0, 1, 47, 146, 250),
380 libdcp::Time (0, 1, 48, 167, 250),
385 libdcp::Color (0, 0, 0),
386 libdcp::Time (0, 0, 0, 0, 250),
387 libdcp::Time (0, 0, 0, 0, 250)
390 s = subs.subtitles_during (libdcp::Time (0, 2, 6, 210, 250), libdcp::Time (0, 2, 6, 211, 250));
391 BOOST_CHECK_EQUAL (s.size(), 2);
392 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
395 libdcp::Color (255, 255, 255),
397 libdcp::Time (0, 2, 5, 208, 250),
398 libdcp::Time (0, 2, 7, 31, 250),
403 libdcp::Color (0, 0, 0),
404 libdcp::Time (0, 0, 0, 0, 250),
405 libdcp::Time (0, 0, 0, 0, 250)
407 BOOST_CHECK_EQUAL (*(s.back().get()), libdcp::Subtitle (
410 libdcp::Color (255, 255, 255),
412 libdcp::Time (0, 2, 5, 208, 250),
413 libdcp::Time (0, 2, 7, 31, 250),
418 libdcp::Color (0, 0, 0),
419 libdcp::Time (0, 0, 0, 0, 250),
420 libdcp::Time (0, 0, 0, 0, 250)
424 /* A very simple SMPTE one */
425 BOOST_AUTO_TEST_CASE (subtitles3)
427 libdcp::SubtitleAsset subs ("test/data", "subs3.xml");
429 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 0, 0, 25), libdcp::Time (0, 0, 7, 0, 25));
431 BOOST_REQUIRE_EQUAL (s.size(), 1);
432 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
435 libdcp::Color (255, 255, 255),
437 libdcp::Time (0, 0, 4, 21, 25),
438 libdcp::Time (0, 0, 6, 5, 25),
443 libdcp::Color (0, 0, 0),
444 libdcp::Time (0, 0, 0, 0, 25),
445 libdcp::Time (0, 0, 0, 0, 25)
449 /* <Font italic="yes"> in the middle of a string */
450 BOOST_AUTO_TEST_CASE (subtitles4)
452 libdcp::SubtitleAsset subs ("test/data", "subs4.xml");
454 list<shared_ptr<libdcp::Subtitle> > s = subs.subtitles_during (libdcp::Time (0, 0, 0, 0, 25), libdcp::Time (0, 0, 7, 0, 25));
456 BOOST_REQUIRE_EQUAL (s.size(), 1);
457 BOOST_CHECK_EQUAL (*(s.front().get()), libdcp::Subtitle (
460 libdcp::Color (255, 255, 255),
462 libdcp::Time (0, 0, 4, 21, 25),
463 libdcp::Time (0, 0, 6, 5, 25),
466 "Hello <i>there</i> world",
468 libdcp::Color (0, 0, 0),
469 libdcp::Time (0, 0, 0, 0, 25),
470 libdcp::Time (0, 0, 0, 0, 25)