X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=test%2Fcreate_cli_test.cc;h=aae5fb6de051d81b83719ba8275918d80c47cde5;hb=HEAD;hp=5425969b6d8f1c4acd745772b4a4b9dfec1f465f;hpb=4edc14c8b1410e24f68b510cc14409b96c0338a3;p=dcpomatic.git diff --git a/test/create_cli_test.cc b/test/create_cli_test.cc index 5425969b6..aae5fb6de 100644 --- a/test/create_cli_test.cc +++ b/test/create_cli_test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2019 Carl Hetherington + Copyright (C) 2019-2021 Carl Hetherington This file is part of DCP-o-matic. @@ -18,16 +18,22 @@ */ + +#include "lib/config.h" #include "lib/create_cli.h" +#include "lib/film.h" #include "lib/ratio.h" #include "lib/dcp_content_type.h" +#include "test.h" #include #include #include #include + using std::string; + static CreateCLI run (string cmd) { @@ -36,21 +42,19 @@ run (string cmd) boost::escaped_list_separator els ("", " ", "\"\'"); boost::tokenizer > tok (cmd, els); - char** argv = new char*[256]; + std::vector argv(256); int argc = 0; for (boost::tokenizer >::iterator i = tok.begin(); i != tok.end(); ++i) { argv[argc++] = strdup (i->c_str()); } - CreateCLI cc (argc, argv); + CreateCLI cc (argc, argv.data()); for (int i = 0; i < argc; ++i) { free (argv[i]); } - delete[] argv; - return cc; } @@ -72,13 +76,13 @@ BOOST_AUTO_TEST_CASE (create_cli_test) cc = run ("dcpomatic2_create x --name frobozz --template bar"); BOOST_CHECK (!cc.error); - BOOST_CHECK_EQUAL (cc.name, "frobozz"); - BOOST_REQUIRE (cc.template_name); - BOOST_CHECK_EQUAL (*cc.template_name, "bar"); + BOOST_CHECK_EQUAL(cc._name, "frobozz"); + BOOST_REQUIRE(cc._template_name); + BOOST_CHECK_EQUAL(*cc._template_name, "bar"); cc = run ("dcpomatic2_create x --dcp-content-type FTR"); BOOST_CHECK (!cc.error); - BOOST_CHECK_EQUAL (cc.dcp_content_type, DCPContentType::from_isdcf_name("FTR")); + BOOST_CHECK_EQUAL(cc._dcp_content_type, DCPContentType::from_isdcf_name("FTR")); cc = run ("dcpomatic2_create x --dcp-frame-rate 30"); BOOST_CHECK (!cc.error); @@ -87,22 +91,46 @@ BOOST_AUTO_TEST_CASE (create_cli_test) cc = run ("dcpomatic2_create x --container-ratio 185"); BOOST_CHECK (!cc.error); - BOOST_CHECK_EQUAL (cc.container_ratio, Ratio::from_id("185")); + BOOST_CHECK_EQUAL(cc._container_ratio, Ratio::from_id("185")); cc = run ("dcpomatic2_create x --container-ratio XXX"); BOOST_CHECK (cc.error); cc = run ("dcpomatic2_create x --still-length 42"); BOOST_CHECK (!cc.error); - BOOST_CHECK_EQUAL (cc.still_length, 42); + BOOST_CHECK_EQUAL(cc.still_length.get_value_or(0), 42); cc = run ("dcpomatic2_create x --standard SMPTE"); BOOST_CHECK (!cc.error); - BOOST_CHECK_EQUAL (cc.standard, dcp::SMPTE); + BOOST_REQUIRE(cc._standard); + BOOST_CHECK_EQUAL(*cc._standard, dcp::Standard::SMPTE); + + cc = run ("dcpomatic2_create x --standard interop"); + BOOST_CHECK (!cc.error); + BOOST_REQUIRE(cc._standard); + BOOST_CHECK_EQUAL(*cc._standard, dcp::Standard::INTEROP); cc = run ("dcpomatic2_create x --standard SMPTEX"); BOOST_CHECK (cc.error); + cc = run("dcpomatic2_create x --no-encrypt"); + BOOST_CHECK(cc._no_encrypt); + + cc = run("dcpomatic2_create x --encrypt"); + BOOST_CHECK(cc._encrypt); + + cc = run("dcpomatic2_create x --no-encrypt --encrypt"); + BOOST_CHECK(cc.error); + + cc = run("dcpomatic2_create x --twod"); + BOOST_CHECK(cc._twod); + + cc = run("dcpomatic2_create x --threed"); + BOOST_CHECK(cc._threed); + + cc = run("dcpomatic2_create x --twod --threed"); + BOOST_CHECK(cc.error); + cc = run ("dcpomatic2_create x --config foo/bar"); BOOST_CHECK (!cc.error); BOOST_REQUIRE (cc.config_dir); @@ -120,35 +148,165 @@ BOOST_AUTO_TEST_CASE (create_cli_test) BOOST_CHECK (!cc.error); BOOST_REQUIRE (cc.config_dir); BOOST_CHECK_EQUAL (*cc.config_dir, "foo/bar"); - BOOST_CHECK_EQUAL (cc.still_length, 42); + BOOST_CHECK_EQUAL(cc.still_length.get_value_or(0), 42); BOOST_REQUIRE (cc.output_dir); BOOST_CHECK_EQUAL (*cc.output_dir, "flaps"); - BOOST_REQUIRE_EQUAL (cc.content.size(), 3); + BOOST_REQUIRE_EQUAL (cc.content.size(), 3U); BOOST_CHECK_EQUAL (cc.content[0].path, "fred"); - BOOST_CHECK_EQUAL (cc.content[0].frame_type, VIDEO_FRAME_TYPE_2D); + BOOST_CHECK_EQUAL (cc.content[0].frame_type, VideoFrameType::TWO_D); BOOST_CHECK_EQUAL (cc.content[1].path, "jim"); - BOOST_CHECK_EQUAL (cc.content[1].frame_type, VIDEO_FRAME_TYPE_2D); + BOOST_CHECK_EQUAL (cc.content[1].frame_type, VideoFrameType::TWO_D); BOOST_CHECK_EQUAL (cc.content[2].path, "sheila"); - BOOST_CHECK_EQUAL (cc.content[2].frame_type, VIDEO_FRAME_TYPE_2D); + BOOST_CHECK_EQUAL (cc.content[2].frame_type, VideoFrameType::TWO_D); cc = run ("dcpomatic2_create --left-eye left.mp4 --right-eye right.mp4"); - BOOST_REQUIRE_EQUAL (cc.content.size(), 2); + BOOST_REQUIRE_EQUAL (cc.content.size(), 2U); BOOST_CHECK_EQUAL (cc.content[0].path, "left.mp4"); - BOOST_CHECK_EQUAL (cc.content[0].frame_type, VIDEO_FRAME_TYPE_3D_LEFT); + BOOST_CHECK_EQUAL (cc.content[0].frame_type, VideoFrameType::THREE_D_LEFT); BOOST_CHECK_EQUAL (cc.content[1].path, "right.mp4"); - BOOST_CHECK_EQUAL (cc.content[1].frame_type, VIDEO_FRAME_TYPE_3D_RIGHT); - BOOST_CHECK_EQUAL (cc.fourk, false); + BOOST_CHECK_EQUAL (cc.content[1].frame_type, VideoFrameType::THREE_D_RIGHT); + BOOST_CHECK_EQUAL(cc._fourk, false); + + cc = run ("dcpomatic2_create --twok foo.mp4"); + BOOST_REQUIRE_EQUAL (cc.content.size(), 1U); + BOOST_CHECK_EQUAL (cc.content[0].path, "foo.mp4"); + BOOST_CHECK_EQUAL(cc._twok, true); + BOOST_CHECK (!cc.error); cc = run ("dcpomatic2_create --fourk foo.mp4"); - BOOST_REQUIRE_EQUAL (cc.content.size(), 1); + BOOST_REQUIRE_EQUAL (cc.content.size(), 1U); BOOST_CHECK_EQUAL (cc.content[0].path, "foo.mp4"); - BOOST_CHECK_EQUAL (cc.fourk, true); + BOOST_CHECK_EQUAL(cc._fourk, true); BOOST_CHECK (!cc.error); cc = run ("dcpomatic2_create --j2k-bandwidth 120 foo.mp4"); - BOOST_REQUIRE_EQUAL (cc.content.size(), 1); + BOOST_REQUIRE_EQUAL (cc.content.size(), 1U); BOOST_CHECK_EQUAL (cc.content[0].path, "foo.mp4"); - BOOST_REQUIRE (cc.j2k_bandwidth); - BOOST_CHECK_EQUAL (*cc.j2k_bandwidth, 120000000); + BOOST_REQUIRE(cc._j2k_bandwidth); + BOOST_CHECK_EQUAL(*cc._j2k_bandwidth, 120000000); BOOST_CHECK (!cc.error); + + cc = run ("dcpomatic2_create --channel L fred.wav --channel R jim.wav sheila.wav"); + BOOST_REQUIRE_EQUAL (cc.content.size(), 3U); + BOOST_CHECK_EQUAL (cc.content[0].path, "fred.wav"); + BOOST_CHECK (cc.content[0].channel); + BOOST_CHECK (*cc.content[0].channel == dcp::Channel::LEFT); + BOOST_CHECK_EQUAL (cc.content[1].path, "jim.wav"); + BOOST_CHECK (cc.content[1].channel); + BOOST_CHECK (*cc.content[1].channel == dcp::Channel::RIGHT); + BOOST_CHECK_EQUAL (cc.content[2].path, "sheila.wav"); + BOOST_CHECK (!cc.content[2].channel); + + cc = run ("dcpomatic2_create --channel foo fred.wav"); + BOOST_REQUIRE (cc.error); + BOOST_CHECK (boost::algorithm::starts_with(*cc.error, "dcpomatic2_create: foo is not valid for --channel")); + + cc = run ("dcpomatic2_create fred.wav --gain -6 jim.wav --gain 2 sheila.wav"); + BOOST_REQUIRE_EQUAL (cc.content.size(), 3U); + BOOST_CHECK_EQUAL (cc.content[0].path, "fred.wav"); + BOOST_CHECK (!cc.content[0].gain); + BOOST_CHECK_EQUAL (cc.content[1].path, "jim.wav"); + BOOST_CHECK_CLOSE (*cc.content[1].gain, -6, 0.001); + BOOST_CHECK_EQUAL (cc.content[2].path, "sheila.wav"); + BOOST_CHECK_CLOSE (*cc.content[2].gain, 2, 0.001); + + cc = run("dcpomatic2_create --cpl 123456-789-0 dcp"); + BOOST_REQUIRE_EQUAL(cc.content.size(), 1U); + BOOST_CHECK_EQUAL(cc.content[0].path, "dcp"); + BOOST_REQUIRE(static_cast(cc.content[0].cpl)); + BOOST_CHECK_EQUAL(*cc.content[0].cpl, "123456-789-0"); + + cc = run("dcpomatic2_create -s SMPTE sheila.wav"); + BOOST_CHECK(!cc.still_length); + BOOST_CHECK(cc.error); +} + + +BOOST_AUTO_TEST_CASE(create_cli_template_test) +{ + ConfigRestorer cr; + + Config::override_path = "test/data"; + + auto cc = run("dcpomatic2_create test/data/flat_red.png"); + auto film = cc.make_film(); + BOOST_CHECK(!film->three_d()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template 2d"); + film = cc.make_film(); + BOOST_CHECK(!film->three_d()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template 2d --threed"); + film = cc.make_film(); + BOOST_CHECK(film->three_d()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template 3d"); + film = cc.make_film(); + BOOST_CHECK(film->three_d()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template 3d --twod"); + film = cc.make_film(); + BOOST_CHECK(!film->three_d()); + + cc = run("dcpomatic2_create test/data/flat_red.png"); + film = cc.make_film(); + BOOST_CHECK(!film->encrypted()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template unencrypted"); + film = cc.make_film(); + BOOST_CHECK(!film->encrypted()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template unencrypted --encrypt"); + film = cc.make_film(); + BOOST_CHECK(film->encrypted()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template encrypted"); + film = cc.make_film(); + BOOST_CHECK(film->encrypted()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template encrypted --no-encrypt"); + film = cc.make_film(); + BOOST_CHECK(!film->encrypted()); + + cc = run("dcpomatic2_create test/data/flat_red.png"); + film = cc.make_film(); + BOOST_CHECK(!film->interop()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template interop"); + film = cc.make_film(); + BOOST_CHECK(film->interop()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template interop --standard SMPTE"); + film = cc.make_film(); + BOOST_CHECK(!film->interop()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template smpte"); + film = cc.make_film(); + BOOST_CHECK(!film->interop()); + + cc = run("dcpomatic2_create test/data/flat_red.png --template smpte --standard interop"); + film = cc.make_film(); + BOOST_CHECK(film->interop()); } + + +BOOST_AUTO_TEST_CASE(create_cli_defaults_test) +{ + ConfigRestorer cr; + + /* I think on balance dcpomatic2_create should not use the defaults from Config; + * it seems a bit surprising that settings from a GUI tool can change the behaviour of + * a CLI tool, and at some point we're probably going to remove all the default config + * options from the main DoM anyway (in favour of a default template). + */ + Config::instance()->set_default_interop(true); + auto cc = run("dcpomatic2_create test/data/flat_red.png"); + auto film = cc.make_film(); + BOOST_CHECK(!film->interop()); + + Config::instance()->set_default_dcp_content_type(DCPContentType::from_isdcf_name("FT")); + cc = run("dcpomatic2_create test/data/flat_red.png"); + film = cc.make_film(); + BOOST_CHECK_EQUAL(film->dcp_content_type()->isdcf_name(), "TST"); +} +