Basic HAlign / HPosition support.
[libdcp.git] / test / read_subtitle_test.cc
1 /*
2     Copyright (C) 2012-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 "interop_subtitle_content.h"
21 #include "subtitle_string.h"
22 #include <boost/test/unit_test.hpp>
23
24 using std::list;
25 using std::string;
26 using boost::shared_ptr;
27
28 /* Load some subtitle content from XML and check that it is read correctly */
29 BOOST_AUTO_TEST_CASE (read_subtitle_test1)
30 {
31         dcp::InteropSubtitleContent subs ("test/data/subs1.xml");
32
33         BOOST_CHECK_EQUAL (subs.language(), "French");
34
35         list<dcp::SubtitleString> s = subs.subtitles_during (dcp::Time (0, 0, 6, 1, 250), dcp::Time (0, 0, 6, 2, 250));
36         BOOST_REQUIRE_EQUAL (s.size(), 1);
37         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
38                                    string ("theFontId"),
39                                    false,
40                                    dcp::Colour (255, 255, 255),
41                                    39,
42                                    1.0,
43                                    dcp::Time (0, 0, 5, 198, 250),
44                                    dcp::Time (0, 0, 7, 115, 250),
45                                    0,
46                                    dcp::HALIGN_CENTER,
47                                    0.15,
48                                    dcp::VALIGN_BOTTOM,
49                                    "My jacket was Idi Amin's",
50                                    dcp::BORDER,
51                                    dcp::Colour (0, 0, 0),
52                                    dcp::Time (0, 0, 0, 1, 250),
53                                    dcp::Time (0, 0, 0, 1, 250)
54                                    ));
55                                                          
56         s = subs.subtitles_during (dcp::Time (0, 0, 7, 190, 250), dcp::Time (0, 0, 7, 191, 250));
57         BOOST_REQUIRE_EQUAL (s.size(), 2);
58         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
59                                    string ("theFontId"),
60                                    true,
61                                    dcp::Colour (255, 255, 255),
62                                    39,
63                                    1.0,
64                                    dcp::Time (0, 0, 7, 177, 250),
65                                    dcp::Time (0, 0, 11, 31, 250),
66                                    0,
67                                    dcp::HALIGN_CENTER,
68                                    0.21,
69                                    dcp::VALIGN_BOTTOM,
70                                    "My corset was H.M. The Queen's",
71                                    dcp::BORDER,
72                                    dcp::Colour (0, 0, 0),
73                                    dcp::Time (0, 0, 0, 1, 250),
74                                    dcp::Time (0, 0, 0, 1, 250)
75                                    ));
76         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
77                                    string ("theFontId"),
78                                    false,
79                                    dcp::Colour (255, 255, 255),
80                                    39,
81                                    1.0,
82                                    dcp::Time (0, 0, 7, 177, 250),
83                                    dcp::Time (0, 0, 11, 31, 250),
84                                    0,
85                                    dcp::HALIGN_CENTER,
86                                    0.15,
87                                    dcp::VALIGN_BOTTOM,
88                                    "My large wonderbra",
89                                    dcp::BORDER,
90                                    dcp::Colour (0, 0, 0),
91                                    dcp::Time (0, 0, 0, 1, 250),
92                                    dcp::Time (0, 0, 0, 1, 250)
93                                    ));
94
95         s = subs.subtitles_during (dcp::Time (0, 0, 11, 95, 250), dcp::Time (0, 0, 11, 96, 250));
96         BOOST_REQUIRE_EQUAL (s.size(), 1);
97         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
98                                    string ("theFontId"),
99                                    false,
100                                    dcp::Colour (255, 255, 255),
101                                    39,
102                                    1.0,
103                                    dcp::Time (0, 0, 11, 94, 250),
104                                    dcp::Time (0, 0, 13, 63, 250),
105                                    0,
106                                    dcp::HALIGN_CENTER,
107                                    0.15,
108                                    dcp::VALIGN_BOTTOM,
109                                    "Once belonged to the Shah",
110                                    dcp::BORDER,
111                                    dcp::Colour (0, 0, 0),
112                                    dcp::Time (0, 0, 0, 1, 250),
113                                    dcp::Time (0, 0, 0, 1, 250)
114                                    ));
115
116         s = subs.subtitles_during (dcp::Time (0, 0, 14, 42, 250), dcp::Time (0, 0, 14, 43, 250));
117         BOOST_REQUIRE_EQUAL (s.size(), 1);
118         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
119                                    string ("theFontId"),
120                                    false,
121                                    dcp::Colour (255, 255, 255),
122                                    39,
123                                    1.0,
124                                    dcp::Time (0, 0, 13, 104, 250),
125                                    dcp::Time (0, 0, 15, 177, 250),
126                                    0,
127                                    dcp::HALIGN_CENTER,
128                                    0.15,
129                                    dcp::VALIGN_BOTTOM,
130                                    "And these are Roy Hattersley's jeans",
131                                    dcp::BORDER,
132                                    dcp::Colour (0, 0, 0),
133                                    dcp::Time (0, 0, 0, 1, 250),
134                                    dcp::Time (0, 0, 0, 1, 250)
135                                    ));
136 }
137
138 /** And similarly for another one */
139 BOOST_AUTO_TEST_CASE (read_subtitle_test2)
140 {
141         dcp::InteropSubtitleContent subs ("test/data/subs2.xml");
142
143         list<dcp::SubtitleString> s = subs.subtitles_during (dcp::Time (0, 0, 42, 100, 250), dcp::Time (0, 0, 42, 101, 250));
144         BOOST_REQUIRE_EQUAL (s.size(), 2);
145         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
146                                    string ("theFont"),
147                                    true,
148                                    dcp::Colour (255, 255, 255),
149                                    42,
150                                    1.0,
151                                    dcp::Time (0, 0, 41, 62, 250),
152                                    dcp::Time (0, 0, 43, 52, 250),
153                                    0,
154                                    dcp::HALIGN_CENTER,
155                                    0.89,
156                                    dcp::VALIGN_TOP,
157                                    "At afternoon tea with John Peel",
158                                    dcp::BORDER,
159                                    dcp::Colour (0, 0, 0),
160                                    dcp::Time (0, 0, 0, 0, 250),
161                                    dcp::Time (0, 0, 0, 0, 250)
162                                    ));
163         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
164                                    string ("theFont"),
165                                    true,
166                                    dcp::Colour (255, 255, 255),
167                                    42,
168                                    1.0,
169                                    dcp::Time (0, 0, 41, 62, 250),
170                                    dcp::Time (0, 0, 43, 52, 250),
171                                    0,
172                                    dcp::HALIGN_CENTER,
173                                    0.95,
174                                    dcp::VALIGN_TOP,
175                                    "I enquired if his accent was real",
176                                    dcp::BORDER,
177                                    dcp::Colour (0, 0, 0),
178                                    dcp::Time (0, 0, 0, 0, 250),
179                                    dcp::Time (0, 0, 0, 0, 250)
180                                    ));
181
182         s = subs.subtitles_during (dcp::Time (0, 0, 50, 50, 250), dcp::Time (0, 0, 50, 51, 250));
183         BOOST_REQUIRE_EQUAL (s.size(), 2);
184         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
185                                    string ("theFont"),
186                                    true,
187                                    dcp::Colour (255, 255, 255),
188                                    42,
189                                    1.0,
190                                    dcp::Time (0, 0, 50, 42, 250),
191                                    dcp::Time (0, 0, 52, 21, 250),
192                                    0,
193                                    dcp::HALIGN_CENTER,
194                                    0.89,
195                                    dcp::VALIGN_TOP,
196                                    "He said \"out of the house",
197                                    dcp::BORDER,
198                                    dcp::Colour (0, 0, 0),
199                                    dcp::Time (0, 0, 0, 0, 250),
200                                    dcp::Time (0, 0, 0, 0, 250)
201                                    ));
202         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
203                                    string ("theFont"),
204                                    true,
205                                    dcp::Colour (255, 255, 255),
206                                    42,
207                                    1.0,
208                                    dcp::Time (0, 0, 50, 42, 250),
209                                    dcp::Time (0, 0, 52, 21, 250),
210                                    0,
211                                    dcp::HALIGN_CENTER,
212                                    0.95,
213                                    dcp::VALIGN_TOP,
214                                    "I'm incredibly scouse",
215                                    dcp::BORDER,
216                                    dcp::Colour (0, 0, 0),
217                                    dcp::Time (0, 0, 0, 0, 250),
218                                    dcp::Time (0, 0, 0, 0, 250)
219                                    ));
220
221         s = subs.subtitles_during (dcp::Time (0, 1, 2, 300, 250), dcp::Time (0, 1, 2, 301, 250));
222         BOOST_REQUIRE_EQUAL (s.size(), 2);
223         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
224                                    string ("theFont"),
225                                    true,
226                                    dcp::Colour (255, 255, 255),
227                                    42,
228                                    1.0,
229                                    dcp::Time (0, 1, 2, 208, 250),
230                                    dcp::Time (0, 1, 4, 10, 250),
231                                    0,
232                                    dcp::HALIGN_CENTER,
233                                    0.89,
234                                    dcp::VALIGN_TOP,
235                                    "At home it depends how I feel.\"",
236                                    dcp::BORDER,
237                                    dcp::Colour (0, 0, 0),
238                                    dcp::Time (0, 0, 0, 0, 250),
239                                    dcp::Time (0, 0, 0, 0, 250)
240                                    ));
241         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
242                                    string ("theFont"),
243                                    true,
244                                    dcp::Colour (255, 255, 255),
245                                    42,
246                                    1.0,
247                                    dcp::Time (0, 1, 2, 208, 250),
248                                    dcp::Time (0, 1, 4, 10, 250),
249                                    0,
250                                    dcp::HALIGN_CENTER,
251                                    0.95,
252                                    dcp::VALIGN_TOP,
253                                    "I spent a long weekend in Brighton",
254                                    dcp::BORDER,
255                                    dcp::Colour (0, 0, 0),
256                                    dcp::Time (0, 0, 0, 0, 250),
257                                    dcp::Time (0, 0, 0, 0, 250)
258                                    ));
259
260         s = subs.subtitles_during (dcp::Time (0, 1, 15, 50, 250), dcp::Time (0, 1, 15, 51, 250));
261         BOOST_REQUIRE_EQUAL (s.size(), 2);
262         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
263                                    string ("theFont"),
264                                    true,
265                                    dcp::Colour (255, 255, 255),
266                                    42,
267                                    1.0,
268                                    dcp::Time (0, 1, 15, 42, 250),
269                                    dcp::Time (0, 1, 16, 42, 250),
270                                    0,
271                                    dcp::HALIGN_CENTER,
272                                    0.89,
273                                    dcp::VALIGN_TOP,
274                                    "With the legendary Miss Enid Blyton",
275                                    dcp::BORDER,
276                                    dcp::Colour (0, 0, 0),
277                                    dcp::Time (0, 0, 0, 0, 250),
278                                    dcp::Time (0, 0, 0, 0, 250)
279                                    ));
280         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
281                                    string ("theFont"),
282                                    true,
283                                    dcp::Colour (255, 255, 255),
284                                    42,
285                                    1.0,
286                                    dcp::Time (0, 1, 15, 42, 250),
287                                    dcp::Time (0, 1, 16, 42, 250),
288                                    0,
289                                    dcp::HALIGN_CENTER,
290                                    0.95,
291                                    dcp::VALIGN_TOP,
292                                    "She said \"you be Noddy",
293                                    dcp::BORDER,
294                                    dcp::Colour (0, 0, 0),
295                                    dcp::Time (0, 0, 0, 0, 250),
296                                    dcp::Time (0, 0, 0, 0, 250)
297                                    ));
298
299         s = subs.subtitles_during (dcp::Time (0, 1, 27, 200, 250), dcp::Time (0, 1, 27, 201, 250));
300         BOOST_REQUIRE_EQUAL (s.size(), 2);
301         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
302                                    string ("theFont"),
303                                    true,
304                                    dcp::Colour (255, 255, 255),
305                                    42,
306                                    1.0,
307                                    dcp::Time (0, 1, 27, 115, 250),
308                                    dcp::Time (0, 1, 28, 208, 250),
309                                    0,
310                                    dcp::HALIGN_CENTER,
311                                    0.89,
312                                    dcp::VALIGN_TOP,
313                                    "That curious creature the Sphinx",
314                                    dcp::BORDER,
315                                    dcp::Colour (0, 0, 0),
316                                    dcp::Time (0, 0, 0, 0, 250),
317                                    dcp::Time (0, 0, 0, 0, 250)
318                                    ));
319         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
320                                    string ("theFont"),
321                                    true,
322                                    dcp::Colour (255, 255, 255),
323                                    42,
324                                    1.0,
325                                    dcp::Time (0, 1, 27, 115, 250),
326                                    dcp::Time (0, 1, 28, 208, 250),
327                                    0,
328                                    dcp::HALIGN_CENTER,
329                                    0.95,
330                                    dcp::VALIGN_TOP,
331                                    "Is smarter than anyone thinks",
332                                    dcp::BORDER,
333                                    dcp::Colour (0, 0, 0),
334                                    dcp::Time (0, 0, 0, 0, 250),
335                                    dcp::Time (0, 0, 0, 0, 250)
336                                    ));
337
338         s = subs.subtitles_during (dcp::Time (0, 1, 42, 300, 250), dcp::Time (0, 1, 42, 301, 250));
339         BOOST_REQUIRE_EQUAL (s.size(), 2);
340         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
341                                    string ("theFont"),
342                                    false,
343                                    dcp::Colour (255, 255, 255),
344                                    42,
345                                    1.0,
346                                    dcp::Time (0, 1, 42, 229, 250),
347                                    dcp::Time (0, 1, 45, 62, 250),
348                                    0,
349                                    dcp::HALIGN_CENTER,
350                                    0.89,
351                                    dcp::VALIGN_TOP,
352                                    "It sits there and smirks",
353                                    dcp::BORDER,
354                                    dcp::Colour (0, 0, 0),
355                                    dcp::Time (0, 0, 0, 0, 250),
356                                    dcp::Time (0, 0, 0, 0, 250)
357                                    ));
358         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
359                                    string ("theFont"),
360                                    false,
361                                    dcp::Colour (255, 255, 255),
362                                    42,
363                                    1.0,
364                                    dcp::Time (0, 1, 42, 229, 250),
365                                    dcp::Time (0, 1, 45, 62, 250),
366                                    0,
367                                    dcp::HALIGN_CENTER,
368                                    0.95,
369                                    dcp::VALIGN_TOP,
370                                    "And you don't think it works",
371                                    dcp::BORDER,
372                                    dcp::Colour (0, 0, 0),
373                                    dcp::Time (0, 0, 0, 0, 250),
374                                    dcp::Time (0, 0, 0, 0, 250)
375                                    ));
376
377         s = subs.subtitles_during (dcp::Time (0, 1, 45, 200, 250), dcp::Time (0, 1, 45, 201, 250));
378         BOOST_REQUIRE_EQUAL (s.size(), 2);
379         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
380                                    string ("theFont"),
381                                    false,
382                                    dcp::Colour (255, 255, 255),
383                                    42,
384                                    1.0,
385                                    dcp::Time (0, 1, 45, 146, 250),
386                                    dcp::Time (0, 1, 47, 94, 250),
387                                    0,
388                                    dcp::HALIGN_CENTER,
389                                    0.89,
390                                    dcp::VALIGN_TOP,
391                                    "Then when you're not looking, it winks.",
392                                    dcp::BORDER,
393                                    dcp::Colour (0, 0, 0),
394                                    dcp::Time (0, 0, 0, 0, 250),
395                                    dcp::Time (0, 0, 0, 0, 250)
396                                    ));
397         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
398                                    string ("theFont"),
399                                    false,
400                                    dcp::Colour (255, 255, 255),
401                                    42,
402                                    1.0,
403                                    dcp::Time (0, 1, 45, 146, 250),
404                                    dcp::Time (0, 1, 47, 94, 250),
405                                    0,
406                                    dcp::HALIGN_CENTER,
407                                    0.95,
408                                    dcp::VALIGN_TOP,
409                                    "When it snows you will find Sister Sledge",
410                                    dcp::BORDER,
411                                    dcp::Colour (0, 0, 0),
412                                    dcp::Time (0, 0, 0, 0, 250),
413                                    dcp::Time (0, 0, 0, 0, 250)
414                                    ));
415
416         s = subs.subtitles_during (dcp::Time (0, 1, 47, 249, 250), dcp::Time (0, 1, 47, 250, 250));
417         BOOST_REQUIRE_EQUAL (s.size(), 2);
418         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
419                                    string ("theFont"),
420                                    false,
421                                    dcp::Colour (255, 255, 255),
422                                    42,
423                                    1.0,
424                                    dcp::Time (0, 1, 47, 146, 250),
425                                    dcp::Time (0, 1, 48, 167, 250),
426                                    0,
427                                    dcp::HALIGN_CENTER,
428                                    0.89,
429                                    dcp::VALIGN_TOP,
430                                    "Out mooning, at night, on the ledge",
431                                    dcp::BORDER,
432                                    dcp::Colour (0, 0, 0),
433                                    dcp::Time (0, 0, 0, 0, 250),
434                                    dcp::Time (0, 0, 0, 0, 250)
435                                    ));
436         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
437                                    string ("theFont"),
438                                    false,
439                                    dcp::Colour (255, 255, 255),
440                                    42,
441                                    1.0,
442                                    dcp::Time (0, 1, 47, 146, 250),
443                                    dcp::Time (0, 1, 48, 167, 250),
444                                    0,
445                                    dcp::HALIGN_CENTER,
446                                    0.95,
447                                    dcp::VALIGN_TOP,
448                                    "One storey down",
449                                    dcp::BORDER,
450                                    dcp::Colour (0, 0, 0),
451                                    dcp::Time (0, 0, 0, 0, 250),
452                                    dcp::Time (0, 0, 0, 0, 250)
453                                    ));
454
455         s = subs.subtitles_during (dcp::Time (0, 2, 6, 210, 250), dcp::Time (0, 2, 6, 211, 250));
456         BOOST_REQUIRE_EQUAL (s.size(), 2);
457         BOOST_CHECK_EQUAL (s.front(), dcp::SubtitleString (
458                                    string ("theFont"),
459                                    true,
460                                    dcp::Colour (255, 255, 255),
461                                    42,
462                                    1.0,
463                                    dcp::Time (0, 2, 5, 208, 250),
464                                    dcp::Time (0, 2, 7, 31, 250),
465                                    0,
466                                    dcp::HALIGN_CENTER,
467                                    0.89,
468                                    dcp::VALIGN_TOP,
469                                    "HELLO",
470                                    dcp::BORDER,
471                                    dcp::Colour (0, 0, 0),
472                                    dcp::Time (0, 0, 0, 0, 250),
473                                    dcp::Time (0, 0, 0, 0, 250)
474                                    ));
475         BOOST_CHECK_EQUAL (s.back(), dcp::SubtitleString (
476                                    string ("theFont"),
477                                    true,
478                                    dcp::Colour (255, 255, 255),
479                                    42,
480                                    1.0,
481                                    dcp::Time (0, 2, 5, 208, 250),
482                                    dcp::Time (0, 2, 7, 31, 250),
483                                    0,
484                                    dcp::HALIGN_CENTER,
485                                    0.95,
486                                    dcp::VALIGN_TOP,
487                                    "WORLD",
488                                    dcp::BORDER,
489                                    dcp::Colour (0, 0, 0),
490                                    dcp::Time (0, 0, 0, 0, 250),
491                                    dcp::Time (0, 0, 0, 0, 250)
492                                    ));
493 }