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