a66327f1c59e73e629888c0f13028eef7a53b147
[libdcp.git] / test / read_interop_subtitle_test.cc
1 /*
2     Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
3
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.
8
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.
13
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.
17
18 */
19
20 #include "interop_subtitle_asset.h"
21 #include "interop_load_font_node.h"
22 #include "subtitle_string.h"
23 #include <boost/test/unit_test.hpp>
24
25 using std::list;
26 using std::string;
27 using boost::shared_ptr;
28 using boost::dynamic_pointer_cast;
29
30 /** Load some subtitle content from Interop XML and check that it is read correctly */
31 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1)
32 {
33         dcp::InteropSubtitleAsset subs ("test/data/subs1.xml");
34
35         BOOST_CHECK_EQUAL (subs.id(), "cab5c268-222b-41d2-88ae-6d6999441b17");
36         BOOST_CHECK_EQUAL (subs.movie_title(), "Movie Title");
37         BOOST_CHECK_EQUAL (subs.reel_number(), "1");
38         BOOST_CHECK_EQUAL (subs.language(), "French");
39
40         list<shared_ptr<dcp::LoadFontNode> > lfn = subs.load_font_nodes ();
41         BOOST_REQUIRE_EQUAL (lfn.size(), 1);
42         shared_ptr<dcp::InteropLoadFontNode> interop_lfn = dynamic_pointer_cast<dcp::InteropLoadFontNode> (lfn.front ());
43         BOOST_REQUIRE (interop_lfn);
44         BOOST_CHECK_EQUAL (interop_lfn->id, "theFontId");
45         BOOST_CHECK_EQUAL (interop_lfn->uri, "arial.ttf");
46
47         list<dcp::SubtitleString> s = subs.subtitles_during (dcp::Time (0, 0, 6, 1, 250), dcp::Time (0, 0, 6, 2, 250), false);
48         BOOST_REQUIRE_EQUAL (s.size(), 1);
49         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
50                                    string ("theFontId"),
51                                    false,
52                                    dcp::Colour (255, 255, 255),
53                                    39,
54                                    1.0,
55                                    dcp::Time (0, 0, 5, 198, 250),
56                                    dcp::Time (0, 0, 7, 115, 250),
57                                    0,
58                                    dcp::HALIGN_CENTER,
59                                    0.15,
60                                    dcp::VALIGN_BOTTOM,
61                                    "My jacket was Idi Amin's",
62                                    dcp::BORDER,
63                                    dcp::Colour (0, 0, 0),
64                                    dcp::Time (0, 0, 0, 1, 250),
65                                    dcp::Time (0, 0, 0, 1, 250)
66                                    ));
67
68         s = subs.subtitles_during (dcp::Time (0, 0, 7, 190, 250), dcp::Time (0, 0, 7, 191, 250), false);
69         BOOST_REQUIRE_EQUAL (s.size(), 2);
70         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
71                                    string ("theFontId"),
72                                    true,
73                                    dcp::Colour (255, 255, 255),
74                                    39,
75                                    1.0,
76                                    dcp::Time (0, 0, 7, 177, 250),
77                                    dcp::Time (0, 0, 11, 31, 250),
78                                    0,
79                                    dcp::HALIGN_CENTER,
80                                    0.21,
81                                    dcp::VALIGN_BOTTOM,
82                                    "My corset was H.M. The Queen's",
83                                    dcp::BORDER,
84                                    dcp::Colour (0, 0, 0),
85                                    dcp::Time (0, 0, 0, 1, 250),
86                                    dcp::Time (0, 0, 0, 1, 250)
87                                    ));
88         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
89                                    string ("theFontId"),
90                                    false,
91                                    dcp::Colour (255, 255, 255),
92                                    39,
93                                    1.0,
94                                    dcp::Time (0, 0, 7, 177, 250),
95                                    dcp::Time (0, 0, 11, 31, 250),
96                                    0,
97                                    dcp::HALIGN_CENTER,
98                                    0.15,
99                                    dcp::VALIGN_BOTTOM,
100                                    "My large wonderbra",
101                                    dcp::BORDER,
102                                    dcp::Colour (0, 0, 0),
103                                    dcp::Time (0, 0, 0, 1, 250),
104                                    dcp::Time (0, 0, 0, 1, 250)
105                                    ));
106
107         s = subs.subtitles_during (dcp::Time (0, 0, 11, 95, 250), dcp::Time (0, 0, 11, 96, 250), false);
108         BOOST_REQUIRE_EQUAL (s.size(), 1);
109         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
110                                    string ("theFontId"),
111                                    false,
112                                    dcp::Colour (255, 255, 255),
113                                    39,
114                                    1.0,
115                                    dcp::Time (0, 0, 11, 94, 250),
116                                    dcp::Time (0, 0, 13, 63, 250),
117                                    0,
118                                    dcp::HALIGN_CENTER,
119                                    0.15,
120                                    dcp::VALIGN_BOTTOM,
121                                    "Once belonged to the Shah",
122                                    dcp::BORDER,
123                                    dcp::Colour (0, 0, 0),
124                                    dcp::Time (0, 0, 0, 1, 250),
125                                    dcp::Time (0, 0, 0, 1, 250)
126                                    ));
127
128         s = subs.subtitles_during (dcp::Time (0, 0, 14, 42, 250), dcp::Time (0, 0, 14, 43, 250), false);
129         BOOST_REQUIRE_EQUAL (s.size(), 1);
130         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
131                                    string ("theFontId"),
132                                    false,
133                                    dcp::Colour (255, 255, 255),
134                                    39,
135                                    1.0,
136                                    dcp::Time (0, 0, 13, 104, 250),
137                                    dcp::Time (0, 0, 15, 177, 250),
138                                    0,
139                                    dcp::HALIGN_CENTER,
140                                    0.15,
141                                    dcp::VALIGN_BOTTOM,
142                                    "And these are Roy Hattersley's jeans",
143                                    dcp::BORDER,
144                                    dcp::Colour (0, 0, 0),
145                                    dcp::Time (0, 0, 0, 1, 250),
146                                    dcp::Time (0, 0, 0, 1, 250)
147                                    ));
148 }
149
150 /** And similarly for another one */
151 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
152 {
153         dcp::InteropSubtitleAsset subs ("test/data/subs2.xml");
154
155         list<dcp::SubtitleString> s = subs.subtitles_during (dcp::Time (0, 0, 42, 100, 250), dcp::Time (0, 0, 42, 101, 250), false);
156         BOOST_REQUIRE_EQUAL (s.size(), 2);
157         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
158                                    string ("theFont"),
159                                    true,
160                                    dcp::Colour (255, 255, 255),
161                                    42,
162                                    1.0,
163                                    dcp::Time (0, 0, 41, 62, 250),
164                                    dcp::Time (0, 0, 43, 52, 250),
165                                    0,
166                                    dcp::HALIGN_CENTER,
167                                    0.89,
168                                    dcp::VALIGN_TOP,
169                                    "At afternoon tea with John Peel",
170                                    dcp::BORDER,
171                                    dcp::Colour (0, 0, 0),
172                                    dcp::Time (0, 0, 0, 0, 250),
173                                    dcp::Time (0, 0, 0, 0, 250)
174                                    ));
175         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
176                                    string ("theFont"),
177                                    true,
178                                    dcp::Colour (255, 255, 255),
179                                    42,
180                                    1.0,
181                                    dcp::Time (0, 0, 41, 62, 250),
182                                    dcp::Time (0, 0, 43, 52, 250),
183                                    0,
184                                    dcp::HALIGN_CENTER,
185                                    0.95,
186                                    dcp::VALIGN_TOP,
187                                    "I enquired if his accent was real",
188                                    dcp::BORDER,
189                                    dcp::Colour (0, 0, 0),
190                                    dcp::Time (0, 0, 0, 0, 250),
191                                    dcp::Time (0, 0, 0, 0, 250)
192                                    ));
193
194         s = subs.subtitles_during (dcp::Time (0, 0, 50, 50, 250), dcp::Time (0, 0, 50, 51, 250), false);
195         BOOST_REQUIRE_EQUAL (s.size(), 2);
196         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
197                                    string ("theFont"),
198                                    true,
199                                    dcp::Colour (255, 255, 255),
200                                    42,
201                                    1.0,
202                                    dcp::Time (0, 0, 50, 42, 250),
203                                    dcp::Time (0, 0, 52, 21, 250),
204                                    0,
205                                    dcp::HALIGN_CENTER,
206                                    0.89,
207                                    dcp::VALIGN_TOP,
208                                    "He said \"out of the house",
209                                    dcp::BORDER,
210                                    dcp::Colour (0, 0, 0),
211                                    dcp::Time (0, 0, 0, 0, 250),
212                                    dcp::Time (0, 0, 0, 0, 250)
213                                    ));
214         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
215                                    string ("theFont"),
216                                    true,
217                                    dcp::Colour (255, 255, 255),
218                                    42,
219                                    1.0,
220                                    dcp::Time (0, 0, 50, 42, 250),
221                                    dcp::Time (0, 0, 52, 21, 250),
222                                    0,
223                                    dcp::HALIGN_CENTER,
224                                    0.95,
225                                    dcp::VALIGN_TOP,
226                                    "I'm incredibly scouse",
227                                    dcp::BORDER,
228                                    dcp::Colour (0, 0, 0),
229                                    dcp::Time (0, 0, 0, 0, 250),
230                                    dcp::Time (0, 0, 0, 0, 250)
231                                    ));
232
233         s = subs.subtitles_during (dcp::Time (0, 1, 2, 300, 250), dcp::Time (0, 1, 2, 301, 250), false);
234         BOOST_REQUIRE_EQUAL (s.size(), 2);
235         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
236                                    string ("theFont"),
237                                    true,
238                                    dcp::Colour (255, 255, 255),
239                                    42,
240                                    1.0,
241                                    dcp::Time (0, 1, 2, 208, 250),
242                                    dcp::Time (0, 1, 4, 10, 250),
243                                    0,
244                                    dcp::HALIGN_CENTER,
245                                    0.89,
246                                    dcp::VALIGN_TOP,
247                                    "At home it depends how I feel.\"",
248                                    dcp::BORDER,
249                                    dcp::Colour (0, 0, 0),
250                                    dcp::Time (0, 0, 0, 0, 250),
251                                    dcp::Time (0, 0, 0, 0, 250)
252                                    ));
253         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
254                                    string ("theFont"),
255                                    true,
256                                    dcp::Colour (255, 255, 255),
257                                    42,
258                                    1.0,
259                                    dcp::Time (0, 1, 2, 208, 250),
260                                    dcp::Time (0, 1, 4, 10, 250),
261                                    0,
262                                    dcp::HALIGN_CENTER,
263                                    0.95,
264                                    dcp::VALIGN_TOP,
265                                    "I spent a long weekend in Brighton",
266                                    dcp::BORDER,
267                                    dcp::Colour (0, 0, 0),
268                                    dcp::Time (0, 0, 0, 0, 250),
269                                    dcp::Time (0, 0, 0, 0, 250)
270                                    ));
271
272         s = subs.subtitles_during (dcp::Time (0, 1, 15, 50, 250), dcp::Time (0, 1, 15, 51, 250), false);
273         BOOST_REQUIRE_EQUAL (s.size(), 2);
274         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
275                                    string ("theFont"),
276                                    true,
277                                    dcp::Colour (255, 255, 255),
278                                    42,
279                                    1.0,
280                                    dcp::Time (0, 1, 15, 42, 250),
281                                    dcp::Time (0, 1, 16, 42, 250),
282                                    0,
283                                    dcp::HALIGN_CENTER,
284                                    0.89,
285                                    dcp::VALIGN_TOP,
286                                    "With the legendary Miss Enid Blyton",
287                                    dcp::BORDER,
288                                    dcp::Colour (0, 0, 0),
289                                    dcp::Time (0, 0, 0, 0, 250),
290                                    dcp::Time (0, 0, 0, 0, 250)
291                                    ));
292         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
293                                    string ("theFont"),
294                                    true,
295                                    dcp::Colour (255, 255, 255),
296                                    42,
297                                    1.0,
298                                    dcp::Time (0, 1, 15, 42, 250),
299                                    dcp::Time (0, 1, 16, 42, 250),
300                                    0,
301                                    dcp::HALIGN_CENTER,
302                                    0.95,
303                                    dcp::VALIGN_TOP,
304                                    "She said \"you be Noddy",
305                                    dcp::BORDER,
306                                    dcp::Colour (0, 0, 0),
307                                    dcp::Time (0, 0, 0, 0, 250),
308                                    dcp::Time (0, 0, 0, 0, 250)
309                                    ));
310
311         s = subs.subtitles_during (dcp::Time (0, 1, 27, 200, 250), dcp::Time (0, 1, 27, 201, 250), false);
312         BOOST_REQUIRE_EQUAL (s.size(), 2);
313         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
314                                    string ("theFont"),
315                                    true,
316                                    dcp::Colour (255, 255, 255),
317                                    42,
318                                    1.0,
319                                    dcp::Time (0, 1, 27, 115, 250),
320                                    dcp::Time (0, 1, 28, 208, 250),
321                                    0,
322                                    dcp::HALIGN_CENTER,
323                                    0.89,
324                                    dcp::VALIGN_TOP,
325                                    "That curious creature the Sphinx",
326                                    dcp::BORDER,
327                                    dcp::Colour (0, 0, 0),
328                                    dcp::Time (0, 0, 0, 0, 250),
329                                    dcp::Time (0, 0, 0, 0, 250)
330                                    ));
331         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
332                                    string ("theFont"),
333                                    true,
334                                    dcp::Colour (255, 255, 255),
335                                    42,
336                                    1.0,
337                                    dcp::Time (0, 1, 27, 115, 250),
338                                    dcp::Time (0, 1, 28, 208, 250),
339                                    0,
340                                    dcp::HALIGN_CENTER,
341                                    0.95,
342                                    dcp::VALIGN_TOP,
343                                    "Is smarter than anyone thinks",
344                                    dcp::BORDER,
345                                    dcp::Colour (0, 0, 0),
346                                    dcp::Time (0, 0, 0, 0, 250),
347                                    dcp::Time (0, 0, 0, 0, 250)
348                                    ));
349
350         s = subs.subtitles_during (dcp::Time (0, 1, 42, 300, 250), dcp::Time (0, 1, 42, 301, 250), false);
351         BOOST_REQUIRE_EQUAL (s.size(), 2);
352         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
353                                    string ("theFont"),
354                                    false,
355                                    dcp::Colour (255, 255, 255),
356                                    42,
357                                    1.0,
358                                    dcp::Time (0, 1, 42, 229, 250),
359                                    dcp::Time (0, 1, 45, 62, 250),
360                                    0,
361                                    dcp::HALIGN_CENTER,
362                                    0.89,
363                                    dcp::VALIGN_TOP,
364                                    "It sits there and smirks",
365                                    dcp::BORDER,
366                                    dcp::Colour (0, 0, 0),
367                                    dcp::Time (0, 0, 0, 0, 250),
368                                    dcp::Time (0, 0, 0, 0, 250)
369                                    ));
370         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
371                                    string ("theFont"),
372                                    false,
373                                    dcp::Colour (255, 255, 255),
374                                    42,
375                                    1.0,
376                                    dcp::Time (0, 1, 42, 229, 250),
377                                    dcp::Time (0, 1, 45, 62, 250),
378                                    0,
379                                    dcp::HALIGN_CENTER,
380                                    0.95,
381                                    dcp::VALIGN_TOP,
382                                    "And you don't think it works",
383                                    dcp::BORDER,
384                                    dcp::Colour (0, 0, 0),
385                                    dcp::Time (0, 0, 0, 0, 250),
386                                    dcp::Time (0, 0, 0, 0, 250)
387                                    ));
388
389         s = subs.subtitles_during (dcp::Time (0, 1, 45, 200, 250), dcp::Time (0, 1, 45, 201, 250), false);
390         BOOST_REQUIRE_EQUAL (s.size(), 2);
391         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
392                                    string ("theFont"),
393                                    false,
394                                    dcp::Colour (255, 255, 255),
395                                    42,
396                                    1.0,
397                                    dcp::Time (0, 1, 45, 146, 250),
398                                    dcp::Time (0, 1, 47, 94, 250),
399                                    0,
400                                    dcp::HALIGN_CENTER,
401                                    0.89,
402                                    dcp::VALIGN_TOP,
403                                    "Then when you're not looking, it winks.",
404                                    dcp::BORDER,
405                                    dcp::Colour (0, 0, 0),
406                                    dcp::Time (0, 0, 0, 0, 250),
407                                    dcp::Time (0, 0, 0, 0, 250)
408                                    ));
409         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
410                                    string ("theFont"),
411                                    false,
412                                    dcp::Colour (255, 255, 255),
413                                    42,
414                                    1.0,
415                                    dcp::Time (0, 1, 45, 146, 250),
416                                    dcp::Time (0, 1, 47, 94, 250),
417                                    0,
418                                    dcp::HALIGN_CENTER,
419                                    0.95,
420                                    dcp::VALIGN_TOP,
421                                    "When it snows you will find Sister Sledge",
422                                    dcp::BORDER,
423                                    dcp::Colour (0, 0, 0),
424                                    dcp::Time (0, 0, 0, 0, 250),
425                                    dcp::Time (0, 0, 0, 0, 250)
426                                    ));
427
428         s = subs.subtitles_during (dcp::Time (0, 1, 47, 249, 250), dcp::Time (0, 1, 47, 250, 250), false);
429         BOOST_REQUIRE_EQUAL (s.size(), 2);
430         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
431                                    string ("theFont"),
432                                    false,
433                                    dcp::Colour (255, 255, 255),
434                                    42,
435                                    1.0,
436                                    dcp::Time (0, 1, 47, 146, 250),
437                                    dcp::Time (0, 1, 48, 167, 250),
438                                    0,
439                                    dcp::HALIGN_CENTER,
440                                    0.89,
441                                    dcp::VALIGN_TOP,
442                                    "Out mooning, at night, on the ledge",
443                                    dcp::BORDER,
444                                    dcp::Colour (0, 0, 0),
445                                    dcp::Time (0, 0, 0, 0, 250),
446                                    dcp::Time (0, 0, 0, 0, 250)
447                                    ));
448         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
449                                    string ("theFont"),
450                                    false,
451                                    dcp::Colour (255, 255, 255),
452                                    42,
453                                    1.0,
454                                    dcp::Time (0, 1, 47, 146, 250),
455                                    dcp::Time (0, 1, 48, 167, 250),
456                                    0,
457                                    dcp::HALIGN_CENTER,
458                                    0.95,
459                                    dcp::VALIGN_TOP,
460                                    "One storey down",
461                                    dcp::BORDER,
462                                    dcp::Colour (0, 0, 0),
463                                    dcp::Time (0, 0, 0, 0, 250),
464                                    dcp::Time (0, 0, 0, 0, 250)
465                                    ));
466
467         s = subs.subtitles_during (dcp::Time (0, 2, 6, 210, 250), dcp::Time (0, 2, 6, 211, 250), false);
468         BOOST_REQUIRE_EQUAL (s.size(), 2);
469         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
470                                    string ("theFont"),
471                                    true,
472                                    dcp::Colour (255, 255, 255),
473                                    42,
474                                    1.0,
475                                    dcp::Time (0, 2, 5, 208, 250),
476                                    dcp::Time (0, 2, 7, 31, 250),
477                                    0,
478                                    dcp::HALIGN_CENTER,
479                                    0.89,
480                                    dcp::VALIGN_TOP,
481                                    "HELLO",
482                                    dcp::BORDER,
483                                    dcp::Colour (0, 0, 0),
484                                    dcp::Time (0, 0, 0, 0, 250),
485                                    dcp::Time (0, 0, 0, 0, 250)
486                                    ));
487         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
488                                    string ("theFont"),
489                                    true,
490                                    dcp::Colour (255, 255, 255),
491                                    42,
492                                    1.0,
493                                    dcp::Time (0, 2, 5, 208, 250),
494                                    dcp::Time (0, 2, 7, 31, 250),
495                                    0,
496                                    dcp::HALIGN_CENTER,
497                                    0.95,
498                                    dcp::VALIGN_TOP,
499                                    "WORLD",
500                                    dcp::BORDER,
501                                    dcp::Colour (0, 0, 0),
502                                    dcp::Time (0, 0, 0, 0, 250),
503                                    dcp::Time (0, 0, 0, 0, 250)
504                                    ));
505 }