X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fsubrip_reader_test.cc;h=50160585dc282dac1f479e83c047109ba8faeffd;hb=d7e0ebee4d94f10a8b80c1e61bf7b162c6a1ac12;hp=91437f2f34747441c2b48f7aa49afa5dded20759;hpb=a002558d5e096d91c3c4294e30405ad3bce3e5d6;p=libsub.git diff --git a/test/subrip_reader_test.cc b/test/subrip_reader_test.cc index 91437f2..5016058 100644 --- a/test/subrip_reader_test.cc +++ b/test/subrip_reader_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014 Carl Hetherington + Copyright (C) 2014-2015 Carl Hetherington 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 @@ -23,12 +23,13 @@ #include "collect.h" #include #include -#include +#include +#include using std::list; using std::cerr; -using std::ifstream; using std::vector; +using std::fabs; /* Test reading of a Subrip file */ BOOST_AUTO_TEST_CASE (subrip_reader_test) @@ -40,20 +41,21 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test) list::iterator i = subs.begin (); - + /* First subtitle */ BOOST_CHECK (i != subs.end ()); BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 41, 90)); BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 42, 210)); - + list::iterator j = i->lines.begin (); BOOST_CHECK (j != i->lines.end ()); 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); @@ -65,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); @@ -74,13 +77,13 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test) BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SUBTITLE); ++i; - + /* Second subtitle */ - + BOOST_CHECK (i != subs.end ()); BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 1, 10)); BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 2, 100)); - + BOOST_CHECK_EQUAL (i->lines.size(), 1); sub::Line l = i->lines.front (); BOOST_CHECK_EQUAL (l.blocks.size(), 7); @@ -88,11 +91,12 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test) BOOST_CHECK_EQUAL (l.vertical_position.reference.get(), sub::TOP_OF_SUBTITLE); list::iterator k = l.blocks.begin (); - + 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); @@ -100,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); @@ -109,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); @@ -118,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); @@ -127,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); @@ -136,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); @@ -145,13 +154,14 @@ 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); ++k; - + BOOST_CHECK (k == l.blocks.end ()); } @@ -209,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 ()); } @@ -217,51 +237,59 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test2) 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 ("Hello world", 0, sub::Time (), sub::Time ()); + rs = sub::RawSubtitle(); + r.convert_line ("Hello world", 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 ("Hello world", 0, sub::Time (), sub::Time ()); + rs = sub::RawSubtitle(); + r.convert_line ("Hello world", 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 ("Hello world", 0, sub::Time (), sub::Time ()); + rs = sub::RawSubtitle(); + r.convert_line ("Hello world", 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 ("This is nesting of subtitles", 0, sub::Time (), sub::Time ()); + rs = sub::RawSubtitle(); + r.convert_line ("This is nesting of subtitles", rs); BOOST_CHECK_EQUAL (r._subs.size(), 3); - list::iterator i = r._subs.begin (); + list::iterator i = r._subs.begin (); BOOST_CHECK_EQUAL (i->text, "This is "); BOOST_CHECK_EQUAL (i->bold, true); BOOST_CHECK_EQUAL (i->italic, false); @@ -275,8 +303,51 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) BOOST_CHECK_EQUAL (i->italic, false); ++i; r._subs.clear (); -} + rs = sub::RawSubtitle(); + r.convert_line ("simple color", 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 ("some red text in bold", rs); + BOOST_CHECK_EQUAL (r._subs.size(), 2); + i = r._subs.begin (); + BOOST_CHECK_EQUAL (i->text, "some red text "); + BOOST_CHECK_EQUAL (i->bold, false); + BOOST_CHECK_CLOSE (i->colour.r, 1, 0.1); + BOOST_CHECK (fabs (i->colour.g) < 0.01); + BOOST_CHECK (fabs (i->colour.b) < 0.01); + ++i; + BOOST_CHECK_EQUAL (i->text, "in bold"); + BOOST_CHECK_EQUAL (i->bold, true); + BOOST_CHECK_CLOSE (i->colour.r, 1, 0.1); + BOOST_CHECK (fabs (i->colour.g) < 0.01); + BOOST_CHECK (fabs (i->colour.b) < 0.01); + r._subs.clear (); + + rs = sub::RawSubtitle(); + r.convert_line ("some blue text in bold", rs); + BOOST_CHECK_EQUAL (r._subs.size(), 2); + i = r._subs.begin (); + BOOST_CHECK_EQUAL (i->text, "some blue text "); + BOOST_CHECK_EQUAL (i->bold, false); + BOOST_CHECK (fabs (i->colour.r) < 0.01); + BOOST_CHECK (fabs (i->colour.g) < 0.01); + BOOST_CHECK_CLOSE (i->colour.b, 1, 0.1); + ++i; + BOOST_CHECK_EQUAL (i->text, "in bold"); + BOOST_CHECK_EQUAL (i->bold, true); + BOOST_CHECK (fabs (i->colour.r) < 0.01); + BOOST_CHECK (fabs (i->colour.g) < 0.01); + BOOST_CHECK_CLOSE (i->colour.b, 1, 0.1); + r._subs.clear (); +} /** Test SubripReader::convert_time */ BOOST_AUTO_TEST_CASE (subrip_reader_convert_time_test) @@ -305,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 subs = sub::collect > (reader.subtitles ()); + + list::iterator i = subs.begin (); + list::iterator j; + list::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 (); }