Still more licence fixups.
[libdcp.git] / test / read_interop_subtitle_test.cc
1 /*
2     Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
3
4     This file is part of libdcp.
5
6     libdcp is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     libdcp is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with libdcp.  If not, see <http://www.gnu.org/licenses/>.
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                                    false,
53                                    dcp::Colour (255, 255, 255),
54                                    39,
55                                    1.0,
56                                    dcp::Time (0, 0, 5, 198, 250),
57                                    dcp::Time (0, 0, 7, 115, 250),
58                                    0,
59                                    dcp::HALIGN_CENTER,
60                                    0.15,
61                                    dcp::VALIGN_BOTTOM,
62                                    dcp::DIRECTION_LTR,
63                                    "My jacket was Idi Amin's",
64                                    dcp::BORDER,
65                                    dcp::Colour (0, 0, 0),
66                                    dcp::Time (0, 0, 0, 1, 250),
67                                    dcp::Time (0, 0, 0, 1, 250)
68                                    ));
69
70         s = subs.subtitles_during (dcp::Time (0, 0, 7, 190, 250), dcp::Time (0, 0, 7, 191, 250), false);
71         BOOST_REQUIRE_EQUAL (s.size(), 2);
72         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
73                                    string ("theFontId"),
74                                    true,
75                                    false,
76                                    dcp::Colour (255, 255, 255),
77                                    39,
78                                    1.0,
79                                    dcp::Time (0, 0, 7, 177, 250),
80                                    dcp::Time (0, 0, 11, 31, 250),
81                                    0,
82                                    dcp::HALIGN_CENTER,
83                                    0.21,
84                                    dcp::VALIGN_BOTTOM,
85                                    dcp::DIRECTION_LTR,
86                                    "My corset was H.M. The Queen's",
87                                    dcp::BORDER,
88                                    dcp::Colour (0, 0, 0),
89                                    dcp::Time (0, 0, 0, 1, 250),
90                                    dcp::Time (0, 0, 0, 1, 250)
91                                    ));
92         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
93                                    string ("theFontId"),
94                                    false,
95                                    false,
96                                    dcp::Colour (255, 255, 255),
97                                    39,
98                                    1.0,
99                                    dcp::Time (0, 0, 7, 177, 250),
100                                    dcp::Time (0, 0, 11, 31, 250),
101                                    0,
102                                    dcp::HALIGN_CENTER,
103                                    0.15,
104                                    dcp::VALIGN_BOTTOM,
105                                    dcp::DIRECTION_LTR,
106                                    "My large wonderbra",
107                                    dcp::BORDER,
108                                    dcp::Colour (0, 0, 0),
109                                    dcp::Time (0, 0, 0, 1, 250),
110                                    dcp::Time (0, 0, 0, 1, 250)
111                                    ));
112
113         s = subs.subtitles_during (dcp::Time (0, 0, 11, 95, 250), dcp::Time (0, 0, 11, 96, 250), false);
114         BOOST_REQUIRE_EQUAL (s.size(), 1);
115         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
116                                    string ("theFontId"),
117                                    false,
118                                    false,
119                                    dcp::Colour (255, 255, 255),
120                                    39,
121                                    1.0,
122                                    dcp::Time (0, 0, 11, 94, 250),
123                                    dcp::Time (0, 0, 13, 63, 250),
124                                    0,
125                                    dcp::HALIGN_CENTER,
126                                    0.15,
127                                    dcp::VALIGN_BOTTOM,
128                                    dcp::DIRECTION_LTR,
129                                    "Once belonged to the Shah",
130                                    dcp::BORDER,
131                                    dcp::Colour (0, 0, 0),
132                                    dcp::Time (0, 0, 0, 1, 250),
133                                    dcp::Time (0, 0, 0, 1, 250)
134                                    ));
135
136         s = subs.subtitles_during (dcp::Time (0, 0, 14, 42, 250), dcp::Time (0, 0, 14, 43, 250), false);
137         BOOST_REQUIRE_EQUAL (s.size(), 1);
138         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
139                                    string ("theFontId"),
140                                    false,
141                                    true,
142                                    dcp::Colour (255, 255, 255),
143                                    39,
144                                    1.0,
145                                    dcp::Time (0, 0, 13, 104, 250),
146                                    dcp::Time (0, 0, 15, 177, 250),
147                                    0,
148                                    dcp::HALIGN_CENTER,
149                                    0.15,
150                                    dcp::VALIGN_BOTTOM,
151                                    dcp::DIRECTION_LTR,
152                                    "And these are Roy Hattersley's jeans",
153                                    dcp::BORDER,
154                                    dcp::Colour (0, 0, 0),
155                                    dcp::Time (0, 0, 0, 1, 250),
156                                    dcp::Time (0, 0, 0, 1, 250)
157                                    ));
158 }
159
160 /** And similarly for another one */
161 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
162 {
163         dcp::InteropSubtitleAsset subs ("test/data/subs2.xml");
164
165         list<dcp::SubtitleString> s = subs.subtitles_during (dcp::Time (0, 0, 42, 100, 250), dcp::Time (0, 0, 42, 101, 250), false);
166         BOOST_REQUIRE_EQUAL (s.size(), 2);
167         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
168                                    string ("theFont"),
169                                    true,
170                                    false,
171                                    dcp::Colour (255, 255, 255),
172                                    42,
173                                    1.0,
174                                    dcp::Time (0, 0, 41, 62, 250),
175                                    dcp::Time (0, 0, 43, 52, 250),
176                                    0,
177                                    dcp::HALIGN_CENTER,
178                                    0.89,
179                                    dcp::VALIGN_TOP,
180                                    dcp::DIRECTION_LTR,
181                                    "At afternoon tea with John Peel",
182                                    dcp::BORDER,
183                                    dcp::Colour (0, 0, 0),
184                                    dcp::Time (0, 0, 0, 0, 250),
185                                    dcp::Time (0, 0, 0, 0, 250)
186                                    ));
187         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
188                                    string ("theFont"),
189                                    true,
190                                    false,
191                                    dcp::Colour (255, 255, 255),
192                                    42,
193                                    1.0,
194                                    dcp::Time (0, 0, 41, 62, 250),
195                                    dcp::Time (0, 0, 43, 52, 250),
196                                    0,
197                                    dcp::HALIGN_CENTER,
198                                    0.95,
199                                    dcp::VALIGN_TOP,
200                                    dcp::DIRECTION_LTR,
201                                    "I enquired if his accent was real",
202                                    dcp::BORDER,
203                                    dcp::Colour (0, 0, 0),
204                                    dcp::Time (0, 0, 0, 0, 250),
205                                    dcp::Time (0, 0, 0, 0, 250)
206                                    ));
207
208         s = subs.subtitles_during (dcp::Time (0, 0, 50, 50, 250), dcp::Time (0, 0, 50, 51, 250), false);
209         BOOST_REQUIRE_EQUAL (s.size(), 2);
210         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
211                                    string ("theFont"),
212                                    true,
213                                    false,
214                                    dcp::Colour (255, 255, 255),
215                                    42,
216                                    1.0,
217                                    dcp::Time (0, 0, 50, 42, 250),
218                                    dcp::Time (0, 0, 52, 21, 250),
219                                    0,
220                                    dcp::HALIGN_CENTER,
221                                    0.89,
222                                    dcp::VALIGN_TOP,
223                                    dcp::DIRECTION_LTR,
224                                    "He said \"out of the house",
225                                    dcp::BORDER,
226                                    dcp::Colour (0, 0, 0),
227                                    dcp::Time (0, 0, 0, 0, 250),
228                                    dcp::Time (0, 0, 0, 0, 250)
229                                    ));
230         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
231                                    string ("theFont"),
232                                    true,
233                                    false,
234                                    dcp::Colour (255, 255, 255),
235                                    42,
236                                    1.0,
237                                    dcp::Time (0, 0, 50, 42, 250),
238                                    dcp::Time (0, 0, 52, 21, 250),
239                                    0,
240                                    dcp::HALIGN_CENTER,
241                                    0.95,
242                                    dcp::VALIGN_TOP,
243                                    dcp::DIRECTION_LTR,
244                                    "I'm incredibly scouse",
245                                    dcp::BORDER,
246                                    dcp::Colour (0, 0, 0),
247                                    dcp::Time (0, 0, 0, 0, 250),
248                                    dcp::Time (0, 0, 0, 0, 250)
249                                    ));
250
251         s = subs.subtitles_during (dcp::Time (0, 1, 2, 300, 250), dcp::Time (0, 1, 2, 301, 250), false);
252         BOOST_REQUIRE_EQUAL (s.size(), 2);
253         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
254                                    string ("theFont"),
255                                    true,
256                                    false,
257                                    dcp::Colour (255, 255, 255),
258                                    42,
259                                    1.0,
260                                    dcp::Time (0, 1, 2, 208, 250),
261                                    dcp::Time (0, 1, 4, 10, 250),
262                                    0,
263                                    dcp::HALIGN_CENTER,
264                                    0.89,
265                                    dcp::VALIGN_TOP,
266                                    dcp::DIRECTION_LTR,
267                                    "At home it depends how I feel.\"",
268                                    dcp::BORDER,
269                                    dcp::Colour (0, 0, 0),
270                                    dcp::Time (0, 0, 0, 0, 250),
271                                    dcp::Time (0, 0, 0, 0, 250)
272                                    ));
273         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
274                                    string ("theFont"),
275                                    true,
276                                    false,
277                                    dcp::Colour (255, 255, 255),
278                                    42,
279                                    1.0,
280                                    dcp::Time (0, 1, 2, 208, 250),
281                                    dcp::Time (0, 1, 4, 10, 250),
282                                    0,
283                                    dcp::HALIGN_CENTER,
284                                    0.95,
285                                    dcp::VALIGN_TOP,
286                                    dcp::DIRECTION_LTR,
287                                    "I spent a long weekend in Brighton",
288                                    dcp::BORDER,
289                                    dcp::Colour (0, 0, 0),
290                                    dcp::Time (0, 0, 0, 0, 250),
291                                    dcp::Time (0, 0, 0, 0, 250)
292                                    ));
293
294         s = subs.subtitles_during (dcp::Time (0, 1, 15, 50, 250), dcp::Time (0, 1, 15, 51, 250), false);
295         BOOST_REQUIRE_EQUAL (s.size(), 2);
296         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
297                                    string ("theFont"),
298                                    true,
299                                    false,
300                                    dcp::Colour (255, 255, 255),
301                                    42,
302                                    1.0,
303                                    dcp::Time (0, 1, 15, 42, 250),
304                                    dcp::Time (0, 1, 16, 42, 250),
305                                    0,
306                                    dcp::HALIGN_CENTER,
307                                    0.89,
308                                    dcp::VALIGN_TOP,
309                                    dcp::DIRECTION_RTL,
310                                    "With the legendary Miss Enid Blyton",
311                                    dcp::BORDER,
312                                    dcp::Colour (0, 0, 0),
313                                    dcp::Time (0, 0, 0, 0, 250),
314                                    dcp::Time (0, 0, 0, 0, 250)
315                                    ));
316         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
317                                    string ("theFont"),
318                                    true,
319                                    false,
320                                    dcp::Colour (255, 255, 255),
321                                    42,
322                                    1.0,
323                                    dcp::Time (0, 1, 15, 42, 250),
324                                    dcp::Time (0, 1, 16, 42, 250),
325                                    0,
326                                    dcp::HALIGN_CENTER,
327                                    0.95,
328                                    dcp::VALIGN_TOP,
329                                    dcp::DIRECTION_TTB,
330                                    "She said \"you be Noddy",
331                                    dcp::BORDER,
332                                    dcp::Colour (0, 0, 0),
333                                    dcp::Time (0, 0, 0, 0, 250),
334                                    dcp::Time (0, 0, 0, 0, 250)
335                                    ));
336
337         s = subs.subtitles_during (dcp::Time (0, 1, 27, 200, 250), dcp::Time (0, 1, 27, 201, 250), false);
338         BOOST_REQUIRE_EQUAL (s.size(), 2);
339         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
340                                    string ("theFont"),
341                                    true,
342                                    false,
343                                    dcp::Colour (255, 255, 255),
344                                    42,
345                                    1.0,
346                                    dcp::Time (0, 1, 27, 115, 250),
347                                    dcp::Time (0, 1, 28, 208, 250),
348                                    0,
349                                    dcp::HALIGN_CENTER,
350                                    0.89,
351                                    dcp::VALIGN_TOP,
352                                    dcp::DIRECTION_BTT,
353                                    "That curious creature the Sphinx",
354                                    dcp::BORDER,
355                                    dcp::Colour (0, 0, 0),
356                                    dcp::Time (0, 0, 0, 0, 250),
357                                    dcp::Time (0, 0, 0, 0, 250)
358                                    ));
359         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
360                                    string ("theFont"),
361                                    true,
362                                    false,
363                                    dcp::Colour (255, 255, 255),
364                                    42,
365                                    1.0,
366                                    dcp::Time (0, 1, 27, 115, 250),
367                                    dcp::Time (0, 1, 28, 208, 250),
368                                    0,
369                                    dcp::HALIGN_CENTER,
370                                    0.95,
371                                    dcp::VALIGN_TOP,
372                                    dcp::DIRECTION_LTR,
373                                    "Is smarter than anyone thinks",
374                                    dcp::BORDER,
375                                    dcp::Colour (0, 0, 0),
376                                    dcp::Time (0, 0, 0, 0, 250),
377                                    dcp::Time (0, 0, 0, 0, 250)
378                                    ));
379
380         s = subs.subtitles_during (dcp::Time (0, 1, 42, 300, 250), dcp::Time (0, 1, 42, 301, 250), false);
381         BOOST_REQUIRE_EQUAL (s.size(), 2);
382         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
383                                    string ("theFont"),
384                                    false,
385                                    false,
386                                    dcp::Colour (255, 255, 255),
387                                    42,
388                                    1.0,
389                                    dcp::Time (0, 1, 42, 229, 250),
390                                    dcp::Time (0, 1, 45, 62, 250),
391                                    0,
392                                    dcp::HALIGN_CENTER,
393                                    0.89,
394                                    dcp::VALIGN_TOP,
395                                    dcp::DIRECTION_LTR,
396                                    "It sits there and smirks",
397                                    dcp::BORDER,
398                                    dcp::Colour (0, 0, 0),
399                                    dcp::Time (0, 0, 0, 0, 250),
400                                    dcp::Time (0, 0, 0, 0, 250)
401                                    ));
402         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
403                                    string ("theFont"),
404                                    false,
405                                    false,
406                                    dcp::Colour (255, 255, 255),
407                                    42,
408                                    1.0,
409                                    dcp::Time (0, 1, 42, 229, 250),
410                                    dcp::Time (0, 1, 45, 62, 250),
411                                    0,
412                                    dcp::HALIGN_CENTER,
413                                    0.95,
414                                    dcp::VALIGN_TOP,
415                                    dcp::DIRECTION_LTR,
416                                    "And you don't think it works",
417                                    dcp::BORDER,
418                                    dcp::Colour (0, 0, 0),
419                                    dcp::Time (0, 0, 0, 0, 250),
420                                    dcp::Time (0, 0, 0, 0, 250)
421                                    ));
422
423         s = subs.subtitles_during (dcp::Time (0, 1, 45, 200, 250), dcp::Time (0, 1, 45, 201, 250), false);
424         BOOST_REQUIRE_EQUAL (s.size(), 2);
425         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
426                                    string ("theFont"),
427                                    false,
428                                    false,
429                                    dcp::Colour (255, 255, 255),
430                                    42,
431                                    1.0,
432                                    dcp::Time (0, 1, 45, 146, 250),
433                                    dcp::Time (0, 1, 47, 94, 250),
434                                    0,
435                                    dcp::HALIGN_CENTER,
436                                    0.89,
437                                    dcp::VALIGN_TOP,
438                                    dcp::DIRECTION_LTR,
439                                    "Then when you're not looking, it winks.",
440                                    dcp::BORDER,
441                                    dcp::Colour (0, 0, 0),
442                                    dcp::Time (0, 0, 0, 0, 250),
443                                    dcp::Time (0, 0, 0, 0, 250)
444                                    ));
445         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
446                                    string ("theFont"),
447                                    false,
448                                    false,
449                                    dcp::Colour (255, 255, 255),
450                                    42,
451                                    1.0,
452                                    dcp::Time (0, 1, 45, 146, 250),
453                                    dcp::Time (0, 1, 47, 94, 250),
454                                    0,
455                                    dcp::HALIGN_CENTER,
456                                    0.95,
457                                    dcp::VALIGN_TOP,
458                                    dcp::DIRECTION_LTR,
459                                    "When it snows you will find Sister Sledge",
460                                    dcp::BORDER,
461                                    dcp::Colour (0, 0, 0),
462                                    dcp::Time (0, 0, 0, 0, 250),
463                                    dcp::Time (0, 0, 0, 0, 250)
464                                    ));
465
466         s = subs.subtitles_during (dcp::Time (0, 1, 47, 249, 250), dcp::Time (0, 1, 47, 250, 250), false);
467         BOOST_REQUIRE_EQUAL (s.size(), 2);
468         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
469                                    string ("theFont"),
470                                    false,
471                                    false,
472                                    dcp::Colour (255, 255, 255),
473                                    42,
474                                    1.0,
475                                    dcp::Time (0, 1, 47, 146, 250),
476                                    dcp::Time (0, 1, 48, 167, 250),
477                                    0,
478                                    dcp::HALIGN_CENTER,
479                                    0.89,
480                                    dcp::VALIGN_TOP,
481                                    dcp::DIRECTION_LTR,
482                                    "Out mooning, at night, on the ledge",
483                                    dcp::BORDER,
484                                    dcp::Colour (0, 0, 0),
485                                    dcp::Time (0, 0, 0, 0, 250),
486                                    dcp::Time (0, 0, 0, 0, 250)
487                                    ));
488         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
489                                    string ("theFont"),
490                                    false,
491                                    false,
492                                    dcp::Colour (255, 255, 255),
493                                    42,
494                                    1.0,
495                                    dcp::Time (0, 1, 47, 146, 250),
496                                    dcp::Time (0, 1, 48, 167, 250),
497                                    0,
498                                    dcp::HALIGN_CENTER,
499                                    0.95,
500                                    dcp::VALIGN_TOP,
501                                    dcp::DIRECTION_LTR,
502                                    "One storey down",
503                                    dcp::BORDER,
504                                    dcp::Colour (0, 0, 0),
505                                    dcp::Time (0, 0, 0, 0, 250),
506                                    dcp::Time (0, 0, 0, 0, 250)
507                                    ));
508
509         s = subs.subtitles_during (dcp::Time (0, 2, 6, 210, 250), dcp::Time (0, 2, 6, 211, 250), false);
510         BOOST_REQUIRE_EQUAL (s.size(), 2);
511         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
512                                    string ("theFont"),
513                                    true,
514                                    false,
515                                    dcp::Colour (255, 255, 255),
516                                    42,
517                                    1.0,
518                                    dcp::Time (0, 2, 5, 208, 250),
519                                    dcp::Time (0, 2, 7, 31, 250),
520                                    0,
521                                    dcp::HALIGN_CENTER,
522                                    0.89,
523                                    dcp::VALIGN_TOP,
524                                    dcp::DIRECTION_LTR,
525                                    "HELLO",
526                                    dcp::BORDER,
527                                    dcp::Colour (0, 0, 0),
528                                    dcp::Time (0, 0, 0, 0, 250),
529                                    dcp::Time (0, 0, 0, 0, 250)
530                                    ));
531         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
532                                    string ("theFont"),
533                                    true,
534                                    false,
535                                    dcp::Colour (255, 255, 255),
536                                    42,
537                                    1.0,
538                                    dcp::Time (0, 2, 5, 208, 250),
539                                    dcp::Time (0, 2, 7, 31, 250),
540                                    0,
541                                    dcp::HALIGN_CENTER,
542                                    0.95,
543                                    dcp::VALIGN_TOP,
544                                    dcp::DIRECTION_LTR,
545                                    "WORLD",
546                                    dcp::BORDER,
547                                    dcp::Colour (0, 0, 0),
548                                    dcp::Time (0, 0, 0, 0, 250),
549                                    dcp::Time (0, 0, 0, 0, 250)
550                                    ));
551 }