File indexing completed on 2024-05-19 15:46:02

0001 /*
0002     SPDX-FileCopyrightText: 2019 Daniel Mensinger <daniel@mensinger-ka.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <QHash>
0010 #include <QObject>
0011 #include <QString>
0012 #include <QStringList>
0013 #include <interfaces/itestsuite.h>
0014 #include <language/duchain/indexeddeclaration.h>
0015 #include <memory>
0016 #include <util/path.h>
0017 
0018 class QJsonObject;
0019 class QJsonArray;
0020 class MesonTest;
0021 class MesonTestSuite;
0022 class MesonTestSuites;
0023 using MesonTestPtr = std::shared_ptr<MesonTest>;
0024 using MesonTestSuitePtr = std::shared_ptr<MesonTestSuite>;
0025 using MesonTestSuitesPtr = std::shared_ptr<MesonTestSuites>;
0026 
0027 class MesonTest
0028 {
0029 public:
0030     explicit MesonTest(const QJsonObject& json, KDevelop::IProject* project);
0031     virtual ~MesonTest();
0032 
0033     QString name() const;
0034     QStringList suites() const;
0035     KDevelop::IProject* project() const;
0036     KJob* job(KDevelop::ITestSuite::TestJobVerbosity verbosity);
0037 
0038     void fromJson(const QJsonObject& json);
0039 
0040 private:
0041     QString m_name;
0042     QStringList m_command;
0043     QStringList m_suites; // In meson one test can be part of multiple suites
0044     KDevelop::Path m_workDir;
0045     QHash<QString, QString> m_env;
0046     KDevelop::IProject* m_project = nullptr;
0047 };
0048 
0049 class MesonTestSuite : public KDevelop::ITestSuite
0050 {
0051 public:
0052     explicit MesonTestSuite(QString name, KDevelop::IProject* project);
0053     virtual ~MesonTestSuite();
0054 
0055     // Implementing the ITestSuite interface
0056     QString name() const override;
0057     QStringList cases() const override;
0058     KDevelop::IProject* project() const override;
0059     KJob* launchCase(const QString& testCase, KDevelop::ITestSuite::TestJobVerbosity verbosity) override;
0060     KJob* launchCases(const QStringList& testCases, KDevelop::ITestSuite::TestJobVerbosity verbosity) override;
0061     KJob* launchAllCases(KDevelop::ITestSuite::TestJobVerbosity verbosity) override;
0062 
0063     // TODO implement these
0064     KDevelop::IndexedDeclaration declaration() const override;
0065     KDevelop::IndexedDeclaration caseDeclaration(const QString& testCase) const override;
0066 
0067     // Custom functions
0068     void addTestCase(MesonTestPtr test);
0069     QHash<QString, MesonTestPtr> tests();
0070 
0071 private:
0072     QString m_name;
0073     KDevelop::IProject* m_project = nullptr;
0074     QHash<QString, MesonTestPtr> m_tests;
0075 };
0076 
0077 class MesonTestSuites
0078 {
0079 public:
0080     explicit MesonTestSuites(const QJsonArray& json, KDevelop::IProject* project);
0081     virtual ~MesonTestSuites();
0082 
0083     QHash<QString, MesonTestSuitePtr> testSuites();
0084     MesonTestSuitePtr testSuite(QString name);
0085     MesonTestSuitePtr operator[](QString name);
0086 
0087     void fromJSON(const QJsonArray& json);
0088 
0089 private:
0090     KDevelop::IProject* m_project = nullptr;
0091     QHash<QString, MesonTestSuitePtr> m_suites;
0092 };