Copy another test over from DCP-o-matic.
[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         ifstream file ("test/data/test1.xml");
34         sub::DCPReader reader (file);
35         list<sub::Subtitle> subs = sub::collect (reader.subtitles ());
36
37         list<sub::Subtitle>::iterator i = subs.begin ();
38         BOOST_CHECK (i != subs.end ());
39         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 0, 5, 198 * 4));
40         BOOST_CHECK_EQUAL (i->to.metric(), sub::MetricTime (0, 0, 7, 115 * 4));
41         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 4));
42         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 4));
43
44         {
45                 list<sub::Line>::iterator j = i->lines.begin ();
46                 BOOST_CHECK (j != i->lines.end ());
47                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
48                 sub::Block b = j->blocks.front ();
49                 BOOST_CHECK_EQUAL (b.font, "Arial");
50                 BOOST_CHECK_EQUAL (b.italic, false);
51                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
52                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
53                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
54                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
55                 BOOST_CHECK_EQUAL (b.text, "My jacket was Idi Amin's");
56                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
57                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
58
59                 ++j;
60                 BOOST_CHECK (j == i->lines.end ());
61         }
62
63         ++i;
64         BOOST_CHECK (i != subs.end ());
65         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 0, 7, 177 * 4));
66         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 11, 31 * 4));
67         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 4));
68         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 4));
69
70         {
71                 list<sub::Line>::iterator j = i->lines.begin ();
72                 BOOST_CHECK (j != i->lines.end ());
73                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
74                 sub::Block b = j->blocks.front ();
75                 BOOST_CHECK_EQUAL (b.font, "Arial");
76                 BOOST_CHECK_EQUAL (b.italic, true);
77                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
78                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
79                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.21, 1);
80                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
81                 BOOST_CHECK_EQUAL (b.text, "My corset was H.M. The Queen's");
82                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
83                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
84
85                 ++j;
86                 BOOST_CHECK (j != i->lines.end ());
87                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
88                 b = j->blocks.front ();
89                 BOOST_CHECK_EQUAL (b.font, "Arial");
90                 BOOST_CHECK_EQUAL (b.italic, false);
91                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
92                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
93                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
94                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
95                 BOOST_CHECK_EQUAL (b.text, "My large wonderbra");
96                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
97                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
98
99                 ++j;
100                 BOOST_CHECK (j == i->lines.end ());
101         }
102
103         ++i;
104         BOOST_CHECK (i != subs.end ());
105         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 0, 11, 94 * 4));
106         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 13, 63 * 4));
107         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 4));
108         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 4));
109
110         {
111                 list<sub::Line>::iterator j = i->lines.begin ();
112                 BOOST_CHECK (j != i->lines.end ());
113                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
114                 sub::Block b = j->blocks.front ();
115                 BOOST_CHECK_EQUAL (b.font, "Arial");
116                 BOOST_CHECK_EQUAL (b.italic, false);
117                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
118                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
119                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
120                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
121                 BOOST_CHECK_EQUAL (b.text, "Once belonged to the Shah");
122                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
123                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
124
125                 ++j;
126                 BOOST_CHECK (j == i->lines.end ());
127         }
128
129         ++i;
130         BOOST_CHECK (i != subs.end ());
131         BOOST_CHECK_EQUAL (i->from.metric(), sub::MetricTime (0, 0, 13, 104 * 4));
132         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 15, 177 * 4));
133         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 4));
134         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 4));
135
136         {
137                 list<sub::Line>::iterator j = i->lines.begin ();
138                 BOOST_CHECK (j != i->lines.end ());
139                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
140                 sub::Block b = j->blocks.front ();
141                 BOOST_CHECK_EQUAL (b.font, "Arial");
142                 BOOST_CHECK_EQUAL (b.italic, false);
143                 BOOST_CHECK (b.colour == sub::Colour (1, 1, 1));
144                 BOOST_CHECK_EQUAL (b.font_size.proportional().get(), float (39) / (72 * 11));
145                 BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.15, 1);
146                 BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::BOTTOM);
147                 BOOST_CHECK_EQUAL (b.text, "And these are Roy Hattersley's jeans");
148                 BOOST_CHECK_EQUAL (b.effect, sub::BORDER);
149                 BOOST_CHECK (b.effect_colour.get() == sub::Colour (0, 0, 0));
150
151                 ++j;
152                 BOOST_CHECK (j == i->lines.end ());
153         }
154 }
155
156 /* And another one */
157 BOOST_AUTO_TEST_CASE (dcp_reader_test2)
158 {
159         ifstream file ("test/data/test2.xml");
160         sub::DCPReader reader (file);
161         list<sub::Subtitle> subs = collect (reader.subtitles ());
162
163         list<sub::Subtitle>::iterator i = subs.begin ();
164         BOOST_CHECK (i != subs.end ());
165         BOOST_CHECK_EQUAL (i->from.metric(), sub::MetricTime (0, 0, 41, 62 * 4));
166         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 43, 52 * 4));
167         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
168         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
169
170         {
171                 list<sub::Line>::iterator j = i->lines.begin ();
172                 BOOST_CHECK (j != i->lines.end ());
173                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
174                 sub::Block b = j->blocks.front ();
175                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
187                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
188                 b = j->blocks.front ();
189                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
205         BOOST_CHECK_EQUAL (i->from.metric(), sub::MetricTime (0, 0, 50, 42 * 4));
206         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 52, 21 * 4));
207         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
208         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
209
210         {
211                 list<sub::Line>::iterator j = i->lines.begin ();
212                 BOOST_CHECK (j != i->lines.end ());
213                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
214                 sub::Block b = j->blocks.front ();
215                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
227                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
228                 b = j->blocks.front ();
229                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
245         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 2, 208 * 4));
246         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 04, 10 * 4));
247         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
248         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
249
250         {
251                 list<sub::Line>::iterator j = i->lines.begin ();
252                 BOOST_CHECK (j != i->lines.end ());
253                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
254                 sub::Block b = j->blocks.front ();
255                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
267                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
268                 b = j->blocks.front ();
269                 BOOST_CHECK_EQUAL (b.font, "Arial");
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.metric().get(), sub::MetricTime (0, 1, 2, 208 * 4));
274                 BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (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);
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::MetricTime (0, 0, 0, 0));
281                 BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
282
283                 ++j;
284                 BOOST_CHECK (j == i->lines.end ());
285         }
286
287         ++i;
288         BOOST_CHECK (i != subs.end ());
289         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 15, 42 * 4));
290         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 16, 42 * 4));
291         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
292         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
293         
294         {
295                 list<sub::Line>::iterator j = i->lines.begin ();
296                 BOOST_CHECK (j != i->lines.end ());
297                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
298                 sub::Block b = j->blocks.front ();
299                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
311                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
312                 b = j->blocks.front ();
313                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
329         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 20, 219 * 4));
330         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 22, 73 * 4));
331         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
332         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));   
333         
334         {
335                 list<sub::Line>::iterator j = i->lines.begin ();
336                 BOOST_CHECK (j != i->lines.end ());
337                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
338                 sub::Block b = j->blocks.front ();
339                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
351                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
352                 b = j->blocks.front ();
353                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
369         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 27, 115 * 4));
370         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 28, 208 * 4));
371         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
372         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
373         
374         {
375                 list<sub::Line>::iterator j = i->lines.begin ();
376                 BOOST_CHECK (j != i->lines.end ());
377                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
378                 sub::Block b = j->blocks.front ();
379                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
391                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
392                 b = j->blocks.front ();
393                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
409         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 42, 229 * 4));
410         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 45, 62 * 4));
411         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
412         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
413
414         {
415                 list<sub::Line>::iterator j = i->lines.begin ();
416                 BOOST_CHECK (j != i->lines.end ());
417                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
418                 sub::Block b = j->blocks.front ();
419                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
431                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
432                 b = j->blocks.front ();
433                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
449         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 45, 146 * 4));
450         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 47, 94 * 4));
451         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
452         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
453         
454         {
455                 list<sub::Line>::iterator j = i->lines.begin ();
456                 BOOST_CHECK (j != i->lines.end ());
457                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
458                 sub::Block b = j->blocks.front ();
459                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
471                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
472                 b = j->blocks.front ();
473                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
489         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 47, 146 * 4));
490         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 48, 167 * 4));
491         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
492         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
493         
494         {
495                 list<sub::Line>::iterator j = i->lines.begin ();
496                 BOOST_CHECK (j != i->lines.end ());
497                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
498                 sub::Block b = j->blocks.front ();
499                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
511                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
512                 b = j->blocks.front ();
513                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
529         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 53, 21 * 4));
530         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 56, 10 * 4));
531         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
532         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
533         
534         {
535                 list<sub::Line>::iterator j = i->lines.begin ();
536                 BOOST_CHECK (j != i->lines.end ());
537                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
538                 sub::Block b = j->blocks.front ();
539                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
551                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
552                 b = j->blocks.front ();
553                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (i != subs.end ());
569         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 2, 5, 208 * 4));
570         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 2, 7, 31 * 4));
571         BOOST_CHECK_EQUAL (i->fade_up.get(), sub::MetricTime (0, 0, 0, 0));
572         BOOST_CHECK_EQUAL (i->fade_down.get(), sub::MetricTime (0, 0, 0, 0));
573         
574         {
575                 list<sub::Line>::iterator j = i->lines.begin ();
576                 BOOST_CHECK (j != i->lines.end ());
577                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
578                 sub::Block b = j->blocks.front ();
579                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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_CHECK (j != i->lines.end ());
591                 BOOST_CHECK_EQUAL (j->blocks.size(), 1);
592                 b = j->blocks.front ();
593                 BOOST_CHECK_EQUAL (b.font, "Arial");
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);
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 }