Bump libdcp.
[libsub.git] / test / dcp_reader_test.cc
index 5da9bf0b22ee13a38dc377c1bcad39d9a8003ccb..7fa419b11e1f857317c07caaf2103494dcaf1ab1 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 
 */
 
-#include "dcp_reader.h"
+#include "interop_dcp_reader.h"
 #include "collect.h"
 #include <boost/test/unit_test.hpp>
+#include <boost/optional/optional_io.hpp>
 #include <fstream>
+#include <iostream>
 
 using std::list;
 using std::cout;
@@ -30,23 +32,22 @@ using boost::shared_ptr;
 /* Test reading of a DCP XML file */
 BOOST_AUTO_TEST_CASE (dcp_reader_test1)
 {
-       ifstream file ("test/data/test1.xml");
-       sub::DCPReader reader (file);
+       sub::InteropDCPReader reader ("test/data/test1.xml");
        list<sub::Subtitle> subs = sub::collect<list<sub::Subtitle> > (reader.subtitles ());
 
        list<sub::Subtitle>::iterator i = subs.begin ();
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 0, 5, 198 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric(), sub::MetricTime (0, 0, 7, 115 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 4));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 4));
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 5, 198 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 7, 115 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 4));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 4));
 
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
@@ -57,22 +58,22 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
 
                ++j;
-               BOOST_CHECK (j == i->lines.end ());
+               BOOST_REQUIRE (j == i->lines.end ());
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 0, 7, 177 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 11, 31 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 4));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 4));
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 7, 177 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 11, 31 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 4));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 4));
 
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
@@ -83,10 +84,10 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
 
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
@@ -97,22 +98,22 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
 
                ++j;
-               BOOST_CHECK (j == i->lines.end ());
+               BOOST_REQUIRE (j == i->lines.end ());
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 0, 11, 94 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 13, 63 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 4));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 4));
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 11, 94 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 13, 63 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 4));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 4));
 
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
@@ -123,22 +124,22 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
 
                ++j;
-               BOOST_CHECK (j == i->lines.end ());
+               BOOST_REQUIRE (j == i->lines.end ());
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric(), sub::MetricTime (0, 0, 13, 104 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 15, 177 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 4));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 4));
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 13, 104 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 15, 177 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 4));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 4));
 
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
@@ -149,30 +150,29 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test1)
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
 
                ++j;
-               BOOST_CHECK (j == i->lines.end ());
+               BOOST_REQUIRE (j == i->lines.end ());
        }
 }
 
 /* And another one */
 BOOST_AUTO_TEST_CASE (dcp_reader_test2)
 {
-       ifstream file ("test/data/test2.xml");
-       sub::DCPReader reader (file);
+       sub::InteropDCPReader reader ("test/data/test2.xml");
        list<sub::Subtitle> subs = sub::collect<list<sub::Subtitle> > (reader.subtitles ());
 
        list<sub::Subtitle>::iterator i = subs.begin ();
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric(), sub::MetricTime (0, 0, 41, 62 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 43, 52 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 41, 62 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 43, 52 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
 
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -181,12 +181,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "At afternoon tea with John Peel");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -199,20 +199,20 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                ++j;
                BOOST_CHECK (j == i->lines.end ());
        }
-               
+
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric(), sub::MetricTime (0, 0, 50, 42 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 52, 21 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 50, 42 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 52, 21 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
 
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -223,10 +223,10 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
 
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -241,18 +241,18 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 2, 208 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 04, 10 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 2, 208 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 04, 10 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
 
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -261,42 +261,42 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "At home it depends how I feel.\"");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
-               BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 2, 208 * 4));
-               BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 4, 10 * 4));
+               BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 2, 208 * 4));
+               BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 4, 10 * 4));
                BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
                BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
                BOOST_CHECK_EQUAL (b.text, "I spent a long weekend in Brighton");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-               BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
+               BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+               BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
 
                ++j;
                BOOST_CHECK (j == i->lines.end ());
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 15, 42 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 16, 42 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
-       
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 15, 42 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 16, 42 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
+
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -305,12 +305,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "With the legendary Miss Enid Blyton");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -325,18 +325,18 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 20, 219 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 22, 73 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));   
-       
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 20, 219 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 22, 73 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
+
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -345,12 +345,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "and I'll show you my body\"");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -365,18 +365,18 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 27, 115 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 28, 208 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
-       
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 27, 115 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 28, 208 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
+
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -385,12 +385,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "That curious creature the Sphinx");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -405,18 +405,18 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 42, 229 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 45, 62 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 42, 229 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 45, 62 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
 
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -425,12 +425,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "It sits there and smirks");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -445,18 +445,18 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 45, 146 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 47, 94 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
-       
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 45, 146 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 47, 94 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
+
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -465,12 +465,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "Then when you're not looking, it winks.");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -485,18 +485,18 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
        }
 
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 47, 146 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 48, 167 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
-       
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 47, 146 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 48, 167 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
+
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -505,12 +505,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "Out mooning, at night, on the ledge");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -523,20 +523,20 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                ++j;
                BOOST_CHECK (j == i->lines.end ());
        }
-               
+
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 53, 21 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 56, 10 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
-       
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 53, 21 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 56, 10 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
+
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -545,12 +545,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "Is the maestro, James Brown");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, false);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -563,20 +563,20 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                ++j;
                BOOST_CHECK (j == i->lines.end ());
        }
-       
+
        ++i;
-       BOOST_CHECK (i != subs.end ());
-       BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 2, 5, 208 * 4));
-       BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 2, 7, 31 * 4));
-       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
-       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
-       
+       BOOST_REQUIRE (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 2, 5, 208 * 4));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 2, 7, 31 * 4));
+       BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
+       BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
+
        {
                list<sub::Line>::iterator j = i->lines.begin ();
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                sub::Block b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
@@ -585,12 +585,12 @@ BOOST_AUTO_TEST_CASE (dcp_reader_test2)
                BOOST_CHECK_EQUAL (b.text, "HELLO");
                BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
                BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
-               
+
                ++j;
-               BOOST_CHECK (j != i->lines.end ());
-               BOOST_CHECK_EQUAL (j->blocks.size(), 1);
+               BOOST_REQUIRE (j != i->lines.end ());
+               BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
                b = j->blocks.front ();
-               BOOST_CHECK_EQUAL (b.font, "Arial");
+               BOOST_CHECK_EQUAL (b.font.get(), "theFont");
                BOOST_CHECK_EQUAL (b.italic, true);
                BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
                BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));