File indexing completed on 2024-04-14 04:47:52

0001 /*
0002     SPDX-FileCopyrightText: 2017-2022 Jean-Baptiste Mardelle <jb@kdenlive.org>
0003     SPDX-FileCopyrightText: 2017-2019 Nicolas Carion <french.ebook.lover@gmail.com>
0004     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "test_utils.hpp"
0008 // test specific headers
0009 #include "doc/kdenlivedoc.h"
0010 
0011 TEST_CASE("Regression")
0012 {
0013     auto binModel = pCore->projectItemModel();
0014     binModel->clean();
0015     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0016 
0017     // Here we do some trickery to enable testing.
0018     // We mock the project class so that the undoStack function returns our undoStack
0019     KdenliveDoc document(undoStack);
0020     Mock<KdenliveDoc> docMock(document);
0021     KdenliveDoc &mockedDoc = docMock.get();
0022     Mock<ProjectManager> pmMock;
0023     When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
0024     When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
0025     When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
0026 
0027     ProjectManager &mocked = pmMock.get();
0028     pCore->m_projectManager = &mocked;
0029 
0030     // We also mock timeline object to spy few functions and mock others
0031     TimelineItemModel tim(mockedDoc.uuid(), undoStack);
0032     Mock<TimelineItemModel> timMock(tim);
0033     auto timeline = std::shared_ptr<TimelineItemModel>(&timMock.get(), [](...) {});
0034     TimelineItemModel::finishConstruct(timeline);
0035     pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline);
0036 
0037     RESET(timMock);
0038     KdenliveDoc::next_id = 0;
0039     undoStack->undo();
0040     undoStack->redo();
0041     undoStack->redo();
0042     undoStack->undo();
0043     QString binId0 = createProducer(pCore->getProjectProfile(), "red", binModel);
0044     int c = ClipModel::construct(timeline, binId0, -1, PlaylistState::VideoOnly);
0045     timeline->m_allClips[c]->m_endlessResize = false;
0046     TrackModel::construct(timeline);
0047     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0048     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0049     REQUIRE(timeline->requestClipMove(0, 1, 0));
0050     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0051     REQUIRE(timeline->requestItemResize(0, 16, false));
0052     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0053     undoStack->undo();
0054     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0055     undoStack->redo();
0056     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0057     undoStack->undo();
0058     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0059     undoStack->redo();
0060     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0061     undoStack->undo();
0062     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0063     undoStack->redo();
0064     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0065     REQUIRE(timeline->requestItemResize(0, 0, false) == -1);
0066     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0067     TrackModel::construct(timeline);
0068     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0069     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0070     undoStack->undo();
0071     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0072     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0073     undoStack->redo();
0074     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0075     pCore->taskManager.slotCancelJobs();
0076     mockedDoc.closing = true;
0077     timeline.reset();
0078     binModel->clean();
0079 }
0080 
0081 TEST_CASE("Regression2")
0082 {
0083     auto binModel = pCore->projectItemModel();
0084     binModel->clean();
0085     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0086 
0087     // Here we do some trickery to enable testing.
0088     // We mock the project class so that the undoStack function returns our undoStack
0089     KdenliveDoc document(undoStack);
0090     Mock<KdenliveDoc> docMock(document);
0091     KdenliveDoc &mockedDoc = docMock.get();
0092     Mock<ProjectManager> pmMock;
0093     When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
0094     When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
0095     When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
0096 
0097     ProjectManager &mocked = pmMock.get();
0098     pCore->m_projectManager = &mocked;
0099 
0100     // We also mock timeline object to spy few functions and mock others
0101     TimelineItemModel tim(mockedDoc.uuid(), undoStack);
0102     Mock<TimelineItemModel> timMock(tim);
0103     auto timeline = std::shared_ptr<TimelineItemModel>(&timMock.get(), [](...) {});
0104     TimelineItemModel::finishConstruct(timeline);
0105     pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline);
0106 
0107     RESET(timMock);
0108     KdenliveDoc::next_id = 0;
0109     int dummy_id;
0110     undoStack->undo();
0111     undoStack->undo();
0112     undoStack->redo();
0113     TrackModel::construct(timeline);
0114     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0115     undoStack->undo();
0116     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0117     {
0118         QString binId0 = createProducer(pCore->getProjectProfile(), "red", binModel);
0119         bool ok = timeline->requestClipInsertion(binId0, 0, 10, dummy_id);
0120         timeline->m_allClips[dummy_id]->m_endlessResize = false;
0121         REQUIRE(ok);
0122     }
0123     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0124     undoStack->undo();
0125     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0126     undoStack->redo();
0127     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0128     TrackModel::construct(timeline);
0129     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0130     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0131     {
0132         QString binId0 = createProducer(pCore->getProjectProfile(), "red", binModel);
0133         bool ok = timeline->requestClipInsertion(binId0, 2, 10, dummy_id);
0134         timeline->m_allClips[3]->m_endlessResize = false;
0135         REQUIRE(ok);
0136     }
0137     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0138     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0139     {
0140         bool ok = timeline->requestClipMove(1, 0, 10);
0141         REQUIRE(ok);
0142     }
0143     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0144     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0145     undoStack->undo();
0146     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0147     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0148     undoStack->redo();
0149     timeline->m_allClips[3]->m_endlessResize = false;
0150     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0151     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0152     {
0153         REQUIRE(timeline->requestItemResize(3, 0, false) == -1);
0154     }
0155     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0156     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0157     TrackModel::construct(timeline);
0158     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0159     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0160     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0161     {
0162         QString binId0 = createProducer(pCore->getProjectProfile(), "red", binModel);
0163         int c = ClipModel::construct(timeline, binId0, -1, PlaylistState::VideoOnly);
0164         timeline->m_allClips[c]->m_endlessResize = false;
0165     }
0166     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0167     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0168     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0169     TrackModel::construct(timeline);
0170     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0171     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0172     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0173     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0174     {
0175         REQUIRE(timeline->requestItemResize(3, 15, true) > -1);
0176     }
0177     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0178     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0179     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0180     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0181     {
0182         bool ok = timeline->requestClipMove(3, 0, 0);
0183         REQUIRE_FALSE(ok);
0184     }
0185     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0186     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0187     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0188     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0189     {
0190         REQUIRE(timeline->requestItemResize(3, 16, false) == -1);
0191     }
0192     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0193     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0194     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0195     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0196     {
0197         REQUIRE(timeline->requestItemResize(3, 16, true) > -1);
0198     }
0199     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0200     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0201     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0202     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0203     undoStack->undo();
0204     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0205     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0206     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0207     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0208     undoStack->undo();
0209     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0210     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0211     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0212     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0213     {
0214         QString binId0 = createProducer(pCore->getProjectProfile(), "red", binModel);
0215         bool ok = timeline->requestClipInsertion(binId0, 0, 1, dummy_id);
0216         REQUIRE_FALSE(ok);
0217     }
0218     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0219     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0220     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0221     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0222     undoStack->undo();
0223     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0224     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0225     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0226     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0227     undoStack->redo();
0228     REQUIRE(timeline->getTrackById(0)->checkConsistency());
0229     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0230     REQUIRE(timeline->getTrackById(4)->checkConsistency());
0231     REQUIRE(timeline->getTrackById(6)->checkConsistency());
0232     undoStack->redo();
0233     pCore->taskManager.slotCancelJobs();
0234     mockedDoc.closing = true;
0235     timeline.reset();
0236     binModel->clean();
0237 }
0238 
0239 /*
0240 TEST_CASE("Regression 3")
0241 {
0242     Mlt::Profile profile;
0243     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0244     std::shared_ptr<TimelineModel> timeline = TimelineItemModel::construct(new Mlt::Profile(), undoStack);
0245     KdenliveDoc::next_id = 0;
0246     int dummy_id;
0247     std::shared_ptr<Mlt::Producer> producer0 = std::make_shared<Mlt::Producer>(profile, "color", "red");
0248     producer0->set("length", 20);
0249     producer0->set("out", 19);
0250     ClipModel::construct(timeline, producer0 );
0251     {
0252         bool ok = timeline->requestTrackInsertion(-1, dummy_id);
0253         REQUIRE(ok);
0254     }
0255     TrackModel::construct(timeline);
0256     TrackModel::construct(timeline);
0257     std::shared_ptr<Mlt::Producer> producer1 = std::make_shared<Mlt::Producer>(profile, "color", "red");
0258     producer1->set("length", 20);
0259     producer1->set("out", 19);
0260     ClipModel::construct(timeline, producer1 );
0261     std::shared_ptr<Mlt::Producer> producer2 = std::make_shared<Mlt::Producer>(profile, "color", "red");
0262     producer2->set("length", 20);
0263     producer2->set("out", 19);
0264     ClipModel::construct(timeline, producer2 );
0265     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0266     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0267     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0268     std::shared_ptr<Mlt::Producer> producer3 = std::make_shared<Mlt::Producer>(profile, "color", "red");
0269     producer3->set("length", 20);
0270     producer3->set("out", 19);
0271     ClipModel::construct(timeline, producer3 );
0272     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0273     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0274     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0275     TrackModel::construct(timeline);
0276     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0277     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0278     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0279     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0280     TrackModel::construct(timeline);
0281     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0282     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0283     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0284     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0285     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0286     TrackModel::construct(timeline);
0287     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0288     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0289     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0290     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0291     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0292     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0293     std::shared_ptr<Mlt::Producer> producer4 = std::make_shared<Mlt::Producer>(profile, "color", "red");
0294     producer4->set("length", 20);
0295     producer4->set("out", 19);
0296     ClipModel::construct(timeline, producer4 );
0297     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0298     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0299     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0300     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0301     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0302     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0303     std::shared_ptr<Mlt::Producer> producer5 = std::make_shared<Mlt::Producer>(profile, "color", "red");
0304     producer5->set("length", 20);
0305     producer5->set("out", 19);
0306     ClipModel::construct(timeline, producer5 );
0307     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0308     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0309     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0310     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0311     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0312     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0313     std::shared_ptr<Mlt::Producer> producer6 = std::make_shared<Mlt::Producer>(profile, "color", "red");
0314     producer6->set("length", 20);
0315     producer6->set("out", 19);
0316     ClipModel::construct(timeline, producer6 );
0317     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0318     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0319     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0320     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0321     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0322     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0323     {
0324         bool ok = timeline->requestClipMove(0,1 ,10 );
0325         REQUIRE(ok);
0326     }
0327     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0328     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0329     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0330     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0331     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0332     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0333     {
0334         bool ok = timeline->requestClipMove(4,2 ,12 );
0335         REQUIRE(ok);
0336     }
0337     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0338     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0339     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0340     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0341     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0342     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0343     {
0344         auto group = {4, 0};
0345         bool ok = timeline->requestClipsGroup(group);
0346         REQUIRE(ok);
0347     }
0348     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0349     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0350     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0351     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0352     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0353     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0354     {
0355         bool ok = timeline->requestClipMove(4,1 ,10 );
0356         REQUIRE_FALSE(ok);
0357     }
0358     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0359     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0360     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0361     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0362     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0363     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0364     {
0365         bool ok = timeline->requestClipMove(4,1 ,100 );
0366         REQUIRE_FALSE(ok);
0367     }
0368     REQUIRE(timeline->getTrackById(1)->checkConsistency());
0369     REQUIRE(timeline->getTrackById(2)->checkConsistency());
0370     REQUIRE(timeline->getTrackById(3)->checkConsistency());
0371     REQUIRE(timeline->getTrackById(7)->checkConsistency());
0372     REQUIRE(timeline->getTrackById(8)->checkConsistency());
0373     REQUIRE(timeline->getTrackById(9)->checkConsistency());
0374     {
0375         bool ok = timeline->requestClipMove(0,3 ,100 );
0376         REQUIRE(ok);
0377     }
0378     std::shared_ptr<Mlt::Producer> producer7 = std::make_shared<Mlt::Producer>(profile, "color", "red");
0379     producer7->set("length", 20);
0380     producer7->set("out", 19);
0381     ClipModel::construct(timeline, producer7 );
0382     {
0383         bool ok = timeline->requestTrackInsertion(-1, dummy_id);
0384         REQUIRE(ok);
0385     }
0386     undoStack->undo();
0387     {
0388         bool ok = timeline->requestClipMove(0,1 ,5 );
0389         REQUIRE(ok);
0390     }
0391     {
0392         bool ok = timeline->requestTrackDeletion(1);
0393         REQUIRE(ok);
0394     }
0395 }
0396 
0397 TEST_CASE("Regression 4")
0398 {
0399     Mlt::Profile profile;
0400     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0401     std::shared_ptr<TimelineModel> timeline = TimelineItemModel::construct(new Mlt::Profile(), undoStack);
0402     KdenliveDoc::next_id = 0;
0403     int dummy_id;
0404     timeline->requestTrackInsertion(-1, dummy_id );
0405     timeline->requestTrackInsertion(-1, dummy_id );
0406     timeline->requestTrackInsertion(-1, dummy_id );
0407     timeline->requestTrackInsertion(-1, dummy_id );
0408     timeline->requestTrackInsertion(-1, dummy_id );
0409     timeline->requestTrackInsertion(-1, dummy_id );
0410     timeline->requestTrackInsertion(-1, dummy_id );
0411     timeline->requestTrackInsertion(-1, dummy_id );
0412     timeline->requestTrackInsertion(-1, dummy_id );
0413     timeline->requestTrackInsertion(-1, dummy_id );
0414     timeline->requestTrackInsertion(-1, dummy_id );
0415     {
0416         std::shared_ptr<Mlt::Producer> producer = std::make_shared<Mlt::Producer>(profile, "color", "red");
0417         producer->set("length", 62);
0418         producer->set("out", 61);
0419         timeline->requestClipInsertion(producer,10 ,453, dummy_id );
0420     }
0421     timeline->requestClipMove(11,10 ,453, true, true );
0422     {
0423         std::shared_ptr<Mlt::Producer> producer = std::make_shared<Mlt::Producer>(profile, "color", "red");
0424         producer->set("length", 62);
0425         producer->set("out", 61);
0426         timeline->requestClipInsertion(producer,9 ,590, dummy_id );
0427     }
0428     timeline->requestItemResize(11,62 ,true, false, true );
0429     timeline->requestItemResize(11,62 ,true, true, true );
0430     timeline->requestClipMove(11,10 ,507, true, true );
0431     timeline->requestClipMove(12,10 ,583, false, false );
0432     timeline->requestClipMove(12,9 ,521, true, true );
0433 }
0434 */
0435 
0436 TEST_CASE("FuzzBug1")
0437 {
0438     auto binModel = pCore->projectItemModel();
0439     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0440     KdenliveDoc::next_id = 0;
0441     {
0442         KdenliveDoc document(undoStack);
0443         Mock<KdenliveDoc> docMock(document);
0444         KdenliveDoc &mockedDoc = docMock.get();
0445         Mock<ProjectManager> pmMock;
0446         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
0447         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
0448         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
0449 
0450         ProjectManager &mocked = pmMock.get();
0451         pCore->m_projectManager = &mocked;
0452 
0453         // We also mock timeline object to spy few functions and mock others
0454         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
0455         Mock<TimelineItemModel> timMock_0(tim);
0456         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
0457         TimelineItemModel::finishConstruct(timeline_0);
0458         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
0459         mocked.m_activeTimelineModel = timeline_0;
0460         Fake(Method(timMock_0, adjustAssetRange));
0461         REQUIRE(timeline_0->checkConsistency());
0462         undoStack->undo();
0463         REQUIRE(timeline_0->checkConsistency());
0464         undoStack->redo();
0465         REQUIRE(timeline_0->checkConsistency());
0466         TrackModel::construct(timeline_0, -1, -1, "", false);
0467         REQUIRE(timeline_0->checkConsistency());
0468         undoStack->undo();
0469         REQUIRE(timeline_0->checkConsistency());
0470         undoStack->redo();
0471         REQUIRE(timeline_0->checkConsistency());
0472         TrackModel::construct(timeline_0, -1, -1, "$$$", false);
0473         REQUIRE(timeline_0->checkConsistency());
0474         undoStack->undo();
0475         REQUIRE(timeline_0->checkConsistency());
0476         undoStack->redo();
0477         REQUIRE(timeline_0->checkConsistency());
0478         {
0479             bool res = timeline_0->requestTrackDeletion(2);
0480             REQUIRE(res == true);
0481         }
0482         REQUIRE(timeline_0->checkConsistency());
0483         undoStack->undo();
0484         REQUIRE(timeline_0->checkConsistency());
0485         undoStack->redo();
0486         REQUIRE(timeline_0->checkConsistency());
0487         {
0488             bool res = timeline_0->requestTrackDeletion(1);
0489             // Cannot delete last track
0490             REQUIRE(res == false);
0491         }
0492         REQUIRE(timeline_0->checkConsistency());
0493         undoStack->undo();
0494         REQUIRE(timeline_0->checkConsistency());
0495         undoStack->redo();
0496         REQUIRE(timeline_0->checkConsistency());
0497         {
0498             int dummy_1;
0499             bool res = timeline_0->requestTrackInsertion(-1, dummy_1, "", false);
0500             REQUIRE(res == true);
0501         }
0502         REQUIRE(timeline_0->checkConsistency());
0503         undoStack->undo();
0504         REQUIRE(timeline_0->checkConsistency());
0505         undoStack->redo();
0506         REQUIRE(timeline_0->checkConsistency());
0507         {
0508             int dummy_1;
0509             bool res = timeline_0->requestTrackInsertion(-1, dummy_1, "", false);
0510             REQUIRE(res == true);
0511         }
0512         REQUIRE(timeline_0->checkConsistency());
0513         undoStack->undo();
0514         REQUIRE(timeline_0->checkConsistency());
0515         undoStack->redo();
0516         REQUIRE(timeline_0->checkConsistency());
0517         createProducer(pCore->getProjectProfile(), "red", binModel, 20, true);
0518         REQUIRE(timeline_0->checkConsistency());
0519         undoStack->undo();
0520         REQUIRE(timeline_0->checkConsistency());
0521         undoStack->redo();
0522         REQUIRE(timeline_0->checkConsistency());
0523         {
0524             int dummy_3;
0525             bool res = timeline_0->requestClipInsertion("2", 3, 0, dummy_3, true, false, true);
0526             REQUIRE(res == true);
0527         }
0528         REQUIRE(timeline_0->checkConsistency());
0529         undoStack->undo();
0530         REQUIRE(timeline_0->checkConsistency());
0531         undoStack->redo();
0532         REQUIRE(timeline_0->checkConsistency());
0533         {
0534             int dummy_3;
0535             bool res = timeline_0->requestClipInsertion("2", 3, 20, dummy_3, true, false, true);
0536             REQUIRE(res == true);
0537         }
0538         REQUIRE(timeline_0->checkConsistency());
0539         undoStack->undo();
0540         REQUIRE(timeline_0->checkConsistency());
0541         undoStack->redo();
0542         REQUIRE(timeline_0->checkConsistency());
0543         {
0544             int dummy_3;
0545             bool res = timeline_0->requestClipInsertion("2", 3, 40, dummy_3, true, false, true);
0546             REQUIRE(res == true);
0547         }
0548         REQUIRE(timeline_0->checkConsistency());
0549         undoStack->undo();
0550         REQUIRE(timeline_0->checkConsistency());
0551         undoStack->redo();
0552         REQUIRE(timeline_0->checkConsistency());
0553         {
0554             int res = timeline_0->requestClipsGroup({5, 7}, true, GroupType::Normal);
0555             REQUIRE(res == 8);
0556         }
0557         REQUIRE(timeline_0->checkConsistency());
0558         undoStack->undo();
0559         REQUIRE(timeline_0->checkConsistency());
0560         undoStack->redo();
0561         REQUIRE(timeline_0->checkConsistency());
0562         {
0563             int res = timeline_0->requestClipsGroup({6, 7}, true, GroupType::Normal);
0564             REQUIRE(res == 9);
0565         }
0566         REQUIRE(timeline_0->checkConsistency());
0567         undoStack->undo();
0568         REQUIRE(timeline_0->checkConsistency());
0569         undoStack->redo();
0570         REQUIRE(timeline_0->checkConsistency());
0571         {
0572             int res = timeline_0->requestClipsGroup({6, 7}, false, GroupType::Normal);
0573             REQUIRE(res == 9);
0574         }
0575         REQUIRE(timeline_0->checkConsistency());
0576         undoStack->undo();
0577         REQUIRE(timeline_0->checkConsistency());
0578         undoStack->redo();
0579         REQUIRE(timeline_0->checkConsistency());
0580         pCore->taskManager.slotCancelJobs();
0581         mockedDoc.closing = true;
0582         timeline_0.reset();
0583         binModel->clean();
0584     }
0585 }
0586 
0587 TEST_CASE("FuzzBug2")
0588 {
0589     auto binModel = pCore->projectItemModel();
0590     binModel->clean();
0591     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0592     KdenliveDoc::next_id = 0;
0593     {
0594         KdenliveDoc document(undoStack);
0595         Mock<KdenliveDoc> docMock(document);
0596         KdenliveDoc &mockedDoc = docMock.get();
0597         Mock<ProjectManager> pmMock;
0598         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
0599         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
0600         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
0601 
0602         ProjectManager &mocked = pmMock.get();
0603         pCore->m_projectManager = &mocked;
0604 
0605         // We also mock timeline object to spy few functions and mock others
0606         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
0607         Mock<TimelineItemModel> timMock_0(tim);
0608         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
0609         TimelineItemModel::finishConstruct(timeline_0);
0610         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
0611 
0612         mocked.m_activeTimelineModel = timeline_0;
0613         Fake(Method(timMock_0, adjustAssetRange));
0614         REQUIRE(timeline_0->checkConsistency());
0615         undoStack->undo();
0616         REQUIRE(timeline_0->checkConsistency());
0617         undoStack->redo();
0618         REQUIRE(timeline_0->checkConsistency());
0619         {
0620             int dummy_1;
0621             bool res = timeline_0->requestTrackInsertion(-1, dummy_1, "$", false);
0622             REQUIRE(res == true);
0623         }
0624         REQUIRE(timeline_0->checkConsistency());
0625         undoStack->undo();
0626         REQUIRE(timeline_0->checkConsistency());
0627         undoStack->redo();
0628         REQUIRE(timeline_0->checkConsistency());
0629         createProducer(pCore->getProjectProfile(), "d", binModel, 0, true);
0630         REQUIRE(timeline_0->checkConsistency());
0631         undoStack->undo();
0632         REQUIRE(timeline_0->checkConsistency());
0633         undoStack->redo();
0634         REQUIRE(timeline_0->checkConsistency());
0635         {
0636             int dummy_3;
0637             bool res = timeline_0->requestClipInsertion("2", 1, 0, dummy_3, true, false, true);
0638             REQUIRE(res == true);
0639         }
0640         REQUIRE(timeline_0->checkConsistency());
0641         undoStack->undo();
0642         REQUIRE(timeline_0->checkConsistency());
0643         undoStack->redo();
0644         REQUIRE(timeline_0->checkConsistency());
0645         {
0646             int dummy_3;
0647             bool res = timeline_0->requestClipInsertion("2", 1, 30, dummy_3, true, false, true);
0648             REQUIRE(res == true);
0649         }
0650         REQUIRE(timeline_0->checkConsistency());
0651         undoStack->undo();
0652         REQUIRE(timeline_0->checkConsistency());
0653         undoStack->redo();
0654         REQUIRE(timeline_0->checkConsistency());
0655         {
0656             int dummy_3;
0657             bool res = timeline_0->requestClipInsertion("2", 1, 60, dummy_3, true, false, true);
0658             REQUIRE(res == true);
0659         }
0660         REQUIRE(timeline_0->checkConsistency());
0661         undoStack->undo();
0662         REQUIRE(timeline_0->checkConsistency());
0663         undoStack->redo();
0664         REQUIRE(timeline_0->checkConsistency());
0665         {
0666             // Grouping 2 audio clips as AVSplit, this is now possible with multiple streams
0667             // int res = timeline_0->requestClipsGroup({3, 2}, true, GroupType::AVSplit);
0668             // REQUIRE(res == -1);
0669         }
0670         REQUIRE(timeline_0->checkConsistency());
0671         undoStack->undo();
0672         REQUIRE(timeline_0->checkConsistency());
0673         undoStack->redo();
0674         REQUIRE(timeline_0->checkConsistency());
0675         pCore->taskManager.slotCancelJobs();
0676         mockedDoc.closing = true;
0677         timeline_0.reset();
0678         binModel->clean();
0679     }
0680 }
0681 
0682 TEST_CASE("FuzzBug3")
0683 {
0684     auto binModel = pCore->projectItemModel();
0685     binModel->clean();
0686     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0687     KdenliveDoc::next_id = 0;
0688     {
0689         KdenliveDoc document(undoStack);
0690         Mock<KdenliveDoc> docMock(document);
0691         KdenliveDoc &mockedDoc = docMock.get();
0692         Mock<ProjectManager> pmMock;
0693         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
0694         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
0695         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
0696 
0697         ProjectManager &mocked = pmMock.get();
0698         pCore->m_projectManager = &mocked;
0699 
0700         // We also mock timeline object to spy few functions and mock others
0701         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
0702         Mock<TimelineItemModel> timMock_0(tim);
0703         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
0704         TimelineItemModel::finishConstruct(timeline_0);
0705         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
0706 
0707         mocked.m_activeTimelineModel = timeline_0;
0708         Fake(Method(timMock_0, adjustAssetRange));
0709 
0710         createProducerWithSound(pCore->getProjectProfile(), binModel);
0711         REQUIRE(timeline_0->checkConsistency());
0712         undoStack->undo();
0713         REQUIRE(timeline_0->checkConsistency());
0714         undoStack->redo();
0715         REQUIRE(timeline_0->checkConsistency());
0716         TrackModel::construct(timeline_0, -1, 0, "0", true);
0717         // Setup timeline audio drop info
0718         QMap<int, QString> audioInfo;
0719         audioInfo.insert(1, QStringLiteral("stream1"));
0720         timeline_0->m_binAudioTargets = audioInfo;
0721         REQUIRE(timeline_0->checkConsistency());
0722         undoStack->undo();
0723         REQUIRE(timeline_0->checkConsistency());
0724         undoStack->redo();
0725         REQUIRE(timeline_0->checkConsistency());
0726         {
0727             int dummy_3;
0728             bool res = timeline_0->requestClipInsertion("2", 1, 0, dummy_3, false, false, false);
0729             REQUIRE(res == true);
0730         }
0731         REQUIRE(timeline_0->checkConsistency());
0732         undoStack->undo();
0733         REQUIRE(timeline_0->checkConsistency());
0734         undoStack->redo();
0735         REQUIRE(timeline_0->checkConsistency());
0736         pCore->taskManager.slotCancelJobs();
0737         mockedDoc.closing = true;
0738         timeline_0.reset();
0739         binModel->clean();
0740     }
0741 }
0742 
0743 TEST_CASE("FuzzBug4")
0744 {
0745     auto binModel = pCore->projectItemModel();
0746     binModel->clean();
0747     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0748     KdenliveDoc::next_id = 0;
0749     {
0750         KdenliveDoc document(undoStack);
0751         Mock<KdenliveDoc> docMock(document);
0752         KdenliveDoc &mockedDoc = docMock.get();
0753         Mock<ProjectManager> pmMock;
0754         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
0755         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
0756         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
0757 
0758         ProjectManager &mocked = pmMock.get();
0759         pCore->m_projectManager = &mocked;
0760 
0761         // We also mock timeline object to spy few functions and mock others
0762         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
0763         Mock<TimelineItemModel> timMock_0(tim);
0764         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
0765         TimelineItemModel::finishConstruct(timeline_0);
0766         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
0767 
0768         mocked.m_activeTimelineModel = timeline_0;
0769         Fake(Method(timMock_0, adjustAssetRange));
0770         REQUIRE(timeline_0->checkConsistency());
0771         undoStack->undo();
0772         REQUIRE(timeline_0->checkConsistency());
0773         undoStack->redo();
0774         REQUIRE(timeline_0->checkConsistency());
0775         createProducer(pCore->getProjectProfile(), "red", binModel, 2, true);
0776         REQUIRE(timeline_0->checkConsistency());
0777         undoStack->undo();
0778         REQUIRE(timeline_0->checkConsistency());
0779         undoStack->redo();
0780         REQUIRE(timeline_0->checkConsistency());
0781         createProducer(pCore->getProjectProfile(), "blue", binModel, 20, true);
0782         REQUIRE(timeline_0->checkConsistency());
0783         undoStack->undo();
0784         REQUIRE(timeline_0->checkConsistency());
0785         undoStack->redo();
0786         REQUIRE(timeline_0->checkConsistency());
0787         createProducer(pCore->getProjectProfile(), "gseen", binModel, 20, true);
0788         REQUIRE(timeline_0->checkConsistency());
0789         undoStack->undo();
0790         REQUIRE(timeline_0->checkConsistency());
0791         undoStack->redo();
0792         REQUIRE(timeline_0->checkConsistency());
0793         TrackModel::construct(timeline_0, -1, -1, "", false);
0794         REQUIRE(timeline_0->checkConsistency());
0795         undoStack->undo();
0796         REQUIRE(timeline_0->checkConsistency());
0797         undoStack->redo();
0798         REQUIRE(timeline_0->checkConsistency());
0799         createProducerWithSound(pCore->getProjectProfile(), binModel);
0800         REQUIRE(timeline_0->checkConsistency());
0801         undoStack->undo();
0802         REQUIRE(timeline_0->checkConsistency());
0803         undoStack->redo();
0804         REQUIRE(timeline_0->checkConsistency());
0805         {
0806             int dummy_3;
0807             bool res = timeline_0->requestClipInsertion("5", 1, 3, dummy_3, true, true, true);
0808             REQUIRE(res == true);
0809         }
0810         REQUIRE(timeline_0->checkConsistency());
0811         undoStack->undo();
0812         REQUIRE(timeline_0->checkConsistency());
0813         undoStack->redo();
0814         REQUIRE(timeline_0->checkConsistency());
0815         {
0816             timeline_0->requestGroupDeletion(2, false);
0817         }
0818         REQUIRE(timeline_0->checkConsistency());
0819         undoStack->undo();
0820         REQUIRE(timeline_0->checkConsistency());
0821         undoStack->redo();
0822         REQUIRE(timeline_0->checkConsistency());
0823         pCore->taskManager.slotCancelJobs();
0824         mockedDoc.closing = true;
0825         timeline_0.reset();
0826         binModel->clean();
0827     }
0828 }
0829 
0830 TEST_CASE("FuzzBug5")
0831 {
0832     auto binModel = pCore->projectItemModel();
0833     binModel->clean();
0834     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
0835     KdenliveDoc::next_id = 0;
0836     {
0837         KdenliveDoc document(undoStack);
0838         Mock<KdenliveDoc> docMock(document);
0839         KdenliveDoc &mockedDoc = docMock.get();
0840         Mock<ProjectManager> pmMock;
0841         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
0842         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
0843         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
0844 
0845         ProjectManager &mocked = pmMock.get();
0846         pCore->m_projectManager = &mocked;
0847 
0848         // We also mock timeline object to spy few functions and mock others
0849         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
0850         Mock<TimelineItemModel> timMock_0(tim);
0851         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
0852         TimelineItemModel::finishConstruct(timeline_0);
0853         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
0854 
0855         mocked.m_activeTimelineModel = timeline_0;
0856         Fake(Method(timMock_0, adjustAssetRange));
0857         REQUIRE(timeline_0->checkConsistency());
0858         undoStack->undo();
0859         REQUIRE(timeline_0->checkConsistency());
0860         undoStack->redo();
0861         REQUIRE(timeline_0->checkConsistency());
0862         TrackModel::construct(timeline_0, -1, 0, "", false);
0863         REQUIRE(timeline_0->checkConsistency());
0864         undoStack->undo();
0865         REQUIRE(timeline_0->checkConsistency());
0866         undoStack->redo();
0867         REQUIRE(timeline_0->checkConsistency());
0868         QUuid uuid2 = QUuid::createUuid();
0869         TimelineItemModel tim_1(uuid2, undoStack);
0870         Mock<TimelineItemModel> timMock_1(tim_1);
0871         auto timeline_1 = std::shared_ptr<TimelineItemModel>(&timMock_1.get(), [](...) {});
0872         TimelineItemModel::finishConstruct(timeline_1);
0873         Fake(Method(timMock_1, adjustAssetRange));
0874         REQUIRE(timeline_0->checkConsistency());
0875         mocked.m_activeTimelineModel = timeline_1;
0876         REQUIRE(timeline_1->checkConsistency());
0877         undoStack->undo();
0878         mocked.m_activeTimelineModel = timeline_0;
0879         REQUIRE(timeline_0->checkConsistency());
0880         mocked.m_activeTimelineModel = timeline_1;
0881         REQUIRE(timeline_1->checkConsistency());
0882         undoStack->redo();
0883         mocked.m_activeTimelineModel = timeline_0;
0884         REQUIRE(timeline_0->checkConsistency());
0885         mocked.m_activeTimelineModel = timeline_1;
0886         REQUIRE(timeline_1->checkConsistency());
0887         TrackModel::construct(timeline_0, -1, 0, "$", false);
0888         mocked.m_activeTimelineModel = timeline_0;
0889         REQUIRE(timeline_0->checkConsistency());
0890         mocked.m_activeTimelineModel = timeline_1;
0891         REQUIRE(timeline_1->checkConsistency());
0892         undoStack->undo();
0893         mocked.m_activeTimelineModel = timeline_0;
0894         REQUIRE(timeline_0->checkConsistency());
0895         mocked.m_activeTimelineModel = timeline_1;
0896         REQUIRE(timeline_1->checkConsistency());
0897         undoStack->redo();
0898         mocked.m_activeTimelineModel = timeline_0;
0899         REQUIRE(timeline_0->checkConsistency());
0900         mocked.m_activeTimelineModel = timeline_1;
0901         REQUIRE(timeline_1->checkConsistency());
0902         TrackModel::construct(timeline_1, -1, 0, "$", true);
0903         mocked.m_activeTimelineModel = timeline_0;
0904         REQUIRE(timeline_0->checkConsistency());
0905         mocked.m_activeTimelineModel = timeline_1;
0906         REQUIRE(timeline_1->checkConsistency());
0907         undoStack->undo();
0908         mocked.m_activeTimelineModel = timeline_0;
0909         REQUIRE(timeline_0->checkConsistency());
0910         mocked.m_activeTimelineModel = timeline_1;
0911         REQUIRE(timeline_1->checkConsistency());
0912         undoStack->redo();
0913         mocked.m_activeTimelineModel = timeline_0;
0914         REQUIRE(timeline_0->checkConsistency());
0915         mocked.m_activeTimelineModel = timeline_1;
0916         REQUIRE(timeline_1->checkConsistency());
0917         createProducerWithSound(pCore->getProjectProfile(), binModel);
0918         mocked.m_activeTimelineModel = timeline_0;
0919         REQUIRE(timeline_0->checkConsistency());
0920         mocked.m_activeTimelineModel = timeline_1;
0921         REQUIRE(timeline_1->checkConsistency());
0922         undoStack->undo();
0923         mocked.m_activeTimelineModel = timeline_0;
0924         REQUIRE(timeline_0->checkConsistency());
0925         mocked.m_activeTimelineModel = timeline_1;
0926         REQUIRE(timeline_1->checkConsistency());
0927         undoStack->redo();
0928         mocked.m_activeTimelineModel = timeline_0;
0929         REQUIRE(timeline_0->checkConsistency());
0930         mocked.m_activeTimelineModel = timeline_1;
0931         REQUIRE(timeline_1->checkConsistency());
0932         TrackModel::construct(timeline_1, -1, -1, "$", false);
0933         mocked.m_activeTimelineModel = timeline_0;
0934         REQUIRE(timeline_0->checkConsistency());
0935         mocked.m_activeTimelineModel = timeline_1;
0936         REQUIRE(timeline_1->checkConsistency());
0937         undoStack->undo();
0938         mocked.m_activeTimelineModel = timeline_0;
0939         REQUIRE(timeline_0->checkConsistency());
0940         mocked.m_activeTimelineModel = timeline_1;
0941         REQUIRE(timeline_1->checkConsistency());
0942         undoStack->redo();
0943         mocked.m_activeTimelineModel = timeline_0;
0944         REQUIRE(timeline_0->checkConsistency());
0945         mocked.m_activeTimelineModel = timeline_1;
0946         REQUIRE(timeline_1->checkConsistency());
0947         TrackModel::construct(timeline_1, -1, -1, "$", true);
0948         mocked.m_activeTimelineModel = timeline_0;
0949         REQUIRE(timeline_0->checkConsistency());
0950         mocked.m_activeTimelineModel = timeline_1;
0951         REQUIRE(timeline_1->checkConsistency());
0952         undoStack->undo();
0953         mocked.m_activeTimelineModel = timeline_0;
0954         REQUIRE(timeline_0->checkConsistency());
0955         mocked.m_activeTimelineModel = timeline_1;
0956         REQUIRE(timeline_1->checkConsistency());
0957         undoStack->redo();
0958 
0959         // Setup timeline audio drop info
0960         QMap<int, QString> audioInfo;
0961         audioInfo.insert(1, QStringLiteral("stream1"));
0962         timeline_1->m_binAudioTargets = audioInfo;
0963         timeline_1->m_videoTarget = 5;
0964         QMap<int, int> audioTarget;
0965         audioTarget.insert(6, 1);
0966         timeline_1->m_audioTarget = audioTarget;
0967 
0968         /*timeline_1->setTrackProperty(4, "kdenlive:timeline_active", QStringLiteral("1"));
0969         timeline_1->setTrackProperty(5, "kdenlive:timeline_active", QStringLiteral("1"));
0970         timeline_1->setTrackProperty(6, "kdenlive:timeline_active", QStringLiteral("1"));*/
0971 
0972         mocked.m_activeTimelineModel = timeline_0;
0973         REQUIRE(timeline_0->checkConsistency());
0974         mocked.m_activeTimelineModel = timeline_1;
0975         REQUIRE(timeline_1->checkConsistency());
0976         {
0977             int dummy_3;
0978             bool res = timeline_1->requestClipInsertion("2", 5, 0, dummy_3, true, false, true);
0979             qDebug() << "==== INSERTED FIRST CLIP DURATION: " << timeline_1->getClipPlaytime(dummy_3);
0980             REQUIRE(res == true);
0981         }
0982         mocked.m_activeTimelineModel = timeline_0;
0983         REQUIRE(timeline_0->checkConsistency());
0984         mocked.m_activeTimelineModel = timeline_1;
0985         REQUIRE(timeline_1->checkConsistency());
0986         undoStack->undo();
0987         mocked.m_activeTimelineModel = timeline_0;
0988         REQUIRE(timeline_0->checkConsistency());
0989         mocked.m_activeTimelineModel = timeline_1;
0990         REQUIRE(timeline_1->checkConsistency());
0991         undoStack->redo();
0992         mocked.m_activeTimelineModel = timeline_0;
0993         REQUIRE(timeline_0->checkConsistency());
0994         mocked.m_activeTimelineModel = timeline_1;
0995         REQUIRE(timeline_1->checkConsistency());
0996         {
0997             int dummy_3;
0998             bool res = timeline_1->requestClipInsertion("2", 6, 20, dummy_3, true, false, true);
0999             REQUIRE(res == true);
1000         }
1001         mocked.m_activeTimelineModel = timeline_0;
1002         REQUIRE(timeline_0->checkConsistency());
1003         mocked.m_activeTimelineModel = timeline_1;
1004         REQUIRE(timeline_1->checkConsistency());
1005         undoStack->undo();
1006         mocked.m_activeTimelineModel = timeline_0;
1007         REQUIRE(timeline_0->checkConsistency());
1008         mocked.m_activeTimelineModel = timeline_1;
1009         REQUIRE(timeline_1->checkConsistency());
1010         undoStack->redo();
1011         mocked.m_activeTimelineModel = timeline_0;
1012         REQUIRE(timeline_0->checkConsistency());
1013         mocked.m_activeTimelineModel = timeline_1;
1014         REQUIRE(timeline_1->checkConsistency());
1015         {
1016             bool res = timeline_1->requestGroupMove(10, 9, 0, 0, true, false, false);
1017             REQUIRE(res == false);
1018         }
1019         mocked.m_activeTimelineModel = timeline_0;
1020         REQUIRE(timeline_0->checkConsistency());
1021         mocked.m_activeTimelineModel = timeline_1;
1022         REQUIRE(timeline_1->checkConsistency());
1023         undoStack->undo();
1024         mocked.m_activeTimelineModel = timeline_0;
1025         REQUIRE(timeline_0->checkConsistency());
1026         mocked.m_activeTimelineModel = timeline_1;
1027         REQUIRE(timeline_1->checkConsistency());
1028         undoStack->redo();
1029         mocked.m_activeTimelineModel = timeline_0;
1030         REQUIRE(timeline_0->checkConsistency());
1031         mocked.m_activeTimelineModel = timeline_1;
1032         REQUIRE(timeline_1->checkConsistency());
1033         pCore->taskManager.slotCancelJobs();
1034         mocked.m_activeTimelineModel.reset();
1035         undoStack->clear();
1036         mockedDoc.closing = true;
1037         binModel->clean();
1038         timeline_0.reset();
1039         timeline_1.reset();
1040     }
1041 }
1042 
1043 TEST_CASE("FuzzBug6")
1044 {
1045     auto binModel = pCore->projectItemModel();
1046     binModel->clean();
1047     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
1048     KdenliveDoc::next_id = 0;
1049     {
1050         KdenliveDoc document(undoStack);
1051         Mock<KdenliveDoc> docMock(document);
1052         KdenliveDoc &mockedDoc = docMock.get();
1053         Mock<ProjectManager> pmMock;
1054         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
1055         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
1056         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
1057 
1058         ProjectManager &mocked = pmMock.get();
1059         pCore->m_projectManager = &mocked;
1060 
1061         // We also mock timeline object to spy few functions and mock others
1062         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
1063         Mock<TimelineItemModel> timMock_0(tim);
1064         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
1065         TimelineItemModel::finishConstruct(timeline_0);
1066         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
1067 
1068         Fake(Method(timMock_0, adjustAssetRange));
1069         REQUIRE(timeline_0->checkConsistency());
1070         undoStack->undo();
1071         REQUIRE(timeline_0->checkConsistency());
1072         undoStack->redo();
1073         REQUIRE(timeline_0->checkConsistency());
1074         TrackModel::construct(timeline_0, -1, 0, "$", false);
1075         REQUIRE(timeline_0->checkConsistency());
1076         undoStack->undo();
1077         REQUIRE(timeline_0->checkConsistency());
1078         undoStack->redo();
1079         REQUIRE(timeline_0->checkConsistency());
1080         QUuid uuid2 = QUuid::createUuid();
1081         TimelineItemModel tim_1(uuid2, undoStack);
1082         Mock<TimelineItemModel> timMock_1(tim_1);
1083         auto timeline_1 = std::shared_ptr<TimelineItemModel>(&timMock_1.get(), [](...) {});
1084         TimelineItemModel::finishConstruct(timeline_1);
1085         Fake(Method(timMock_1, adjustAssetRange));
1086         mocked.m_activeTimelineModel = timeline_0;
1087         REQUIRE(timeline_0->checkConsistency());
1088         mocked.m_activeTimelineModel = timeline_1;
1089         REQUIRE(timeline_1->checkConsistency());
1090         undoStack->undo();
1091         mocked.m_activeTimelineModel = timeline_0;
1092         REQUIRE(timeline_0->checkConsistency());
1093         mocked.m_activeTimelineModel = timeline_1;
1094         REQUIRE(timeline_1->checkConsistency());
1095         undoStack->redo();
1096         mocked.m_activeTimelineModel = timeline_0;
1097         REQUIRE(timeline_0->checkConsistency());
1098         mocked.m_activeTimelineModel = timeline_1;
1099         REQUIRE(timeline_1->checkConsistency());
1100         createProducer(pCore->getProjectProfile(), "b", binModel, 20, true);
1101         mocked.m_activeTimelineModel = timeline_0;
1102         REQUIRE(timeline_0->checkConsistency());
1103         mocked.m_activeTimelineModel = timeline_1;
1104         REQUIRE(timeline_1->checkConsistency());
1105         undoStack->undo();
1106         mocked.m_activeTimelineModel = timeline_0;
1107         REQUIRE(timeline_0->checkConsistency());
1108         mocked.m_activeTimelineModel = timeline_1;
1109         REQUIRE(timeline_1->checkConsistency());
1110         undoStack->redo();
1111         mocked.m_activeTimelineModel = timeline_0;
1112         REQUIRE(timeline_0->checkConsistency());
1113         mocked.m_activeTimelineModel = timeline_1;
1114         REQUIRE(timeline_1->checkConsistency());
1115         {
1116             int dummy_3;
1117             bool res = timeline_0->requestClipInsertion("2", 1, -1, dummy_3, false, false, false);
1118             REQUIRE(res == false);
1119         }
1120         mocked.m_activeTimelineModel = timeline_0;
1121         REQUIRE(timeline_0->checkConsistency());
1122         mocked.m_activeTimelineModel = timeline_1;
1123         REQUIRE(timeline_1->checkConsistency());
1124         undoStack->undo();
1125         mocked.m_activeTimelineModel = timeline_0;
1126         REQUIRE(timeline_0->checkConsistency());
1127         mocked.m_activeTimelineModel = timeline_1;
1128         REQUIRE(timeline_1->checkConsistency());
1129         undoStack->redo();
1130         mocked.m_activeTimelineModel = timeline_0;
1131         REQUIRE(timeline_0->checkConsistency());
1132         mocked.m_activeTimelineModel = timeline_1;
1133         REQUIRE(timeline_1->checkConsistency());
1134         pCore->taskManager.slotCancelJobs();
1135         mockedDoc.closing = true;
1136         timeline_0.reset();
1137         timeline_1.reset();
1138         binModel->clean();
1139     }
1140 }
1141 
1142 TEST_CASE("FuzzBug7")
1143 {
1144     auto binModel = pCore->projectItemModel();
1145     binModel->clean();
1146     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
1147     KdenliveDoc::next_id = 0;
1148     {
1149         KdenliveDoc document(undoStack);
1150         Mock<KdenliveDoc> docMock(document);
1151         KdenliveDoc &mockedDoc = docMock.get();
1152         Mock<ProjectManager> pmMock;
1153         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
1154         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
1155         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
1156 
1157         ProjectManager &mocked = pmMock.get();
1158         pCore->m_projectManager = &mocked;
1159 
1160         // We also mock timeline object to spy few functions and mock others
1161         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
1162         Mock<TimelineItemModel> timMock_0(tim);
1163         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
1164         TimelineItemModel::finishConstruct(timeline_0);
1165         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
1166 
1167         mocked.m_activeTimelineModel = timeline_0;
1168         Fake(Method(timMock_0, adjustAssetRange));
1169         REQUIRE(timeline_0->checkConsistency());
1170         undoStack->undo();
1171         REQUIRE(timeline_0->checkConsistency());
1172         undoStack->redo();
1173         REQUIRE(timeline_0->checkConsistency());
1174         TrackModel::construct(timeline_0, -1, -1, "0", false);
1175         REQUIRE(timeline_0->checkConsistency());
1176         undoStack->undo();
1177         REQUIRE(timeline_0->checkConsistency());
1178         undoStack->redo();
1179         REQUIRE(timeline_0->checkConsistency());
1180         QUuid uuid2 = QUuid::createUuid();
1181         TimelineItemModel tim_1(uuid2, undoStack);
1182         Mock<TimelineItemModel> timMock_1(tim_1);
1183         auto timeline_1 = std::shared_ptr<TimelineItemModel>(&timMock_1.get(), [](...) {});
1184         TimelineItemModel::finishConstruct(timeline_1);
1185         Fake(Method(timMock_1, adjustAssetRange));
1186         mocked.m_activeTimelineModel = timeline_0;
1187         REQUIRE(timeline_0->checkConsistency());
1188         mocked.m_activeTimelineModel = timeline_1;
1189         REQUIRE(timeline_1->checkConsistency());
1190         undoStack->undo();
1191         mocked.m_activeTimelineModel = timeline_0;
1192         REQUIRE(timeline_0->checkConsistency());
1193         mocked.m_activeTimelineModel = timeline_1;
1194         REQUIRE(timeline_1->checkConsistency());
1195         undoStack->redo();
1196         mocked.m_activeTimelineModel = timeline_0;
1197         REQUIRE(timeline_0->checkConsistency());
1198         mocked.m_activeTimelineModel = timeline_1;
1199         REQUIRE(timeline_1->checkConsistency());
1200         createProducer(pCore->getProjectProfile(), "r5", binModel, 2, true);
1201         mocked.m_activeTimelineModel = timeline_0;
1202         REQUIRE(timeline_0->checkConsistency());
1203         mocked.m_activeTimelineModel = timeline_1;
1204         REQUIRE(timeline_1->checkConsistency());
1205         undoStack->undo();
1206         mocked.m_activeTimelineModel = timeline_0;
1207         REQUIRE(timeline_0->checkConsistency());
1208         mocked.m_activeTimelineModel = timeline_1;
1209         REQUIRE(timeline_1->checkConsistency());
1210         undoStack->redo();
1211         mocked.m_activeTimelineModel = timeline_0;
1212         REQUIRE(timeline_0->checkConsistency());
1213         mocked.m_activeTimelineModel = timeline_1;
1214         REQUIRE(timeline_1->checkConsistency());
1215         {
1216             int dummy_3;
1217             bool res = timeline_0->requestClipInsertion("2", 1, 0, dummy_3, true, false, true);
1218             REQUIRE(res == true);
1219         }
1220         mocked.m_activeTimelineModel = timeline_0;
1221         REQUIRE(timeline_0->checkConsistency());
1222         mocked.m_activeTimelineModel = timeline_1;
1223         REQUIRE(timeline_1->checkConsistency());
1224         mocked.m_activeTimelineModel = timeline_0;
1225         undoStack->undo();
1226         REQUIRE(timeline_0->checkConsistency());
1227         mocked.m_activeTimelineModel = timeline_1;
1228         REQUIRE(timeline_1->checkConsistency());
1229         undoStack->redo();
1230         mocked.m_activeTimelineModel = timeline_0;
1231         REQUIRE(timeline_0->checkConsistency());
1232         mocked.m_activeTimelineModel = timeline_1;
1233         REQUIRE(timeline_1->checkConsistency());
1234         {
1235             mocked.m_activeTimelineModel = timeline_0;
1236             int dummy_3;
1237             bool res = timeline_0->requestClipInsertion("2", 1, 20, dummy_3, true, false, true);
1238             REQUIRE(res == true);
1239         }
1240         REQUIRE(timeline_0->checkConsistency());
1241         mocked.m_activeTimelineModel = timeline_1;
1242         REQUIRE(timeline_1->checkConsistency());
1243         mocked.m_activeTimelineModel = timeline_0;
1244         undoStack->undo();
1245         REQUIRE(timeline_0->checkConsistency());
1246         mocked.m_activeTimelineModel = timeline_1;
1247         REQUIRE(timeline_1->checkConsistency());
1248         mocked.m_activeTimelineModel = timeline_0;
1249         undoStack->redo();
1250         REQUIRE(timeline_0->checkConsistency());
1251         mocked.m_activeTimelineModel = timeline_1;
1252         REQUIRE(timeline_1->checkConsistency());
1253         {
1254             mocked.m_activeTimelineModel = timeline_0;
1255             int dummy_3;
1256             bool res = timeline_0->requestClipInsertion("2", 1, 40, dummy_3, true, false, true);
1257             REQUIRE(res == true);
1258         }
1259         REQUIRE(timeline_0->checkConsistency());
1260         mocked.m_activeTimelineModel = timeline_1;
1261         REQUIRE(timeline_1->checkConsistency());
1262         mocked.m_activeTimelineModel = timeline_0;
1263         undoStack->undo();
1264         REQUIRE(timeline_0->checkConsistency());
1265         mocked.m_activeTimelineModel = timeline_1;
1266         REQUIRE(timeline_1->checkConsistency());
1267         mocked.m_activeTimelineModel = timeline_0;
1268         undoStack->redo();
1269         REQUIRE(timeline_0->checkConsistency());
1270         mocked.m_activeTimelineModel = timeline_1;
1271         REQUIRE(timeline_1->checkConsistency());
1272         {
1273             mocked.m_activeTimelineModel = timeline_0;
1274             int res = timeline_0->requestClipsGroup({4, 3}, true, GroupType::Selection);
1275             REQUIRE(res == -1);
1276         }
1277         REQUIRE(timeline_0->checkConsistency());
1278         mocked.m_activeTimelineModel = timeline_1;
1279         REQUIRE(timeline_1->checkConsistency());
1280         mocked.m_activeTimelineModel = timeline_0;
1281         undoStack->undo();
1282         REQUIRE(timeline_0->checkConsistency());
1283         mocked.m_activeTimelineModel = timeline_1;
1284         REQUIRE(timeline_1->checkConsistency());
1285         mocked.m_activeTimelineModel = timeline_0;
1286         undoStack->redo();
1287         REQUIRE(timeline_0->checkConsistency());
1288         mocked.m_activeTimelineModel = timeline_1;
1289         REQUIRE(timeline_1->checkConsistency());
1290         {
1291             mocked.m_activeTimelineModel = timeline_0;
1292             int res = timeline_0->requestClipsGroup({5, 3}, true, GroupType::Normal);
1293             REQUIRE(res == 6);
1294         }
1295         REQUIRE(timeline_0->checkConsistency());
1296         mocked.m_activeTimelineModel = timeline_1;
1297         REQUIRE(timeline_1->checkConsistency());
1298         mocked.m_activeTimelineModel = timeline_0;
1299         undoStack->undo();
1300         REQUIRE(timeline_0->checkConsistency());
1301         mocked.m_activeTimelineModel = timeline_1;
1302         REQUIRE(timeline_1->checkConsistency());
1303         mocked.m_activeTimelineModel = timeline_0;
1304         undoStack->redo();
1305         REQUIRE(timeline_0->checkConsistency());
1306         mocked.m_activeTimelineModel = timeline_1;
1307         REQUIRE(timeline_1->checkConsistency());
1308         pCore->taskManager.slotCancelJobs();
1309         mockedDoc.closing = true;
1310         timeline_0.reset();
1311         timeline_1.reset();
1312         binModel->clean();
1313     }
1314 }
1315 
1316 TEST_CASE("FuzzBug8")
1317 {
1318     auto binModel = pCore->projectItemModel();
1319     binModel->clean();
1320     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
1321     KdenliveDoc::next_id = 0;
1322     {
1323         KdenliveDoc document(undoStack);
1324         Mock<KdenliveDoc> docMock(document);
1325         KdenliveDoc &mockedDoc = docMock.get();
1326         Mock<ProjectManager> pmMock;
1327         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
1328         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
1329         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
1330 
1331         ProjectManager &mocked = pmMock.get();
1332         pCore->m_projectManager = &mocked;
1333 
1334         // We also mock timeline object to spy few functions and mock others
1335         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
1336         Mock<TimelineItemModel> timMock_0(tim);
1337         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
1338         TimelineItemModel::finishConstruct(timeline_0);
1339         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
1340 
1341         mocked.m_activeTimelineModel = timeline_0;
1342         Fake(Method(timMock_0, adjustAssetRange));
1343         REQUIRE(timeline_0->checkConsistency());
1344         undoStack->undo();
1345         REQUIRE(timeline_0->checkConsistency());
1346         undoStack->redo();
1347         REQUIRE(timeline_0->checkConsistency());
1348         {
1349             int dummy_1;
1350             bool res = timeline_0->requestTrackInsertion(-1, dummy_1, "", false);
1351             REQUIRE(res == true);
1352         }
1353         REQUIRE(timeline_0->checkConsistency());
1354         undoStack->undo();
1355         REQUIRE(timeline_0->checkConsistency());
1356         undoStack->redo();
1357         REQUIRE(timeline_0->checkConsistency());
1358         createProducer(pCore->getProjectProfile(), "red20", binModel, 1, true);
1359         REQUIRE(timeline_0->checkConsistency());
1360         undoStack->undo();
1361         REQUIRE(timeline_0->checkConsistency());
1362         undoStack->redo();
1363         REQUIRE(timeline_0->checkConsistency());
1364         {
1365             int dummy_3;
1366             bool res = timeline_0->requestClipInsertion("2", 1, 40, dummy_3, true, false, true);
1367             REQUIRE(res == true);
1368         }
1369         REQUIRE(timeline_0->checkConsistency());
1370         undoStack->undo();
1371         REQUIRE(timeline_0->checkConsistency());
1372         undoStack->redo();
1373         REQUIRE(timeline_0->checkConsistency());
1374         {
1375             int res = timeline_0->requestClipsGroup({2}, true, GroupType::Leaf);
1376             REQUIRE(res == -1);
1377         }
1378         REQUIRE(timeline_0->checkConsistency());
1379         undoStack->undo();
1380         REQUIRE(timeline_0->checkConsistency());
1381         undoStack->redo();
1382         REQUIRE(timeline_0->checkConsistency());
1383         pCore->taskManager.slotCancelJobs();
1384         mockedDoc.closing = true;
1385         timeline_0.reset();
1386         binModel->clean();
1387     }
1388 }
1389 
1390 TEST_CASE("FuzzBug9")
1391 {
1392     auto binModel = pCore->projectItemModel();
1393     binModel->clean();
1394     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
1395     KdenliveDoc::next_id = 0;
1396     {
1397         KdenliveDoc document(undoStack);
1398         Mock<KdenliveDoc> docMock(document);
1399         KdenliveDoc &mockedDoc = docMock.get();
1400         Mock<ProjectManager> pmMock;
1401         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
1402         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
1403         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
1404 
1405         ProjectManager &mocked = pmMock.get();
1406         pCore->m_projectManager = &mocked;
1407 
1408         // We also mock timeline object to spy few functions and mock others
1409         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
1410         Mock<TimelineItemModel> timMock_0(tim);
1411         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
1412         TimelineItemModel::finishConstruct(timeline_0);
1413         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
1414 
1415         mocked.m_activeTimelineModel = timeline_0;
1416         Fake(Method(timMock_0, adjustAssetRange));
1417         REQUIRE(timeline_0->checkConsistency());
1418         undoStack->undo();
1419         REQUIRE(timeline_0->checkConsistency());
1420         undoStack->redo();
1421         REQUIRE(timeline_0->checkConsistency());
1422         createProducer(pCore->getProjectProfile(), "60", binModel, 1, true);
1423         REQUIRE(timeline_0->checkConsistency());
1424         undoStack->undo();
1425         REQUIRE(timeline_0->checkConsistency());
1426         undoStack->redo();
1427         REQUIRE(timeline_0->checkConsistency());
1428         TrackModel::construct(timeline_0, -1, -1, "", false);
1429         REQUIRE(timeline_0->checkConsistency());
1430         undoStack->undo();
1431         REQUIRE(timeline_0->checkConsistency());
1432         undoStack->redo();
1433         REQUIRE(timeline_0->checkConsistency());
1434         ClipModel::construct(timeline_0, "2", 2, PlaylistState::Disabled, 1);
1435         REQUIRE(timeline_0->checkConsistency());
1436         undoStack->undo();
1437         REQUIRE(timeline_0->checkConsistency());
1438         undoStack->redo();
1439         REQUIRE(timeline_0->checkConsistency());
1440         {
1441             timeline_0->suggestClipMove(2, 1, -34, 0, 0);
1442         }
1443         REQUIRE(timeline_0->checkConsistency());
1444         undoStack->undo();
1445         REQUIRE(timeline_0->checkConsistency());
1446         undoStack->redo();
1447         REQUIRE(timeline_0->checkConsistency());
1448         pCore->taskManager.slotCancelJobs();
1449         mockedDoc.closing = true;
1450         timeline_0.reset();
1451         binModel->clean();
1452     }
1453 }
1454 
1455 TEST_CASE("FuzzBug10")
1456 {
1457     auto binModel = pCore->projectItemModel();
1458     binModel->clean();
1459     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
1460     KdenliveDoc::next_id = 0;
1461     {
1462         KdenliveDoc document(undoStack);
1463         Mock<KdenliveDoc> docMock(document);
1464         KdenliveDoc &mockedDoc = docMock.get();
1465         Mock<ProjectManager> pmMock;
1466         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
1467         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
1468         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
1469 
1470         ProjectManager &mocked = pmMock.get();
1471         pCore->m_projectManager = &mocked;
1472 
1473         // We also mock timeline object to spy few functions and mock others
1474         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
1475         Mock<TimelineItemModel> timMock_0(tim);
1476         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
1477         TimelineItemModel::finishConstruct(timeline_0);
1478         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
1479 
1480         mocked.m_activeTimelineModel = timeline_0;
1481         Fake(Method(timMock_0, adjustAssetRange));
1482         REQUIRE(timeline_0->checkConsistency());
1483         undoStack->undo();
1484         REQUIRE(timeline_0->checkConsistency());
1485         undoStack->redo();
1486         REQUIRE(timeline_0->checkConsistency());
1487         createProducer(pCore->getProjectProfile(), "red", binModel, 50, true);
1488         REQUIRE(timeline_0->checkConsistency());
1489         undoStack->undo();
1490         REQUIRE(timeline_0->checkConsistency());
1491         undoStack->redo();
1492         REQUIRE(timeline_0->checkConsistency());
1493         ClipModel::construct(timeline_0, "2", 1, PlaylistState::VideoOnly, -1);
1494         REQUIRE(timeline_0->checkConsistency());
1495         undoStack->undo();
1496         REQUIRE(timeline_0->checkConsistency());
1497         undoStack->redo();
1498         REQUIRE(timeline_0->checkConsistency());
1499         {
1500             timeline_0->requestItemResize(1, 12, false, true, 1, false);
1501         }
1502         REQUIRE(timeline_0->checkConsistency());
1503         undoStack->undo();
1504         REQUIRE(timeline_0->checkConsistency());
1505         undoStack->redo();
1506         REQUIRE(timeline_0->checkConsistency());
1507         pCore->taskManager.slotCancelJobs();
1508         mockedDoc.closing = true;
1509         timeline_0.reset();
1510         binModel->clean();
1511     }
1512 }
1513 
1514 TEST_CASE("FuzzBug11")
1515 {
1516     auto binModel = pCore->projectItemModel();
1517     binModel->clean();
1518     std::shared_ptr<DocUndoStack> undoStack = std::make_shared<DocUndoStack>(nullptr);
1519     KdenliveDoc::next_id = 0;
1520     {
1521         KdenliveDoc document(undoStack);
1522         Mock<KdenliveDoc> docMock(document);
1523         KdenliveDoc &mockedDoc = docMock.get();
1524         Mock<ProjectManager> pmMock;
1525         When(Method(pmMock, undoStack)).AlwaysReturn(undoStack);
1526         When(Method(pmMock, cacheDir)).AlwaysReturn(QDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
1527         When(Method(pmMock, current)).AlwaysReturn(&mockedDoc);
1528 
1529         ProjectManager &mocked = pmMock.get();
1530         pCore->m_projectManager = &mocked;
1531 
1532         // We also mock timeline object to spy few functions and mock others
1533         TimelineItemModel tim(mockedDoc.uuid(), undoStack);
1534         Mock<TimelineItemModel> timMock_0(tim);
1535         auto timeline_0 = std::shared_ptr<TimelineItemModel>(&timMock_0.get(), [](...) {});
1536         TimelineItemModel::finishConstruct(timeline_0);
1537         pCore->m_projectManager->testSetActiveDocument(&mockedDoc, timeline_0);
1538 
1539         mocked.m_activeTimelineModel = timeline_0;
1540         Fake(Method(timMock_0, adjustAssetRange));
1541         REQUIRE(timeline_0->checkConsistency());
1542         undoStack->undo();
1543         REQUIRE(timeline_0->checkConsistency());
1544         undoStack->redo();
1545         REQUIRE(timeline_0->checkConsistency());
1546         createProducer(pCore->getProjectProfile(), "red", binModel, 20, true);
1547         REQUIRE(timeline_0->checkConsistency());
1548         undoStack->undo();
1549         REQUIRE(timeline_0->checkConsistency());
1550         undoStack->redo();
1551         REQUIRE(timeline_0->checkConsistency());
1552         createProducer(pCore->getProjectProfile(), "blue", binModel, 0, true);
1553         REQUIRE(timeline_0->checkConsistency());
1554         undoStack->undo();
1555         REQUIRE(timeline_0->checkConsistency());
1556         undoStack->redo();
1557         REQUIRE(timeline_0->checkConsistency());
1558         createProducer(pCore->getProjectProfile(), "green", binModel, 20, true);
1559         REQUIRE(timeline_0->checkConsistency());
1560         undoStack->undo();
1561         REQUIRE(timeline_0->checkConsistency());
1562         undoStack->redo();
1563         REQUIRE(timeline_0->checkConsistency());
1564         TrackModel::construct(timeline_0, -1, -1, "$", true);
1565         REQUIRE(timeline_0->checkConsistency());
1566         undoStack->undo();
1567         REQUIRE(timeline_0->checkConsistency());
1568         undoStack->redo();
1569         REQUIRE(timeline_0->checkConsistency());
1570         TrackModel::construct(timeline_0, -1, -1, "", false);
1571         REQUIRE(timeline_0->checkConsistency());
1572         undoStack->undo();
1573         REQUIRE(timeline_0->checkConsistency());
1574         undoStack->redo();
1575         REQUIRE(timeline_0->checkConsistency());
1576         createProducerWithSound(pCore->getProjectProfile(), binModel);
1577 
1578         // Setup timeline audio drop info
1579         QMap<int, QString> audioInfo;
1580         audioInfo.insert(1, QStringLiteral("stream1"));
1581         timeline_0->m_binAudioTargets = audioInfo;
1582         REQUIRE(timeline_0->checkConsistency());
1583         undoStack->undo();
1584         REQUIRE(timeline_0->checkConsistency());
1585         undoStack->redo();
1586         REQUIRE(timeline_0->checkConsistency());
1587         {
1588             int dummy_3;
1589             bool res = timeline_0->requestClipInsertion("5", 2, 3, dummy_3, true, true, false);
1590             REQUIRE(res == true);
1591         }
1592         REQUIRE(timeline_0->checkConsistency());
1593         undoStack->undo();
1594         REQUIRE(timeline_0->checkConsistency());
1595         undoStack->redo();
1596         REQUIRE(timeline_0->checkConsistency());
1597         undoStack->undo();
1598         REQUIRE(timeline_0->checkConsistency());
1599         undoStack->redo();
1600         REQUIRE(timeline_0->checkConsistency());
1601         {
1602             timeline_0->requestSetSelection({4});
1603         }
1604         REQUIRE(timeline_0->checkConsistency());
1605         undoStack->undo();
1606         REQUIRE(timeline_0->checkConsistency());
1607         undoStack->redo();
1608         REQUIRE(timeline_0->checkConsistency());
1609         undoStack->undo();
1610         REQUIRE(timeline_0->checkConsistency());
1611         pCore->taskManager.slotCancelJobs();
1612         mockedDoc.closing = true;
1613         timeline_0.reset();
1614         binModel->clean();
1615     }
1616 }