Fix parsing of SSA colour tags which have their leading zeros omitted.
[libsub.git] / test / dcp_reader_test.cc
1 /*
2     Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
3
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.
8
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.
13
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.
17
18 */
19
20 #include "dcp_reader.h"
21 #include "collect.h"
22 #include <boost/test/unit_test.hpp>
23 #include <boost/optional/optional_io.hpp>
24
25 using std::shared_ptr;
26 using std::vector;
27
28 /* Test reading of a DCP XML file */
29 BOOST_AUTO_TEST_CASE (dcp_reader_test1)
30 {
31         sub::DCPReader reader ("test/data/test1.xml");
32         auto subs = sub::collect<vector<sub::Subtitle>> (reader.subtitles());
33
34         auto i = subs.begin();
35         BOOST_REQUIRE (i != subs.end());
36         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 5, 198 * 4));
37         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 7, 115 * 4));
38         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 4));
39         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 4));
40
41         {
42                 auto j = i->lines.begin();
43                 BOOST_REQUIRE (j != i->lines.end ());
44                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
45                 sub::Block b = j->blocks.front ();
46                 BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
47                 BOOST_CHECK_EQUAL (b.italic, false);
48                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
49                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
50                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
51                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
52                 BOOST_CHECK_EQUAL (b.text, "My jacket was Idi Amin's");
53                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
54                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
55
56                 ++j;
57                 BOOST_REQUIRE (j == i->lines.end ());
58         }
59
60         ++i;
61         BOOST_REQUIRE (i != subs.end ());
62         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 7, 177 * 4));
63         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 11, 31 * 4));
64         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 4));
65         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 4));
66
67         {
68                 auto j = i->lines.begin();
69                 BOOST_REQUIRE (j != i->lines.end ());
70                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
71                 auto b = j->blocks.front ();
72                 BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
73                 BOOST_CHECK_EQUAL (b.italic, true);
74                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
75                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
76                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.21, 1);
77                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
78                 BOOST_CHECK_EQUAL (b.text, "My corset was H.M. The Queen's");
79                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
80                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
81
82                 ++j;
83                 BOOST_REQUIRE (j != i->lines.end ());
84                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
85                 b = j->blocks.front ();
86                 BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
87                 BOOST_CHECK_EQUAL (b.italic, false);
88                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
89                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
90                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
91                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
92                 BOOST_CHECK_EQUAL (b.text, "My large wonderbra");
93                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
94                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
95
96                 ++j;
97                 BOOST_REQUIRE (j == i->lines.end ());
98         }
99
100         ++i;
101         BOOST_REQUIRE (i != subs.end ());
102         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 11, 94 * 4));
103         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 13, 63 * 4));
104         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 4));
105         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 4));
106
107         {
108                 auto j = i->lines.begin();
109                 BOOST_REQUIRE (j != i->lines.end ());
110                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
111                 auto b = j->blocks.front();
112                 BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
113                 BOOST_CHECK_EQUAL (b.italic, false);
114                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
115                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
116                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
117                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
118                 BOOST_CHECK_EQUAL (b.text, "Once belonged to the Shah");
119                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
120                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
121
122                 ++j;
123                 BOOST_REQUIRE (j == i->lines.end ());
124         }
125
126         ++i;
127         BOOST_REQUIRE (i != subs.end ());
128         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 13, 104 * 4));
129         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 15, 177 * 4));
130         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 4));
131         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 4));
132
133         {
134                 auto j = i->lines.begin();
135                 BOOST_REQUIRE (j != i->lines.end ());
136                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
137                 auto b = j->blocks.front();
138                 BOOST_CHECK_EQUAL (b.font.get(), "theFontId");
139                 BOOST_CHECK_EQUAL (b.italic, false);
140                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
141                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
142                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
143                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM_OF_SCREEN);
144                 BOOST_CHECK_EQUAL (b.text, "And these are Roy Hattersley's jeans");
145                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
146                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
147
148                 ++j;
149                 BOOST_REQUIRE (j == i->lines.end ());
150         }
151 }
152
153 /* And another one */
154 BOOST_AUTO_TEST_CASE (dcp_reader_test2)
155 {
156         sub::DCPReader reader ("test/data/test2.xml");
157         auto subs = sub::collect<vector<sub::Subtitle>> (reader.subtitles ());
158
159         auto i = subs.begin ();
160         BOOST_REQUIRE (i != subs.end ());
161         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 41, 62 * 4));
162         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 43, 52 * 4));
163         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
164         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
165
166         {
167                 auto j = i->lines.begin ();
168                 BOOST_REQUIRE (j != i->lines.end ());
169                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
170                 auto b = j->blocks.front ();
171                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
172                 BOOST_CHECK_EQUAL (b.italic, true);
173                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
174                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
175                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
176                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
177                 BOOST_CHECK_EQUAL (b.text, "At afternoon tea with John Peel");
178                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
179                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
180
181                 ++j;
182                 BOOST_REQUIRE (j != i->lines.end ());
183                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
184                 b = j->blocks.front ();
185                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
186                 BOOST_CHECK_EQUAL (b.italic, true);
187                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
188                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
189                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
190                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
191                 BOOST_CHECK_EQUAL (b.text, "I enquired if his accent was real");
192                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
193                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
194
195                 ++j;
196                 BOOST_CHECK (j == i->lines.end ());
197         }
198
199         ++i;
200         BOOST_REQUIRE (i != subs.end ());
201         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 0, 50, 42 * 4));
202         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 0, 52, 21 * 4));
203         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
204         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
205
206         {
207                 auto j = i->lines.begin ();
208                 BOOST_REQUIRE (j != i->lines.end ());
209                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
210                 auto b = j->blocks.front ();
211                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
212                 BOOST_CHECK_EQUAL (b.italic, true);
213                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
214                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
215                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
216                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
217                 BOOST_CHECK_EQUAL (b.text, "He said \"out of the house");
218                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
219                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
220
221                 ++j;
222                 BOOST_REQUIRE (j != i->lines.end ());
223                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
224                 b = j->blocks.front ();
225                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
226                 BOOST_CHECK_EQUAL (b.italic, true);
227                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
228                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
229                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
230                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
231                 BOOST_CHECK_EQUAL (b.text, "I'm incredibly scouse");
232                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
233                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
234
235                 ++j;
236                 BOOST_CHECK (j == i->lines.end ());
237         }
238
239         ++i;
240         BOOST_REQUIRE (i != subs.end ());
241         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 2, 208 * 4));
242         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 04, 10 * 4));
243         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
244         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
245
246         {
247                 auto j = i->lines.begin();
248                 BOOST_REQUIRE (j != i->lines.end ());
249                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
250                 auto b = j->blocks.front();
251                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
252                 BOOST_CHECK_EQUAL (b.italic, true);
253                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
254                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
255                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
256                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
257                 BOOST_CHECK_EQUAL (b.text, "At home it depends how I feel.\"");
258                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
259                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
260
261                 ++j;
262                 BOOST_REQUIRE (j != i->lines.end ());
263                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
264                 b = j->blocks.front ();
265                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
266                 BOOST_CHECK_EQUAL (b.italic, true);
267                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
268                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
269                 BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 2, 208 * 4));
270                 BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 4, 10 * 4));
271                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
272                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
273                 BOOST_CHECK_EQUAL (b.text, "I spent a long weekend in Brighton");
274                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
275                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
276                 BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
277                 BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
278
279                 ++j;
280                 BOOST_CHECK (j == i->lines.end ());
281         }
282
283         ++i;
284         BOOST_REQUIRE (i != subs.end ());
285         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 15, 42 * 4));
286         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 16, 42 * 4));
287         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
288         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
289
290         {
291                 auto j = i->lines.begin();
292                 BOOST_REQUIRE (j != i->lines.end ());
293                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
294                 auto b = j->blocks.front();
295                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
296                 BOOST_CHECK_EQUAL (b.italic, true);
297                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
298                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
299                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
300                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
301                 BOOST_CHECK_EQUAL (b.text, "With the legendary Miss Enid Blyton");
302                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
303                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
304
305                 ++j;
306                 BOOST_REQUIRE (j != i->lines.end ());
307                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
308                 b = j->blocks.front ();
309                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
310                 BOOST_CHECK_EQUAL (b.italic, true);
311                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
312                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
313                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
314                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
315                 BOOST_CHECK_EQUAL (b.text, "She said \"you be Noddy");
316                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
317                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
318
319                 ++j;
320                 BOOST_CHECK (j == i->lines.end ());
321         }
322
323         ++i;
324         BOOST_REQUIRE (i != subs.end ());
325         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 20, 219 * 4));
326         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 22, 73 * 4));
327         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
328         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
329
330         {
331                 auto j = i->lines.begin();
332                 BOOST_REQUIRE (j != i->lines.end ());
333                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
334                 auto b = j->blocks.front();
335                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
336                 BOOST_CHECK_EQUAL (b.italic, true);
337                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
338                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
339                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
340                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
341                 BOOST_CHECK_EQUAL (b.text, "and I'll show you my body\"");
342                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
343                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
344
345                 ++j;
346                 BOOST_REQUIRE (j != i->lines.end ());
347                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
348                 b = j->blocks.front ();
349                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
350                 BOOST_CHECK_EQUAL (b.italic, true);
351                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
352                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
353                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
354                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
355                 BOOST_CHECK_EQUAL (b.text, "But Big Ears kept turning the light on.");
356                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
357                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
358
359                 ++j;
360                 BOOST_CHECK (j == i->lines.end ());
361         }
362
363         ++i;
364         BOOST_REQUIRE (i != subs.end ());
365         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 27, 115 * 4));
366         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 28, 208 * 4));
367         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
368         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
369
370         {
371                 auto j = i->lines.begin();
372                 BOOST_REQUIRE (j != i->lines.end ());
373                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
374                 auto b = j->blocks.front();
375                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
376                 BOOST_CHECK_EQUAL (b.italic, true);
377                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
378                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
379                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
380                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
381                 BOOST_CHECK_EQUAL (b.text, "That curious creature the Sphinx");
382                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
383                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
384
385                 ++j;
386                 BOOST_REQUIRE (j != i->lines.end ());
387                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
388                 b = j->blocks.front ();
389                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
390                 BOOST_CHECK_EQUAL (b.italic, true);
391                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
392                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
393                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
394                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
395                 BOOST_CHECK_EQUAL (b.text, "Is smarter than anyone thinks");
396                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
397                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
398
399                 ++j;
400                 BOOST_CHECK (j == i->lines.end ());
401         }
402
403         ++i;
404         BOOST_REQUIRE (i != subs.end ());
405         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 42, 229 * 4));
406         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 45, 62 * 4));
407         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
408         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
409
410         {
411                 auto j = i->lines.begin();
412                 BOOST_REQUIRE (j != i->lines.end ());
413                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
414                 auto b = j->blocks.front();
415                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
416                 BOOST_CHECK_EQUAL (b.italic, false);
417                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
418                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
419                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
420                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
421                 BOOST_CHECK_EQUAL (b.text, "It sits there and smirks");
422                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
423                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
424
425                 ++j;
426                 BOOST_REQUIRE (j != i->lines.end ());
427                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
428                 b = j->blocks.front ();
429                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
430                 BOOST_CHECK_EQUAL (b.italic, false);
431                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
432                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
433                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
434                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
435                 BOOST_CHECK_EQUAL (b.text, "And you don't think it works");
436                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
437                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
438
439                 ++j;
440                 BOOST_CHECK (j == i->lines.end ());
441         }
442
443         ++i;
444         BOOST_REQUIRE (i != subs.end ());
445         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 45, 146 * 4));
446         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 47, 94 * 4));
447         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
448         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
449
450         {
451                 auto j = i->lines.begin();
452                 BOOST_REQUIRE (j != i->lines.end ());
453                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
454                 auto b = j->blocks.front();
455                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
456                 BOOST_CHECK_EQUAL (b.italic, false);
457                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
458                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
459                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
460                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
461                 BOOST_CHECK_EQUAL (b.text, "Then when you're not looking, it winks.");
462                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
463                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
464
465                 ++j;
466                 BOOST_REQUIRE (j != i->lines.end ());
467                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
468                 b = j->blocks.front ();
469                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
470                 BOOST_CHECK_EQUAL (b.italic, false);
471                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
472                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
473                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
474                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
475                 BOOST_CHECK_EQUAL (b.text, "When it snows you will find Sister Sledge");
476                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
477                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
478
479                 ++j;
480                 BOOST_CHECK (j == i->lines.end ());
481         }
482
483         ++i;
484         BOOST_REQUIRE (i != subs.end ());
485         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 47, 146 * 4));
486         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 48, 167 * 4));
487         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
488         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
489
490         {
491                 auto j = i->lines.begin();
492                 BOOST_REQUIRE (j != i->lines.end ());
493                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
494                 auto b = j->blocks.front();
495                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
496                 BOOST_CHECK_EQUAL (b.italic, false);
497                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
498                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
499                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
500                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
501                 BOOST_CHECK_EQUAL (b.text, "Out mooning, at night, on the ledge");
502                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
503                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
504
505                 ++j;
506                 BOOST_REQUIRE (j != i->lines.end ());
507                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
508                 b = j->blocks.front ();
509                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
510                 BOOST_CHECK_EQUAL (b.italic, false);
511                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
512                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
513                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
514                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
515                 BOOST_CHECK_EQUAL (b.text, "One storey down");
516                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
517                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
518
519                 ++j;
520                 BOOST_CHECK (j == i->lines.end ());
521         }
522
523         ++i;
524         BOOST_REQUIRE (i != subs.end ());
525         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 1, 53, 21 * 4));
526         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 1, 56, 10 * 4));
527         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
528         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
529
530         {
531                 auto j = i->lines.begin();
532                 BOOST_REQUIRE (j != i->lines.end ());
533                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
534                 auto b = j->blocks.front();
535                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
536                 BOOST_CHECK_EQUAL (b.italic, false);
537                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
538                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
539                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
540                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
541                 BOOST_CHECK_EQUAL (b.text, "Is the maestro, James Brown");
542                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
543                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
544
545                 ++j;
546                 BOOST_REQUIRE (j != i->lines.end ());
547                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
548                 b = j->blocks.front ();
549                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
550                 BOOST_CHECK_EQUAL (b.italic, false);
551                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
552                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
553                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
554                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
555                 BOOST_CHECK_EQUAL (b.text, "Displaying his meat and two veg.");
556                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
557                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
558
559                 ++j;
560                 BOOST_CHECK (j == i->lines.end ());
561         }
562
563         ++i;
564         BOOST_REQUIRE (i != subs.end ());
565         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hms (0, 2, 5, 208 * 4));
566         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hms (0, 2, 7, 31 * 4));
567         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::Time::from_hms (0, 0, 0, 0));
568         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::Time::from_hms (0, 0, 0, 0));
569
570         {
571                 auto j = i->lines.begin();
572                 BOOST_REQUIRE (j != i->lines.end ());
573                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
574                 auto b = j->blocks.front();
575                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
576                 BOOST_CHECK_EQUAL (b.italic, true);
577                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
578                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
579                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.89, 1);
580                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
581                 BOOST_CHECK_EQUAL (b.text, "HELLO");
582                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
583                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
584
585                 ++j;
586                 BOOST_REQUIRE (j != i->lines.end ());
587                 BOOST_REQUIRE_EQUAL (j->blocks.size(), 1);
588                 b = j->blocks.front ();
589                 BOOST_CHECK_EQUAL (b.font.get(), "theFont");
590                 BOOST_CHECK_EQUAL (b.italic, true);
591                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
592                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (42) / (72 * 11));
593                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.95, 1);
594                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP_OF_SCREEN);
595                 BOOST_CHECK_EQUAL (b.text, "WORLD");
596                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
597                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
598
599                 ++j;
600                 BOOST_CHECK (j == i->lines.end ());
601         }
602 }