File indexing completed on 2024-11-03 04:29:42

0001 /*
0002     SPDX-FileCopyrightText: 2022 Jean-Baptiste Mardelle <jb@kdenlive.org>
0003     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 #include "catch.hpp"
0006 #include "test_utils.hpp"
0007 // test specific headers
0008 #include "doc/docundostack.hpp"
0009 #include "doc/kdenlivedoc.h"
0010 
0011 #include "core.h"
0012 #include "definitions.h"
0013 
0014 using namespace fakeit;
0015 
0016 TEST_CASE("Cut undo/redo", "[MoveClips]")
0017 {
0018     // Create timeline
0019     auto binModel = pCore->projectItemModel();
0020     binModel->clean();
0021     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0022 
0023     // Create document
0024     KdenliveDoc document(undoStack);
0025     pCore->projectManager()->m_project = &document;
0026     std::function<bool(void)> undo = []() { return true; };
0027     std::function<bool(void)> redo = []() { return true; };
0028     QDateTime documentDate = QDateTime::currentDateTime();
0029     pCore->projectManager()->updateTimeline(false, QString(), QString(), documentDate, 0);
0030     auto timeline = document.getTimeline(document.uuid());
0031     pCore->projectManager()->m_activeTimelineModel = timeline;
0032     pCore->projectManager()->testSetActiveDocument(&document, timeline);
0033 
0034     // Create a request
0035     int tid3 = timeline->getTrackIndexFromPosition(1);
0036     int tid2 = timeline->getTrackIndexFromPosition(2);
0037 
0038     // Create clip with audio (40 frames long)
0039     // QString binId = createAVProducer(*pCore->getProjectProfile(), binModel);
0040     QString binId = createProducerWithSound(pCore->getProjectProfile(), binModel, 100);
0041 
0042     // Setup insert stream data
0043     QMap<int, QString> audioInfo;
0044     audioInfo.insert(1, QStringLiteral("stream1"));
0045     timeline->m_binAudioTargets = audioInfo;
0046 
0047     // Create AV clip 1
0048     int cid1;
0049     int cid2;
0050     int cid3;
0051     int cid4;
0052 
0053     REQUIRE(timeline->requestClipInsertion(binId, tid2, 100, cid1));
0054     cid2 = timeline->getClipSplitPartner(cid1);
0055 
0056     SECTION("Ensure all clip instances on a track use the same producer")
0057     {
0058         REQUIRE(timeline->getItemTrackId(cid2) == tid3);
0059         REQUIRE(timeline->getItemTrackId(cid1) == tid2);
0060         Mlt::Producer prod1 = *(timeline->getClipPtr(cid1));
0061         Mlt::Producer prod2 = *(timeline->getClipPtr(cid2));
0062         // Clips on different tracks shoud not use the same producer
0063         REQUIRE(!prod1.same_clip(prod2));
0064 
0065         // Split clip
0066         REQUIRE(TimelineFunctions::requestClipCut(timeline, cid1, 110));
0067         cid3 = timeline->getClipByPosition(tid2, 111);
0068         cid4 = timeline->getClipSplitPartner(cid3);
0069         REQUIRE(timeline->getItemTrackId(cid4) == tid3);
0070         REQUIRE(timeline->getItemTrackId(cid3) == tid2);
0071 
0072         Mlt::Producer prod3 = *(timeline->getClipPtr(cid3));
0073         Mlt::Producer prod4 = *(timeline->getClipPtr(cid4));
0074         // Clips on different tracks shoud not use the same producer
0075         REQUIRE(!prod3.same_clip(prod4));
0076         // Clips on same track shoud use the same producer
0077         REQUIRE(prod1.same_clip(prod3));
0078         REQUIRE(prod2.same_clip(prod4));
0079 
0080         // Undo and redo cut, then ensure the producers are still correct
0081         undoStack->undo();
0082         undoStack->redo();
0083 
0084         prod3 = *(timeline->getClipPtr(cid3));
0085         prod4 = *(timeline->getClipPtr(cid4));
0086         // Clips on different tracks shoud not use the same producer
0087         REQUIRE(!prod3.same_clip(prod4));
0088         // Clips on same track shoud use the same producer
0089         REQUIRE(prod1.same_clip(prod3));
0090         REQUIRE(prod2.same_clip(prod4));
0091     }
0092     pCore->projectManager()->closeCurrentDocument(false, false);
0093 }