From a890bedf688f0066d70dd5e9b07cbd86736cc0b1 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 15 Jan 2014 11:07:04 +0000 Subject: [PATCH] More testing / SubRip parse fixes. --- src/lib/subrip.cc | 14 ++++++++-- src/lib/subrip.h | 2 ++ src/lib/subrip_content.cc | 4 +-- src/lib/subrip_content.h | 4 +++ test/subrip_test.cc | 55 +++++++++++++++++++++++++++++++++++++-- 5 files changed, 73 insertions(+), 6 deletions(-) diff --git a/src/lib/subrip.cc b/src/lib/subrip.cc index 1fdadf87e..04765532f 100644 --- a/src/lib/subrip.cc +++ b/src/lib/subrip.cc @@ -29,6 +29,7 @@ using std::string; using std::list; using std::vector; +using std::cout; using boost::shared_ptr; using boost::lexical_cast; using boost::algorithm::trim; @@ -54,8 +55,12 @@ SubRip::SubRip (shared_ptr content) while (!feof (f)) { fgets (buffer, sizeof (buffer), f); + if (feof (f)) { + break; + } + string line (buffer); - trim (line); + trim_right_if (line, boost::is_any_of ("\n\r")); switch (state) { case COUNTER: @@ -93,6 +98,7 @@ SubRip::SubRip (shared_ptr content) current->y1 = convert_coordinate (p[5]); current->y2 = convert_coordinate (p[6]); } + state = CONTENT; break; } case CONTENT: @@ -109,6 +115,11 @@ SubRip::SubRip (shared_ptr content) } } + if (state == CONTENT) { + current->pieces = convert_content (lines); + _subtitles.push_back (current.get ()); + } + fclose (f); } @@ -217,7 +228,6 @@ SubRip::convert_content (list t) Time SubRip::length () const { - boost::mutex::scoped_lock lm (_mutex); if (_subtitles.empty ()) { return 0; } diff --git a/src/lib/subrip.h b/src/lib/subrip.h index 0f4fe5d29..6451c105f 100644 --- a/src/lib/subrip.h +++ b/src/lib/subrip.h @@ -23,6 +23,7 @@ class SubRipContent; class subrip_time_test; class subrip_coordinate_test; class subrip_content_test; +class subrip_parse_test; class SubRip { @@ -35,6 +36,7 @@ private: friend class subrip_time_test; friend class subrip_coordinate_test; friend class subrip_content_test; + friend class subrip_parse_test; static Time convert_time (std::string); static int convert_coordinate (std::string); diff --git a/src/lib/subrip_content.cc b/src/lib/subrip_content.cc index 74bba33ba..b13f64ded 100644 --- a/src/lib/subrip_content.cc +++ b/src/lib/subrip_content.cc @@ -19,6 +19,7 @@ #include "subrip_content.h" #include "util.h" +#include "subrip.h" #include "i18n.h" @@ -33,7 +34,7 @@ SubRipContent::SubRipContent (shared_ptr film, boost::filesystem::pa } -SubRipContent::SubRipContent (shared_ptr film, shared_ptr node, int version) +SubRipContent::SubRipContent (shared_ptr film, shared_ptr node, int) : Content (film, node) , SubtitleContent (film, node) { @@ -96,4 +97,3 @@ SubRipContent::identifier () const return s.str (); } - diff --git a/src/lib/subrip_content.h b/src/lib/subrip_content.h index 741e1a4c3..30a824eec 100644 --- a/src/lib/subrip_content.h +++ b/src/lib/subrip_content.h @@ -25,6 +25,10 @@ public: SubRipContent (boost::shared_ptr, boost::filesystem::path); SubRipContent (boost::shared_ptr, boost::shared_ptr, int); + boost::shared_ptr shared_from_this () { + return boost::dynamic_pointer_cast (Content::shared_from_this ()); + } + void examine (boost::shared_ptr); std::string summary () const; std::string technical_summary () const; diff --git a/test/subrip_test.cc b/test/subrip_test.cc index f23fc8a0b..a66ee1afd 100644 --- a/test/subrip_test.cc +++ b/test/subrip_test.cc @@ -115,6 +115,57 @@ BOOST_AUTO_TEST_CASE (subrip_content_test) /** Test parsing of full SubRip file content */ BOOST_AUTO_TEST_CASE (subrip_parse_test) { - SubRipContent content (shared_ptr (), "test/data/subrip.srt"); - content.examine (shared_ptr ()); + shared_ptr content (new SubRipContent (shared_ptr (), "test/data/subrip.srt")); + content->examine (shared_ptr ()); + BOOST_CHECK_EQUAL (content->full_length(), ((3 * 60) + 56.471) * TIME_HZ); + + SubRip s (content); + + list::const_iterator i = s._subtitles.begin(); + + BOOST_CHECK (i != s._subtitles.end ()); + BOOST_CHECK_EQUAL (i->from, ((1 * 60) + 49.200) * TIME_HZ); + BOOST_CHECK_EQUAL (i->to, ((1 * 60) + 52.351) * TIME_HZ); + BOOST_CHECK_EQUAL (i->pieces.size(), 1); + BOOST_CHECK_EQUAL (i->pieces.front().text, "This is a subtitle, and it goes over two lines."); + + ++i; + BOOST_CHECK (i != s._subtitles.end ()); + BOOST_CHECK_EQUAL (i->from, ((1 * 60) + 52.440) * TIME_HZ); + BOOST_CHECK_EQUAL (i->to, ((1 * 60) + 54.351) * TIME_HZ); + BOOST_CHECK_EQUAL (i->pieces.size(), 1); + BOOST_CHECK_EQUAL (i->pieces.front().text, "We have emboldened this"); + BOOST_CHECK_EQUAL (i->pieces.front().bold, true); + + ++i; + BOOST_CHECK (i != s._subtitles.end ()); + BOOST_CHECK_EQUAL (i->from, ((1 * 60) + 54.440) * TIME_HZ); + BOOST_CHECK_EQUAL (i->to, ((1 * 60) + 56.590) * TIME_HZ); + BOOST_CHECK_EQUAL (i->pieces.size(), 1); + BOOST_CHECK_EQUAL (i->pieces.front().text, "And italicised this."); + BOOST_CHECK_EQUAL (i->pieces.front().italic, true); + + ++i; + BOOST_CHECK (i != s._subtitles.end ()); + BOOST_CHECK_EQUAL (i->from, ((1 * 60) + 56.680) * TIME_HZ); + BOOST_CHECK_EQUAL (i->to, ((1 * 60) + 58.955) * TIME_HZ); + BOOST_CHECK_EQUAL (i->pieces.size(), 1); + BOOST_CHECK_EQUAL (i->pieces.front().text, "Shall I compare thee to a summers' day?"); + + ++i; + BOOST_CHECK (i != s._subtitles.end ()); + BOOST_CHECK_EQUAL (i->from, ((2 * 60) + 0.840) * TIME_HZ); + BOOST_CHECK_EQUAL (i->to, ((2 * 60) + 3.400) * TIME_HZ); + BOOST_CHECK_EQUAL (i->pieces.size(), 1); + BOOST_CHECK_EQUAL (i->pieces.front().text, "Is this a dagger I see before me?"); + + ++i; + BOOST_CHECK (i != s._subtitles.end ()); + BOOST_CHECK_EQUAL (i->from, ((3 * 60) + 54.560) * TIME_HZ); + BOOST_CHECK_EQUAL (i->to, ((3 * 60) + 56.471) * TIME_HZ); + BOOST_CHECK_EQUAL (i->pieces.size(), 1); + BOOST_CHECK_EQUAL (i->pieces.front().text, "Hello world."); + + ++i; + BOOST_CHECK (i == s._subtitles.end ()); } -- 2.30.2