Basic and scruffy Subrip read support.
[libsub.git] / test / subrip_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 "subrip_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 Subrip file */
31 BOOST_AUTO_TEST_CASE (subrip_reader_test)
32 {
33         FILE* f = fopen ("test/data/test.srt", "r");
34         sub::SubripReader reader (f);
35         fclose (f);
36         list<sub::Subtitle> subs = sub::collect (reader.subtitles ());
37
38         list<sub::Subtitle>::iterator i = subs.begin ();
39
40         
41         /* First subtitle */
42
43         BOOST_CHECK (i != subs.end ());
44         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 0, 41, 90));
45         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 0, 42, 210));
46         
47         list<sub::Line>::iterator j = i->lines.begin ();
48         BOOST_CHECK (j != i->lines.end ());
49         BOOST_CHECK_EQUAL (j->blocks.size(), 1);
50         sub::Block b = j->blocks.front ();
51         BOOST_CHECK_EQUAL (b.text, "This is a subtitle");
52         BOOST_CHECK_EQUAL (b.font, "Arial");
53         BOOST_CHECK_EQUAL (b.font_size.points().get(), 48);
54         BOOST_CHECK_EQUAL (b.bold, false);
55         BOOST_CHECK_EQUAL (b.italic, false);
56         BOOST_CHECK_EQUAL (b.underline, false);
57         BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.7, 1);
58         BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
59         ++j;
60
61         BOOST_CHECK (j != i->lines.end ());
62         BOOST_CHECK_EQUAL (j->blocks.size(), 1);
63         b = j->blocks.front ();
64         BOOST_CHECK_EQUAL (b.text, "and that's a line break");
65         BOOST_CHECK_EQUAL (b.font, "Arial");
66         BOOST_CHECK_EQUAL (b.font_size.points().get(), 48);
67         BOOST_CHECK_EQUAL (b.bold, false);
68         BOOST_CHECK_EQUAL (b.italic, false);
69         BOOST_CHECK_EQUAL (b.underline, false);
70         BOOST_CHECK_CLOSE (j->vertical_position.proportional.get(), 0.8, 1);
71         BOOST_CHECK_EQUAL (j->vertical_position.reference.get(), sub::TOP);
72         ++i;
73
74         
75         /* Second subtitle */
76         
77         BOOST_CHECK (i != subs.end ());
78         BOOST_CHECK_EQUAL (i->from.metric().get(), sub::MetricTime (0, 1, 1, 10));
79         BOOST_CHECK_EQUAL (i->to.metric().get(), sub::MetricTime (0, 1, 2, 100));
80         
81         BOOST_CHECK_EQUAL (i->lines.size(), 1);
82         sub::Line l = i->lines.front ();
83         BOOST_CHECK_EQUAL (l.blocks.size(), 7);
84         BOOST_CHECK_CLOSE (l.vertical_position.proportional.get(), 0.7, 1);
85
86         list<sub::Block>::iterator k = l.blocks.begin ();
87         
88         BOOST_CHECK (k != l.blocks.end ());
89         BOOST_CHECK_EQUAL (k->text, "This is some ");
90         BOOST_CHECK_EQUAL (k->font, "Arial");
91         BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
92         BOOST_CHECK_EQUAL (k->bold, false);
93         BOOST_CHECK_EQUAL (k->italic, false);
94         BOOST_CHECK_EQUAL (k->underline, false);
95         ++k;
96
97         BOOST_CHECK (k != l.blocks.end ());
98         BOOST_CHECK_EQUAL (k->text, "bold");
99         BOOST_CHECK_EQUAL (k->font, "Arial");
100         BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
101         BOOST_CHECK_EQUAL (k->bold, true);
102         BOOST_CHECK_EQUAL (k->italic, false);
103         BOOST_CHECK_EQUAL (k->underline, false);
104         ++k;
105
106         BOOST_CHECK (k != l.blocks.end ());
107         BOOST_CHECK_EQUAL (k->text, " and some ");
108         BOOST_CHECK_EQUAL (k->font, "Arial");
109         BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
110         BOOST_CHECK_EQUAL (k->bold, false);
111         BOOST_CHECK_EQUAL (k->italic, false);
112         BOOST_CHECK_EQUAL (k->underline, false);
113         ++k;
114
115         BOOST_CHECK (k != l.blocks.end ());
116         BOOST_CHECK_EQUAL (k->text, "bold italic");
117         BOOST_CHECK_EQUAL (k->font, "Arial");
118         BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
119         BOOST_CHECK_EQUAL (k->bold, true);
120         BOOST_CHECK_EQUAL (k->italic, true);
121         BOOST_CHECK_EQUAL (k->underline, false);
122         ++k;
123
124         BOOST_CHECK (k != l.blocks.end ());
125         BOOST_CHECK_EQUAL (k->text, " and some ");
126         BOOST_CHECK_EQUAL (k->font, "Arial");
127         BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
128         BOOST_CHECK_EQUAL (k->bold, false);
129         BOOST_CHECK_EQUAL (k->italic, false);
130         BOOST_CHECK_EQUAL (k->underline, false);
131         ++k;
132
133         BOOST_CHECK (k != l.blocks.end ());
134         BOOST_CHECK_EQUAL (k->text, "underlined");
135         BOOST_CHECK_EQUAL (k->font, "Arial");
136         BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
137         BOOST_CHECK_EQUAL (k->bold, false);
138         BOOST_CHECK_EQUAL (k->italic, false);
139         BOOST_CHECK_EQUAL (k->underline, true);
140         ++k;
141
142         BOOST_CHECK (k != l.blocks.end ());
143         BOOST_CHECK_EQUAL (k->text, ".");
144         BOOST_CHECK_EQUAL (k->font, "Arial");
145         BOOST_CHECK_EQUAL (k->font_size.points().get(), 48);
146         BOOST_CHECK_EQUAL (k->bold, false);
147         BOOST_CHECK_EQUAL (k->italic, false);
148         BOOST_CHECK_EQUAL (k->underline, false);
149         ++k;
150         
151         BOOST_CHECK (k == l.blocks.end ());
152 }
153
154