Trim some includes.
[libsub.git] / test / subrip_reader_test.cc
index dcd506a2957d0c5595e9cc4b9771d4c96b78e24d..50160585dc282dac1f479e83c047109ba8faeffd 100644 (file)
 #include "collect.h"
 #include <boost/test/unit_test.hpp>
 #include <boost/filesystem.hpp>
-#include <fstream>
 #include <cmath>
+#include <iostream>
 
 using std::list;
 using std::cerr;
-using std::ifstream;
 using std::vector;
 using std::fabs;
 
@@ -54,8 +53,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
        BOOST_CHECK_EQUAL (j->blocks.size(), 1);
        sub::Block b = j->blocks.front ();
        BOOST_CHECK_EQUAL (b.text, "This is a subtitle");
-       BOOST_CHECK_EQUAL (b.font.get(), "Arial");
-       BOOST_CHECK_EQUAL (b.font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (b.bold, false);
        BOOST_CHECK_EQUAL (b.italic, false);
        BOOST_CHECK_EQUAL (b.underline, false);
@@ -67,8 +67,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
        BOOST_CHECK_EQUAL (j->blocks.size(), 1);
        b = j->blocks.front ();
        BOOST_CHECK_EQUAL (b.text, "and that's a line break");
-       BOOST_CHECK_EQUAL (b.font.get(), "Arial");
-       BOOST_CHECK_EQUAL (b.font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (b.bold, false);
        BOOST_CHECK_EQUAL (b.italic, false);
        BOOST_CHECK_EQUAL (b.underline, false);
@@ -93,8 +94,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
 
        BOOST_CHECK (k != l.blocks.end ());
        BOOST_CHECK_EQUAL (k->text, "This is some ");
-       BOOST_CHECK_EQUAL (k->font.get(), "Arial");
-       BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (k->bold, false);
        BOOST_CHECK_EQUAL (k->italic, false);
        BOOST_CHECK_EQUAL (k->underline, false);
@@ -102,8 +104,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
 
        BOOST_CHECK (k != l.blocks.end ());
        BOOST_CHECK_EQUAL (k->text, "bold");
-       BOOST_CHECK_EQUAL (k->font.get(), "Arial");
-       BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (k->bold, true);
        BOOST_CHECK_EQUAL (k->italic, false);
        BOOST_CHECK_EQUAL (k->underline, false);
@@ -111,8 +114,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
 
        BOOST_CHECK (k != l.blocks.end ());
        BOOST_CHECK_EQUAL (k->text, " and some ");
-       BOOST_CHECK_EQUAL (k->font.get(), "Arial");
-       BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (k->bold, false);
        BOOST_CHECK_EQUAL (k->italic, false);
        BOOST_CHECK_EQUAL (k->underline, false);
@@ -120,8 +124,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
 
        BOOST_CHECK (k != l.blocks.end ());
        BOOST_CHECK_EQUAL (k->text, "bold italic");
-       BOOST_CHECK_EQUAL (k->font.get(), "Arial");
-       BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (k->bold, true);
        BOOST_CHECK_EQUAL (k->italic, true);
        BOOST_CHECK_EQUAL (k->underline, false);
@@ -129,8 +134,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
 
        BOOST_CHECK (k != l.blocks.end ());
        BOOST_CHECK_EQUAL (k->text, " and some ");
-       BOOST_CHECK_EQUAL (k->font.get(), "Arial");
-       BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (k->bold, false);
        BOOST_CHECK_EQUAL (k->italic, false);
        BOOST_CHECK_EQUAL (k->underline, false);
@@ -138,8 +144,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
 
        BOOST_CHECK (k != l.blocks.end ());
        BOOST_CHECK_EQUAL (k->text, "underlined");
-       BOOST_CHECK_EQUAL (k->font.get(), "Arial");
-       BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (k->bold, false);
        BOOST_CHECK_EQUAL (k->italic, false);
        BOOST_CHECK_EQUAL (k->underline, true);
@@ -147,8 +154,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test)
 
        BOOST_CHECK (k != l.blocks.end ());
        BOOST_CHECK_EQUAL (k->text, ".");
-       BOOST_CHECK_EQUAL (k->font.get(), "Arial");
-       BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
+       /* No font is specified by subrip, so none should be seen here */
+       BOOST_CHECK (!b.font);
+       BOOST_CHECK (!b.font_size.specified());
        BOOST_CHECK_EQUAL (k->bold, false);
        BOOST_CHECK_EQUAL (k->italic, false);
        BOOST_CHECK_EQUAL (k->underline, false);
@@ -211,6 +219,16 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test2)
        BOOST_CHECK_EQUAL (i->lines.size(), 1);
        BOOST_CHECK_EQUAL (i->lines.front().blocks.front().text, "Hello world.");
 
+       ++i;
+       BOOST_CHECK (i != subs.end ());
+       BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 4, 50, 123));
+       BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 4, 55, 23));
+       BOOST_CHECK_EQUAL (i->lines.size(), 2);
+       BOOST_CHECK_EQUAL (i->lines.front().blocks.front().text, "Some italics over");
+       BOOST_CHECK_EQUAL (i->lines.front().blocks.front().italic, true);
+       BOOST_CHECK_EQUAL (i->lines.back().blocks.front().text, "multiple lines");
+       BOOST_CHECK_EQUAL (i->lines.back().blocks.front().italic, true);
+
        ++i;
        BOOST_CHECK (i == subs.end ());
 }
@@ -220,48 +238,56 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test)
 {
        sub::SubripReader r;
 
-       r.convert_line ("Hello world", 0, sub::Time (), sub::Time ());
+       sub::RawSubtitle rs;
+       r.convert_line ("Hello world", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 1);
        BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world");
        r._subs.clear ();
 
-       r.convert_line ("<b>Hello world</b>", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("<b>Hello world</b>", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 1);
        BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world");
        BOOST_CHECK_EQUAL (r._subs.front().bold, true);
        r._subs.clear ();
 
-       r.convert_line ("<i>Hello world</i>", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("<i>Hello world</i>", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 1);
        BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world");
        BOOST_CHECK_EQUAL (r._subs.front().italic, true);
        r._subs.clear ();
 
-       r.convert_line ("<u>Hello world</u>", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("<u>Hello world</u>", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 1);
        BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world");
        BOOST_CHECK_EQUAL (r._subs.front().underline, true);
        r._subs.clear ();
 
-       r.convert_line ("{b}Hello world{/b}", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("{b}Hello world{/b}", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 1);
        BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world");
        BOOST_CHECK_EQUAL (r._subs.front().bold, true);
        r._subs.clear ();
 
-       r.convert_line ("{i}Hello world{/i}", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("{i}Hello world{/i}", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 1);
        BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world");
        BOOST_CHECK_EQUAL (r._subs.front().italic, true);
        r._subs.clear ();
 
-       r.convert_line ("{u}Hello world{/u}", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("{u}Hello world{/u}", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 1);
        BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world");
        BOOST_CHECK_EQUAL (r._subs.front().underline, true);
        r._subs.clear ();
 
-       r.convert_line ("<b>This is <i>nesting</i> of subtitles</b>", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("<b>This is <i>nesting</i> of subtitles</b>", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 3);
        list<sub::RawSubtitle>::iterator i = r._subs.begin ();
        BOOST_CHECK_EQUAL (i->text, "This is ");
@@ -278,7 +304,18 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test)
        ++i;
        r._subs.clear ();
 
-       r.convert_line ("<font color=\"#ff0000\">some red text <b>in bold</b></font>", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("<font color=\"#ff00ff\">simple color</font>", rs);
+       BOOST_CHECK_EQUAL (r._subs.size(), 1);
+       BOOST_CHECK_EQUAL (r._subs.front().text, "simple color");
+       BOOST_CHECK_EQUAL (r._subs.front().bold, false);
+       BOOST_CHECK_CLOSE (r._subs.front().colour.r, 1, 0.1);
+       BOOST_CHECK (fabs (r._subs.front().colour.g) < 0.01);
+       BOOST_CHECK_CLOSE (r._subs.front().colour.b, 1, 0.1);
+       r._subs.clear ();
+
+       rs = sub::RawSubtitle();
+       r.convert_line ("<font color=\"#ff0000\">some red text <b>in bold</b></font>", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 2);
        i = r._subs.begin ();
        BOOST_CHECK_EQUAL (i->text, "some red text ");
@@ -294,7 +331,8 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test)
        BOOST_CHECK (fabs (i->colour.b) < 0.01);
        r._subs.clear ();
 
-       r.convert_line ("<font color=\"#0000ff\">some blue text <b>in bold</b></font>", 0, sub::Time (), sub::Time ());
+       rs = sub::RawSubtitle();
+       r.convert_line ("<font color=\"#0000ff\">some blue text <b>in bold</b></font>", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 2);
        i = r._subs.begin ();
        BOOST_CHECK_EQUAL (i->text, "some blue text ");
@@ -338,4 +376,108 @@ BOOST_AUTO_TEST_CASE (subrip_read_test)
        test ("sintel_en.srt");
        test ("sintel_fr.srt");
        test ("Fight.Club.1999.720p.BRRip.x264-x0r.srt");
+       test ("EU13.srt");
+}
+
+#define SUB_START(f, t) \
+       BOOST_REQUIRE (i != subs.end ()); \
+       BOOST_CHECK_EQUAL (i->from, f); \
+       BOOST_CHECK_EQUAL (i->to, t); \
+       j = i->lines.begin ();
+
+#define LINE(p)                                                        \
+       BOOST_REQUIRE (j != i->lines.end ()); \
+       BOOST_CHECK (j->vertical_position.line); \
+       BOOST_CHECK_EQUAL (j->vertical_position.line.get(), p); \
+       BOOST_CHECK (j->vertical_position.reference); \
+       BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SUBTITLE); \
+       k = j->blocks.begin (); \
+       ++j;
+
+#define BLOCK(t, f, s, b, i, u) \
+       BOOST_REQUIRE (k != j->blocks.end ()); \
+       BOOST_CHECK_EQUAL (k->text, t); \
+       BOOST_CHECK_EQUAL (k->bold, b); \
+       BOOST_CHECK_EQUAL (k->italic, i); \
+       BOOST_CHECK_EQUAL (k->underline, u); \
+       ++k;
+
+#define SUB_END() \
+       ++i;
+
+/** Test reading of another .srt file */
+BOOST_AUTO_TEST_CASE (subrip_reader_test3)
+{
+       boost::filesystem::path p = private_test / "DCP-o-matic_test_subs_1.srt";
+       FILE* f = fopen (p.string().c_str(), "r");
+       sub::SubripReader reader (f);
+       fclose (f);
+       list<sub::Subtitle> subs = sub::collect<std::list<sub::Subtitle> > (reader.subtitles ());
+
+       list<sub::Subtitle>::iterator i = subs.begin ();
+       list<sub::Line>::iterator j;
+       list<sub::Block>::iterator k;
+
+       BOOST_REQUIRE (i != subs.end ());
+
+       SUB_START (sub::Time::from_hms (0, 0, 0, 76), sub::Time::from_hms (0, 0, 1, 116));
+       LINE (0);
+       BLOCK ("This line is normal", "Arial", 30, false, false, false);
+       LINE (1);
+       BLOCK ("This line is bold", "Arial", 30, true, false, false);
+       SUB_END ();
+
+       SUB_START (sub::Time::from_hms (0, 0, 1, 206), sub::Time::from_hms (0, 0, 2, 246));
+       LINE (0);
+       BLOCK ("This line is bold", "Arial", 30, true, false, false);
+       LINE (1);
+       BLOCK ("This line is normal", "Arial", 30, false, false, false);
+       SUB_END ();
+
+       SUB_START (sub::Time::from_hms (0, 0, 2, 308), sub::Time::from_hms (0, 0, 3, 380));
+       LINE (0);
+       BLOCK ("This line is bold", "Arial", 30, true, false, false);
+       LINE (1);
+       BLOCK ("This line is italic", "Arial", 30, false, true, false);
+       SUB_END ();
+
+       SUB_START (sub::Time::from_hms (0, 0, 3, 404), sub::Time::from_hms (0, 0, 4, 484));
+       LINE (0);
+       BLOCK ("This line is italic", "Arial", 30, false, true, false);
+       LINE (1);
+       BLOCK ("This line is bold", "Arial", 30, true, false, false);
+       SUB_END ();
+
+       SUB_START (sub::Time::from_hms (0, 0, 4, 519), sub::Time::from_hms (0, 0, 5, 604));
+       LINE (0);
+       BLOCK ("Last three words are ", "Arial", 30, false, false, false);
+       BLOCK ("bold AND italic", "Arial", 30, true, true, false);
+       LINE (1);
+       BLOCK ("Last three words are ", "Arial", 30, false, false, false);
+       BLOCK ("italic AND bold", "Arial", 30, true, true, false);
+       SUB_END ();
+
+       SUB_START (sub::Time::from_hms (0, 0, 5, 628), sub::Time::from_hms (0, 0, 6, 712));
+       LINE (0);
+       BLOCK ("Last three words are ", "Arial", 30, false, false, false);
+       BLOCK ("bold AND italic", "Arial", 30, true, true, false);
+       LINE (1);
+       BLOCK ("First three words", "Arial", 30, true, true, false);
+       BLOCK (" are italic AND bold", "Arial", 30, false, false, false);
+       SUB_END ();
+
+       SUB_START (sub::Time::from_hms (0, 0, 6, 736), sub::Time::from_hms (0, 0, 8, 31));
+       LINE (0);
+       BLOCK ("Last three words are ", "Arial", 30, false, false, false);
+       BLOCK ("bold AND italic", "Arial", 30, true, true, false);
+       LINE (1);
+       BLOCK ("This line is normal", "Arial", 30, false, false, false);
+       SUB_END ();
+
+       SUB_START (sub::Time::from_hms (0, 0, 8, 94), sub::Time::from_hms (0, 0, 9, 211));
+       LINE (0);
+       BLOCK ("Both lines are bold AND italic", "Arial", 30, true, true, false);
+       LINE (1);
+       BLOCK ("Both lines are bold AND italic", "Arial", 30, true, true, false);
+       SUB_END ();
 }