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