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