Fix failure to verify when the XSD/DTD path has a space in it.
[libdcp.git] / test / write_subtitle_test.cc
1 /*
2     Copyright (C) 2015-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 "smpte_subtitle_asset.h"
36 #include "subtitle_string.h"
37 #include "subtitle_image.h"
38 #include "subtitle_asset_internal.h"
39 #include "reel_subtitle_asset.h"
40 #include "reel.h"
41 #include "cpl.h"
42 #include "dcp.h"
43 #include "test.h"
44 #include "util.h"
45 #include <boost/test/unit_test.hpp>
46
47 using std::list;
48 using std::string;
49 using boost::shared_ptr;
50
51 /** Test dcp::order::Font::take_intersection */
52 BOOST_AUTO_TEST_CASE (take_intersection_test)
53 {
54         dcp::order::Font A;
55         A._values["foo"] = "bar";
56         A._values["fred"] = "jim";
57
58         dcp::order::Font B;
59         B._values["foo"] = "bar";
60         B._values["sheila"] = "baz";
61
62         A.take_intersection (B);
63         BOOST_REQUIRE_EQUAL (A._values.size(), 1);
64         BOOST_CHECK_EQUAL (A._values["foo"], "bar");
65
66         A._values.clear ();
67         B._values.clear ();
68
69         A._values["foo"] = "bar";
70         A._values["fred"] = "jim";
71
72         B._values["foo"] = "hello";
73         B._values["sheila"] = "baz";
74
75         A.take_intersection (B);
76         BOOST_CHECK_EQUAL (A._values.size(), 0);
77 }
78
79 /** Test dcp::order::Font::take_difference */
80 BOOST_AUTO_TEST_CASE (take_difference_test)
81 {
82         dcp::order::Font A;
83         A._values["foo"] = "bar";
84         A._values["fred"] = "jim";
85
86         dcp::order::Font B;
87         B._values["foo"] = "bar";
88         B._values["sheila"] = "baz";
89
90         A.take_difference (B);
91         BOOST_REQUIRE_EQUAL (A._values.size(), 1);
92         BOOST_CHECK_EQUAL (A._values["fred"], "jim");
93 }
94
95 /** Test dcp::order::Subtitle::pull_fonts */
96 BOOST_AUTO_TEST_CASE (pull_fonts_test1)
97 {
98         shared_ptr<dcp::order::Part> root (new dcp::order::Part (shared_ptr<dcp::order::Part> ()));
99         shared_ptr<dcp::order::Subtitle> sub1 (new dcp::order::Subtitle (root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time()));
100         root->children.push_back (sub1);
101         shared_ptr<dcp::order::Text> text1 (new dcp::order::Text (sub1, dcp::HALIGN_CENTER, 0, dcp::VALIGN_TOP, 0, dcp::DIRECTION_LTR));
102         sub1->children.push_back (text1);
103         text1->font._values["font"] = "Inconsolata";
104         text1->font._values["size"] = "42";
105
106         dcp::SubtitleAsset::pull_fonts (root);
107
108         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 2);
109         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
110         BOOST_CHECK_EQUAL (sub1->font._values["size"], "42");
111         BOOST_CHECK_EQUAL (text1->font._values.size(), 0);
112 }
113
114 /** Test dcp::order::Subtitle::pull_fonts */
115 BOOST_AUTO_TEST_CASE (pull_fonts_test2)
116 {
117         shared_ptr<dcp::order::Part> root (new dcp::order::Part (shared_ptr<dcp::order::Part> ()));
118         shared_ptr<dcp::order::Subtitle> sub1 (new dcp::order::Subtitle (root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time()));
119         root->children.push_back (sub1);
120         shared_ptr<dcp::order::Text> text1 (new dcp::order::Text (sub1, dcp::HALIGN_CENTER, 0, dcp::VALIGN_TOP, 0, dcp::DIRECTION_LTR));
121         sub1->children.push_back (text1);
122         text1->font._values["font"] = "Inconsolata";
123         text1->font._values["size"] = "42";
124         shared_ptr<dcp::order::Text> text2 (new dcp::order::Text (sub1, dcp::HALIGN_CENTER, 0, dcp::VALIGN_TOP, 0, dcp::DIRECTION_LTR));
125         sub1->children.push_back (text2);
126         text2->font._values["font"] = "Inconsolata";
127         text2->font._values["size"] = "48";
128
129         dcp::SubtitleAsset::pull_fonts (root);
130
131         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 1);
132         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
133         BOOST_REQUIRE_EQUAL (text1->font._values.size(), 1);
134         BOOST_CHECK_EQUAL (text1->font._values["size"], "42");
135         BOOST_REQUIRE_EQUAL (text2->font._values.size(), 1);
136         BOOST_CHECK_EQUAL (text2->font._values["size"], "48");
137 }
138
139 /** Test dcp::order::Subtitle::pull_fonts */
140 BOOST_AUTO_TEST_CASE (pull_fonts_test3)
141 {
142         shared_ptr<dcp::order::Part> root (new dcp::order::Part (shared_ptr<dcp::order::Part> ()));
143         shared_ptr<dcp::order::Subtitle> sub1 (new dcp::order::Subtitle (root, dcp::Time(), dcp::Time(), dcp::Time(), dcp::Time()));
144         root->children.push_back (sub1);
145         shared_ptr<dcp::order::Text> text1 (new dcp::order::Text (sub1, dcp::HALIGN_CENTER, 0, dcp::VALIGN_TOP, 0, dcp::DIRECTION_LTR));
146         sub1->children.push_back (text1);
147         dcp::order::Font font;
148         font._values["font"] = "Inconsolata";
149         font._values["size"] = "42";
150         shared_ptr<dcp::order::String> string1 (new dcp::order::String (text1, font, "Hello world"));
151         text1->children.push_back (string1);
152
153         dcp::SubtitleAsset::pull_fonts (root);
154
155         BOOST_REQUIRE_EQUAL (sub1->font._values.size(), 2);
156         BOOST_CHECK_EQUAL (sub1->font._values["font"], "Inconsolata");
157         BOOST_CHECK_EQUAL (sub1->font._values["size"], "42");
158 }
159
160 /** Write some subtitle content as Interop XML and check that it is right */
161 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test)
162 {
163         dcp::InteropSubtitleAsset c;
164         c.set_reel_number ("1");
165         c.set_language ("EN");
166         c.set_movie_title ("Test");
167
168         c.add (
169                 shared_ptr<dcp::Subtitle> (
170                         new dcp::SubtitleString (
171                                 string ("Frutiger"),
172                                 false,
173                                 false,
174                                 false,
175                                 dcp::Colour (255, 255, 255),
176                                 48,
177                                 1.0,
178                                 dcp::Time (0, 4,  9, 22, 24),
179                                 dcp::Time (0, 4, 11, 22, 24),
180                                 0,
181                                 dcp::HALIGN_CENTER,
182                                 0.8,
183                                 dcp::VALIGN_TOP,
184                                 dcp::DIRECTION_LTR,
185                                 "Hello world",
186                                 dcp::NONE,
187                                 dcp::Colour (0, 0, 0),
188                                 dcp::Time (0, 0, 0, 0, 24),
189                                 dcp::Time (0, 0, 0, 0, 24)
190                                 )
191                         )
192                 );
193
194         c.add (
195                 shared_ptr<dcp::Subtitle> (
196                         new dcp::SubtitleString (
197                                 boost::optional<string> (),
198                                 true,
199                                 true,
200                                 true,
201                                 dcp::Colour (128, 0, 64),
202                                 91,
203                                 1.0,
204                                 dcp::Time (5, 41,  0, 21, 24),
205                                 dcp::Time (6, 12, 15, 21, 24),
206                                 0,
207                                 dcp::HALIGN_CENTER,
208                                 0.4,
209                                 dcp::VALIGN_BOTTOM,
210                                 dcp::DIRECTION_LTR,
211                                 "What's going on",
212                                 dcp::BORDER,
213                                 dcp::Colour (1, 2, 3),
214                                 dcp::Time (1, 2, 3, 4, 24),
215                                 dcp::Time (5, 6, 7, 8, 24)
216                                 )
217                         )
218                 );
219
220         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
221
222         check_xml (
223                 "<DCSubtitle Version=\"1.0\">"
224                   "<SubtitleID>a6c58cff-3e1e-4b38-acec-a42224475ef6</SubtitleID>"
225                   "<MovieTitle>Test</MovieTitle>"
226                   "<ReelNumber>1</ReelNumber>"
227                   "<Language>EN</Language>"
228                   "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" Id=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underlined=\"no\" Weight=\"normal\">"
229                     "<Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:229\" TimeOut=\"00:04:11:229\" FadeUpTime=\"0\" FadeDownTime=\"0\">"
230                       "<Text VAlign=\"top\" VPosition=\"80\">Hello world</Text>"
231                     "</Subtitle>"
232                   "</Font>"
233                   "<Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underlined=\"yes\" Weight=\"bold\">"
234                     "<Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:219\" TimeOut=\"06:12:15:219\" FadeUpTime=\"930792\" FadeDownTime=\"4591834\">"
235                       "<Text VAlign=\"bottom\" VPosition=\"40\">What's going on</Text>"
236                     "</Subtitle>"
237                   "</Font>"
238                 "</DCSubtitle>",
239                 c.xml_as_string (),
240                 list<string> ()
241                 );
242 }
243
244 /** Write some subtitle content as Interop XML and check that it is right.
245  *  This test includes some horizontal alignment.
246  */
247 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test2)
248 {
249         dcp::InteropSubtitleAsset c;
250         c.set_reel_number ("1");
251         c.set_language ("EN");
252         c.set_movie_title ("Test");
253
254         c.add (
255                 shared_ptr<dcp::Subtitle> (
256                         new dcp::SubtitleString (
257                                 string ("Frutiger"),
258                                 false,
259                                 false,
260                                 false,
261                                 dcp::Colour (255, 255, 255),
262                                 48,
263                                 1.0,
264                                 dcp::Time (0, 4,  9, 22, 24),
265                                 dcp::Time (0, 4, 11, 22, 24),
266                                 -0.2,
267                                 dcp::HALIGN_CENTER,
268                                 0.8,
269                                 dcp::VALIGN_TOP,
270                                 dcp::DIRECTION_LTR,
271                                 "Hello world",
272                                 dcp::NONE,
273                                 dcp::Colour (0, 0, 0),
274                                 dcp::Time (0, 0, 0, 0, 24),
275                                 dcp::Time (0, 0, 0, 0, 24)
276                                 )
277                         )
278                 );
279
280         c.add (
281                 shared_ptr<dcp::Subtitle> (
282                         new dcp::SubtitleString (
283                                 boost::optional<string> (),
284                                 true,
285                                 true,
286                                 true,
287                                 dcp::Colour (128, 0, 64),
288                                 91,
289                                 1.0,
290                                 dcp::Time (5, 41,  0, 21, 24),
291                                 dcp::Time (6, 12, 15, 21, 24),
292                                 -0.2,
293                                 dcp::HALIGN_CENTER,
294                                 0.4,
295                                 dcp::VALIGN_BOTTOM,
296                                 dcp::DIRECTION_LTR,
297                                 "What's going on",
298                                 dcp::BORDER,
299                                 dcp::Colour (1, 2, 3),
300                                 dcp::Time (1, 2, 3, 4, 24),
301                                 dcp::Time (5, 6, 7, 8, 24)
302                                 )
303                         )
304                 );
305
306         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
307
308         check_xml (
309                 "<DCSubtitle Version=\"1.0\">"
310                   "<SubtitleID>a6c58cff-3e1e-4b38-acec-a42224475ef6</SubtitleID>"
311                   "<MovieTitle>Test</MovieTitle>"
312                   "<ReelNumber>1</ReelNumber>"
313                   "<Language>EN</Language>"
314                   "<Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" Id=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underlined=\"no\" Weight=\"normal\">"
315                     "<Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:229\" TimeOut=\"00:04:11:229\" FadeUpTime=\"0\" FadeDownTime=\"0\">"
316                       "<Text HPosition=\"-20\" VAlign=\"top\" VPosition=\"80\">Hello world</Text>"
317                     "</Subtitle>"
318                   "</Font>"
319                   "<Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underlined=\"yes\" Weight=\"bold\">"
320                     "<Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:219\" TimeOut=\"06:12:15:219\" FadeUpTime=\"930792\" FadeDownTime=\"4591834\">"
321                       "<Text HPosition=\"-20\" VAlign=\"bottom\" VPosition=\"40\">What's going on</Text>"
322                     "</Subtitle>"
323                   "</Font>"
324                 "</DCSubtitle>",
325                 c.xml_as_string (),
326                 list<string> ()
327                 );
328 }
329
330 /* Write some subtitle content as Interop XML using bitmaps and check that it is right */
331 BOOST_AUTO_TEST_CASE (write_interop_subtitle_test3)
332 {
333         shared_ptr<dcp::InteropSubtitleAsset> c (new dcp::InteropSubtitleAsset());
334         c->set_reel_number ("1");
335         c->set_language ("EN");
336         c->set_movie_title ("Test");
337
338         c->add (
339                 shared_ptr<dcp::Subtitle> (
340                         new dcp::SubtitleImage (
341                                 dcp::Data ("test/data/sub.png"),
342                                 dcp::Time (0, 4,  9, 22, 24),
343                                 dcp::Time (0, 4, 11, 22, 24),
344                                 0,
345                                 dcp::HALIGN_CENTER,
346                                 0.8,
347                                 dcp::VALIGN_TOP,
348                                 dcp::Time (0, 0, 0, 0, 24),
349                                 dcp::Time (0, 0, 0, 0, 24)
350                                 )
351                         )
352                 );
353
354         c->_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
355         boost::filesystem::create_directories ("build/test/write_interop_subtitle_test3");
356         c->write ("build/test/write_interop_subtitle_test3/subs.xml");
357
358         shared_ptr<dcp::Reel> reel (new dcp::Reel());
359         reel->add(shared_ptr<dcp::ReelSubtitleAsset>(new dcp::ReelSubtitleAsset(c, dcp::Fraction(24, 1), 6046, 0)));
360
361         dcp::XMLMetadata xml_meta;
362         xml_meta.issue_date = "2018-09-02T04:45:18+00:00";
363         xml_meta.issuer = "libdcp";
364         xml_meta.creator = "libdcp";
365         xml_meta.annotation_text = "Created by libdcp";
366
367         shared_ptr<dcp::CPL> cpl (new dcp::CPL ("My film", dcp::FEATURE));
368         cpl->add (reel);
369         cpl->set_metadata (xml_meta);
370         cpl->set_content_version_label_text ("foo");
371
372         dcp::DCP dcp ("build/test/write_interop_subtitle_test3");
373         dcp.add (cpl);
374         dcp.write_xml (dcp::INTEROP, xml_meta);
375
376         check_xml (
377                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/subs.xml"),
378                 dcp::file_to_string("build/test/write_interop_subtitle_test3/subs.xml"),
379                 list<string>()
380                 );
381         check_file ("build/test/write_interop_subtitle_test3/ef5c6baa-be2d-4f86-9f15-b1acc792ee8b.png", "test/data/sub.png");
382
383         check_xml (
384                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/ASSETMAP"),
385                 dcp::file_to_string("build/test/write_interop_subtitle_test3/ASSETMAP"),
386                 list<string>()
387                 );
388
389         check_xml (
390                 dcp::file_to_string("test/ref/write_interop_subtitle_test3/pkl.xml"),
391                 dcp::file_to_string("build/test/write_interop_subtitle_test3/pkl_f5aab304-8145-44e3-a265-aa8d8812d8a2.xml"),
392                 list<string>()
393                 );
394 }
395
396 /* Write some subtitle content as SMPTE XML and check that it is right */
397 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
398 {
399         dcp::SMPTESubtitleAsset c;
400         c.set_reel_number (1);
401         c.set_language ("EN");
402         c.set_content_title_text ("Test");
403         c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
404
405         c.add (
406                 shared_ptr<dcp::Subtitle> (
407                         new dcp::SubtitleString (
408                                 string ("Frutiger"),
409                                 false,
410                                 false,
411                                 false,
412                                 dcp::Colour (255, 255, 255),
413                                 48,
414                                 1.0,
415                                 dcp::Time (0, 4,  9, 22, 24),
416                                 dcp::Time (0, 4, 11, 22, 24),
417                                 0,
418                                 dcp::HALIGN_CENTER,
419                                 0.8,
420                                 dcp::VALIGN_TOP,
421                                 dcp::DIRECTION_LTR,
422                                 "Hello world",
423                                 dcp::NONE,
424                                 dcp::Colour (0, 0, 0),
425                                 dcp::Time (0, 0, 0, 0, 24),
426                                 dcp::Time (0, 0, 0, 0, 24)
427                                 )
428                         )
429                 );
430
431         c.add (
432                 shared_ptr<dcp::Subtitle> (
433                         new dcp::SubtitleString (
434                                 boost::optional<string> (),
435                                 true,
436                                 true,
437                                 true,
438                                 dcp::Colour (128, 0, 64),
439                                 91,
440                                 1.0,
441                                 dcp::Time (5, 41,  0, 21, 24),
442                                 dcp::Time (6, 12, 15, 21, 24),
443                                 0,
444                                 dcp::HALIGN_CENTER,
445                                 0.4,
446                                 dcp::VALIGN_BOTTOM,
447                                 dcp::DIRECTION_RTL,
448                                 "What's going on",
449                                 dcp::BORDER,
450                                 dcp::Colour (1, 2, 3),
451                                 dcp::Time (1, 2, 3, 4, 24),
452                                 dcp::Time (5, 6, 7, 8, 24)
453                                 )
454                         )
455                 );
456
457         c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
458
459         check_xml (
460                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
461                 "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
462                   "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
463                   "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
464                   "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
465                   "<dcst:ReelNumber>1</dcst:ReelNumber>"
466                   "<dcst:Language>EN</dcst:Language>"
467                   "<dcst:EditRate>24 1</dcst:EditRate>"
468                   "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
469                   "<dcst:SubtitleList>"
470                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
471                       "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
472                         "<dcst:Text Valign=\"top\" Vposition=\"80\">Hello world</dcst:Text>"
473                       "</dcst:Subtitle>"
474                     "</dcst:Font>"
475                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">"
476                       "<dcst:Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">"
477                         "<dcst:Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going on</dcst:Text>"
478                       "</dcst:Subtitle>"
479                     "</dcst:Font>"
480                   "</dcst:SubtitleList>"
481                 "</dcst:SubtitleReel>",
482                 c.xml_as_string (),
483                 list<string> ()
484                 );
485 }
486
487 /* Write some subtitle content as SMPTE XML and check that it is right.
488    This includes in-line font changes.
489 */
490 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
491 {
492         dcp::SMPTESubtitleAsset c;
493         c.set_reel_number (1);
494         c.set_language ("EN");
495         c.set_content_title_text ("Test");
496         c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
497
498         c.add (
499                 shared_ptr<dcp::Subtitle> (
500                         new dcp::SubtitleString (
501                                 string ("Arial"),
502                                 false,
503                                 false,
504                                 false,
505                                 dcp::Colour (255, 255, 255),
506                                 48,
507                                 1.0,
508                                 dcp::Time (0, 0, 1, 0, 24),
509                                 dcp::Time (0, 0, 9, 0, 24),
510                                 0,
511                                 dcp::HALIGN_CENTER,
512                                 0.8,
513                                 dcp::VALIGN_TOP,
514                                 dcp::DIRECTION_LTR,
515                                 "Testing is ",
516                                 dcp::NONE,
517                                 dcp::Colour (0, 0, 0),
518                                 dcp::Time (0, 0, 0, 0, 24),
519                                 dcp::Time (0, 0, 0, 0, 24)
520                                 )
521                         )
522                 );
523
524         c.add (
525                 shared_ptr<dcp::Subtitle> (
526                         new dcp::SubtitleString (
527                                 string ("Arial"),
528                                 true,
529                                 false,
530                                 false,
531                                 dcp::Colour (255, 255, 255),
532                                 48,
533                                 1.0,
534                                 dcp::Time (0, 0, 1, 0, 24),
535                                 dcp::Time (0, 0, 9, 0, 24),
536                                 0,
537                                 dcp::HALIGN_CENTER,
538                                 0.8,
539                                 dcp::VALIGN_TOP,
540                                 dcp::DIRECTION_LTR,
541                                 "really",
542                                 dcp::NONE,
543                                 dcp::Colour (0, 0, 0),
544                                 dcp::Time (0, 0, 0, 0, 24),
545                                 dcp::Time (0, 0, 0, 0, 24)
546                                 )
547                         )
548                 );
549
550         c.add (
551                 shared_ptr<dcp::Subtitle> (
552                         new dcp::SubtitleString (
553                                 string ("Arial"),
554                                 false,
555                                 false,
556                                 false,
557                                 dcp::Colour (255, 255, 255),
558                                 48,
559                                 1.0,
560                                 dcp::Time (0, 0, 1, 0, 24),
561                                 dcp::Time (0, 0, 9, 0, 24),
562                                 0,
563                                 dcp::HALIGN_CENTER,
564                                 0.8,
565                                 dcp::VALIGN_TOP,
566                                 dcp::DIRECTION_LTR,
567                                 " fun",
568                                 dcp::NONE,
569                                 dcp::Colour (0, 0, 0),
570                                 dcp::Time (0, 0, 0, 0, 24),
571                                 dcp::Time (0, 0, 0, 0, 24)
572                                 )
573                         )
574                 );
575
576         c.add (
577                 shared_ptr<dcp::Subtitle> (
578                         new dcp::SubtitleString (
579                                 string ("Arial"),
580                                 false,
581                                 false,
582                                 false,
583                                 dcp::Colour (255, 255, 255),
584                                 48,
585                                 1.0,
586                                 dcp::Time (0, 0, 1, 0, 24),
587                                 dcp::Time (0, 0, 9, 0, 24),
588                                 0,
589                                 dcp::HALIGN_CENTER,
590                                 0.9,
591                                 dcp::VALIGN_TOP,
592                                 dcp::DIRECTION_LTR,
593                                 "This is the ",
594                                 dcp::NONE,
595                                 dcp::Colour (0, 0, 0),
596                                 dcp::Time (0, 0, 0, 0, 24),
597                                 dcp::Time (0, 0, 0, 0, 24)
598                                 )
599                         )
600                 );
601
602         c.add (
603                 shared_ptr<dcp::Subtitle> (
604                         new dcp::SubtitleString (
605                                 string ("Arial"),
606                                 true,
607                                 false,
608                                 false,
609                                 dcp::Colour (255, 255, 255),
610                                 48,
611                                 1.0,
612                                 dcp::Time (0, 0, 1, 0, 24),
613                                 dcp::Time (0, 0, 9, 0, 24),
614                                 0,
615                                 dcp::HALIGN_CENTER,
616                                 0.9,
617                                 dcp::VALIGN_TOP,
618                                 dcp::DIRECTION_LTR,
619                                 "second",
620                                 dcp::NONE,
621                                 dcp::Colour (0, 0, 0),
622                                 dcp::Time (0, 0, 0, 0, 24),
623                                 dcp::Time (0, 0, 0, 0, 24)
624                                 )
625                         )
626                 );
627
628         c.add (
629                 shared_ptr<dcp::Subtitle> (
630                         new dcp::SubtitleString (
631                                 string ("Arial"),
632                                 false,
633                                 false,
634                                 false,
635                                 dcp::Colour (255, 255, 255),
636                                 48,
637                                 1.0,
638                                 dcp::Time (0, 0, 1, 0, 24),
639                                 dcp::Time (0, 0, 9, 0, 24),
640                                 0,
641                                 dcp::HALIGN_CENTER,
642                                 0.9,
643                                 dcp::VALIGN_TOP,
644                                 dcp::DIRECTION_LTR,
645                                 " line",
646                                 dcp::NONE,
647                                 dcp::Colour (0, 0, 0),
648                                 dcp::Time (0, 0, 0, 0, 24),
649                                 dcp::Time (0, 0, 0, 0, 24)
650                                 )
651                         )
652                 );
653
654         c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
655
656         check_xml (
657                 c.xml_as_string (),
658                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
659                 "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
660                   "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
661                   "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
662                   "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
663                   "<dcst:ReelNumber>1</dcst:ReelNumber>"
664                   "<dcst:Language>EN</dcst:Language>"
665                   "<dcst:EditRate>24 1</dcst:EditRate>"
666                   "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
667                   "<dcst:SubtitleList>"
668                     "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
669                       "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
670                         "<dcst:Text Valign=\"top\" Vposition=\"80\">"
671                           "<dcst:Font Italic=\"no\">Testing is </dcst:Font>"
672                           "<dcst:Font Italic=\"yes\">really</dcst:Font>"
673                           "<dcst:Font Italic=\"no\"> fun</dcst:Font>"
674                         "</dcst:Text>"
675                         "<dcst:Text Valign=\"top\" Vposition=\"90\">"
676                           "<dcst:Font Italic=\"no\">This is the </dcst:Font>"
677                           "<dcst:Font Italic=\"yes\">second</dcst:Font>"
678                           "<dcst:Font Italic=\"no\"> line</dcst:Font>"
679                         "</dcst:Text>"
680                       "</dcst:Subtitle>"
681                     "</dcst:Font>"
682                   "</dcst:SubtitleList>"
683                 "</dcst:SubtitleReel>",
684                 list<string> ()
685                 );
686 }
687
688 /* Write some subtitle content as SMPTE using bitmaps and check that it is right */
689 BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
690 {
691         dcp::SMPTESubtitleAsset c;
692         c.set_reel_number (1);
693         c.set_language ("EN");
694         c.set_content_title_text ("Test");
695
696         c.add (
697                 shared_ptr<dcp::Subtitle> (
698                         new dcp::SubtitleImage (
699                                 dcp::Data ("test/data/sub.png"),
700                                 dcp::Time (0, 4,  9, 22, 24),
701                                 dcp::Time (0, 4, 11, 22, 24),
702                                 0,
703                                 dcp::HALIGN_CENTER,
704                                 0.8,
705                                 dcp::VALIGN_TOP,
706                                 dcp::Time (0, 0, 0, 0, 24),
707                                 dcp::Time (0, 0, 0, 0, 24)
708                                 )
709                         )
710                 );
711
712         c._id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
713
714         boost::filesystem::create_directories ("build/test/write_smpte_subtitle_test3");
715         c.write ("build/test/write_smpte_subtitle_test3/subs.mxf");
716
717         /* XXX: check this result when we can read them back in again */
718 }