File indexing completed on 2024-04-14 14:12:10
0001 /* KStars scheduler operations tests 0002 SPDX-FileCopyrightText: 2021 Hy Murveit <hy@murveit.com> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #ifndef TESTEKOSSCHEDULEROPS_H 0008 #define TESTEKOSSCHEDULEROPS_H 0009 0010 #include "config-kstars.h" 0011 #include "ekos/scheduler/schedulerjob.h" 0012 #include "test_ekos_scheduler_helper.h" 0013 0014 #if defined(HAVE_INDI) 0015 0016 #include <QObject> 0017 #include <QPushButton> 0018 #include <QComboBox> 0019 #include <QDoubleSpinBox> 0020 #include <QSpinBox> 0021 #include <QCheckBox> 0022 #include <QTest> 0023 0024 namespace Ekos 0025 { 0026 class Scheduler; 0027 class MockFocus; 0028 class MockMount; 0029 class MockCapture; 0030 class MockAlign; 0031 class MockGuide; 0032 class MockEkos; 0033 } 0034 class KStarsDateTime; 0035 class GeoLocation; 0036 0037 class TestEkosSchedulerOps : public QObject 0038 { 0039 Q_OBJECT 0040 0041 public: 0042 explicit TestEkosSchedulerOps(QObject *parent = nullptr); 0043 0044 private slots: 0045 void initTestCase(); 0046 void cleanupTestCase(); 0047 0048 void init(); 0049 void cleanup(); 0050 0051 void testBasics(); 0052 void testSimpleJob(); 0053 void testTimeZone(); 0054 void testDawnShutdown(); 0055 void testTwilightStartup(); 0056 void testTwilightStartup_data(); 0057 void testArtificialHorizonConstraints(); 0058 void testGreedySchedulerRun(); 0059 void testRememberJobProgress(); 0060 void testGreedy(); 0061 void testGroups(); 0062 void testArtificialCeiling(); 0063 void testGreedyAborts(); 0064 void testSettingAltitudeBug(); 0065 void testEstimateTimeBug(); 0066 void testGreedyMessier(); 0067 0068 // test data 0069 void testCulminationStartup_data(); 0070 void testRememberJobProgress_data(); 0071 0072 protected: 0073 void prepareTestData(QList<QString> locationList, QList<QString> targetList); 0074 void runSimpleJob(const GeoLocation &geo, const SkyObject *targetObject, const QDateTime &startUTime, 0075 const QDateTime &wakeupTime, bool enforceArtificialHorizon); 0076 void startup(const GeoLocation &geo, const QVector<SkyObject*> targetObjects, 0077 const QDateTime &startSchedulerUTime, KStarsDateTime ¤tUTime, int &sleepMs, QTemporaryDir &dir); 0078 void slewAndRun(SkyObject *object, const QDateTime &startUTime, const QDateTime &interruptUTime, 0079 KStarsDateTime ¤tUTime, int &sleepMs, int tolerance, const QString &label = ""); 0080 void parkAndSleep(KStarsDateTime &testUTime, int &sleepMs); 0081 void wakeupAndRestart(const QDateTime &restartTime, KStarsDateTime &testUTime, int &sleepMs); 0082 0083 0084 private: 0085 bool iterateScheduler(const QString &label, int iterations, int *sleepMs, 0086 KStarsDateTime* testUTime, 0087 std::function<bool ()> fcn); 0088 0089 void initScheduler(const GeoLocation &geo, const QDateTime &startUTime, QTemporaryDir *dir, 0090 const QVector<QString> &eslContents, const QVector<QString> &esqContents); 0091 void initTimeGeo(const GeoLocation &geo, const QDateTime &startUTime); 0092 void initFiles(QTemporaryDir *dir, const QVector<QString> &esls, const QVector<QString> &esqs); 0093 QString writeFiles(const QString &label, QTemporaryDir &dir, 0094 const QVector<TestEkosSchedulerHelper::CaptureJob> &captureJob, 0095 const QString &schedulerXML); 0096 0097 void initJob(const KStarsDateTime &startUTime, const KStarsDateTime &jobStartUTime); 0098 0099 void startupJobs( 0100 const GeoLocation &geo, const QDateTime &startUTime, 0101 QTemporaryDir *dir, const QVector<QString> &esls, const QVector<QString> &esqs, 0102 const QDateTime &wakeupTime, KStarsDateTime &endTestUTime, int &endSleepMs); 0103 void startupJob( 0104 const GeoLocation &geo, const QDateTime &startUTime, 0105 QTemporaryDir *dir, const QString &esl, const QString &esq, 0106 const QDateTime &wakeupTime, KStarsDateTime &endTestUTime, int &endSleepMs); 0107 void startModules(KStarsDateTime &testUTime, int &sleepMs); 0108 0109 void disableSkyMap(); 0110 int timeTolerance(int seconds); 0111 bool checkLastSlew(const SkyObject* targetObject); 0112 void printJobs(const QString &label); 0113 void loadGreedySchedule( 0114 bool first, const QString &targetName, 0115 const TestEkosSchedulerHelper::StartupCondition &startupCondition, 0116 const TestEkosSchedulerHelper::CompletionCondition &completionCondition, 0117 QTemporaryDir &dir, const QVector<TestEkosSchedulerHelper::CaptureJob> &captureJob, int minAltitude = 30, 0118 const TestEkosSchedulerHelper::ScheduleSteps steps = {true, true, true, true}, bool enforceTwilight = true, 0119 bool enforceHorizon = true, int errorDelay = 0); 0120 void makeFitsFiles(const QString &base, int num); 0121 0122 QSharedPointer<Ekos::Scheduler> scheduler; 0123 QSharedPointer<Ekos::MockFocus> focuser; 0124 QSharedPointer<Ekos::MockMount> mount; 0125 QSharedPointer<Ekos::MockCapture> capture; 0126 QSharedPointer<Ekos::MockAlign> align; 0127 QSharedPointer<Ekos::MockGuide> guider; 0128 QSharedPointer<Ekos::MockEkos> ekos; 0129 0130 TestEkosSchedulerHelper::StartupCondition m_startupCondition; 0131 TestEkosSchedulerHelper::CompletionCondition m_completionCondition; 0132 QElapsedTimer testTimer; 0133 }; 0134 0135 #endif // HAVE_INDI 0136 #endif // TESTEKOSSCHEDULEROPS_H