Supporters update.
[dcpomatic.git] / test / create_cli_test.cc
index 5425969b6d8f1c4acd745772b4a4b9dfec1f465f..aae5fb6de051d81b83719ba8275918d80c47cde5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2019 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2019-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
+
+#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 <boost/test/unit_test.hpp>
 #include <boost/tokenizer.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <iostream>
 
+
 using std::string;
 
+
 static CreateCLI
 run (string cmd)
 {
@@ -36,21 +42,19 @@ run (string cmd)
        boost::escaped_list_separator<char> els ("", " ", "\"\'");
        boost::tokenizer<boost::escaped_list_separator<char> > tok (cmd, els);
 
-       char** argv = new char*[256];
+       std::vector<char*> argv(256);
        int argc = 0;
 
        for (boost::tokenizer<boost::escaped_list_separator<char> >::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<bool>(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");
+}
+