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 &currentUTime, int &sleepMs, QTemporaryDir &dir);
0078         void slewAndRun(SkyObject *object, const QDateTime &startUTime, const QDateTime &interruptUTime,
0079                         KStarsDateTime &currentUTime, 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