Move some tests from write_subtitle_test to smpte_subtitle_test.
[libdcp.git] / test / read_interop_subtitle_test.cc
1 /*
2     Copyright (C) 2012-2019 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     In addition, as a special exception, the copyright holders give
20     permission to link the code of portions of this program with the
21     OpenSSL library under certain conditions as described in each
22     individual source file, and distribute linked combinations
23     including the two.
24
25     You must obey the GNU General Public License in all respects
26     for all of the code used other than OpenSSL.  If you modify
27     file(s) with this exception, you may extend this exception to your
28     version of the file(s), but you are not obligated to do so.  If you
29     do not wish to do so, delete this exception statement from your
30     version.  If you delete this exception statement from all source
31     files in the program, then also delete it here.
32 */
33
34 #include "interop_subtitle_asset.h"
35 #include "interop_load_font_node.h"
36 #include "subtitle_string.h"
37 #include "subtitle_image.h"
38 #include <boost/test/unit_test.hpp>
39 #include <iostream>
40
41 using std::list;
42 using std::string;
43 using std::shared_ptr;
44 using std::dynamic_pointer_cast;
45
46 /** Load some subtitle content from Interop XML and check that it is read correctly */
47 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test1)
48 {
49         dcp::InteropSubtitleAsset subs ("test/data/subs1.xml");
50
51         BOOST_CHECK_EQUAL (subs.id(), "cab5c268-222b-41d2-88ae-6d6999441b17");
52         BOOST_CHECK_EQUAL (subs.movie_title(), "Movie Title");
53         BOOST_CHECK_EQUAL (subs.reel_number(), "1");
54         BOOST_CHECK_EQUAL (subs.language(), "French");
55
56         auto lfn = subs.load_font_nodes ();
57         BOOST_REQUIRE_EQUAL (lfn.size(), 1);
58         shared_ptr<dcp::InteropLoadFontNode> interop_lfn = dynamic_pointer_cast<dcp::InteropLoadFontNode> (lfn.front ());
59         BOOST_REQUIRE (interop_lfn);
60         BOOST_CHECK_EQUAL (interop_lfn->id, "theFontId");
61         BOOST_CHECK_EQUAL (interop_lfn->uri, "arial.ttf");
62
63         auto s = subs.subtitles_during (dcp::Time (0, 0, 6, 1, 250), dcp::Time (0, 0, 6, 2, 250), false);
64         BOOST_REQUIRE_EQUAL (s.size(), 1);
65         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
66         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
67                                    string ("theFontId"),
68                                    false,
69                                    false,
70                                    false,
71                                    dcp::Colour (255, 255, 255),
72                                    39,
73                                    1.0,
74                                    dcp::Time (0, 0, 5, 198, 250),
75                                    dcp::Time (0, 0, 7, 115, 250),
76                                    0,
77                                    dcp::HAlign::CENTER,
78                                    0.15,
79                                    dcp::VAlign::BOTTOM,
80                                    dcp::Direction::LTR,
81                                    "My jacket was Idi Amin's",
82                                    dcp::Effect::BORDER,
83                                    dcp::Colour (0, 0, 0),
84                                    dcp::Time (0, 0, 0, 1, 250),
85                                    dcp::Time (0, 0, 0, 1, 250)
86                                    ));
87
88         s = subs.subtitles_during (dcp::Time (0, 0, 7, 190, 250), dcp::Time (0, 0, 7, 191, 250), false);
89         BOOST_REQUIRE_EQUAL (s.size(), 2);
90         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
91         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
92                                    string ("theFontId"),
93                                    true,
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.21,
104                                    dcp::VAlign::BOTTOM,
105                                    dcp::Direction::LTR,
106                                    "My corset was H.M. The Queen's",
107                                    dcp::Effect::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         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
113         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
114                                    string ("theFontId"),
115                                    false,
116                                    false,
117                                    false,
118                                    dcp::Colour (255, 255, 255),
119                                    39,
120                                    1.0,
121                                    dcp::Time (0, 0, 7, 177, 250),
122                                    dcp::Time (0, 0, 11, 31, 250),
123                                    0,
124                                    dcp::HAlign::CENTER,
125                                    0.15,
126                                    dcp::VAlign::BOTTOM,
127                                    dcp::Direction::LTR,
128                                    "My large wonderbra",
129                                    dcp::Effect::BORDER,
130                                    dcp::Colour (0, 0, 0),
131                                    dcp::Time (0, 0, 0, 1, 250),
132                                    dcp::Time (0, 0, 0, 1, 250)
133                                    ));
134
135         s = subs.subtitles_during (dcp::Time (0, 0, 11, 95, 250), dcp::Time (0, 0, 11, 96, 250), false);
136         BOOST_REQUIRE_EQUAL (s.size(), 1);
137         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
138         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
139                                    string ("theFontId"),
140                                    false,
141                                    false,
142                                    false,
143                                    dcp::Colour (255, 255, 255),
144                                    39,
145                                    1.0,
146                                    dcp::Time (0, 0, 11, 94, 250),
147                                    dcp::Time (0, 0, 13, 63, 250),
148                                    0,
149                                    dcp::HAlign::CENTER,
150                                    0.15,
151                                    dcp::VAlign::BOTTOM,
152                                    dcp::Direction::LTR,
153                                    "Once belonged to the Shah",
154                                    dcp::Effect::BORDER,
155                                    dcp::Colour (0, 0, 0),
156                                    dcp::Time (0, 0, 0, 1, 250),
157                                    dcp::Time (0, 0, 0, 1, 250)
158                                    ));
159
160         s = subs.subtitles_during (dcp::Time (0, 0, 14, 42, 250), dcp::Time (0, 0, 14, 43, 250), false);
161         BOOST_REQUIRE_EQUAL (s.size(), 1);
162         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
163         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
164                                    string ("theFontId"),
165                                    false,
166                                    true,
167                                    true,
168                                    dcp::Colour (255, 255, 255),
169                                    39,
170                                    1.0,
171                                    dcp::Time (0, 0, 13, 104, 250),
172                                    dcp::Time (0, 0, 15, 177, 250),
173                                    0,
174                                    dcp::HAlign::CENTER,
175                                    0.15,
176                                    dcp::VAlign::BOTTOM,
177                                    dcp::Direction::LTR,
178                                    "And these are Roy Hattersley's jeans",
179                                    dcp::Effect::BORDER,
180                                    dcp::Colour (0, 0, 0),
181                                    dcp::Time (0, 0, 0, 1, 250),
182                                    dcp::Time (0, 0, 0, 1, 250)
183                                    ));
184 }
185
186 /** And similarly for another one */
187 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test2)
188 {
189         dcp::InteropSubtitleAsset subs ("test/data/subs2.xml");
190
191         auto s = subs.subtitles_during (dcp::Time (0, 0, 42, 100, 250), dcp::Time (0, 0, 42, 101, 250), false);
192         BOOST_REQUIRE_EQUAL (s.size(), 2);
193         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
194         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
195                                    string ("theFont"),
196                                    true,
197                                    false,
198                                    false,
199                                    dcp::Colour (255, 255, 255),
200                                    42,
201                                    1.0,
202                                    dcp::Time (0, 0, 41, 62, 250),
203                                    dcp::Time (0, 0, 43, 52, 250),
204                                    0,
205                                    dcp::HAlign::CENTER,
206                                    0.89,
207                                    dcp::VAlign::TOP,
208                                    dcp::Direction::LTR,
209                                    "At afternoon tea with John Peel",
210                                    dcp::Effect::BORDER,
211                                    dcp::Colour (0, 0, 0),
212                                    dcp::Time (0, 0, 0, 0, 250),
213                                    dcp::Time (0, 0, 0, 0, 250)
214                                    ));
215         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
216         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
217                                    string ("theFont"),
218                                    true,
219                                    false,
220                                    false,
221                                    dcp::Colour (255, 255, 255),
222                                    42,
223                                    1.0,
224                                    dcp::Time (0, 0, 41, 62, 250),
225                                    dcp::Time (0, 0, 43, 52, 250),
226                                    0,
227                                    dcp::HAlign::CENTER,
228                                    0.95,
229                                    dcp::VAlign::TOP,
230                                    dcp::Direction::LTR,
231                                    "I enquired if his accent was real",
232                                    dcp::Effect::BORDER,
233                                    dcp::Colour (0, 0, 0),
234                                    dcp::Time (0, 0, 0, 0, 250),
235                                    dcp::Time (0, 0, 0, 0, 250)
236                                    ));
237
238         s = subs.subtitles_during (dcp::Time (0, 0, 50, 50, 250), dcp::Time (0, 0, 50, 51, 250), false);
239         BOOST_REQUIRE_EQUAL (s.size(), 2);
240         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
241         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
242                                    string ("theFont"),
243                                    true,
244                                    false,
245                                    false,
246                                    dcp::Colour (255, 255, 255),
247                                    42,
248                                    1.0,
249                                    dcp::Time (0, 0, 50, 42, 250),
250                                    dcp::Time (0, 0, 52, 21, 250),
251                                    0,
252                                    dcp::HAlign::CENTER,
253                                    0.89,
254                                    dcp::VAlign::TOP,
255                                    dcp::Direction::LTR,
256                                    "He said \"out of the house",
257                                    dcp::Effect::BORDER,
258                                    dcp::Colour (0, 0, 0),
259                                    dcp::Time (0, 0, 0, 0, 250),
260                                    dcp::Time (0, 0, 0, 0, 250)
261                                    ));
262         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
263         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
264                                    string ("theFont"),
265                                    true,
266                                    false,
267                                    false,
268                                    dcp::Colour (255, 255, 255),
269                                    42,
270                                    1.0,
271                                    dcp::Time (0, 0, 50, 42, 250),
272                                    dcp::Time (0, 0, 52, 21, 250),
273                                    0,
274                                    dcp::HAlign::CENTER,
275                                    0.95,
276                                    dcp::VAlign::TOP,
277                                    dcp::Direction::LTR,
278                                    "I'm incredibly scouse",
279                                    dcp::Effect::BORDER,
280                                    dcp::Colour (0, 0, 0),
281                                    dcp::Time (0, 0, 0, 0, 250),
282                                    dcp::Time (0, 0, 0, 0, 250)
283                                    ));
284
285         s = subs.subtitles_during (dcp::Time (0, 1, 2, 300, 250), dcp::Time (0, 1, 2, 301, 250), false);
286         BOOST_REQUIRE_EQUAL (s.size(), 2);
287         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
288         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
289                                    string("theFont"),
290                                    true,
291                                    false,
292                                    false,
293                                    dcp::Colour(255, 255, 255),
294                                    42,
295                                    1.0,
296                                    dcp::Time(0, 1, 2, 208, 250),
297                                    dcp::Time(0, 1, 4, 10, 250),
298                                    0,
299                                    dcp::HAlign::CENTER,
300                                    0.89,
301                                    dcp::VAlign::TOP,
302                                    dcp::Direction::LTR,
303                                    "At home it depends how I feel.\"",
304                                    dcp::Effect::BORDER,
305                                    dcp::Colour(0, 0, 0),
306                                    dcp::Time(0, 0, 0, 0, 250),
307                                    dcp::Time(0, 0, 0, 0, 250)
308                                    ));
309         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
310         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
311                                    string ("theFont"),
312                                    true,
313                                    false,
314                                    false,
315                                    dcp::Colour(255, 255, 255),
316                                    42,
317                                    1.0,
318                                    dcp::Time(0, 1, 2, 208, 250),
319                                    dcp::Time(0, 1, 4, 10, 250),
320                                    0,
321                                    dcp::HAlign::CENTER,
322                                    0.95,
323                                    dcp::VAlign::TOP,
324                                    dcp::Direction::LTR,
325                                    "I spent a long weekend in Brighton",
326                                    dcp::Effect::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
332         s = subs.subtitles_during (dcp::Time (0, 1, 15, 50, 250), dcp::Time (0, 1, 15, 51, 250), false);
333         BOOST_REQUIRE_EQUAL (s.size(), 2);
334         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
335         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
336                                    string ("theFont"),
337                                    true,
338                                    false,
339                                    false,
340                                    dcp::Colour(255, 255, 255),
341                                    42,
342                                    1.0,
343                                    dcp::Time(0, 1, 15, 42, 250),
344                                    dcp::Time(0, 1, 16, 42, 250),
345                                    0,
346                                    dcp::HAlign::CENTER,
347                                    0.89,
348                                    dcp::VAlign::TOP,
349                                    dcp::Direction::RTL,
350                                    "With the legendary Miss Enid Blyton",
351                                    dcp::Effect::BORDER,
352                                    dcp::Colour(0, 0, 0),
353                                    dcp::Time(0, 0, 0, 0, 250),
354                                    dcp::Time(0, 0, 0, 0, 250)
355                                    ));
356         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
357         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
358                                    string ("theFont"),
359                                    true,
360                                    false,
361                                    false,
362                                    dcp::Colour(255, 255, 255),
363                                    42,
364                                    1.0,
365                                    dcp::Time(0, 1, 15, 42, 250),
366                                    dcp::Time(0, 1, 16, 42, 250),
367                                    0,
368                                    dcp::HAlign::CENTER,
369                                    0.95,
370                                    dcp::VAlign::TOP,
371                                    dcp::Direction::TTB,
372                                    "She said \"you be Noddy",
373                                    dcp::Effect::BORDER,
374                                    dcp::Colour(0, 0, 0),
375                                    dcp::Time(0, 0, 0, 0, 250),
376                                    dcp::Time(0, 0, 0, 0, 250)
377                                    ));
378
379         s = subs.subtitles_during (dcp::Time (0, 1, 27, 200, 250), dcp::Time (0, 1, 27, 201, 250), false);
380         BOOST_REQUIRE_EQUAL (s.size(), 2);
381         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
382         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
383                                    string ("theFont"),
384                                    true,
385                                    false,
386                                    false,
387                                    dcp::Colour(255, 255, 255),
388                                    42,
389                                    1.0,
390                                    dcp::Time(0, 1, 27, 115, 250),
391                                    dcp::Time(0, 1, 28, 208, 250),
392                                    0,
393                                    dcp::HAlign::CENTER,
394                                    0.89,
395                                    dcp::VAlign::TOP,
396                                    dcp::Direction::BTT,
397                                    "That curious creature the Sphinx",
398                                    dcp::Effect::BORDER,
399                                    dcp::Colour(0, 0, 0),
400                                    dcp::Time(0, 0, 0, 0, 250),
401                                    dcp::Time(0, 0, 0, 0, 250)
402                                    ));
403         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
404         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
405                                    string ("theFont"),
406                                    true,
407                                    false,
408                                    false,
409                                    dcp::Colour(255, 255, 255),
410                                    42,
411                                    1.0,
412                                    dcp::Time(0, 1, 27, 115, 250),
413                                    dcp::Time(0, 1, 28, 208, 250),
414                                    0,
415                                    dcp::HAlign::CENTER,
416                                    0.95,
417                                    dcp::VAlign::TOP,
418                                    dcp::Direction::LTR,
419                                    "Is smarter than anyone thinks",
420                                    dcp::Effect::BORDER,
421                                    dcp::Colour(0, 0, 0),
422                                    dcp::Time(0, 0, 0, 0, 250),
423                                    dcp::Time(0, 0, 0, 0, 250)
424                                    ));
425
426         s = subs.subtitles_during (dcp::Time (0, 1, 42, 300, 250), dcp::Time (0, 1, 42, 301, 250), false);
427         BOOST_REQUIRE_EQUAL (s.size(), 2);
428         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
429         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
430                                    string ("theFont"),
431                                    false,
432                                    false,
433                                    false,
434                                    dcp::Colour (255, 255, 255),
435                                    42,
436                                    1.0,
437                                    dcp::Time (0, 1, 42, 229, 250),
438                                    dcp::Time (0, 1, 45, 62, 250),
439                                    0,
440                                    dcp::HAlign::CENTER,
441                                    0.89,
442                                    dcp::VAlign::TOP,
443                                    dcp::Direction::LTR,
444                                    "It sits there and smirks",
445                                    dcp::Effect::BORDER,
446                                    dcp::Colour(0, 0, 0),
447                                    dcp::Time(0, 0, 0, 0, 250),
448                                    dcp::Time(0, 0, 0, 0, 250)
449                                    ));
450         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
451         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
452                                    string ("theFont"),
453                                    false,
454                                    false,
455                                    false,
456                                    dcp::Colour (255, 255, 255),
457                                    42,
458                                    1.0,
459                                    dcp::Time (0, 1, 42, 229, 250),
460                                    dcp::Time (0, 1, 45, 62, 250),
461                                    0,
462                                    dcp::HAlign::CENTER,
463                                    0.95,
464                                    dcp::VAlign::TOP,
465                                    dcp::Direction::LTR,
466                                    "And you don't think it works",
467                                    dcp::Effect::BORDER,
468                                    dcp::Colour(0, 0, 0),
469                                    dcp::Time(0, 0, 0, 0, 250),
470                                    dcp::Time(0, 0, 0, 0, 250)
471                                    ));
472
473         s = subs.subtitles_during (dcp::Time (0, 1, 45, 200, 250), dcp::Time (0, 1, 45, 201, 250), false);
474         BOOST_REQUIRE_EQUAL (s.size(), 2);
475         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
476         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
477                                    string("theFont"),
478                                    false,
479                                    false,
480                                    false,
481                                    dcp::Colour(255, 255, 255),
482                                    42,
483                                    1.0,
484                                    dcp::Time(0, 1, 45, 146, 250),
485                                    dcp::Time(0, 1, 47, 94, 250),
486                                    0,
487                                    dcp::HAlign::CENTER,
488                                    0.89,
489                                    dcp::VAlign::TOP,
490                                    dcp::Direction::LTR,
491                                    "Then when you're not looking, it winks.",
492                                    dcp::Effect::BORDER,
493                                    dcp::Colour(0, 0, 0),
494                                    dcp::Time(0, 0, 0, 0, 250),
495                                    dcp::Time(0, 0, 0, 0, 250)
496                                    ));
497         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
498         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
499                                    string ("theFont"),
500                                    false,
501                                    false,
502                                    false,
503                                    dcp::Colour (255, 255, 255),
504                                    42,
505                                    1.0,
506                                    dcp::Time (0, 1, 45, 146, 250),
507                                    dcp::Time (0, 1, 47, 94, 250),
508                                    0,
509                                    dcp::HAlign::CENTER,
510                                    0.95,
511                                    dcp::VAlign::TOP,
512                                    dcp::Direction::LTR,
513                                    "When it snows you will find Sister Sledge",
514                                    dcp::Effect::BORDER,
515                                    dcp::Colour(0, 0, 0),
516                                    dcp::Time(0, 0, 0, 0, 250),
517                                    dcp::Time(0, 0, 0, 0, 250)
518                                    ));
519
520         s = subs.subtitles_during (dcp::Time (0, 1, 47, 249, 250), dcp::Time (0, 1, 47, 250, 250), false);
521         BOOST_REQUIRE_EQUAL (s.size(), 2);
522         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
523         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
524                                    string ("theFont"),
525                                    false,
526                                    false,
527                                    false,
528                                    dcp::Colour(255, 255, 255),
529                                    42,
530                                    1.0,
531                                    dcp::Time(0, 1, 47, 146, 250),
532                                    dcp::Time(0, 1, 48, 167, 250),
533                                    0,
534                                    dcp::HAlign::CENTER,
535                                    0.89,
536                                    dcp::VAlign::TOP,
537                                    dcp::Direction::LTR,
538                                    "Out mooning, at night, on the ledge",
539                                    dcp::Effect::BORDER,
540                                    dcp::Colour(0, 0, 0),
541                                    dcp::Time(0, 0, 0, 0, 250),
542                                    dcp::Time(0, 0, 0, 0, 250)
543                                    ));
544         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
545         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
546                                    string ("theFont"),
547                                    false,
548                                    false,
549                                    false,
550                                    dcp::Colour(255, 255, 255),
551                                    42,
552                                    1.0,
553                                    dcp::Time(0, 1, 47, 146, 250),
554                                    dcp::Time(0, 1, 48, 167, 250),
555                                    0,
556                                    dcp::HAlign::CENTER,
557                                    0.95,
558                                    dcp::VAlign::TOP,
559                                    dcp::Direction::LTR,
560                                    "One storey down",
561                                    dcp::Effect::BORDER,
562                                    dcp::Colour(0, 0, 0),
563                                    dcp::Time(0, 0, 0, 0, 250),
564                                    dcp::Time(0, 0, 0, 0, 250)
565                                    ));
566
567         s = subs.subtitles_during (dcp::Time (0, 2, 6, 210, 250), dcp::Time (0, 2, 6, 211, 250), false);
568         BOOST_REQUIRE_EQUAL (s.size(), 2);
569         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.front()));
570         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.front()), dcp::SubtitleString (
571                                    string ("theFont"),
572                                    true,
573                                    false,
574                                    false,
575                                    dcp::Colour (255, 255, 255),
576                                    42,
577                                    1.0,
578                                    dcp::Time (0, 2, 5, 208, 250),
579                                    dcp::Time (0, 2, 7, 31, 250),
580                                    0,
581                                    dcp::HAlign::CENTER,
582                                    0.89,
583                                    dcp::VAlign::TOP,
584                                    dcp::Direction::LTR,
585                                    "HELLO",
586                                    dcp::Effect::BORDER,
587                                    dcp::Colour(0, 0, 0),
588                                    dcp::Time(0, 0, 0, 0, 250),
589                                    dcp::Time(0, 0, 0, 0, 250)
590                                    ));
591         BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(s.back()));
592         BOOST_CHECK_EQUAL (*dynamic_pointer_cast<const dcp::SubtitleString>(s.back()), dcp::SubtitleString (
593                                    string ("theFont"),
594                                    true,
595                                    false,
596                                    false,
597                                    dcp::Colour(255, 255, 255),
598                                    42,
599                                    1.0,
600                                    dcp::Time(0, 2, 5, 208, 250),
601                                    dcp::Time(0, 2, 7, 31, 250),
602                                    0,
603                                    dcp::HAlign::CENTER,
604                                    0.95,
605                                    dcp::VAlign::TOP,
606                                    dcp::Direction::LTR,
607                                    "WORLD",
608                                    dcp::Effect::BORDER,
609                                    dcp::Colour(0, 0, 0),
610                                    dcp::Time(0, 0, 0, 0, 250),
611                                    dcp::Time(0, 0, 0, 0, 250)
612                                    ));
613 }
614
615 /** And one with bitmap subtitles */
616 BOOST_AUTO_TEST_CASE (read_interop_subtitle_test3)
617 {
618         dcp::InteropSubtitleAsset subs ("test/data/subs3.xml");
619
620         BOOST_REQUIRE_EQUAL (subs.subtitles().size(), 1);
621         auto si = dynamic_pointer_cast<const dcp::SubtitleImage>(subs.subtitles().front());
622         BOOST_REQUIRE (si);
623         BOOST_CHECK (si->png_image() == dcp::ArrayData("test/data/sub.png"));
624 }