void VCCueList_Test::keyboardNextPrevious() { QWidget w; VCCueList cl(&w, m_doc); Chaser* c = createChaser(m_doc); c->setDuration(Function::infiniteSpeed()); cl.setChaser(c->id()); cl.setNextKeySequence(QKeySequence(keySequenceB)); cl.setPreviousKeySequence(QKeySequence(keySequenceA)); cl.setPlaybackKeySequence(QKeySequence(keySequenceD)); // Switch mode m_doc->setMode(Doc::Operate); MasterTimer* timer = m_doc->masterTimer(); // Next keyboard key cl.slotKeyPressed(QKeySequence(keySequenceB)); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 0); QCOMPARE(cl.m_tree->indexOfTopLevelItem(cl.m_tree->currentItem()), 0); // Next keyboard key cl.slotKeyPressed(QKeySequence(keySequenceB)); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 1); QCOMPARE(cl.m_tree->indexOfTopLevelItem(cl.m_tree->currentItem()), 1); // Unrecognized keyboard key cl.slotKeyPressed(QKeySequence(QKeySequence::SelectAll)); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 1); QCOMPARE(cl.m_tree->indexOfTopLevelItem(cl.m_tree->currentItem()), 1); // Previous keyboard key cl.slotKeyPressed(QKeySequence(keySequenceA)); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 0); QCOMPARE(cl.m_tree->indexOfTopLevelItem(cl.m_tree->currentItem()), 0); // Previous keyboard key cl.slotKeyPressed(QKeySequence(keySequenceA)); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 3); QCOMPARE(cl.m_tree->indexOfTopLevelItem(cl.m_tree->currentItem()), 3); // Next keyboard key cl.slotKeyPressed(QKeySequence(keySequenceB)); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 0); QCOMPARE(cl.m_tree->indexOfTopLevelItem(cl.m_tree->currentItem()), 0); // Playback cl.slotKeyPressed(QKeySequence(keySequenceD)); timer->timerTick(); //QVERIFY(cl.m_runner == NULL); QCOMPARE(cl.m_tree->indexOfTopLevelItem(cl.m_tree->currentItem()), 0); }
void Chaser_Test::quickChaser() { Fixture* fxi = new Fixture(m_doc); fxi->setAddress(0); fxi->setUniverse(0); fxi->setChannels(1); m_doc->addFixture(fxi); Chaser* c = new Chaser(m_doc); // A really quick chaser c->setDuration(0); m_doc->addFunction(c); Scene* s1 = new Scene(m_doc); s1->setValue(fxi->id(), 0, 255); m_doc->addFunction(s1); c->addStep(s1->id()); Scene* s2 = new Scene(m_doc); s2->setValue(fxi->id(), 0, 127); m_doc->addFunction(s2); c->addStep(s2->id()); MasterTimer timer(m_doc); QVERIFY(c->isRunning() == false); QVERIFY(c->stopped() == true); c->start(&timer, FunctionParent::master()); timer.timerTick(); for (uint i = 0; i < 12; ++i) { timer.timerTick(); QVERIFY(c->isRunning() == true); QVERIFY(c->stopped() == false); // always one function running while the other is not QVERIFY(s1->isRunning() == true || s2->isRunning() == true); QVERIFY(s1->stopped() == true || s2->stopped() == true); } c->stop(FunctionParent::master()); timer.timerTick(); QVERIFY(c->isRunning() == false); QVERIFY(c->stopped() == true); QVERIFY(s1->isRunning() == false); QVERIFY(s1->stopped() == true); QVERIFY(s2->isRunning() == false); QVERIFY(s2->stopped() == true); }
void Chaser_Test::write() { Fixture* fxi = new Fixture(m_doc); fxi->setAddress(0); fxi->setUniverse(0); fxi->setChannels(1); m_doc->addFixture(fxi); Chaser* c = new Chaser(m_doc); c->setDuration(MasterTimer::tick() * 10); m_doc->addFunction(c); Scene* s1 = new Scene(m_doc); s1->setValue(fxi->id(), 0, 255); m_doc->addFunction(s1); c->addStep(s1->id()); Scene* s2 = new Scene(m_doc); s2->setValue(fxi->id(), 0, 127); m_doc->addFunction(s2); c->addStep(s2->id()); MasterTimer timer(m_doc); QVERIFY(c->isRunning() == false); QVERIFY(c->stopped() == true); c->start(&timer); timer.timerTick(); for (uint i = MasterTimer::tick(); i < c->duration(); i += MasterTimer::tick()) { timer.timerTick(); QVERIFY(c->isRunning() == true); QVERIFY(c->stopped() == false); QVERIFY(s1->isRunning() == true); QVERIFY(s2->isRunning() == false); } for (uint i = 0; i < c->duration(); i += MasterTimer::tick()) { timer.timerTick(); QVERIFY(c->isRunning() == true); QVERIFY(c->stopped() == false); QVERIFY(s1->isRunning() == false); QVERIFY(s2->isRunning() == true); } }
void VCCueList_Test::input() { QWidget w; VCCueList cl(&w, m_doc); Chaser* c = createChaser(m_doc); c->setDuration(Function::infiniteSpeed()); cl.setChaser(c->id()); cl.setInputSource(QSharedPointer<QLCInputSource>(new QLCInputSource(0, 1)), VCCueList::nextInputSourceId); cl.setInputSource(QSharedPointer<QLCInputSource>(new QLCInputSource(2, 3)), VCCueList::previousInputSourceId); cl.setInputSource(QSharedPointer<QLCInputSource>(new QLCInputSource(4, 5)), VCCueList::playbackInputSourceId); // Switch mode m_doc->setMode(Doc::Operate); MasterTimer* timer = m_doc->masterTimer(); // Runner creation thru "next" input cl.slotInputValueChanged(5, 3, 255); //QVERIFY(cl.m_runner == NULL); cl.slotInputValueChanged(2, 15, 255); //QVERIFY(cl.m_runner == NULL); cl.slotInputValueChanged(0, 1, 255); //QVERIFY(cl.m_runner != NULL); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 0); cl.slotInputValueChanged(0, 1, 0); //QVERIFY(cl.m_runner != NULL); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 0); cl.slotInputValueChanged(0, 1, 255); //QVERIFY(cl.m_runner != NULL); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 1); // Runner creation thru previous input m_doc->setMode(Doc::Design); //QVERIFY(cl.m_runner == NULL); m_doc->setMode(Doc::Operate); cl.slotInputValueChanged(0, 3, 255); //QVERIFY(cl.m_runner == NULL); cl.slotInputValueChanged(2, 1, 255); //QVERIFY(cl.m_runner == NULL); cl.slotInputValueChanged(2, 3, 255); //QVERIFY(cl.m_runner != NULL); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 3); cl.slotInputValueChanged(2, 3, 0); //QVERIFY(cl.m_runner != NULL); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 3); cl.slotInputValueChanged(2, 3, 255); //QVERIFY(cl.m_runner != NULL); timer->timerTick(); //QCOMPARE(cl.m_runner->currentStepIndex(), 2); cl.slotInputValueChanged(4, 5, 255); //QVERIFY(cl.m_runner != NULL); timer->timerTick(); //QVERIFY(cl.m_runner == NULL); cl.slotInputValueChanged(4, 5, 0); //QVERIFY(cl.m_runner == NULL); timer->timerTick(); //QVERIFY(cl.m_runner == NULL); }
void VCCueList_Test::manualActivation() { QWidget w; VCCueList cl(&w, m_doc); Chaser* c = createChaser(m_doc); c->setDuration(Function::infiniteSpeed()); cl.setChaser(c->id()); Scene* s1 = qobject_cast<Scene*> (m_doc->function(c->steps()[0].fid)); //Scene* s2 = qobject_cast<Scene*> (m_doc->function(c->steps()[1].fid)); Scene* s3 = qobject_cast<Scene*> (m_doc->function(c->steps()[2].fid)); //Scene* s4 = qobject_cast<Scene*> (m_doc->function(c->steps()[3].fid)); Q_ASSERT(s1 /*&& s2*/ && s3/* && s4*/); // Switch mode m_doc->setMode(Doc::Operate); MasterTimer* timer = m_doc->masterTimer(); // QVERIFY(cl.m_runner == NULL); cl.slotItemActivated(cl.m_tree->topLevelItem(2)); // QVERIFY(cl.m_runner != NULL); timer->timerTick(); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); // Same item cl.slotItemActivated(cl.m_tree->topLevelItem(2)); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); // Another item cl.slotItemActivated(cl.m_tree->topLevelItem(0)); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); // Crash check cl.slotItemActivated(NULL); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); }
void VCCueList_Test::nextPrevious() { QWidget w; VCCueList cl(&w, m_doc); Chaser* c = createChaser(m_doc); c->setDuration(Function::infiniteSpeed()); cl.setChaser(c->id()); QCOMPARE(c->steps().size(), 4); Scene* s1 = qobject_cast<Scene*> (m_doc->function(c->steps()[0].fid)); Scene* s2 = qobject_cast<Scene*> (m_doc->function(c->steps()[1].fid)); Scene* s3 = qobject_cast<Scene*> (m_doc->function(c->steps()[2].fid)); Scene* s4 = qobject_cast<Scene*> (m_doc->function(c->steps()[3].fid)); Q_ASSERT(s1 && s2 && s3 && s4); // Not in operate mode, check for crashes cl.slotNextCue(); cl.slotPreviousCue(); cl.slotItemActivated(cl.m_tree->topLevelItem(2)); // QVERIFY(cl.m_runner == NULL); // Switch mode m_doc->setMode(Doc::Operate); MasterTimer* timer = m_doc->masterTimer(); // Create runner with a next action -> first item should be activated cl.slotNextCue(); // QVERIFY(cl.m_runner != NULL); timer->timerTick(); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); cl.slotNextCue(); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s2); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s2); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s2); cl.slotNextCue(); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s3); cl.slotPreviousCue(); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s2); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s2); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s2); cl.slotPreviousCue(); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); // Wrap around to the last cue cl.slotPreviousCue(); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s4); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s4); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s4); // Wrap around to the next cue cl.slotNextCue(); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); timer->timerTick(); QCOMPARE(timer->runningFunctions(), 2); QCOMPARE(timer->m_functionList[1], s1); }
quint32 FunctionManager::createFunction(int type, QStringList fileList) { Function* f = NULL; QString name; switch(type) { case Function::SceneType: { f = new Scene(m_doc); name = tr("New Scene"); m_sceneCount++; emit sceneCountChanged(); } break; case Function::ChaserType: { f = new Chaser(m_doc); name = tr("New Chaser"); if (f != NULL) { /* give the Chaser a meaningful common duration, to avoid * that awful effect of playing steps with 0 duration */ Chaser *chaser = qobject_cast<Chaser*>(f); chaser->setDuration(1000); } m_chaserCount++; emit chaserCountChanged(); } break; case Function::SequenceType: { /* a Sequence depends on a Scene, so let's create * a new hidden Scene first */ Function *scene = new Scene(m_doc); scene->setVisible(false); if (m_doc->addFunction(scene) == true) { f = new Sequence(m_doc); name = tr("New Sequence"); Sequence *sequence = qobject_cast<Sequence *>(f); sequence->setBoundSceneID(scene->id()); m_sequenceCount++; emit sequenceCountChanged(); } else delete scene; } break; case Function::EFXType: { f = new EFX(m_doc); name = tr("New EFX"); m_efxCount++; emit efxCountChanged(); } break; case Function::CollectionType: { f = new Collection(m_doc); name = tr("New Collection"); if (m_selectedIDList.count()) { Collection *collection = qobject_cast<Collection *>(f); for (QVariant fID : m_selectedIDList) collection->addFunction(fID.toUInt()); } m_collectionCount++; emit collectionCountChanged(); } break; case Function::RGBMatrixType: { f = new RGBMatrix(m_doc); name = tr("New RGB Matrix"); m_rgbMatrixCount++; emit rgbMatrixCountChanged(); } break; case Function::ScriptType: { f = new Script(m_doc); name = tr("New Script"); m_scriptCount++; emit scriptCountChanged(); } break; case Function::ShowType: { f = new Show(m_doc); name = tr("New Show"); m_showCount++; emit showCountChanged(); } break; case Function::AudioType: { name = tr("New Audio"); if (fileList.isEmpty()) { f = new Audio(m_doc); m_audioCount++; emit audioCountChanged(); } else { quint32 lastFuncID = Function::invalidId(); for (QString filePath : fileList) { filePath = filePath.replace("file://", ""); f = new Audio(m_doc); lastFuncID = addFunctiontoDoc(f, name, fileList.count() == 1 ? true : false); if (lastFuncID != Function::invalidId()) { Audio *audio = qobject_cast<Audio *>(f); audio->setSourceFileName(filePath); } m_audioCount++; } emit audioCountChanged(); return lastFuncID; } } break; case Function::VideoType: { name = tr("New Video"); if (fileList.isEmpty()) { f = new Video(m_doc); m_videoCount++; emit videoCountChanged(); } else { quint32 lastFuncID = Function::invalidId(); for (QString filePath : fileList) { filePath = filePath.replace("file://", ""); f = new Video(m_doc); lastFuncID = addFunctiontoDoc(f, name, fileList.count() == 1 ? true : false); if (lastFuncID != Function::invalidId()) { Video *video = qobject_cast<Video *>(f); video->setSourceUrl(filePath); } m_videoCount++; } emit videoCountChanged(); return lastFuncID; } } break; default: break; } return addFunctiontoDoc(f, name, true); }