Fix crash on malformed SubRip file (dcpomatic #1454).
[libsub.git] / test / stl_text_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 "stl_text_reader.h"
21 #include "subtitle.h"
22 #include "collect.h"
23 #include <boost/test/unit_test.hpp>
24 #include <fstream>
25
26 using std::list;
27 using std::ifstream;
28 using std::vector;
29
30 /* Test reading of a textual STL file */
31 BOOST_AUTO_TEST_CASE (stl_text_reader_test)
32 {
33         ifstream file ("test/data/test_text.stl");
34         sub::STLTextReader reader (file);
35         list<sub::Subtitle> subs = sub::collect<list<sub::Subtitle> > (reader.subtitles ());
36
37         list<sub::Subtitle>::iterator i = subs.begin ();
38
39
40         /* First subtitle */
41
42         BOOST_CHECK (i != subs.end ());
43         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hmsf (0, 0, 41, 9));
44         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hmsf (0, 0, 42, 21));
45
46         list<sub::Line>::iterator j = i->lines.begin ();
47         BOOST_CHECK (j != i->lines.end ());
48         BOOST_CHECK_EQUAL (j->blocks.size(), 1);
49         sub::Block b = j->blocks.front ();
50         BOOST_CHECK_EQUAL (b.text, " This is a subtitle ");
51         BOOST_CHECK_EQUAL (b.font.get(), "Arial");
52         BOOST_CHECK_EQUAL (b.font_size.points().get(), 42);
53         BOOST_CHECK_EQUAL (b.bold, false);
54         BOOST_CHECK_EQUAL (b.italic, false);
55         BOOST_CHECK_EQUAL (b.underline, false);
56         BOOST_CHECK_EQUAL (j->vertical_position.line.get(), 0);
57         ++j;
58
59         BOOST_CHECK (j != i->lines.end ());
60         BOOST_CHECK_EQUAL (j->blocks.size(), 1);
61         b = j->blocks.front ();
62         BOOST_CHECK_EQUAL (b.text, " and that's a line break");
63         BOOST_CHECK_EQUAL (b.font.get(), "Arial");
64         BOOST_CHECK_EQUAL (b.font_size.points().get(), 42);
65         BOOST_CHECK_EQUAL (b.bold, false);
66         BOOST_CHECK_EQUAL (b.italic, false);
67         BOOST_CHECK_EQUAL (b.underline, false);
68         BOOST_CHECK_EQUAL (j->vertical_position.line.get(), 1);
69         ++i;
70
71
72         /* Second subtitle */
73
74         BOOST_CHECK (i != subs.end ());
75         BOOST_CHECK_EQUAL (i->from, sub::Time::from_hmsf (0, 1, 1, 1));
76         BOOST_CHECK_EQUAL (i->to, sub::Time::from_hmsf (0, 1, 2, 10));
77
78         BOOST_CHECK_EQUAL (i->lines.size(), 1);
79         sub::Line l = i->lines.front ();
80         BOOST_CHECK_EQUAL (l.blocks.size(), 7);
81         BOOST_CHECK_EQUAL (l.vertical_position.line.get(), 0);
82
83         list<sub::Block>::iterator k = l.blocks.begin ();
84
85         BOOST_CHECK (k != l.blocks.end ());
86         BOOST_CHECK_EQUAL (k->text, " This is some ");
87         BOOST_CHECK_EQUAL (k->font.get(), "Arial");
88         BOOST_CHECK_EQUAL (k->font_size.points().get(), 42);
89         BOOST_CHECK_EQUAL (k->bold, false);
90         BOOST_CHECK_EQUAL (k->italic, false);
91         BOOST_CHECK_EQUAL (k->underline, false);
92         ++k;
93
94         BOOST_CHECK (k != l.blocks.end ());
95         BOOST_CHECK_EQUAL (k->text, "bold");
96         BOOST_CHECK_EQUAL (k->font.get(), "Arial");
97         BOOST_CHECK_EQUAL (k->font_size.points().get(), 42);
98         BOOST_CHECK_EQUAL (k->bold, true);
99         BOOST_CHECK_EQUAL (k->italic, false);
100         BOOST_CHECK_EQUAL (k->underline, false);
101         ++k;
102
103         BOOST_CHECK (k != l.blocks.end ());
104         BOOST_CHECK_EQUAL (k->text, " and some ");
105         BOOST_CHECK_EQUAL (k->font.get(), "Arial");
106         BOOST_CHECK_EQUAL (k->font_size.points().get(), 42);
107         BOOST_CHECK_EQUAL (k->bold, false);
108         BOOST_CHECK_EQUAL (k->italic, false);
109         BOOST_CHECK_EQUAL (k->underline, false);
110         ++k;
111
112         BOOST_CHECK (k != l.blocks.end ());
113         BOOST_CHECK_EQUAL (k->text, "bold italic");
114         BOOST_CHECK_EQUAL (k->font.get(), "Arial");
115         BOOST_CHECK_EQUAL (k->font_size.points().get(), 42);
116         BOOST_CHECK_EQUAL (k->bold, true);
117         BOOST_CHECK_EQUAL (k->italic, true);
118         BOOST_CHECK_EQUAL (k->underline, false);
119         ++k;
120
121         BOOST_CHECK (k != l.blocks.end ());
122         BOOST_CHECK_EQUAL (k->text, " and some ");
123         BOOST_CHECK_EQUAL (k->font.get(), "Arial");
124         BOOST_CHECK_EQUAL (k->font_size.points().get(), 42);
125         BOOST_CHECK_EQUAL (k->bold, false);
126         BOOST_CHECK_EQUAL (k->italic, false);
127         BOOST_CHECK_EQUAL (k->underline, false);
128         ++k;
129
130         BOOST_CHECK (k != l.blocks.end ());
131         BOOST_CHECK_EQUAL (k->text, "underlined");
132         BOOST_CHECK_EQUAL (k->font.get(), "Arial");
133         BOOST_CHECK_EQUAL (k->font_size.points().get(), 42);
134         BOOST_CHECK_EQUAL (k->bold, false);
135         BOOST_CHECK_EQUAL (k->italic, false);
136         BOOST_CHECK_EQUAL (k->underline, true);
137         ++k;
138
139         BOOST_CHECK (k != l.blocks.end ());
140         BOOST_CHECK_EQUAL (k->text, ".");
141         BOOST_CHECK_EQUAL (k->font.get(), "Arial");
142         BOOST_CHECK_EQUAL (k->font_size.points().get(), 42);
143         BOOST_CHECK_EQUAL (k->bold, false);
144         BOOST_CHECK_EQUAL (k->italic, false);
145         BOOST_CHECK_EQUAL (k->underline, false);
146         ++k;
147
148         BOOST_CHECK (k == l.blocks.end ());
149 }
150
151