X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fsubrip_reader_test.cc;h=2daf84a52b3e853b4d17a86f282abd501da63ffb;hb=ebf251867a862f4660a0148d4ee81f980d4d6cd6;hp=c06cf256aaa92d43fe4dd059c96f1f2cb38deb10;hpb=067c21c5f8d45cfef426b1f88f8c912019f944e4;p=libsub.git diff --git a/test/subrip_reader_test.cc b/test/subrip_reader_test.cc index c06cf25..2daf84a 100644 --- a/test/subrip_reader_test.cc +++ b/test/subrip_reader_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014-2015 Carl Hetherington + Copyright (C) 2014-2020 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 @@ -20,6 +20,7 @@ #include "subrip_reader.h" #include "subtitle.h" #include "test.h" +#include "exceptions.h" #include "collect.h" #include #include @@ -27,7 +28,6 @@ #include #include -using std::list; using std::cerr; using std::vector; using std::fabs; @@ -38,9 +38,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test) FILE* f = fopen ("test/data/test.srt", "r"); sub::SubripReader reader (f); fclose (f); - list subs = sub::collect > (reader.subtitles ()); + auto subs = sub::collect> (reader.subtitles()); - list::iterator i = subs.begin (); + auto i = subs.begin (); /* First subtitle */ @@ -49,10 +49,10 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test) 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 (); + auto j = i->lines.begin(); BOOST_CHECK (j != i->lines.end ()); BOOST_CHECK_EQUAL (j->blocks.size(), 1); - sub::Block b = j->blocks.front (); + auto b = j->blocks.front(); BOOST_CHECK_EQUAL (b.text, "This is a subtitle"); /* No font is specified by subrip, so none should be seen here */ BOOST_CHECK (!b.font); @@ -60,6 +60,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test) BOOST_CHECK_EQUAL (b.bold, false); BOOST_CHECK_EQUAL (b.italic, false); BOOST_CHECK_EQUAL (b.underline, false); + BOOST_REQUIRE (j->vertical_position.line); BOOST_CHECK_EQUAL (j->vertical_position.line.get(), 0); BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SUBTITLE); ++j; @@ -74,6 +75,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test) BOOST_CHECK_EQUAL (b.bold, false); BOOST_CHECK_EQUAL (b.italic, false); BOOST_CHECK_EQUAL (b.underline, false); + BOOST_REQUIRE (j->vertical_position.line); BOOST_CHECK_EQUAL (j->vertical_position.line.get(), 1); BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SUBTITLE); ++i; @@ -91,7 +93,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test) BOOST_CHECK_EQUAL (l.vertical_position.line.get(), 0); BOOST_CHECK_EQUAL (l.vertical_position.reference.get(), sub::TOP_OF_SUBTITLE); - list::iterator k = l.blocks.begin (); + auto k = l.blocks.begin(); BOOST_CHECK (k != l.blocks.end ()); BOOST_CHECK_EQUAL (k->text, "This is some "); @@ -172,9 +174,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test2) FILE* f = fopen ("test/data/test2.srt", "r"); sub::SubripReader reader (f); fclose (f); - list subs = sub::collect > (reader.subtitles ()); + auto subs = sub::collect> (reader.subtitles()); - list::const_iterator i = subs.begin(); + auto i = subs.begin(); BOOST_CHECK (i != subs.end ()); BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 49, 200)); @@ -290,7 +292,25 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) 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 (); + auto i = r._subs.begin(); + BOOST_CHECK_EQUAL (i->text, "This is "); + BOOST_CHECK_EQUAL (i->bold, true); + BOOST_CHECK_EQUAL (i->italic, false); + ++i; + BOOST_CHECK_EQUAL (i->text, "nesting"); + BOOST_CHECK_EQUAL (i->bold, true); + BOOST_CHECK_EQUAL (i->italic, true); + ++i; + BOOST_CHECK_EQUAL (i->text, " of subtitles"); + BOOST_CHECK_EQUAL (i->bold, true); + BOOST_CHECK_EQUAL (i->italic, false); + ++i; + r._subs.clear (); + + rs = sub::RawSubtitle(); + r.convert_line ("This is nesting of subtitles", rs); + BOOST_CHECK_EQUAL (r._subs.size(), 3); + i = r._subs.begin(); BOOST_CHECK_EQUAL (i->text, "This is "); BOOST_CHECK_EQUAL (i->bold, true); BOOST_CHECK_EQUAL (i->italic, false); @@ -315,6 +335,16 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) BOOST_CHECK_CLOSE (r._subs.front().colour.b, 1, 0.1); r._subs.clear (); + rs = sub::RawSubtitle(); + r.convert_line ("simple color in capitals", rs); + BOOST_CHECK_EQUAL (r._subs.size(), 1); + BOOST_CHECK_EQUAL (r._subs.front().text, "simple color in capitals"); + 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); @@ -332,6 +362,23 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) BOOST_CHECK (fabs (i->colour.b) < 0.01); 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); @@ -348,13 +395,21 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) BOOST_CHECK (fabs (i->colour.g) < 0.01); BOOST_CHECK_CLOSE (i->colour.b, 1, 0.1); r._subs.clear (); + + rs = sub::RawSubtitle(); + r.convert_line ("<< angle brackets but no HTML >>", rs); + BOOST_CHECK_EQUAL (r._subs.size(), 1); + i = r._subs.begin (); + BOOST_CHECK_EQUAL (i->text, "<< angle brackets but no HTML >>"); + r._subs.clear(); } /** Test SubripReader::convert_time */ BOOST_AUTO_TEST_CASE (subrip_reader_convert_time_test) { - BOOST_CHECK_EQUAL (sub::SubripReader::convert_time ("00:03:10,500"), sub::Time::from_hms (0, 3, 10, 500)); - BOOST_CHECK_EQUAL (sub::SubripReader::convert_time ("04:19:51,782"), sub::Time::from_hms (4, 19, 51, 782)); + sub::SubripReader reader; + BOOST_CHECK_EQUAL (reader.convert_time ("00:03:10,500"), sub::Time::from_hms (0, 3, 10, 500)); + BOOST_CHECK_EQUAL (reader.convert_time ("04:19:51,782"), sub::Time::from_hms (4, 19, 51, 782)); } static void @@ -371,13 +426,30 @@ test (boost::filesystem::path p) fclose (f); } +static void +test_throw (boost::filesystem::path p) +{ + p = private_test / p; + FILE* f = fopen (p.string().c_str(), "r"); + BOOST_CHECK (f); + if (!f) { + cerr << p << " not found.\n"; + return; + } + BOOST_CHECK_THROW (sub::SubripReader r(f), sub::SubripError); + fclose (f); +} + /** Test of reading some typical .srt files */ 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 ("FC.srt"); test ("EU13.srt"); + test ("Subtitulos_H_eng.srt"); + test ("SWING.srt"); + test_throw ("subtitulo1.srt"); } #define SUB_START(f, t) \ @@ -413,11 +485,11 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test3) FILE* f = fopen (p.string().c_str(), "r"); sub::SubripReader reader (f); fclose (f); - list subs = sub::collect > (reader.subtitles ()); + auto subs = sub::collect> (reader.subtitles()); - list::iterator i = subs.begin (); - list::iterator j; - list::iterator k; + auto i = subs.begin (); + vector::iterator j; + vector::iterator k; BOOST_REQUIRE (i != subs.end ()); @@ -482,3 +554,105 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test3) BLOCK ("Both lines are bold AND italic", "Arial", 30, true, true, false); SUB_END (); } + +/** Test reading of a .srt file with RTL text */ +BOOST_AUTO_TEST_CASE (subrip_reader_test4) +{ + boost::filesystem::path p = private_test / "rtl.srt"; + FILE* f = fopen (p.string().c_str(), "r"); + sub::SubripReader reader (f); + fclose (f); + auto subs = sub::collect>(reader.subtitles()); + + auto i = subs.begin(); + std::cout << i->lines.front().blocks.front().text << "\n"; + + std::string const t = i->lines.front().blocks.front().text; + for (size_t i = 0; i < t.length() - 2; ++i) { + /* Check that unicode U+202B (right-to-left embedding) has been stripped */ + unsigned char const a = t[i]; + unsigned char const b = t[i+1]; + unsigned char const c = t[i+2]; + BOOST_CHECK ((a != 0xe2 || b != 0x80 || c != 0xab)); + } + + BOOST_CHECK (t == "- \"(دريه فابينار)\""); +} + +/** Test */ +BOOST_AUTO_TEST_CASE (subrip_reader_test5) +{ + sub::RawSubtitle rs; + sub::SubripReader r; + r.convert_line ("Foo bar", rs); + BOOST_REQUIRE_EQUAL (r._subs.size(), 1); + BOOST_CHECK_EQUAL (r._subs.front().text, "Foo bar"); + BOOST_CHECK_CLOSE (r._subs.front().colour.r, 255.0 / 255, 0.1); + BOOST_CHECK_CLOSE (r._subs.front().colour.g, 128.0 / 255, 0.1); + BOOST_CHECK_CLOSE (r._subs.front().colour.b, 64.0 / 255, 0.1); + r._subs.clear (); + + rs = sub::RawSubtitle (); + r.convert_line ("Foo bar", rs); + BOOST_REQUIRE_EQUAL (r._subs.size(), 1); + BOOST_CHECK_EQUAL (r._subs.front().text, "Foo bar"); + BOOST_CHECK_CLOSE (r._subs.front().colour.r, 1.0 / 255, 0.1); + BOOST_CHECK_CLOSE (r._subs.front().colour.g, 2.0 / 255, 0.1); + BOOST_CHECK_CLOSE (r._subs.front().colour.b, 3.0 / 255, 0.1); +} + +/** Test alignment */ +BOOST_AUTO_TEST_CASE (subrip_reader_test6) +{ + sub::RawSubtitle rs; + rs.vertical_position.line = 0; + rs.vertical_position.reference = sub::TOP_OF_SUBTITLE; + sub::SubripReader r; + r.convert_line ("Hello world", rs); + BOOST_REQUIRE_EQUAL (r._subs.size(), 1); + BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); + BOOST_REQUIRE (r._subs.front().vertical_position.line); + BOOST_CHECK_EQUAL (r._subs.front().vertical_position.line.get(), 0); + BOOST_REQUIRE (r._subs.front().vertical_position.reference); + BOOST_CHECK_EQUAL (r._subs.front().vertical_position.reference.get(), sub::TOP_OF_SUBTITLE); + r._subs.clear (); + + rs = sub::RawSubtitle (); + rs.vertical_position.line = 0; + r.convert_line ("{\\an1}Hello", rs); + BOOST_REQUIRE_EQUAL (r._subs.size(), 1); + BOOST_CHECK_EQUAL (r._subs.front().text, "Hello"); + BOOST_REQUIRE (r._subs.front().vertical_position.line); + BOOST_CHECK_EQUAL (r._subs.front().vertical_position.line.get(), 0); + BOOST_REQUIRE (r._subs.front().vertical_position.reference); + BOOST_CHECK_EQUAL (r._subs.front().vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN); + BOOST_CHECK_EQUAL (r._subs.front().horizontal_position.proportional, 0); + BOOST_CHECK_EQUAL (r._subs.front().horizontal_position.reference, sub::LEFT_OF_SCREEN); + r._subs.clear (); + + rs = sub::RawSubtitle (); + rs.vertical_position.line = 0; + r.convert_line ("{\\an2}to", rs); + BOOST_REQUIRE_EQUAL (r._subs.size(), 1); + BOOST_CHECK_EQUAL (r._subs.front().text, "to"); + BOOST_REQUIRE (r._subs.front().vertical_position.line); + BOOST_CHECK_EQUAL (r._subs.front().vertical_position.line.get(), 0); + BOOST_REQUIRE (r._subs.front().vertical_position.reference); + BOOST_CHECK_EQUAL (r._subs.front().vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN); + BOOST_CHECK_EQUAL (r._subs.front().horizontal_position.proportional, 0); + BOOST_CHECK_EQUAL (r._subs.front().horizontal_position.reference, sub::HORIZONTAL_CENTRE_OF_SCREEN); + r._subs.clear (); + + rs = sub::RawSubtitle (); + rs.vertical_position.line = 0; + r.convert_line ("{\\an3}you", rs); + BOOST_CHECK_EQUAL (r._subs.front().text, "you"); + BOOST_REQUIRE (r._subs.front().vertical_position.line); + BOOST_CHECK_EQUAL (r._subs.front().vertical_position.line.get(), 0); + BOOST_REQUIRE (r._subs.front().vertical_position.reference); + BOOST_CHECK_EQUAL (r._subs.front().vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN); + BOOST_CHECK_EQUAL (r._subs.front().horizontal_position.proportional, 0); + BOOST_CHECK_EQUAL (r._subs.front().horizontal_position.reference, sub::RIGHT_OF_SCREEN); + r._subs.clear (); +} +