Add some logging to the KDM creator.
[dcpomatic.git] / test / subtitle_font_id_change_test.cc
1 /*
2     Copyright (C) 2022 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
6     DCP-o-matic is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     DCP-o-matic is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21
22 /** @file  test/subtitle_font_id_change_test.cc
23  *  @brief Check that old projects can still be used after the changes in 5a820bb8fae34591be5ac6d19a73461b9dab532a
24  */
25
26
27 #include "lib/check_content_job.h"
28 #include "lib/content.h"
29 #include "lib/film.h"
30 #include "lib/font.h"
31 #include "lib/text_content.h"
32 #include "test.h"
33 #include <dcp/verify.h>
34 #include <boost/filesystem.hpp>
35 #include <boost/test/unit_test.hpp>
36
37
38 using std::string;
39
40
41 class Editor
42 {
43 public:
44         Editor (boost::filesystem::path path)
45                 : _path(path)
46                 , _content(dcp::file_to_string(path))
47         {
48
49         }
50
51         ~Editor ()
52         {
53                 auto f = fopen(_path.string().c_str(), "w");
54                 BOOST_REQUIRE(f);
55                 fwrite(_content.c_str(), _content.length(), 1, f);
56                 fclose(f);
57         }
58
59         void replace (string a, string b)
60         {
61                 auto old_content = _content;
62                 boost::algorithm::replace_all (_content, a, b);
63                 BOOST_REQUIRE (_content != old_content);
64         }
65
66 private:
67         boost::filesystem::path _path;
68         std::string _content;
69 };
70
71
72 BOOST_AUTO_TEST_CASE(subtitle_font_id_change_test1)
73 {
74         auto film = new_test_film2("subtitle_font_id_change_test1");
75         boost::filesystem::remove(film->file("metadata.xml"));
76         boost::filesystem::copy_file("test/data/subtitle_font_id_change_test1.xml", film->file("metadata.xml"));
77         film->read_metadata();
78
79         auto content = film->content();
80         BOOST_REQUIRE_EQUAL(content.size(), 1U);
81         BOOST_REQUIRE_EQUAL(content[0]->text.size(), 1U);
82
83         content[0]->set_paths({"test/data/short.srt"});
84
85         CheckContentJob check(film);
86         check.run();
87         BOOST_REQUIRE (!wait_for_jobs());
88
89         make_and_verify_dcp(film, { dcp::VerificationNote::Code::INVALID_STANDARD });
90 }
91
92
93 BOOST_AUTO_TEST_CASE(subtitle_font_id_change_test2)
94 {
95         auto film = new_test_film2("subtitle_font_id_change_test2");
96         boost::filesystem::remove(film->file("metadata.xml"));
97         boost::filesystem::copy_file("test/data/subtitle_font_id_change_test2.xml", film->file("metadata.xml"));
98         {
99                 Editor editor(film->file("metadata.xml"));
100                 editor.replace("/usr/share/fonts/truetype/inconsolata/Inconsolata.otf", "test/data/Inconsolata-VF.ttf");
101         }
102         film->read_metadata();
103
104         auto content = film->content();
105         BOOST_REQUIRE_EQUAL(content.size(), 1U);
106         BOOST_REQUIRE_EQUAL(content[0]->text.size(), 1U);
107
108         content[0]->set_paths({"test/data/short.srt"});
109         /* Make sure the content doesn't look like it's changed, otherwise it will be re-examined
110          * which obscures the point of this test.
111          */
112         content[0]->_last_write_times[0] = boost::filesystem::last_write_time("test/data/short.srt");
113
114         CheckContentJob check(film);
115         check.run();
116         BOOST_REQUIRE (!wait_for_jobs());
117
118         auto font = content[0]->text.front()->get_font("");
119         BOOST_REQUIRE(font->file());
120         BOOST_CHECK_EQUAL(*font->file(), "test/data/Inconsolata-VF.ttf");
121
122         make_and_verify_dcp(film, { dcp::VerificationNote::Code::INVALID_STANDARD });
123 }
124
125
126 BOOST_AUTO_TEST_CASE(subtitle_font_id_change_test3)
127 {
128         auto film = new_test_film2("subtitle_font_id_change_test3");
129         boost::filesystem::remove(film->file("metadata.xml"));
130         boost::filesystem::copy_file("test/data/subtitle_font_id_change_test3.xml", film->file("metadata.xml"));
131         {
132                 Editor editor(film->file("metadata.xml"));
133                 editor.replace("/usr/share/fonts/truetype/inconsolata/Inconsolata.otf", "test/data/Inconsolata-VF.ttf");
134         }
135         film->read_metadata();
136
137         auto content = film->content();
138         BOOST_REQUIRE_EQUAL(content.size(), 1U);
139         BOOST_REQUIRE_EQUAL(content[0]->text.size(), 1U);
140
141         content[0]->set_paths({"test/data/fonts.ass"});
142
143         CheckContentJob check(film);
144         check.run();
145         BOOST_REQUIRE (!wait_for_jobs());
146
147         auto font = content[0]->text.front()->get_font("Arial Black");
148         BOOST_REQUIRE(font->file());
149         BOOST_CHECK_EQUAL(*font->file(), "test/data/Inconsolata-VF.ttf");
150
151         font = content[0]->text.front()->get_font("Helvetica Neue");
152         BOOST_REQUIRE(font->file());
153         BOOST_CHECK_EQUAL(*font->file(), "test/data/Inconsolata-VF.ttf");
154
155         make_and_verify_dcp(film, { dcp::VerificationNote::Code::INVALID_STANDARD });
156 }
157
158
159 BOOST_AUTO_TEST_CASE(subtitle_font_id_change_test4)
160 {
161         auto film = new_test_film2("subtitle_font_id_change_test4");
162         boost::filesystem::remove(film->file("metadata.xml"));
163         boost::filesystem::copy_file("test/data/subtitle_font_id_change_test4.xml", film->file("metadata.xml"));
164
165         {
166                 Editor editor(film->file("metadata.xml"));
167                 editor.replace("dcpomatic-test-private", TestPaths::private_data().string());
168         }
169
170         film->read_metadata();
171
172         auto content = film->content();
173         BOOST_REQUIRE_EQUAL(content.size(), 1U);
174         BOOST_REQUIRE_EQUAL(content[0]->text.size(), 1U);
175
176         CheckContentJob check(film);
177         check.run();
178         BOOST_REQUIRE(!wait_for_jobs());
179
180         make_and_verify_dcp(film, { dcp::VerificationNote::Code::INVALID_STANDARD });
181 }
182