2 Copyright (C) 2016 Carl Hetherington <cth@carlh.net>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "ssa_reader.h"
24 #include <boost/test/unit_test.hpp>
25 #include <boost/filesystem.hpp>
32 BOOST_AUTO_TEST_CASE (ssa_reader_test)
34 boost::filesystem::path p = private_test / "example.ssa";
35 FILE* f = fopen (p.string().c_str(), "r");
36 sub::SSAReader reader (f);
38 list<sub::Subtitle> subs = sub::collect<std::list<sub::Subtitle> > (reader.subtitles ());
40 list<sub::Subtitle>::iterator i = subs.begin ();
42 BOOST_REQUIRE (i != subs.end ());
43 BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 2, 40, 650));
44 BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 2, 41, 790));
45 list<sub::Line>::iterator j = i->lines.begin();
46 BOOST_REQUIRE (j != i->lines.end ());
47 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
48 sub::Block b = j->blocks.front ();
49 BOOST_CHECK_EQUAL (b.text, "Et les enregistrements de ses ondes delta ?");
50 BOOST_CHECK_EQUAL (b.font.get(), "Wolf_Rain");
51 BOOST_CHECK_EQUAL (b.font_size.points().get(), 56);
52 BOOST_CHECK_EQUAL (b.bold, false);
53 BOOST_CHECK_EQUAL (b.italic, false);
54 BOOST_CHECK_EQUAL (b.underline, false);
57 BOOST_REQUIRE (i != subs.end ());
58 BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 2, 42, 420));
59 BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 2, 44, 150));
61 BOOST_REQUIRE (j != i->lines.end ());
62 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
63 b = j->blocks.front ();
64 BOOST_CHECK_EQUAL (b.text, "Toujours rien.");
65 BOOST_CHECK_EQUAL (b.font.get(), "Wolf_Rain");
66 BOOST_CHECK_EQUAL (b.font_size.points().get(), 56);
67 BOOST_CHECK_EQUAL (b.bold, false);
68 BOOST_CHECK_EQUAL (b.italic, false);
69 BOOST_CHECK_EQUAL (b.underline, false);
72 BOOST_CHECK (i == subs.end());
75 BOOST_AUTO_TEST_CASE (ssa_reader_line_test1)
77 sub::RawSubtitle base;
78 list<sub::RawSubtitle> r = sub::SSAReader::parse_line (base, "This is a line with some {\\i1}italics{\\i0} and then\\nthere is a new line.");
80 list<sub::RawSubtitle>::const_iterator i = r.begin ();
81 BOOST_CHECK_EQUAL (i->text, "This is a line with some ");
82 BOOST_CHECK_EQUAL (i->italic, false);
84 BOOST_REQUIRE (i != r.end ());
86 BOOST_CHECK_EQUAL (i->text, "italics");
87 BOOST_CHECK_EQUAL (i->italic, true);
89 BOOST_REQUIRE (i != r.end ());
91 BOOST_CHECK_EQUAL (i->text, " and then");
92 BOOST_CHECK_EQUAL (i->italic, false);
94 BOOST_REQUIRE (i != r.end ());
96 BOOST_CHECK_EQUAL (i->text, "there is a new line.");
98 BOOST_REQUIRE (i == r.end ());
101 BOOST_AUTO_TEST_CASE (ssa_reader_line_test2)
103 sub::RawSubtitle base;
104 list<sub::RawSubtitle> r = sub::SSAReader::parse_line (base, "{\\i1}It's all just italics{\\i0}");
106 list<sub::RawSubtitle>::const_iterator i = r.begin ();
107 BOOST_CHECK_EQUAL (i->text, "It's all just italics");
108 BOOST_CHECK_EQUAL (i->italic, true);
110 BOOST_REQUIRE (i == r.end ());
114 test (boost::filesystem::path p)
116 p = private_test / p;
117 FILE* f = fopen (p.string().c_str(), "r");
119 sub::SSAReader r (f);
123 /** Test of reading some typical .ssa files */
124 BOOST_AUTO_TEST_CASE (ssa_reader_test2)
126 test ("DKH_UT_EN20160601def.ssa");
129 /** Test reading of a file within the libsub tree which exercises the parser */
130 BOOST_AUTO_TEST_CASE (ssa_reader_test3)
132 boost::filesystem::path p = "test/data/test.ssa";
133 FILE* f = fopen (p.string().c_str(), "r");
134 sub::SSAReader reader (f);
136 list<sub::Subtitle> subs = sub::collect<std::list<sub::Subtitle> > (reader.subtitles ());
138 list<sub::Subtitle>::iterator i = subs.begin ();
141 BOOST_REQUIRE (i != subs.end ());
142 BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 1, 230));
143 BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 4, 550));
144 list<sub::Line>::iterator j = i->lines.begin();
145 BOOST_REQUIRE (j != i->lines.end ());
146 BOOST_CHECK (j->vertical_position.proportional);
147 BOOST_CHECK_EQUAL (j->vertical_position.proportional.get(), 0);
148 BOOST_CHECK (j->vertical_position.reference);
149 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
150 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
151 sub::Block b = j->blocks.front ();
152 BOOST_CHECK_EQUAL (b.text, "Hello world");
153 BOOST_CHECK_EQUAL (b.font.get(), "Arial");
154 BOOST_CHECK_EQUAL (b.font_size.points().get(), 20);
155 BOOST_CHECK_EQUAL (b.bold, false);
156 BOOST_CHECK_EQUAL (b.italic, false);
157 BOOST_CHECK_EQUAL (b.underline, false);
160 /* This is vertically moved\nand has two lines. */
161 BOOST_REQUIRE (i != subs.end ());
162 BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 5, 740));
163 BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 11, 0));
164 j = i->lines.begin();
165 BOOST_REQUIRE (j != i->lines.end ());
166 BOOST_CHECK (j->vertical_position.proportional);
167 /* The first line should be 900 pixels and one line (20
168 points, 1.2 times spaced, as a proportion of the total
169 screen height 729 points) up.
171 BOOST_CHECK (fabs (j->vertical_position.proportional.get() - (900.0 / 1080) - (20.0 * 1.2 / 792)) < 1e-5);
172 BOOST_CHECK (j->vertical_position.reference);
173 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
174 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
175 b = j->blocks.front ();
176 BOOST_CHECK_EQUAL (b.text, "This is vertically moved");
177 BOOST_CHECK_EQUAL (b.font.get(), "Arial");
178 BOOST_CHECK_EQUAL (b.font_size.points().get(), 20);
179 BOOST_CHECK_EQUAL (b.bold, false);
180 BOOST_CHECK_EQUAL (b.italic, false);
181 BOOST_CHECK_EQUAL (b.underline, false);
184 BOOST_CHECK (fabs (j->vertical_position.proportional.get() - (900.0 / 1080)) < 1e-5);
185 BOOST_CHECK (j->vertical_position.reference);
186 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
187 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
188 b = j->blocks.front ();
189 BOOST_CHECK_EQUAL (b.text, "and has two lines.");
190 BOOST_CHECK_EQUAL (b.font.get(), "Arial");
191 BOOST_CHECK_EQUAL (b.font_size.points().get(), 20);
192 BOOST_CHECK_EQUAL (b.bold, false);
193 BOOST_CHECK_EQUAL (b.italic, false);
194 BOOST_CHECK_EQUAL (b.underline, false);
198 /* Some {\i1}italics{\i} are here. */
199 BOOST_REQUIRE (i != subs.end ());
200 BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 7, 740));
201 BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 9, 0));
202 j = i->lines.begin();
203 BOOST_REQUIRE (j != i->lines.end ());
204 BOOST_CHECK (j->vertical_position.proportional);
205 BOOST_CHECK_EQUAL (j->vertical_position.proportional.get(), 0);
206 BOOST_CHECK (j->vertical_position.reference);
207 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
208 BOOST_REQUIRE_EQUAL (j->blocks.size(), 3);
209 list<sub::Block>::const_iterator bi = j->blocks.begin ();
210 BOOST_CHECK_EQUAL (bi->text, "Some ");
211 BOOST_CHECK_EQUAL (bi->font.get(), "Arial");
212 BOOST_CHECK_EQUAL (bi->font_size.points().get(), 20);
213 BOOST_CHECK_EQUAL (bi->bold, false);
214 BOOST_CHECK_EQUAL (bi->italic, false);
215 BOOST_CHECK_EQUAL (bi->underline, false);
217 BOOST_CHECK_EQUAL (bi->text, "italics");
218 BOOST_CHECK_EQUAL (bi->font.get(), "Arial");
219 BOOST_CHECK_EQUAL (bi->font_size.points().get(), 20);
220 BOOST_CHECK_EQUAL (bi->bold, false);
221 BOOST_CHECK_EQUAL (bi->italic, true);
222 BOOST_CHECK_EQUAL (bi->underline, false);
224 BOOST_CHECK_EQUAL (bi->text, " are here.");
225 BOOST_CHECK_EQUAL (bi->font.get(), "Arial");
226 BOOST_CHECK_EQUAL (bi->font_size.points().get(), 20);
227 BOOST_CHECK_EQUAL (bi->bold, false);
228 BOOST_CHECK_EQUAL (bi->italic, false);
229 BOOST_CHECK_EQUAL (bi->underline, false);
232 BOOST_REQUIRE (j == i->lines.end());
235 BOOST_REQUIRE (i == subs.end ());