From: Carl Hetherington Date: Wed, 30 Nov 2022 15:20:10 +0000 (+0100) Subject: Add some failing tests. X-Git-Tag: v2.16.35~1 X-Git-Url: https://git.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=efb1172f51bbe15cd1f90b25a032bbe858453f5f Add some failing tests. --- diff --git a/test/dcp_subtitle_test.cc b/test/dcp_subtitle_test.cc index 679325a91..20fbe5f1a 100644 --- a/test/dcp_subtitle_test.cc +++ b/test/dcp_subtitle_test.cc @@ -25,19 +25,22 @@ */ -#include -#include "lib/film.h" -#include "lib/dcp_subtitle_content.h" +#include "lib/content_text.h" #include "lib/dcp_content.h" -#include "lib/ratio.h" -#include "lib/dcp_decoder.h" #include "lib/dcp_content_type.h" +#include "lib/dcp_decoder.h" +#include "lib/dcp_subtitle_content.h" #include "lib/dcp_subtitle_decoder.h" -#include "lib/text_content.h" -#include "lib/content_text.h" +#include "lib/film.h" #include "lib/font.h" +#include "lib/ratio.h" +#include "lib/text_content.h" #include "lib/text_decoder.h" #include "test.h" +#include +#include +#include +#include #include @@ -244,3 +247,86 @@ BOOST_AUTO_TEST_CASE (test_font_override) check_file (subtitle_file(film).parent_path() / "font_0.ttf", "test/data/Inconsolata-VF.ttf"); } + +BOOST_AUTO_TEST_CASE(entity_from_dcp_source) +{ + std::ofstream source_xml("build/test/entity_from_dcp_source.xml"); + source_xml + << "\n" + << "\n" + << "urn:uuid:9c0a0a67-ffd8-4c65-8b5a-c6be3ef182c5\n" + << "DCP\n" + << "2022-11-30T18:13:56.000+01:00\n" + << "1\n" + << "24 1\n" + << "24\n" + << "00:00:00:00\n" + << "urn:uuid:899e5c59-50f6-467b-985b-8282c020e1ee\n" + << "\n" + << "\n" + << "\n" + << "Hello & world\n" + << "\n" + << "\n" + << "\n" + << "\n"; + source_xml.close(); + + auto content = make_shared("build/test/entity_from_dcp_source.xml"); + auto film = new_test_film2("entity_from_dcp_source", { content }); + film->set_interop(false); + content->only_text()->set_use(true); + content->only_text()->set_burn(false); + make_and_verify_dcp ( + film, + { + dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, + dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME, + dcp::VerificationNote::Code::MISSING_CPL_METADATA, + dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION, + dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, + }); + + dcp::SMPTESubtitleAsset check(dcp_file(film, "sub_")); + auto subs = check.subtitles(); + BOOST_REQUIRE_EQUAL(subs.size(), 1U); + auto sub = std::dynamic_pointer_cast(subs[0]); + BOOST_REQUIRE(sub); + /* libdcp::SubtitleAsset gets the text from the XML with get_content(), which + * resolves the 5 predefined entities & " < > ' so we shouldn't see any + * entity here. + */ + BOOST_CHECK_EQUAL(sub->text(), "Hello & world"); + + /* It should be escaped in the raw XML though */ + BOOST_REQUIRE(static_cast(check.raw_xml())); + BOOST_CHECK(check.raw_xml()->find("Hello & world") != std::string::npos); + + /* Remake with burn */ + content->only_text()->set_burn(true); + make_and_verify_dcp ( + film, + { + dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, + dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME, + dcp::VerificationNote::Code::MISSING_CPL_METADATA, + dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION, + dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, + }); + + dcp::MonoPictureAsset burnt(dcp_file(film, "j2c_")); + auto frame = burnt.start_read()->get_frame(12)->xyz_image(); + auto const size = frame->size(); + int max_X = 0; + for (auto y = 0; y < size.height; ++y) { + for (auto x = 0; x < size.width; ++x) { + max_X = std::max(frame->data(0)[x + y * size.width], max_X); + } + } + + /* Check that the subtitle got rendered to the image; if the escaping of the & is wrong Pango + * will throw errors and nothing will be rendered. + */ + BOOST_CHECK(max_X > 100); +} + diff --git a/test/srt_subtitle_test.cc b/test/srt_subtitle_test.cc index 11b6b28b9..7caef5245 100644 --- a/test/srt_subtitle_test.cc +++ b/test/srt_subtitle_test.cc @@ -32,6 +32,8 @@ #include "lib/ratio.h" #include "lib/text_content.h" #include "test.h" +#include +#include #include #include #include @@ -205,6 +207,47 @@ BOOST_AUTO_TEST_CASE (srt_subtitle_test6) } +/** Test a case where a & in srt ended up in the SMPTE subtitle as &amp */ +BOOST_AUTO_TEST_CASE(srt_subtitle_entity) +{ + std::ofstream srt("build/test/srt_subtitle_entity.srt"); + srt << "1\n"; + srt << "00:00:01,000 -> 00:00:10,000\n"; + srt << "Hello & world\n"; + srt.close(); + + auto content = make_shared("build/test/srt_subtitle_entity.srt"); + auto film = new_test_film2("srt_subtitle_entity", { content }); + film->set_interop(false); + content->only_text()->set_use(true); + content->only_text()->set_burn(false); + make_and_verify_dcp ( + film, + { + dcp::VerificationNote::Code::MISSING_SUBTITLE_LANGUAGE, + dcp::VerificationNote::Code::INVALID_SUBTITLE_FIRST_TEXT_TIME, + dcp::VerificationNote::Code::MISSING_CPL_METADATA, + dcp::VerificationNote::Code::INVALID_SUBTITLE_DURATION, + dcp::VerificationNote::Code::INVALID_SUBTITLE_SPACING, + }); + + dcp::SMPTESubtitleAsset check(dcp_file(film, "sub_")); + auto subs = check.subtitles(); + BOOST_REQUIRE_EQUAL(subs.size(), 1U); + auto sub = std::dynamic_pointer_cast(subs[0]); + BOOST_REQUIRE(sub); + /* libdcp::SubtitleAsset gets the text from the XML with get_content(), which + * resolves the 5 predefined entities & " < > ' so we shouldn't see any + * entity here. + */ + BOOST_CHECK_EQUAL(sub->text(), "Hello & world"); + + /* It should be escaped in the raw XML though */ + BOOST_REQUIRE(static_cast(check.raw_xml())); + BOOST_CHECK(check.raw_xml()->find("Hello & world") != string::npos); +} + + #if 0 /* XXX: this is disabled; there is some difference in font rendering between the test machine and others.