Avoid full_name() so we can build on Ubuntu 16.04.
[libdcp.git] / test / verify_test.cc
index c7579e2ec0a7a500a9a759f6ea04c1059781beea..a18058ef10968d0db40019e246fd620629b315fb 100644 (file)
@@ -153,135 +153,6 @@ write_dcp_with_single_asset (path dir, shared_ptr<dcp::ReelAsset> reel_asset, dc
 }
 
 
-/** Class that can alter a file by searching and replacing strings within it.
- *  On destruction modifies the file whose name was given to the constructor.
- */
-class Editor
-{
-public:
-       Editor (path path)
-               : _path(path)
-       {
-               _content = dcp::file_to_string (_path);
-       }
-
-       ~Editor ()
-       {
-               auto f = fopen(_path.string().c_str(), "w");
-               BOOST_REQUIRE (f);
-               fwrite (_content.c_str(), _content.length(), 1, f);
-               fclose (f);
-       }
-
-       class ChangeChecker
-       {
-       public:
-               ChangeChecker(Editor* editor)
-                       : _editor(editor)
-               {
-                       _old_content = _editor->_content;
-               }
-
-               ~ChangeChecker()
-               {
-                       BOOST_REQUIRE(_old_content != _editor->_content);
-               }
-       private:
-               Editor* _editor;
-               std::string _old_content;
-       };
-
-       void replace (string a, string b)
-       {
-               ChangeChecker cc(this);
-               boost::algorithm::replace_all (_content, a, b);
-       }
-
-       void delete_first_line_containing (string s)
-       {
-               ChangeChecker cc(this);
-               auto lines = as_lines();
-               _content = "";
-               bool done = false;
-               for (auto i: lines) {
-                       if (i.find(s) == string::npos || done) {
-                               _content += i + "\n";
-                       } else {
-                               done = true;
-                       }
-               }
-       }
-
-       void delete_lines (string from, string to)
-       {
-               ChangeChecker cc(this);
-               auto lines = as_lines();
-               bool deleting = false;
-               _content = "";
-               for (auto i: lines) {
-                       if (i.find(from) != string::npos) {
-                               deleting = true;
-                       }
-                       if (!deleting) {
-                               _content += i + "\n";
-                       }
-                       if (deleting && i.find(to) != string::npos) {
-                               deleting = false;
-                       }
-               }
-       }
-
-       void insert (string after, string line)
-       {
-               ChangeChecker cc(this);
-               auto lines = as_lines();
-               _content = "";
-               bool replaced = false;
-               for (auto i: lines) {
-                       _content += i + "\n";
-                       if (!replaced && i.find(after) != string::npos) {
-                               _content += line + "\n";
-                               replaced = true;
-                       }
-               }
-       }
-
-       void delete_lines_after(string after, int lines_to_delete)
-       {
-               ChangeChecker cc(this);
-               auto lines = as_lines();
-               _content = "";
-               auto iter = std::find_if(lines.begin(), lines.end(), [after](string const& line) {
-                       return line.find(after) != string::npos;
-               });
-               int to_delete = 0;
-               for (auto i = lines.begin(); i != lines.end(); ++i) {
-                       if (i == iter) {
-                               to_delete = lines_to_delete;
-                               _content += *i + "\n";
-                       } else if (to_delete == 0) {
-                               _content += *i + "\n";
-                       } else {
-                               --to_delete;
-                       }
-               }
-       }
-
-private:
-       friend class ChangeChecker;
-
-       vector<string> as_lines() const
-       {
-               vector<string> lines;
-               boost::algorithm::split(lines, _content, boost::is_any_of("\r\n"), boost::token_compress_on);
-               return lines;
-       }
-
-       path _path;
-       std::string _content;
-};
-
-
 LIBDCP_DISABLE_WARNINGS
 static
 void
@@ -670,6 +541,12 @@ BOOST_AUTO_TEST_CASE (verify_invalid_standard)
 BOOST_AUTO_TEST_CASE (verify_invalid_duration)
 {
        auto dir = setup (8, "invalid_duration");
+
+       dcp::DCP dcp(dir);
+       dcp.read();
+       BOOST_REQUIRE(dcp.cpls().size() == 1);
+       auto cpl = dcp.cpls()[0];
+
        check_verify_result (
                { dir },
                {
@@ -678,7 +555,12 @@ BOOST_AUTO_TEST_CASE (verify_invalid_duration)
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("d7576dcb-a361-4139-96b8-267f5f8d7f91") },
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") },
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_INTRINSIC_DURATION, string("a2a87f5d-b749-4a7e-8d0c-9d48a4abf626") },
-                       { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2") }
+                       { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_JPEG2000_GUARD_BITS_FOR_2K, string("2") },
+                       dcp::VerificationNote(
+                               dcp::VerificationNote::Type::WARNING,
+                               dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT,
+                               cpl->file().get()
+                       ).set_id("d74fda30-d5f4-4c5f-870f-ebc089d97eb7")
                });
 }
 
@@ -788,6 +670,23 @@ BOOST_AUTO_TEST_CASE (verify_valid_interop_subtitles)
 }
 
 
+BOOST_AUTO_TEST_CASE(verify_catch_missing_font_file_with_interop_ccap)
+{
+       path const dir("build/test/verify_catch_missing_font_file_with_interop_ccap");
+       prepare_directory(dir);
+       copy_file("test/data/subs1.xml", dir / "ccap.xml");
+       auto asset = make_shared<dcp::InteropSubtitleAsset>(dir / "ccap.xml");
+       auto reel_asset = make_shared<dcp::ReelInteropClosedCaptionAsset>(asset, dcp::Fraction(24, 1), 16 * 24, 0);
+       write_dcp_with_single_asset(dir, reel_asset, dcp::Standard::INTEROP);
+
+       check_verify_result (
+               {dir}, {
+                       { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::INVALID_STANDARD },
+                       { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISSING_FONT, string{"theFontId"} }
+               });
+}
+
+
 BOOST_AUTO_TEST_CASE (verify_invalid_interop_subtitles)
 {
        using namespace boost::filesystem;
@@ -1526,7 +1425,6 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_language)
 
        auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
        dcp->cpls()[0]->reels()[0]->add(reel_subs);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        check_verify_result (
@@ -1565,7 +1463,6 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_subtitle_languages)
                cpl->reels()[1]->add(reel_subs);
        }
 
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        check_verify_result (
@@ -1605,7 +1502,6 @@ BOOST_AUTO_TEST_CASE (verify_multiple_closed_caption_languages_allowed)
                cpl->reels()[1]->add(reel_ccaps);
        }
 
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        check_verify_result (
@@ -1653,7 +1549,6 @@ BOOST_AUTO_TEST_CASE (verify_missing_subtitle_start_time)
 
        auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
        dcp->cpls()[0]->reels()[0]->add(reel_subs);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        check_verify_result (
@@ -1702,7 +1597,6 @@ BOOST_AUTO_TEST_CASE (verify_invalid_subtitle_start_time)
 
        auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 106, 0);
        dcp->cpls().front()->reels().front()->add(reel_subs);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        check_verify_result (
@@ -2272,7 +2166,6 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_annotation_text)
 {
        path const dir("build/test/verify_missing_cpl_annotation_text");
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        BOOST_REQUIRE_EQUAL (dcp->cpls().size(), 1U);
@@ -2298,7 +2191,6 @@ BOOST_AUTO_TEST_CASE (verify_mismatched_cpl_annotation_text)
 {
        path const dir("build/test/verify_mismatched_cpl_annotation_text");
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        BOOST_REQUIRE_EQUAL (dcp->cpls().size(), 1U);
@@ -2370,8 +2262,8 @@ verify_subtitles_must_be_in_all_reels_check (path dir, bool add_to_reel1, bool a
        auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), reel_length, 0);
 
        auto reel1 = make_shared<dcp::Reel>(
-               make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "", reel_length), 0),
-               make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0)
+               make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "1", reel_length), 0),
+               make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "1", dcp::MXFMetadata(), "en-US", reel_length), 0)
                );
 
        if (add_to_reel1) {
@@ -2385,8 +2277,8 @@ verify_subtitles_must_be_in_all_reels_check (path dir, bool add_to_reel1, bool a
        cpl->add (reel1);
 
        auto reel2 = make_shared<dcp::Reel>(
-               make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "", reel_length), 0),
-               make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0)
+               make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "2", reel_length), 0),
+               make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "2", dcp::MXFMetadata(), "en-US", reel_length), 0)
                );
 
        if (add_to_reel2) {
@@ -2453,8 +2345,8 @@ verify_closed_captions_must_be_in_all_reels_check (path dir, int caps_in_reel1,
        subs->write (dir / "subs.mxf");
 
        auto reel1 = make_shared<dcp::Reel>(
-               make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "", reel_length), 0),
-               make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0)
+               make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "1", reel_length), 0),
+               make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "1", dcp::MXFMetadata(), "en-US", reel_length), 0)
                );
 
        for (int i = 0; i < caps_in_reel1; ++i) {
@@ -2468,8 +2360,8 @@ verify_closed_captions_must_be_in_all_reels_check (path dir, int caps_in_reel1,
        cpl->add (reel1);
 
        auto reel2 = make_shared<dcp::Reel>(
-               make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "", reel_length), 0),
-               make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "", dcp::MXFMetadata(), "en-US", reel_length), 0)
+               make_shared<dcp::ReelMonoPictureAsset>(simple_picture(dir, "2", reel_length), 0),
+               make_shared<dcp::ReelSoundAsset>(simple_sound(dir, "2", dcp::MXFMetadata(), "en-US", reel_length), 0)
                );
 
        for (int i = 0; i < caps_in_reel2; ++i) {
@@ -2602,7 +2494,6 @@ BOOST_AUTO_TEST_CASE (verify_missing_hash)
 
        path const dir("build/test/verify_missing_hash");
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        BOOST_REQUIRE_EQUAL (dcp->cpls().size(), 1U);
@@ -2641,7 +2532,6 @@ verify_markers_test (
                markers_asset->set (i.first, i.second);
        }
        dcp->cpls()[0]->reels()[0]->add(markers_asset);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        check_verify_result ({dir}, test_notes);
@@ -2738,7 +2628,6 @@ BOOST_AUTO_TEST_CASE (verify_missing_cpl_metadata_version_number)
        auto dcp = make_simple (dir);
        auto cpl = dcp->cpls()[0];
        cpl->unset_version_number();
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        check_verify_result ({dir}, {{ dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISSING_CPL_METADATA_VERSION_NUMBER, cpl->id(), cpl->file().get() }});
@@ -2749,7 +2638,6 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata1)
 {
        path dir = "build/test/verify_missing_extension_metadata1";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        BOOST_REQUIRE_EQUAL (dcp->cpls().size(), 1U);
@@ -2773,7 +2661,6 @@ BOOST_AUTO_TEST_CASE (verify_missing_extension_metadata2)
 {
        path dir = "build/test/verify_missing_extension_metadata2";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        auto cpl = dcp->cpls()[0];
@@ -2796,7 +2683,6 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata3)
 {
        path dir = "build/test/verify_invalid_xml_cpl_extension_metadata3";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        auto const cpl = dcp->cpls()[0];
@@ -2821,7 +2707,6 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata1)
 {
        path dir = "build/test/verify_invalid_extension_metadata1";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        auto cpl = dcp->cpls()[0];
@@ -2844,7 +2729,6 @@ BOOST_AUTO_TEST_CASE (verify_invalid_extension_metadata2)
 {
        path dir = "build/test/verify_invalid_extension_metadata2";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        auto cpl = dcp->cpls()[0];
@@ -2867,7 +2751,6 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata6)
 {
        path dir = "build/test/verify_invalid_xml_cpl_extension_metadata6";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        auto const cpl = dcp->cpls()[0];
@@ -2892,7 +2775,6 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata7)
 {
        path dir = "build/test/verify_invalid_xml_cpl_extension_metadata7";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        auto const cpl = dcp->cpls()[0];
@@ -2915,7 +2797,6 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata8)
 {
        path dir = "build/test/verify_invalid_xml_cpl_extension_metadata8";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        auto const cpl = dcp->cpls()[0];
@@ -2940,7 +2821,6 @@ BOOST_AUTO_TEST_CASE (verify_invalid_xml_cpl_extension_metadata9)
 {
        path dir = "build/test/verify_invalid_xml_cpl_extension_metadata9";
        auto dcp = make_simple (dir);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        auto const cpl = dcp->cpls()[0];
@@ -3298,7 +3178,6 @@ BOOST_AUTO_TEST_CASE (verify_unexpected_things_in_main_markers)
        path dir = "build/test/verify_unexpected_things_in_main_markers";
        prepare_directory (dir);
        auto dcp = make_simple (dir, 1, 24);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        {
@@ -3326,7 +3205,6 @@ BOOST_AUTO_TEST_CASE(verify_invalid_content_kind)
        path dir = "build/test/verify_invalid_content_kind";
        prepare_directory (dir);
        auto dcp = make_simple (dir, 1, 24);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        {
@@ -3351,7 +3229,6 @@ BOOST_AUTO_TEST_CASE(verify_valid_content_kind)
        path dir = "build/test/verify_valid_content_kind";
        prepare_directory (dir);
        auto dcp = make_simple (dir, 1, 24);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        {
@@ -3393,7 +3270,6 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_1)
                { dir },
                {
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir)) },
-                       { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, pkl.id(), canonical(find_pkl(dir)), },
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 1997 is not a multiple of 2", canonical(find_cpl(dir)) },
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 4080 is bigger than the asset height 1080", canonical(find_cpl(dir)) },
                });
@@ -3423,7 +3299,6 @@ BOOST_AUTO_TEST_CASE(verify_invalid_main_picture_active_area_2)
                { dir },
                {
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_CPL_HASHES, cpl.id(), canonical(find_cpl(dir)) },
-                       { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, pkl.id(), canonical(find_pkl(dir)), },
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is not a multiple of 2", canonical(find_cpl(dir)) },
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "width 9900 is bigger than the asset width 1998", canonical(find_cpl(dir)) },
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::INVALID_MAIN_PICTURE_ACTIVE_AREA, "height 5125 is bigger than the asset height 1080", canonical(find_cpl(dir)) },
@@ -3475,7 +3350,6 @@ BOOST_AUTO_TEST_CASE(verify_duplicate_assetmap_asset_ids)
        check_verify_result(
                { dir },
                {
-                       { dcp::VerificationNote::Type::BV21_ERROR, dcp::VerificationNote::Code::MISMATCHED_PKL_ANNOTATION_TEXT_WITH_CPL, pkl.id(), canonical(find_pkl(dir)), },
                        { dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::DUPLICATE_ASSET_ID_IN_ASSETMAP, asset_map.id(), canonical(find_asset_map(dir)) },
                        { dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EXTERNAL_ASSET, string("5407b210-4441-4e97-8b16-8bdc7c12da54") },
                });
@@ -3705,7 +3579,7 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font_for_font)
 
 BOOST_AUTO_TEST_CASE(verify_missing_load_font)
 {
-       boost::filesystem::path const dir = dcp::String::compose("build/test/%1", boost::unit_test::framework::current_test_case().full_name());
+       boost::filesystem::path const dir = "build/test/verify_missing_load_font";
        prepare_directory(dir);
        auto dcp = make_simple (dir, 1, 202);
 
@@ -3739,7 +3613,6 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font)
 
        auto reel_subs = make_shared<dcp::ReelSMPTESubtitleAsset>(subs, dcp::Fraction(24, 1), 202, 0);
        dcp->cpls()[0]->reels()[0]->add(reel_subs);
-       dcp->set_annotation_text("A Test DCP");
        dcp->write_xml();
 
        check_verify_result (
@@ -3749,3 +3622,46 @@ BOOST_AUTO_TEST_CASE(verify_missing_load_font)
                });
 }
 
+
+BOOST_AUTO_TEST_CASE(verify_spots_wrong_asset)
+{
+       boost::filesystem::path const dir = "build/test/verify_spots_wrong_asset";
+       boost::filesystem::remove_all(dir);
+
+       auto dcp1 = make_simple(dir / "1");
+       dcp1->write_xml();
+
+       auto const asset_1 = dcp::MonoPictureAsset(dir / "1" / "video.mxf").id();
+
+       auto dcp2 = make_simple(dir / "2");
+       dcp2->write_xml();
+       auto const asset_2 = dcp::MonoPictureAsset(dir / "2" / "video.mxf").id();
+
+       boost::filesystem::remove(dir / "1" / "video.mxf");
+       boost::filesystem::copy_file(dir / "2" / "video.mxf", dir / "1" / "video.mxf");
+
+       check_verify_result(
+               {dir / "1"},
+               {
+                       dcp::VerificationNote(dcp::VerificationNote::Type::ERROR, dcp::VerificationNote::Code::MISMATCHED_ASSET_MAP_ID).set_id(asset_1).set_other_id(asset_2)
+               });
+}
+
+
+BOOST_AUTO_TEST_CASE(verify_cpl_content_version_label_text_empty)
+{
+       boost::filesystem::path const dir = "build/test/verify_cpl_content_version_label_text_empty";
+       boost::filesystem::remove_all(dir);
+
+       auto dcp = make_simple(dir);
+       BOOST_REQUIRE(dcp->cpls().size() == 1);
+       auto cpl = dcp->cpls()[0];
+       cpl->set_content_version(dcp::ContentVersion(""));
+       dcp->write_xml();
+
+       check_verify_result(
+               {dir},
+               {
+                       dcp::VerificationNote(dcp::VerificationNote::Type::WARNING, dcp::VerificationNote::Code::EMPTY_CONTENT_VERSION_LABEL_TEXT, cpl->file().get()).set_id(cpl->id())
+               });
+}