Add a FIXME.
[libsub.git] / test / subrip_reader_test.cc
index c06cf256aaa92d43fe4dd059c96f1f2cb38deb10..87f7b51477f5b5edc4b0696a79f6e0f0770083f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2020 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
@@ -20,6 +20,7 @@
 #include "subrip_reader.h"
 #include "subtitle.h"
 #include "test.h"
+#include "exceptions.h"
 #include "collect.h"
 #include <boost/test/unit_test.hpp>
 #include <boost/filesystem.hpp>
@@ -60,6 +61,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 +76,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;
@@ -332,6 +335,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 ("<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 ");
+       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 ("<font color=\"#0000ff\">some blue text <b>in bold</b></font>", rs);
        BOOST_CHECK_EQUAL (r._subs.size(), 2);
@@ -353,8 +373,9 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test)
 /** 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,6 +392,20 @@ 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)
 {
@@ -378,6 +413,8 @@ BOOST_AUTO_TEST_CASE (subrip_read_test)
        test ("sintel_fr.srt");
        test ("Fight.Club.1999.720p.BRRip.x264-x0r.srt");
        test ("EU13.srt");
+       test ("Subtitulos_HURTO_eng.srt");
+       test_throw ("subtitulo1.srt");
 }
 
 #define SUB_START(f, t) \
@@ -482,3 +519,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);
+       list<sub::Subtitle> subs = sub::collect<std::list<sub::Subtitle> >(reader.subtitles());
+
+       list<sub::Subtitle>::iterator 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 <font color="rgba(255,255,255,255)"> */
+BOOST_AUTO_TEST_CASE (subrip_reader_test5)
+{
+       sub::RawSubtitle rs;
+       sub::SubripReader r;
+       r.convert_line ("<font color=\"rgba(255,128,64,15)\">Foo bar</font>", 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 ("<font color=\"rgba(1, 2 , 3, 4)\">Foo bar</font>", 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 ();
+}
+