Fix tests again on Windows.
[libdcp.git] / test / smpte_subtitle_test.cc
index cc6190c2a29571bc6e5b24c57a73ef0a4441ff90..b271b02c1c0dd2a23639aacf277c5b5f1ef80574 100644 (file)
 #include <boost/test/unit_test.hpp>
 
 
-using std::make_shared;
-using std::string;
-using std::shared_ptr;
 using std::dynamic_pointer_cast;
+using std::shared_ptr;
+using std::string;
 using std::vector;
 using boost::optional;
 
@@ -54,7 +53,7 @@ BOOST_AUTO_TEST_CASE (smpte_subtitle_id_test)
 {
        dcp::SMPTESubtitleAsset subs;
        subs.add(
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        optional<string>(),
                        false, false, false,
                        dcp::Colour(),
@@ -66,12 +65,14 @@ BOOST_AUTO_TEST_CASE (smpte_subtitle_id_test)
                        dcp::HAlign::CENTER,
                        0.5,
                        dcp::VAlign::CENTER,
+                       0,
                        dcp::Direction::LTR,
                        "Hello",
                        dcp::Effect::NONE,
                        dcp::Colour(),
                        dcp::Time(0, 0, 0, 0, 24),
-                       dcp::Time(0, 0, 0, 0, 24)
+                       dcp::Time(0, 0, 0, 0, 24),
+                       0
                        )
                );
        subs.write("build/test/smpte_subtitle_id_test.mxf");
@@ -104,60 +105,68 @@ BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test)
        BOOST_CHECK_EQUAL (sc.time_code_rate(), 25);
        BOOST_CHECK_EQUAL (sc.start_time(), dcp::Time (0, 0, 0, 0, 25));
        auto lfn = sc.load_font_nodes ();
-       BOOST_REQUIRE_EQUAL (lfn.size(), 1);
+       BOOST_REQUIRE_EQUAL (lfn.size(), 1U);
        shared_ptr<dcp::SMPTELoadFontNode> smpte_lfn = dynamic_pointer_cast<dcp::SMPTELoadFontNode> (lfn.front ());
        BOOST_REQUIRE (smpte_lfn);
        BOOST_CHECK_EQUAL (smpte_lfn->id, "theFontId");
        BOOST_CHECK_EQUAL (smpte_lfn->urn, "9118bbce-4105-4a05-b37c-a5a6f75e1fea");
-       BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 63);
+       BOOST_REQUIRE_EQUAL (sc.subtitles().size(), 63U);
        BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front()));
        BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front())->text(), "Noch mal.");
+       BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().front())->space_before(), 0.0f);
        BOOST_CHECK_EQUAL (sc.subtitles().front()->in(), dcp::Time (0, 0, 25, 12, 25));
        BOOST_CHECK_EQUAL (sc.subtitles().front()->out(), dcp::Time (0, 0, 26, 4, 25));
        BOOST_REQUIRE (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().back()));
        BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().back())->text(), "Prochainement");
+       BOOST_CHECK_EQUAL (dynamic_pointer_cast<const dcp::SubtitleString>(sc.subtitles().back())->space_before(), 0.0f);
        BOOST_CHECK_EQUAL (sc.subtitles().back()->in(), dcp::Time (0, 1, 57, 17, 25));
        BOOST_CHECK_EQUAL (sc.subtitles().back()->out(), dcp::Time (0, 1, 58, 12, 25));
 }
 
 
-/** And another one featuring <Font> within <Text> */
+/** And another one featuring <Font> within <Text> and some <Space> */
 BOOST_AUTO_TEST_CASE (read_smpte_subtitle_test2)
 {
        dcp::SMPTESubtitleAsset sc (private_test / "olsson.xml");
 
        auto subs = sc.subtitles();
-       BOOST_REQUIRE_EQUAL (subs.size(), 6);
+       BOOST_REQUIRE_EQUAL (subs.size(), 6U);
        auto i = 0;
        auto is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
        BOOST_REQUIRE (is);
        BOOST_CHECK_EQUAL (is->text(), "Testing is ");
        BOOST_CHECK (!is->italic());
+       BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
        ++i;
        is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
        BOOST_REQUIRE (is);
        BOOST_CHECK_EQUAL (is->text(), "really");
        BOOST_CHECK (is->italic());
+       BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
        ++i;
        is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
        BOOST_REQUIRE (is);
        BOOST_CHECK_EQUAL (is->text(), " fun!");
        BOOST_CHECK (!is->italic());
+       BOOST_CHECK_CLOSE (is->space_before(), 5, 0.1);
        ++i;
        is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
        BOOST_REQUIRE (is);
        BOOST_CHECK_EQUAL (is->text(), "This is the ");
        BOOST_CHECK (!is->italic());
+       BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
        ++i;
        is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
        BOOST_REQUIRE (is);
        BOOST_CHECK_EQUAL (is->text(), "second");
        BOOST_CHECK (is->italic());
+       BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
        ++i;
        is = dynamic_pointer_cast<const dcp::SubtitleString>(subs[i]);
        BOOST_REQUIRE (is);
        BOOST_CHECK_EQUAL (is->text(), " line!");
        BOOST_CHECK (!is->italic());
+       BOOST_CHECK_CLOSE (is->space_before(), 0, 0.1);
 }
 
 
@@ -171,7 +180,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
        c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
 
        c.add (
-               make_shared<dcp::SubtitleString> (
+               std::make_shared<dcp::SubtitleString> (
                        string ("Frutiger"),
                        false,
                        false,
@@ -185,17 +194,19 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0.3,
                        dcp::Direction::LTR,
                        "Hello world",
                        dcp::Effect::NONE,
                        dcp::Colour (0, 0, 0),
                        dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        boost::optional<string> (),
                        true,
                        true,
@@ -209,40 +220,68 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test)
                        dcp::HAlign::CENTER,
                        0.4,
                        dcp::VAlign::BOTTOM,
+                       0,
                        dcp::Direction::RTL,
-                       "What's going on",
+                       "What's going ",
                        dcp::Effect::BORDER,
                        dcp::Colour (1, 2, 3),
                        dcp::Time (1, 2, 3, 4, 24),
-                       dcp::Time (5, 6, 7, 8, 24)
+                       dcp::Time (5, 6, 7, 8, 24),
+                       0
+                       )
+               );
+
+       c.add (
+               std::make_shared<dcp::SubtitleString>(
+                       boost::optional<string> (),
+                       true,
+                       true,
+                       true,
+                       dcp::Colour (128, 0, 64),
+                       91,
+                       1.0,
+                       dcp::Time (5, 41,  0, 21, 24),
+                       dcp::Time (6, 12, 15, 21, 24),
+                       0,
+                       dcp::HAlign::CENTER,
+                       0.4,
+                       dcp::VAlign::BOTTOM,
+                       0,
+                       dcp::Direction::RTL,
+                       "on",
+                       dcp::Effect::BORDER,
+                       dcp::Colour (1, 2, 3),
+                       dcp::Time (1, 2, 3, 4, 24),
+                       dcp::Time (5, 6, 7, 8, 24),
+                       4.2
                        )
                );
 
        c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
 
        check_xml (
-               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-               "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
-                 "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
-                 "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
-                 "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
-                 "<dcst:ReelNumber>1</dcst:ReelNumber>"
-                 "<dcst:Language>en</dcst:Language>"
-                 "<dcst:EditRate>24 1</dcst:EditRate>"
-                 "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
-                 "<dcst:SubtitleList>"
-                   "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
-                     "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
-                       "<dcst:Text Valign=\"top\" Vposition=\"80\">Hello world</dcst:Text>"
-                     "</dcst:Subtitle>"
-                   "</dcst:Font>"
-                   "<dcst:Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">"
-                     "<dcst:Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">"
-                       "<dcst:Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going on</dcst:Text>"
-                     "</dcst:Subtitle>"
-                   "</dcst:Font>"
-                 "</dcst:SubtitleList>"
-               "</dcst:SubtitleReel>",
+               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+               "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+               "  <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
+               "  <ContentTitleText>Test</ContentTitleText>\n"
+               "  <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
+               "  <ReelNumber>1</ReelNumber>\n"
+               "  <Language>en</Language>\n"
+               "  <EditRate>24 1</EditRate>\n"
+               "  <TimeCodeRate>24</TimeCodeRate>\n"
+               "  <SubtitleList>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Frutiger\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
+               "      <Subtitle SpotNumber=\"1\" TimeIn=\"00:04:09:22\" TimeOut=\"00:04:11:22\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
+               "        <Text Valign=\"top\" Vposition=\"80\" Zposition=\"30\">Hello world</Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FF800040\" Effect=\"border\" EffectColor=\"FF010203\" Italic=\"yes\" Script=\"normal\" Size=\"91\" Underline=\"yes\" Weight=\"bold\">\n"
+               "      <Subtitle SpotNumber=\"2\" TimeIn=\"05:41:00:21\" TimeOut=\"06:12:15:21\" FadeUpTime=\"01:02:03:04\" FadeDownTime=\"05:06:07:08\">\n"
+               "        <Text Valign=\"bottom\" Vposition=\"40\" Direction=\"rtl\">What's going <Space Size=\"4.2\"/>on</Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "  </SubtitleList>\n"
+               "</SubtitleReel>",
                c.xml_as_string (),
                vector<string>()
                );
@@ -260,7 +299,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
        c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -274,17 +313,19 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0,
                        dcp::Direction::LTR,
                        "Testing is ",
                        dcp::Effect::NONE,
                        dcp::Colour (0, 0, 0),
                        dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        true,
                        false,
@@ -298,17 +339,19 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0,
                        dcp::Direction::LTR,
                        "really",
                        dcp::Effect::NONE,
                        dcp::Colour (0, 0, 0),
                        dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -322,17 +365,19 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       0,
                        dcp::Direction::LTR,
                        " fun",
                        dcp::Effect::NONE,
                        dcp::Colour (0, 0, 0),
                        dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -346,17 +391,19 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.9,
                        dcp::VAlign::TOP,
+                       0,
                        dcp::Direction::LTR,
                        "This is the ",
                        dcp::Effect::NONE,
                        dcp::Colour (0, 0, 0),
                        dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        true,
                        false,
@@ -370,17 +417,19 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.9,
                        dcp::VAlign::TOP,
+                       0,
                        dcp::Direction::LTR,
                        "second",
                        dcp::Effect::NONE,
                        dcp::Colour (0, 0, 0),
                        dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
                        )
                );
 
        c.add (
-               make_shared<dcp::SubtitleString>(
+               std::make_shared<dcp::SubtitleString>(
                        string ("Arial"),
                        false,
                        false,
@@ -394,12 +443,14 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
                        dcp::HAlign::CENTER,
                        0.9,
                        dcp::VAlign::TOP,
+                       0,
                        dcp::Direction::LTR,
                        " line",
                        dcp::Effect::NONE,
                        dcp::Colour (0, 0, 0),
                        dcp::Time (0, 0, 0, 0, 24),
-                       dcp::Time (0, 0, 0, 0, 24)
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
                        )
                );
 
@@ -407,32 +458,24 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test2)
 
        check_xml (
                c.xml_as_string(),
-               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
-               "<dcst:SubtitleReel xmlns:dcst=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"
-                 "<dcst:Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</dcst:Id>"
-                 "<dcst:ContentTitleText>Test</dcst:ContentTitleText>"
-                 "<dcst:IssueDate>2016-04-01T03:52:00.000+00:00</dcst:IssueDate>"
-                 "<dcst:ReelNumber>1</dcst:ReelNumber>"
-                 "<dcst:Language>en</dcst:Language>"
-                 "<dcst:EditRate>24 1</dcst:EditRate>"
-                 "<dcst:TimeCodeRate>24</dcst:TimeCodeRate>"
-                 "<dcst:SubtitleList>"
-                   "<dcst:Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">"
-                     "<dcst:Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">"
-                       "<dcst:Text Valign=\"top\" Vposition=\"80\">"
-                         "<dcst:Font Italic=\"no\">Testing is </dcst:Font>"
-                         "<dcst:Font Italic=\"yes\">really</dcst:Font>"
-                         "<dcst:Font Italic=\"no\"> fun</dcst:Font>"
-                       "</dcst:Text>"
-                       "<dcst:Text Valign=\"top\" Vposition=\"90\">"
-                         "<dcst:Font Italic=\"no\">This is the </dcst:Font>"
-                         "<dcst:Font Italic=\"yes\">second</dcst:Font>"
-                         "<dcst:Font Italic=\"no\"> line</dcst:Font>"
-                       "</dcst:Text>"
-                     "</dcst:Subtitle>"
-                   "</dcst:Font>"
-                 "</dcst:SubtitleList>"
-               "</dcst:SubtitleReel>",
+               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+               "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+               "  <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
+               "  <ContentTitleText>Test</ContentTitleText>\n"
+               "  <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
+               "  <ReelNumber>1</ReelNumber>\n"
+               "  <Language>en</Language>\n"
+               "  <EditRate>24 1</EditRate>\n"
+               "  <TimeCodeRate>24</TimeCodeRate>\n"
+               "  <SubtitleList>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
+               "      <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
+               "        <Text Valign=\"top\" Vposition=\"80\"><Font Italic=\"no\">Testing is </Font><Font Italic=\"yes\">really</Font><Font Italic=\"no\"> fun</Font></Text>\n"
+               "        <Text Valign=\"top\" Vposition=\"90\"><Font Italic=\"no\">This is the </Font><Font Italic=\"yes\">second</Font><Font Italic=\"no\"> line</Font></Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "  </SubtitleList>\n"
+               "</SubtitleReel>",
                vector<string>()
                );
 }
@@ -449,7 +492,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
        boost::filesystem::path const sub_image = "test/data/sub.png";
 
        c.add (
-               make_shared<dcp::SubtitleImage>(
+               std::make_shared<dcp::SubtitleImage>(
                        dcp::ArrayData(sub_image),
                        dcp::Time (0, 4,  9, 22, 24),
                        dcp::Time (0, 4, 11, 22, 24),
@@ -457,6 +500,7 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
                        dcp::HAlign::CENTER,
                        0.8,
                        dcp::VAlign::TOP,
+                       -88,
                        dcp::Time (0, 0, 0, 0, 24),
                        dcp::Time (0, 0, 0, 0, 24)
                        )
@@ -481,6 +525,226 @@ BOOST_AUTO_TEST_CASE (write_smpte_subtitle_test3)
        BOOST_CHECK (image->h_align() == dcp::HAlign::CENTER);
        BOOST_CHECK_CLOSE (image->v_position(), 0.8, 1);
        BOOST_CHECK (image->v_align() == dcp::VAlign::TOP);
+       BOOST_CHECK_EQUAL(image->z_position(), -88);
        BOOST_CHECK (image->fade_up_time() == dcp::Time(0, 0, 0, 0, 24));
        BOOST_CHECK (image->fade_down_time() == dcp::Time(0, 0, 0, 0, 24));
 }
+
+
+/* Some closed caption systems require the <Text> elements to be written in order of their
+ * vertical position (see DoM bug #2106).
+ */
+BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_top_alignment)
+{
+       dcp::SMPTESubtitleAsset c;
+       c.set_reel_number (1);
+       c.set_language (dcp::LanguageTag("en"));
+       c.set_content_title_text ("Test");
+       c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
+
+       c.add (
+               std::make_shared<dcp::SubtitleString>(
+                       string ("Arial"),
+                       false,
+                       false,
+                       false,
+                       dcp::Colour (255, 255, 255),
+                       48,
+                       1.0,
+                       dcp::Time (0, 0, 1, 0, 24),
+                       dcp::Time (0, 0, 9, 0, 24),
+                       0,
+                       dcp::HAlign::CENTER,
+                       0.8,
+                       dcp::VAlign::TOP,
+                       0,
+                       dcp::Direction::LTR,
+                       "Top line",
+                       dcp::Effect::NONE,
+                       dcp::Colour (0, 0, 0),
+                       dcp::Time (0, 0, 0, 0, 24),
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
+                       )
+               );
+
+       c.add (
+               std::make_shared<dcp::SubtitleString>(
+                       string ("Arial"),
+                       false,
+                       false,
+                       false,
+                       dcp::Colour (255, 255, 255),
+                       48,
+                       1.0,
+                       dcp::Time (0, 0, 1, 0, 24),
+                       dcp::Time (0, 0, 9, 0, 24),
+                       0,
+                       dcp::HAlign::CENTER,
+                       0.9,
+                       dcp::VAlign::TOP,
+                       0,
+                       dcp::Direction::LTR,
+                       "Bottom line",
+                       dcp::Effect::NONE,
+                       dcp::Colour (0, 0, 0),
+                       dcp::Time (0, 0, 0, 0, 24),
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
+                       )
+               );
+
+       c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
+
+       check_xml (
+               c.xml_as_string(),
+               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+               "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+               "  <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
+               "  <ContentTitleText>Test</ContentTitleText>\n"
+               "  <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
+               "  <ReelNumber>1</ReelNumber>\n"
+               "  <Language>en</Language>\n"
+               "  <EditRate>24 1</EditRate>\n"
+               "  <TimeCodeRate>24</TimeCodeRate>\n"
+               "  <SubtitleList>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
+               "      <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
+               "        <Text Valign=\"top\" Vposition=\"80\">Top line</Text>\n"
+               "        <Text Valign=\"top\" Vposition=\"90\">Bottom line</Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "  </SubtitleList>\n"
+               "</SubtitleReel>",
+               {}
+               );
+}
+
+
+/* See the test above */
+BOOST_AUTO_TEST_CASE (write_subtitles_in_vertical_order_with_bottom_alignment)
+{
+       dcp::SMPTESubtitleAsset c;
+       c.set_reel_number (1);
+       c.set_language (dcp::LanguageTag("en"));
+       c.set_content_title_text ("Test");
+       c.set_issue_date (dcp::LocalTime ("2016-04-01T03:52:00+00:00"));
+
+       c.add (
+               std::make_shared<dcp::SubtitleString>(
+                       string ("Arial"),
+                       false,
+                       false,
+                       false,
+                       dcp::Colour (255, 255, 255),
+                       48,
+                       1.0,
+                       dcp::Time (0, 0, 1, 0, 24),
+                       dcp::Time (0, 0, 9, 0, 24),
+                       0,
+                       dcp::HAlign::CENTER,
+                       0.8,
+                       dcp::VAlign::BOTTOM,
+                       0,
+                       dcp::Direction::LTR,
+                       "Top line",
+                       dcp::Effect::NONE,
+                       dcp::Colour (0, 0, 0),
+                       dcp::Time (0, 0, 0, 0, 24),
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
+                       )
+               );
+
+       c.add (
+               std::make_shared<dcp::SubtitleString>(
+                       string ("Arial"),
+                       false,
+                       false,
+                       false,
+                       dcp::Colour (255, 255, 255),
+                       48,
+                       1.0,
+                       dcp::Time (0, 0, 1, 0, 24),
+                       dcp::Time (0, 0, 9, 0, 24),
+                       0,
+                       dcp::HAlign::CENTER,
+                       0.7,
+                       dcp::VAlign::BOTTOM,
+                       0,
+                       dcp::Direction::LTR,
+                       "Bottom line",
+                       dcp::Effect::NONE,
+                       dcp::Colour (0, 0, 0),
+                       dcp::Time (0, 0, 0, 0, 24),
+                       dcp::Time (0, 0, 0, 0, 24),
+                       0
+                       )
+               );
+
+       c._xml_id = "a6c58cff-3e1e-4b38-acec-a42224475ef6";
+
+       check_xml (
+               c.xml_as_string(),
+               "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+               "<SubtitleReel xmlns=\"http://www.smpte-ra.org/schemas/428-7/2010/DCST\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
+               "  <Id>urn:uuid:a6c58cff-3e1e-4b38-acec-a42224475ef6</Id>\n"
+               "  <ContentTitleText>Test</ContentTitleText>\n"
+               "  <IssueDate>2016-04-01T03:52:00</IssueDate>\n"
+               "  <ReelNumber>1</ReelNumber>\n"
+               "  <Language>en</Language>\n"
+               "  <EditRate>24 1</EditRate>\n"
+               "  <TimeCodeRate>24</TimeCodeRate>\n"
+               "  <SubtitleList>\n"
+               "    <Font AspectAdjust=\"1.0\" Color=\"FFFFFFFF\" Effect=\"none\" EffectColor=\"FF000000\" ID=\"Arial\" Italic=\"no\" Script=\"normal\" Size=\"48\" Underline=\"no\" Weight=\"normal\">\n"
+               "      <Subtitle SpotNumber=\"1\" TimeIn=\"00:00:01:00\" TimeOut=\"00:00:09:00\" FadeUpTime=\"00:00:00:00\" FadeDownTime=\"00:00:00:00\">\n"
+               "        <Text Valign=\"bottom\" Vposition=\"80\">Top line</Text>\n"
+               "        <Text Valign=\"bottom\" Vposition=\"70\">Bottom line</Text>\n"
+               "      </Subtitle>\n"
+               "    </Font>\n"
+               "  </SubtitleList>\n"
+               "</SubtitleReel>",
+               {}
+               );
+}
+
+
+BOOST_AUTO_TEST_CASE(smpte_subtitle_standard_written_correctly)
+{
+       RNGFixer fixer;
+
+       boost::filesystem::path const ref = "test/data";
+       boost::filesystem::path const out = "build/test/smpte_subtitle_standard_written_correctly";
+
+       boost::filesystem::remove_all(out);
+       boost::filesystem::create_directories(out);
+
+       dcp::SMPTESubtitleAsset test_2014;
+       test_2014.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
+       test_2014.write(out / "2014.mxf");
+       BOOST_CHECK(dcp::SMPTESubtitleAsset(ref / "2014.mxf").raw_xml() == dcp::SMPTESubtitleAsset(out / "2014.mxf").raw_xml());
+
+       dcp::SMPTESubtitleAsset test_2010(dcp::SubtitleStandard::SMPTE_2010);
+       test_2010.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
+       test_2010.write(out / "2010.mxf");
+       BOOST_CHECK(dcp::SMPTESubtitleAsset(ref / "2010.mxf").raw_xml() == dcp::SMPTESubtitleAsset(out / "2010.mxf").raw_xml());
+
+       dcp::SMPTESubtitleAsset test_2007(dcp::SubtitleStandard::SMPTE_2007);
+       test_2007.set_issue_date(dcp::LocalTime("2020-01-01T14:00:00"));
+       test_2007.write(out / "2007.mxf");
+       BOOST_CHECK(dcp::SMPTESubtitleAsset(ref / "2007.mxf").raw_xml() == dcp::SMPTESubtitleAsset(out / "2007.mxf").raw_xml());
+}
+
+
+BOOST_AUTO_TEST_CASE(smpte_subtitle_standard_read_correctly)
+{
+       dcp::SMPTESubtitleAsset test_2007("test/data/2007.mxf");
+       BOOST_CHECK(test_2007.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2007);
+
+       dcp::SMPTESubtitleAsset test_2010("test/data/2010.mxf");
+       BOOST_CHECK(test_2010.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2010);
+
+       dcp::SMPTESubtitleAsset test_2014("test/data/2014.mxf");
+       BOOST_CHECK(test_2014.subtitle_standard() == dcp::SubtitleStandard::SMPTE_2014);
+}
+