From 2644a86432e9aff121822d554dc4ce6d27bfe24a Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 12:33:27 +0000 Subject: [PATCH 01/23] Create addMVPTab function for adding MVP tab to Data Reduction interface --- .../Reduction/IndirectDataReduction.h | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h index 2eddc0bbb695..6b04f9898067 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h @@ -130,6 +130,43 @@ private slots: m_uiForm.twIDRTabs->addTab(tabWidget, name); } + /** + * Adds an MVP tab to the cache of tabs that can be shown. + * + * This method is used to ensure that the tabs are always loaded and their + * layouts setup for the sake of screenshoting them for documentation. + * + * @param name Name to be displayed on tab + */ + + template void addMVPTab(const QString &name) { + QWidget *tabWidget = new QWidget(m_uiForm.twIDRTabs); + QVBoxLayout *tabLayout = new QVBoxLayout(tabWidget); + tabWidget->setLayout(tabLayout); + + QScrollArea *tabScrollArea = new QScrollArea(tabWidget); + tabLayout->addWidget(tabScrollArea); + tabScrollArea->setWidgetResizable(true); + + QWidget *tabContent = new QWidget(tabScrollArea); + tabContent->setObjectName("tab" + QString(name).remove(QRegExp("[ ,()]"))); + tabScrollArea->setWidget(tabContent); + tabScrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + IndirectDataReductionTab *tabIDRContent = new TabPresenter(this, new TabView(tabContent)); + + tabIDRContent->setupTab(); + tabContent->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + connect(tabIDRContent, SIGNAL(showMessageBox(const QString &)), this, SLOT(showMessageBox(const QString &))); + + // Add to the cache + m_tabs[name] = qMakePair(tabWidget, tabIDRContent); + + // Add all tabs to UI initially + m_uiForm.twIDRTabs->addTab(tabWidget, name); + } + friend class IndirectDataReductionTab; /// The .ui form generated by Qt Designer Ui::IndirectDataReduction m_uiForm; From aa052d22a7749bb579605cafa3eb664714ba3f6d Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 12:44:43 +0000 Subject: [PATCH 02/23] Pass view into presenter constructor for ISISEnergyTransfer tab --- .../Reduction/ISISEnergyTransferPresenter.cpp | 8 ++++---- .../Reduction/ISISEnergyTransferPresenter.h | 17 ++++++++++++++--- .../Reduction/ISISEnergyTransferView.cpp | 17 ++++++++++------- .../Indirect/Reduction/ISISEnergyTransferView.h | 17 +++++------------ .../Reduction/IndirectDataReduction.cpp | 2 +- 5 files changed, 34 insertions(+), 27 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp index 0ade544b5d60..2ed51dcc8ace 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp @@ -28,16 +28,16 @@ using MantidQt::API::BatchAlgorithmRunner; namespace MantidQt::CustomInterfaces { -IETPresenter::IETPresenter(IndirectDataReduction *idrUI, QWidget *parent) - : IndirectDataReductionTab(idrUI, parent), m_model(std::make_unique()), - m_view(std::make_unique(this, parent)) { +IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IETView *view) + : IndirectDataReductionTab(idrUI), m_model(std::make_unique()), m_view(view) { + m_view->subscribePresenter(this); setOutputPlotOptionsPresenter( std::make_unique(m_view->getPlotOptionsView(), PlotWidget::SpectraSliceSurface)); connect(this, SIGNAL(newInstrumentConfiguration()), this, SLOT(setInstrumentDefault())); - connect(this, SIGNAL(updateRunButton(bool, std::string const &, QString const &, QString const &)), m_view.get(), + connect(this, SIGNAL(updateRunButton(bool, std::string const &, QString const &, QString const &)), m_view, SLOT(updateRunButton(bool, std::string const &, QString const &, QString const &))); } diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h index 87276856887f..cdd58e4dd796 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h @@ -15,11 +15,22 @@ namespace MantidQt { namespace CustomInterfaces { -class MANTIDQT_INDIRECT_DLL IETPresenter : public IndirectDataReductionTab, public IETViewSubscriber { + +class MANTIDQT_INDIRECT_DLL IIETPresenter { +public: + virtual void notifyNewMessage(const QString &message) = 0; + virtual void notifySaveClicked() = 0; + virtual void notifyRunClicked() = 0; + virtual void notifyPlotRawClicked() = 0; + virtual void notifySaveCustomGroupingClicked(std::string const &customGrouping) = 0; + virtual void notifyRunFinished() = 0; +}; + +class MANTIDQT_INDIRECT_DLL IETPresenter : public IndirectDataReductionTab, public IIETPresenter { Q_OBJECT public: - IETPresenter(IndirectDataReduction *idrUI, QWidget *parent = nullptr); + IETPresenter(IndirectDataReduction *idrUI, IETView *view); ~IETPresenter() override; void setup() override; @@ -54,7 +65,7 @@ private slots: std::vector m_outputWorkspaces; std::unique_ptr m_model; - std::unique_ptr m_view; + IETView *m_view; }; } // namespace CustomInterfaces } // namespace MantidQt \ No newline at end of file diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp index e6fcdf1da332..80d06d105e27 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp @@ -8,6 +8,7 @@ #include "ISISEnergyTransferView.h" #include "Common/DetectorGroupingOptions.h" #include "Common/IndirectDataValidationHelper.h" +#include "ISISEnergyTransferPresenter.h" #include "MantidQtWidgets/Common/AlgorithmDialog.h" #include "MantidQtWidgets/Common/InterfaceManager.h" @@ -19,7 +20,7 @@ using namespace MantidQt::API; namespace MantidQt::CustomInterfaces { -IETView::IETView(IETViewSubscriber *subscriber, QWidget *parent) : m_subscriber(subscriber) { +IETView::IETView(QWidget *parent) { m_uiForm.setupUi(parent); connect(m_uiForm.pbPlotTime, SIGNAL(clicked()), this, SLOT(plotRawClicked())); @@ -40,6 +41,8 @@ IETView::IETView(IETViewSubscriber *subscriber, QWidget *parent) : m_subscriber( IETView::~IETView() {} +void IETView::subscribePresenter(IIETPresenter *presenter) { m_presenter = presenter; } + IETRunData IETView::getRunData() const { IETInputData inputDetails(m_uiForm.dsRunFiles->getFilenames().join(",").toStdString(), m_uiForm.dsRunFiles->getText().toStdString(), m_uiForm.ckSumFiles->isChecked(), @@ -288,19 +291,19 @@ void IETView::updateRunButton(bool enabled, std::string const &enableOutputButto } } -void IETView::showMessageBox(const QString &message) { m_subscriber->notifyNewMessage(message); } +void IETView::showMessageBox(const QString &message) { m_presenter->notifyNewMessage(message); } -void IETView::saveClicked() { m_subscriber->notifySaveClicked(); } +void IETView::saveClicked() { m_presenter->notifySaveClicked(); } -void IETView::runClicked() { m_subscriber->notifyRunClicked(); } +void IETView::runClicked() { m_presenter->notifyRunClicked(); } -void IETView::plotRawClicked() { m_subscriber->notifyPlotRawClicked(); } +void IETView::plotRawClicked() { m_presenter->notifyPlotRawClicked(); } void IETView::saveCustomGroupingClicked(std::string const &customGrouping) { - m_subscriber->notifySaveCustomGroupingClicked(customGrouping); + m_presenter->notifySaveCustomGroupingClicked(customGrouping); } -void IETView::pbRunFinished() { m_subscriber->notifyRunFinished(); } +void IETView::pbRunFinished() { m_presenter->notifyRunFinished(); } void IETView::handleDataReady() { UserInputValidator uiv; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h index 0e24b95d774a..a405ad6cf9c7 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h @@ -16,24 +16,17 @@ namespace MantidQt { namespace CustomInterfaces { class DetectorGroupingOptions; - -class MANTIDQT_INDIRECT_DLL IETViewSubscriber { -public: - virtual void notifyNewMessage(const QString &message) = 0; - virtual void notifySaveClicked() = 0; - virtual void notifyRunClicked() = 0; - virtual void notifyPlotRawClicked() = 0; - virtual void notifySaveCustomGroupingClicked(std::string const &customGrouping) = 0; - virtual void notifyRunFinished() = 0; -}; +class IIETPresenter; class MANTIDQT_INDIRECT_DLL IETView : public QWidget { Q_OBJECT public: - IETView(IETViewSubscriber *subscriber, QWidget *parent = nullptr); + IETView(QWidget *parent = nullptr); ~IETView(); + void subscribePresenter(IIETPresenter *presenter); + IETRunData getRunData() const; IETPlotData getPlotData() const; IETSaveData getSaveData() const; @@ -108,7 +101,7 @@ private slots: std::vector m_outputWorkspaces; Ui::ISISEnergyTransfer m_uiForm; - IETViewSubscriber *m_subscriber; + IIETPresenter *m_presenter; DetectorGroupingOptions *m_groupingWidget; }; } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp index 0170bc09423b..99f29a6dafc4 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp @@ -77,7 +77,7 @@ void IndirectDataReduction::initLayout() { m_uiForm.pbSettings->setIcon(Settings::icon()); // Create the tabs - addTab("ISIS Energy Transfer"); + addMVPTab("ISIS Energy Transfer"); addTab("ISIS Calibration"); addTab("ISIS Diagnostics"); addTab("Transmission"); From 308eab5fc9d756d51d87dfcc0f297c8ba942f9f9 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 12:47:44 +0000 Subject: [PATCH 03/23] Pass model into presenter constructor for ISISEnergyTransfer tab --- .../Indirect/Reduction/ISISEnergyTransferPresenter.cpp | 4 ++-- .../Indirect/Reduction/ISISEnergyTransferPresenter.h | 4 ++-- .../Indirect/Reduction/IndirectDataReduction.cpp | 2 +- .../Indirect/Reduction/IndirectDataReduction.h | 5 +++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp index 2ed51dcc8ace..81d7569aec3b 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp @@ -28,8 +28,8 @@ using MantidQt::API::BatchAlgorithmRunner; namespace MantidQt::CustomInterfaces { -IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IETView *view) - : IndirectDataReductionTab(idrUI), m_model(std::make_unique()), m_view(view) { +IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IETView *view, std::unique_ptr model) + : IndirectDataReductionTab(idrUI), m_view(view), m_model(std::move(model)) { m_view->subscribePresenter(this); setOutputPlotOptionsPresenter( diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h index cdd58e4dd796..51c5ff6c2f56 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h @@ -30,7 +30,7 @@ class MANTIDQT_INDIRECT_DLL IETPresenter : public IndirectDataReductionTab, publ Q_OBJECT public: - IETPresenter(IndirectDataReduction *idrUI, IETView *view); + IETPresenter(IndirectDataReduction *idrUI, IETView *view, std::unique_ptr model); ~IETPresenter() override; void setup() override; @@ -64,8 +64,8 @@ private slots: std::string m_outputGroupName; std::vector m_outputWorkspaces; - std::unique_ptr m_model; IETView *m_view; + std::unique_ptr m_model; }; } // namespace CustomInterfaces } // namespace MantidQt \ No newline at end of file diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp index 99f29a6dafc4..262cac0c1e96 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp @@ -77,7 +77,7 @@ void IndirectDataReduction::initLayout() { m_uiForm.pbSettings->setIcon(Settings::icon()); // Create the tabs - addMVPTab("ISIS Energy Transfer"); + addMVPTab("ISIS Energy Transfer"); addTab("ISIS Calibration"); addTab("ISIS Diagnostics"); addTab("Transmission"); diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h index 6b04f9898067..445970ad5d25 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h @@ -139,7 +139,7 @@ private slots: * @param name Name to be displayed on tab */ - template void addMVPTab(const QString &name) { + template void addMVPTab(const QString &name) { QWidget *tabWidget = new QWidget(m_uiForm.twIDRTabs); QVBoxLayout *tabLayout = new QVBoxLayout(tabWidget); tabWidget->setLayout(tabLayout); @@ -153,7 +153,8 @@ private slots: tabScrollArea->setWidget(tabContent); tabScrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - IndirectDataReductionTab *tabIDRContent = new TabPresenter(this, new TabView(tabContent)); + IndirectDataReductionTab *tabIDRContent = + new TabPresenter(this, new TabView(tabContent), std::make_unique()); tabIDRContent->setupTab(); tabContent->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); From 123eccfc5ad149f2af9a5b575b1bccefc7323606 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 15:08:16 +0000 Subject: [PATCH 04/23] Add interface class for IETView --- .../Reduction/ISISEnergyTransferPresenter.cpp | 20 +-- .../Reduction/ISISEnergyTransferPresenter.h | 7 +- .../Reduction/ISISEnergyTransferView.cpp | 35 ++-- .../Reduction/ISISEnergyTransferView.h | 155 ++++++++++++------ 4 files changed, 128 insertions(+), 89 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp index 81d7569aec3b..8550835661ef 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp @@ -28,7 +28,7 @@ using MantidQt::API::BatchAlgorithmRunner; namespace MantidQt::CustomInterfaces { -IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IETView *view, std::unique_ptr model) +IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model) : IndirectDataReductionTab(idrUI), m_view(view), m_model(std::move(model)) { m_view->subscribePresenter(this); @@ -36,9 +36,6 @@ IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IETView *view, std::uni std::make_unique(m_view->getPlotOptionsView(), PlotWidget::SpectraSliceSurface)); connect(this, SIGNAL(newInstrumentConfiguration()), this, SLOT(setInstrumentDefault())); - - connect(this, SIGNAL(updateRunButton(bool, std::string const &, QString const &, QString const &)), m_view, - SLOT(updateRunButton(bool, std::string const &, QString const &, QString const &))); } IETPresenter::~IETPresenter() = default; @@ -180,11 +177,16 @@ void IETPresenter::run() { connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(algorithmComplete(bool))); disconnect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(plotRawComplete(bool))); + m_view->setRunButtonText("Running..."); + m_view->setEnableOutputOptions(false); + m_outputGroupName = m_model->runIETAlgorithm(m_batchAlgoRunner, instrumentData, runData); } void IETPresenter::algorithmComplete(bool error) { disconnect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(algorithmComplete(bool))); + m_view->setRunButtonText("Run"); + m_view->setEnableOutputOptions(!error); if (!error) { InstrumentData instrumentData = getInstrumentData(); @@ -261,12 +263,11 @@ void IETPresenter::notifySaveCustomGroupingClicked(std::string const &customGrou void IETPresenter::notifyRunFinished() { if (!m_view->isRunFilesValid()) { - m_view->updateRunButton(false, "unchanged", "Invalid Run(s)", - "Cannot find data files for some of the run numbers entered."); + m_view->setRunButtonText("Invalid Run(s)"); } else { double detailedBalance = m_model->loadDetailedBalance(m_view->getFirstFilename()); m_view->setDetailedBalance(detailedBalance); - m_view->updateRunButton(); + m_view->setRunButtonText("Run"); } m_view->setRunFilesEnabled(true); } @@ -281,11 +282,6 @@ void IETPresenter::setFileExtensionsByName(bool filter) { m_view->setFileExtensionsByName(fbSuffixes, wsSuffixes); } -void IETPresenter::updateRunButton(bool enabled, std::string const &enableOutputButtons, QString const &message, - QString const &tooltip) { - m_view->updateRunButton(enabled, enableOutputButtons, message, tooltip); -} - void IETPresenter::notifyNewMessage(QString const &message) { showMessageBox(message); } } // namespace MantidQt::CustomInterfaces \ No newline at end of file diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h index 51c5ff6c2f56..fabfafe26396 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h @@ -30,7 +30,7 @@ class MANTIDQT_INDIRECT_DLL IETPresenter : public IndirectDataReductionTab, publ Q_OBJECT public: - IETPresenter(IndirectDataReduction *idrUI, IETView *view, std::unique_ptr model); + IETPresenter(IndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model); ~IETPresenter() override; void setup() override; @@ -49,9 +49,6 @@ public slots: private slots: void algorithmComplete(bool error); void plotRawComplete(bool error); - - void updateRunButton(bool enabled = true, std::string const &enableOutputButtons = "unchanged", - QString const &message = "Run", QString const &tooltip = ""); void setInstrumentDefault(); private: @@ -64,7 +61,7 @@ private slots: std::string m_outputGroupName; std::vector m_outputWorkspaces; - IETView *m_view; + IIETView *m_view; std::unique_ptr m_model; }; } // namespace CustomInterfaces diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp index 80d06d105e27..6b9e86a99c38 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp @@ -201,7 +201,7 @@ void IETView::setSaveEnabled(bool enable) { void IETView::setPlotTimeIsPlotting(bool plotting) { m_uiForm.pbPlotTime->setText(plotting ? "Plotting..." : "Plot"); - setButtonsEnabled(!plotting); + setEnableOutputOptions(!plotting); } void IETView::setFileExtensionsByName(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes) { @@ -279,16 +279,16 @@ void IETView::setInstrumentSpecDefault(std::map &specMap) { m_uiForm.ckFold->setChecked(specMap["defaultFoldMultiple"]); } -void IETView::updateRunButton(bool enabled, std::string const &enableOutputButtons, QString const &message, - QString const &tooltip) { - setRunEnabled(enabled); - m_uiForm.pbRun->setText(message); - m_uiForm.pbRun->setToolTip(tooltip); - if (enableOutputButtons != "unchanged") { - auto const enableButtons = enableOutputButtons == "enable"; - setPlotTimeEnabled(enableButtons); - setSaveEnabled(enableButtons); - } +void IETView::setRunButtonText(std::string const &runText) { + m_uiForm.pbRun->setText(QString::fromStdString(runText)); + m_uiForm.pbRun->setEnabled(runText == "Run"); + m_uiForm.pbRun->setToolTip(runText == "Invalid Run(s)" ? "Cannot find data files for some of the run numbers entered." + : ""); +} + +void IETView::setEnableOutputOptions(bool const enable) { + setPlotTimeEnabled(enable); + setSaveEnabled(enable); } void IETView::showMessageBox(const QString &message) { m_presenter->notifyNewMessage(message); } @@ -314,26 +314,17 @@ void IETView::handleDataReady() { emit showMessageBox(errorMessage); } -void IETView::pbRunEditing() { - updateRunButton(false, "unchanged", "Editing...", "Run numbers are currently being edited."); -} +void IETView::pbRunEditing() { setRunButtonText("Editing..."); } void IETView::pbRunFinding() { - updateRunButton(false, "unchanged", "Finding files...", "Searching for data files for the run numbers entered..."); + setRunButtonText("Finding files..."); m_uiForm.dsRunFiles->setEnabled(false); } -void IETView::setRunEnabled(bool enable) { m_uiForm.pbRun->setEnabled(enable); } - void IETView::setPlotTimeEnabled(bool enable) { m_uiForm.pbPlotTime->setEnabled(enable); m_uiForm.spPlotTimeSpecMin->setEnabled(enable); m_uiForm.spPlotTimeSpecMax->setEnabled(enable); } -void IETView::setButtonsEnabled(bool enable) { - setRunEnabled(enable); - setPlotTimeEnabled(enable); - setSaveEnabled(enable); -} } // namespace MantidQt::CustomInterfaces \ No newline at end of file diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h index a405ad6cf9c7..f60ff0e4bd52 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h @@ -18,68 +18,125 @@ namespace CustomInterfaces { class DetectorGroupingOptions; class IIETPresenter; -class MANTIDQT_INDIRECT_DLL IETView : public QWidget { +class MANTIDQT_INDIRECT_DLL IIETView { +public: + virtual void subscribePresenter(IIETPresenter *presenter) = 0; + + virtual IETRunData getRunData() const = 0; + virtual IETPlotData getPlotData() const = 0; + virtual IETSaveData getSaveData() const = 0; + + virtual std::string getGroupOutputOption() const = 0; + virtual OutputPlotOptionsView *getPlotOptionsView() const = 0; + virtual bool getGroupOutputCheckbox() const = 0; + + virtual std::string getFirstFilename() const = 0; + + virtual bool isRunFilesValid() const = 0; + virtual void validateCalibrationFileType(UserInputValidator &uiv) const = 0; + virtual void validateRebinString(UserInputValidator &uiv) const = 0; + virtual std::optional validateGroupingProperties(std::size_t const &spectraMin, + std::size_t const &spectraMax) const = 0; + + virtual bool showRebinWidthPrompt() const = 0; + virtual void showSaveCustomGroupingDialog(std::string const &customGroupingOutput, + std::string const &defaultGroupingFilename, + std::string const &saveDirectory) const = 0; + virtual void displayWarning(std::string const &message) const = 0; + + virtual void setCalibVisible(bool visible) = 0; + virtual void setEfixedVisible(bool visible) = 0; + virtual void setBackgroundSectionVisible(bool visible) = 0; + virtual void setPlotTimeSectionVisible(bool visible) = 0; + virtual void setAnalysisSectionVisible(bool visible) = 0; + virtual void setPlottingOptionsVisible(bool visible) = 0; + virtual void setAclimaxSaveVisible(bool visible) = 0; + virtual void setSPEVisible(bool visible) = 0; + virtual void setFoldMultipleFramesVisible(bool visible) = 0; + virtual void setOutputInCm1Visible(bool visible) = 0; + virtual void setGroupOutputCheckBoxVisible(bool visible) = 0; + virtual void setGroupOutputDropdownVisible(bool visible) = 0; + + virtual void setInstrumentDefault(InstrumentData const &instrumentDetails) = 0; + virtual void setDetailedBalance(double detailedBalance) = 0; + virtual void setRunFilesEnabled(bool enable) = 0; + virtual void setSingleRebin(bool enable) = 0; + virtual void setMultipleRebin(bool enable) = 0; + virtual void setSaveEnabled(bool enable) = 0; + virtual void setPlotTimeIsPlotting(bool plotting) = 0; + virtual void setFileExtensionsByName(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes) = 0; + virtual void setOutputWorkspaces(std::vector const &outputWorkspaces) = 0; + virtual void setRunButtonText(std::string const &runText) = 0; + virtual void setEnableOutputOptions(bool const enable) = 0; + + virtual void setInstrumentSpectraRange(int specMin, int specMax) = 0; + virtual void setInstrumentRebinning(std::vector const &rebinParams, std::string const &rebinText, bool checked, + int tabIndex) = 0; + virtual void setInstrumentEFixed(std::string const &instrumentName, double eFixed) = 0; + virtual void setInstrumentGrouping(std::string const &instrumentName) = 0; + virtual void setInstrumentSpecDefault(std::map &specMap) = 0; +}; + +class MANTIDQT_INDIRECT_DLL IETView : public QWidget, public IIETView { Q_OBJECT public: IETView(QWidget *parent = nullptr); ~IETView(); - void subscribePresenter(IIETPresenter *presenter); + void subscribePresenter(IIETPresenter *presenter) override; - IETRunData getRunData() const; - IETPlotData getPlotData() const; - IETSaveData getSaveData() const; + IETRunData getRunData() const override; + IETPlotData getPlotData() const override; + IETSaveData getSaveData() const override; - std::string getGroupOutputOption() const; - OutputPlotOptionsView *getPlotOptionsView() const; - bool getGroupOutputCheckbox() const; + std::string getGroupOutputOption() const override; + OutputPlotOptionsView *getPlotOptionsView() const override; + bool getGroupOutputCheckbox() const override; - std::string getFirstFilename() const; + std::string getFirstFilename() const override; - bool isRunFilesValid() const; - void validateCalibrationFileType(UserInputValidator &uiv) const; - void validateRebinString(UserInputValidator &uiv) const; + bool isRunFilesValid() const override; + void validateCalibrationFileType(UserInputValidator &uiv) const override; + void validateRebinString(UserInputValidator &uiv) const override; std::optional validateGroupingProperties(std::size_t const &spectraMin, - std::size_t const &spectraMax) const; + std::size_t const &spectraMax) const override; - bool showRebinWidthPrompt() const; + bool showRebinWidthPrompt() const override; void showSaveCustomGroupingDialog(std::string const &customGroupingOutput, std::string const &defaultGroupingFilename, - std::string const &saveDirectory) const; - void displayWarning(std::string const &message) const; - - void setCalibVisible(bool visible); - void setEfixedVisible(bool visible); - void setBackgroundSectionVisible(bool visible); - void setPlotTimeSectionVisible(bool visible); - void setAnalysisSectionVisible(bool visible); - void setPlottingOptionsVisible(bool visible); - void setAclimaxSaveVisible(bool visible); - void setSPEVisible(bool visible); - void setFoldMultipleFramesVisible(bool visible); - void setOutputInCm1Visible(bool visible); - void setGroupOutputCheckBoxVisible(bool visible); - void setGroupOutputDropdownVisible(bool visible); - - void setDetailedBalance(double detailedBalance); - void setRunFilesEnabled(bool enable); - void setSingleRebin(bool enable); - void setMultipleRebin(bool enable); - void setSaveEnabled(bool enable); - void setPlotTimeIsPlotting(bool plotting); - void setFileExtensionsByName(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes); - void setOutputWorkspaces(std::vector const &outputWorkspaces); - - void setInstrumentSpectraRange(int specMin, int specMax); + std::string const &saveDirectory) const override; + void displayWarning(std::string const &message) const override; + + void setCalibVisible(bool visible) override; + void setEfixedVisible(bool visible) override; + void setBackgroundSectionVisible(bool visible) override; + void setPlotTimeSectionVisible(bool visible) override; + void setAnalysisSectionVisible(bool visible) override; + void setPlottingOptionsVisible(bool visible) override; + void setAclimaxSaveVisible(bool visible) override; + void setSPEVisible(bool visible) override; + void setFoldMultipleFramesVisible(bool visible) override; + void setOutputInCm1Visible(bool visible) override; + void setGroupOutputCheckBoxVisible(bool visible) override; + void setGroupOutputDropdownVisible(bool visible) override; + + void setDetailedBalance(double detailedBalance) override; + void setRunFilesEnabled(bool enable) override; + void setSingleRebin(bool enable) override; + void setMultipleRebin(bool enable) override; + void setSaveEnabled(bool enable) override; + void setPlotTimeIsPlotting(bool plotting) override; + void setFileExtensionsByName(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes) override; + void setOutputWorkspaces(std::vector const &outputWorkspaces) override; + void setRunButtonText(std::string const &runText) override; + void setEnableOutputOptions(bool const enable) override; + + void setInstrumentSpectraRange(int specMin, int specMax) override; void setInstrumentRebinning(std::vector const &rebinParams, std::string const &rebinText, bool checked, - int tabIndex); - void setInstrumentEFixed(std::string const &instrumentName, double eFixed); - void setInstrumentGrouping(std::string const &instrumentName); - void setInstrumentSpecDefault(std::map &specMap); - -public slots: - void updateRunButton(bool enabled = true, std::string const &enableOutputButtons = "unchanged", - QString const &message = "Run", QString const &tooltip = ""); + int tabIndex) override; + void setInstrumentEFixed(std::string const &instrumentName, double eFixed) override; + void setInstrumentGrouping(std::string const &instrumentName) override; + void setInstrumentSpecDefault(std::map &specMap) override; private slots: void showMessageBox(const QString &message); @@ -95,9 +152,7 @@ private slots: void pbRunFinding(); private: - void setRunEnabled(bool enable); void setPlotTimeEnabled(bool enable); - void setButtonsEnabled(bool enable); std::vector m_outputWorkspaces; Ui::ISISEnergyTransfer m_uiForm; From d48a99717d372d2a9db6e80dc6b8173e54e6d012 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 15:17:12 +0000 Subject: [PATCH 05/23] Add interface class for IETModel --- .../Reduction/ISISEnergyTransferModel.h | 62 +++++++++++++------ .../Reduction/ISISEnergyTransferPresenter.cpp | 2 +- .../Reduction/ISISEnergyTransferPresenter.h | 4 +- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h index 36897fb2dbcb..e2e0aedb2f5f 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h @@ -17,12 +17,54 @@ using namespace Mantid::API; namespace MantidQt { namespace CustomInterfaces { -class MANTIDQT_INDIRECT_DLL IETModel { + +class MANTIDQT_INDIRECT_DLL IIETModel { +public: + virtual void setInstrumentProperties(IAlgorithmRuntimeProps &properties, InstrumentData const &instData) = 0; + + virtual std::vector validateRunData(IETRunData const &runData) = 0; + virtual std::vector validatePlotData(IETPlotData const &plotData) = 0; + + virtual std::string runIETAlgorithm(MantidQt::API::BatchAlgorithmRunner *batchAlgoRunner, + InstrumentData const &instData, IETRunData &runParams) = 0; + virtual std::deque + plotRawAlgorithmQueue(InstrumentData const &instData, IETPlotData const &plotData) const = 0; + + virtual void saveWorkspace(std::string const &workspaceName, IETSaveData const &saveData) = 0; + + virtual void createGroupingWorkspace(std::string const &instrumentName, std::string const &analyser, + std::string const &customGrouping, std::string const &outputName) = 0; + virtual double loadDetailedBalance(std::string const &filename) = 0; + + virtual std::vector groupWorkspaces(std::string const &groupName, std::string const &instrument, + std::string const &groupOption, bool const shouldGroup) = 0; +}; + +class MANTIDQT_INDIRECT_DLL IETModel : public IIETModel { public: IETModel(); ~IETModel() = default; - void setInstrumentProperties(IAlgorithmRuntimeProps &properties, InstrumentData const &instData); + void setInstrumentProperties(IAlgorithmRuntimeProps &properties, InstrumentData const &instData) override; + + std::vector validateRunData(IETRunData const &runData) override; + std::vector validatePlotData(IETPlotData const &plotData) override; + + std::string runIETAlgorithm(MantidQt::API::BatchAlgorithmRunner *batchAlgoRunner, InstrumentData const &instData, + IETRunData &runParams) override; + std::deque + plotRawAlgorithmQueue(InstrumentData const &instData, IETPlotData const &plotData) const override; + + void saveWorkspace(std::string const &workspaceName, IETSaveData const &saveData) override; + + void createGroupingWorkspace(std::string const &instrumentName, std::string const &analyser, + std::string const &customGrouping, std::string const &outputName) override; + double loadDetailedBalance(std::string const &filename) override; + + std::vector groupWorkspaces(std::string const &groupName, std::string const &instrument, + std::string const &groupOption, bool const shouldGroup) override; + +private: void setInputProperties(IAlgorithmRuntimeProps &properties, IETInputData const &inputData); void setConversionProperties(IAlgorithmRuntimeProps &properties, IETConversionData const &conversionData, std::string const &instrument); @@ -33,31 +75,15 @@ class MANTIDQT_INDIRECT_DLL IETModel { std::string const &outputGroupName); std::string getOuputGroupName(InstrumentData const &instData, std::string const &inputFiles); - std::vector validateRunData(IETRunData const &runData); - std::vector validatePlotData(IETPlotData const &plotData); - - std::string runIETAlgorithm(MantidQt::API::BatchAlgorithmRunner *batchAlgoRunner, InstrumentData const &instData, - IETRunData &runParams); - std::deque plotRawAlgorithmQueue(InstrumentData const &instData, - IETPlotData const &plotData) const; - - void saveWorkspace(std::string const &workspaceName, IETSaveData const &saveData); void saveDaveGroup(std::string const &workspaceName, std::string const &outputName); void saveAclimax(std::string const &workspaceName, std::string const &outputName, std::string const &xUnits = "DeltaE_inWavenumber"); void save(std::string const &algorithmName, std::string const &workspaceName, std::string const &outputName, int const version = -1, std::string const &separator = ""); - void createGroupingWorkspace(std::string const &instrumentName, std::string const &analyser, - std::string const &customGrouping, std::string const &outputName); - double loadDetailedBalance(std::string const &filename); - - std::vector groupWorkspaces(std::string const &groupName, std::string const &instrument, - std::string const &groupOption, bool const shouldGroup); void ungroupWorkspace(std::string const &workspaceName); void groupWorkspaceBySampleChanger(std::string const &workspaceName); -private: std::deque plotRawAlgorithmQueue(std::string const &rawFile, std::string const &basename, std::string const &instrumentName, std::vector const &detectorList, IETBackgroundData const &backgroundData) const; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp index 8550835661ef..b27fac56fb97 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp @@ -28,7 +28,7 @@ using MantidQt::API::BatchAlgorithmRunner; namespace MantidQt::CustomInterfaces { -IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model) +IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model) : IndirectDataReductionTab(idrUI), m_view(view), m_model(std::move(model)) { m_view->subscribePresenter(this); diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h index fabfafe26396..ed78f83d8e3e 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h @@ -30,7 +30,7 @@ class MANTIDQT_INDIRECT_DLL IETPresenter : public IndirectDataReductionTab, publ Q_OBJECT public: - IETPresenter(IndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model); + IETPresenter(IndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model); ~IETPresenter() override; void setup() override; @@ -62,7 +62,7 @@ private slots: std::vector m_outputWorkspaces; IIETView *m_view; - std::unique_ptr m_model; + std::unique_ptr m_model; }; } // namespace CustomInterfaces } // namespace MantidQt \ No newline at end of file From 371e29f5e17b0a9e15c0e038cab534fa73900b42 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 15:27:16 +0000 Subject: [PATCH 06/23] Move common setup for ISISEnergyTransferModel test --- .../Reduction/ISISEnergyTransferModel.cpp | 4 +- .../Reduction/ISISEnergyTransferModel.h | 5 +- .../Reduction/ISISEnergyTransferModelTest.h | 62 ++++++++----------- 3 files changed, 30 insertions(+), 41 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.cpp index 69dba23eb8c9..d4f297dfb8f0 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.cpp @@ -110,7 +110,7 @@ void IETModel::setOutputProperties(IAlgorithmRuntimeProps &properties, IETOutput Mantid::API::AlgorithmProperties::update("OutputWorkspace", outputGroupName, properties); } -std::string IETModel::getOuputGroupName(InstrumentData const &instData, std::string const &inputText) { +std::string IETModel::getOutputGroupName(InstrumentData const &instData, std::string const &inputText) { std::string instrument = instData.getInstrument(); std::string analyser = instData.getAnalyser(); std::string reflection = instData.getReflection(); @@ -129,7 +129,7 @@ std::string IETModel::runIETAlgorithm(MantidQt::API::BatchAlgorithmRunner *batch setRebinProperties(*properties, runData.getRebinData()); setAnalysisProperties(*properties, runData.getAnalysisData()); - std::string outputGroupName = getOuputGroupName(instData, runData.getInputData().getInputText()); + std::string outputGroupName = getOutputGroupName(instData, runData.getInputData().getInputText()); setOutputProperties(*properties, runData.getOutputData(), outputGroupName); auto reductionAlg = AlgorithmManager::Instance().create("ISISIndirectEnergyTransfer"); diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h index e2e0aedb2f5f..cfee4e864165 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h @@ -64,7 +64,7 @@ class MANTIDQT_INDIRECT_DLL IETModel : public IIETModel { std::vector groupWorkspaces(std::string const &groupName, std::string const &instrument, std::string const &groupOption, bool const shouldGroup) override; -private: + // Public for testing purposes void setInputProperties(IAlgorithmRuntimeProps &properties, IETInputData const &inputData); void setConversionProperties(IAlgorithmRuntimeProps &properties, IETConversionData const &conversionData, std::string const &instrument); @@ -73,8 +73,9 @@ class MANTIDQT_INDIRECT_DLL IETModel : public IIETModel { void setAnalysisProperties(IAlgorithmRuntimeProps &properties, IETAnalysisData const &analysisData); void setOutputProperties(IAlgorithmRuntimeProps &properties, IETOutputData const &outputData, std::string const &outputGroupName); - std::string getOuputGroupName(InstrumentData const &instData, std::string const &inputFiles); + std::string getOutputGroupName(InstrumentData const &instData, std::string const &inputFiles); +private: void saveDaveGroup(std::string const &workspaceName, std::string const &outputName); void saveAclimax(std::string const &workspaceName, std::string const &outputName, std::string const &xUnits = "DeltaE_inWavenumber"); diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h index f2eb1a4dd5fe..b39cf5d667e7 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h @@ -131,16 +131,21 @@ DECLARE_ALGORITHM(ISISIndirectEnergyTransfer) class ISISEnergyTransferModelTest : public CxxTest::TestSuite { public: ISISEnergyTransferModelTest() = default; - void setUp() override { AnalysisDataService::Instance().clear(); } + void setUp() override { + m_model = std::make_unique(); + AnalysisDataService::Instance().clear(); + } - void tearDown() override { AnalysisDataService::Instance().clear(); } + void tearDown() override { + m_model.reset(); + AnalysisDataService::Instance().clear(); + } void testSetInstrumentProperties() { - auto model = makeModel(); auto properties = std::make_unique(); InstrumentData instData("instrument", "analyser", "reflection"); - model->setInstrumentProperties(*properties, instData); + m_model->setInstrumentProperties(*properties, instData); TS_ASSERT_EQUALS(properties->getPropertyValue("Instrument"), "instrument"); TS_ASSERT_EQUALS(properties->getPropertyValue("Analyser"), "analyser"); @@ -148,11 +153,10 @@ class ISISEnergyTransferModelTest : public CxxTest::TestSuite { } void testSetInputPropertiesWithAllEnabled() { - auto model = makeModel(); auto properties = std::make_unique(); IETInputData inputData("input_workspace", "input_workspace", true, true, true, "calibration_workspace"); - model->setInputProperties(*properties, inputData); + m_model->setInputProperties(*properties, inputData); TS_ASSERT_EQUALS(properties->getPropertyValue("InputFiles"), "input_workspace"); TS_ASSERT_EQUALS(properties->getPropertyValue("SumFiles"), "1"); @@ -161,11 +165,10 @@ class ISISEnergyTransferModelTest : public CxxTest::TestSuite { } void testSetInputPropertiesWithAllDisabled() { - auto model = makeModel(); auto properties = std::make_unique(); IETInputData inputData("input_workspace", "input_workspace", false, false, false, ""); - model->setInputProperties(*properties, inputData); + m_model->setInputProperties(*properties, inputData); TS_ASSERT_EQUALS(properties->getPropertyValue("InputFiles"), "input_workspace"); TS_ASSERT_EQUALS(properties->getPropertyValue("SumFiles"), "0"); @@ -174,123 +177,111 @@ class ISISEnergyTransferModelTest : public CxxTest::TestSuite { } void testSetConversionPropertiesWithoutEfixed() { - auto model = makeModel(); auto properties = std::make_unique(); IETConversionData conversionData(1.0, 1, 2); - model->setConversionProperties(*properties, conversionData, "instrument"); + m_model->setConversionProperties(*properties, conversionData, "instrument"); TS_ASSERT(!properties->existsProperty("Efixed")); TS_ASSERT_EQUALS(properties->getPropertyValue("SpectraRange"), "1, 2"); } void testSetConversionPropertiesWithEfixed() { - auto model = makeModel(); auto properties = std::make_unique(); IETConversionData conversionData(1.0, 1, 2); - model->setConversionProperties(*properties, conversionData, "IRIS"); + m_model->setConversionProperties(*properties, conversionData, "IRIS"); TS_ASSERT_EQUALS(properties->getPropertyValue("Efixed"), "1"); TS_ASSERT_EQUALS(properties->getPropertyValue("SpectraRange"), "1, 2"); } void testSetBackgroundPropertiesWithBackgroundEnabled() { - auto model = makeModel(); auto properties = std::make_unique(); IETBackgroundData backgroundData(true, 1.0, 2.0); - model->setBackgroundProperties(*properties, backgroundData); + m_model->setBackgroundProperties(*properties, backgroundData); TS_ASSERT_EQUALS(properties->getPropertyValue("BackgroundRange"), "1, 2"); } void testSetBackgroundPropertiesWithBackgroundDisabled() { - auto model = makeModel(); auto properties = std::make_unique(); IETBackgroundData backgroundData(false, 1.0, 2.0); - model->setBackgroundProperties(*properties, backgroundData); + m_model->setBackgroundProperties(*properties, backgroundData); TS_ASSERT(!properties->existsProperty("BackgroundRange")); } void testSetRebinPropertiesWithMultipleRebin() { - auto model = makeModel(); auto properties = std::make_unique(); IETRebinData rebinData(true, "Multiple", 1.0, 2.0, 3.0, "1,2,10"); - model->setRebinProperties(*properties, rebinData); + m_model->setRebinProperties(*properties, rebinData); TS_ASSERT_EQUALS(properties->getPropertyValue("RebinString"), "1,2,10"); } void testSetRebinPropertiesWithMultipleLogRebin() { - auto model = makeModel(); auto properties = std::make_unique(); IETRebinData rebinData(true, "Multiple", 1.0, 2.0, 3.0, "2,-0.035,10"); - model->setRebinProperties(*properties, rebinData); + m_model->setRebinProperties(*properties, rebinData); TS_ASSERT_EQUALS(properties->getPropertyValue("RebinString"), "2,-0.035,10"); } void testSetRebinPropertiesWithMultipleVariableRangeRebin() { - auto model = makeModel(); auto properties = std::make_unique(); IETRebinData rebinData(true, "Multiple", 1.0, 2.0, 3.0, "0,2,10,4,20"); - model->setRebinProperties(*properties, rebinData); + m_model->setRebinProperties(*properties, rebinData); TS_ASSERT_EQUALS(properties->getPropertyValue("RebinString"), "0,2,10,4,20"); } void testSetRebinPropertiesWithSingleRebin() { - auto model = makeModel(); auto properties = std::make_unique(); IETRebinData rebinData(true, "Single", 0.0, 2.0, 6.0, ""); - model->setRebinProperties(*properties, rebinData); + m_model->setRebinProperties(*properties, rebinData); TS_ASSERT_EQUALS(properties->getPropertyValue("RebinString"), "0.000000,6.000000,2.000000"); } void testSetRebinPropertiesWithNoRebin() { - auto model = makeModel(); auto properties = std::make_unique(); IETRebinData rebinData(false, "Single", 0.0, 0.0, 0.0, "1.0, 3.0, 5.0"); - model->setRebinProperties(*properties, rebinData); + m_model->setRebinProperties(*properties, rebinData); TS_ASSERT(!properties->existsProperty("RebinString")); } void testSetAnalysisPropertiesWithPropsEnabled() { - auto model = makeModel(); auto properties = std::make_unique(); IETAnalysisData analysisData(true, 2.5); - model->setAnalysisProperties(*properties, analysisData); + m_model->setAnalysisProperties(*properties, analysisData); TS_ASSERT_EQUALS(properties->getPropertyValue("DetailedBalance"), "2.5"); } void testSetAnalysisPropertiesWithPropsDisabled() { - auto model = makeModel(); auto properties = std::make_unique(); IETAnalysisData analysisData(false, 2.5); - model->setAnalysisProperties(*properties, analysisData); + m_model->setAnalysisProperties(*properties, analysisData); TS_ASSERT(!properties->existsProperty("DetailedBalance")); } void testSetOutputPropertiesWithPropsEnabled() { - auto model = makeModel(); auto properties = std::make_unique(); IETOutputData outputData(true, true); - model->setOutputProperties(*properties, outputData, "output"); + m_model->setOutputProperties(*properties, outputData, "output"); TS_ASSERT_EQUALS(properties->getPropertyValue("UnitX"), "DeltaE_inWavenumber"); TS_ASSERT_EQUALS(properties->getPropertyValue("FoldMultipleFrames"), "1"); @@ -298,11 +289,10 @@ class ISISEnergyTransferModelTest : public CxxTest::TestSuite { } void testSetOutputPropertiesWithPropsDisabled() { - auto model = makeModel(); auto properties = std::make_unique(); IETOutputData outputData(false, false); - model->setOutputProperties(*properties, outputData, "output"); + m_model->setOutputProperties(*properties, outputData, "output"); TS_ASSERT(!properties->existsProperty("UnitX")); TS_ASSERT_EQUALS(properties->getPropertyValue("FoldMultipleFrames"), "0"); @@ -310,11 +300,10 @@ class ISISEnergyTransferModelTest : public CxxTest::TestSuite { } void testGetOutputGroupName() { - auto model = makeModel(); InstrumentData instData("instrument", "analyser", "reflection"); std::string inputFiles("1234, 1235"); - std::string outputName = model->getOuputGroupName(instData, inputFiles); + std::string outputName = m_model->getOutputGroupName(instData, inputFiles); TS_ASSERT_EQUALS(outputName, "instrument1234, 1235_analyser_reflection_Reduced"); } @@ -520,7 +509,6 @@ class ISISEnergyTransferModelTest : public CxxTest::TestSuite { } private: - std::unique_ptr makeModel() { return std::make_unique(); } IAlgorithm_sptr makeReductionAlgorithm() { return AlgorithmManager::Instance().create("ISISIndirectEnergyTransfer"); } std::unique_ptr m_model; From 65baa284eef890cd8d94c0ac8f717d7a2920cb6f Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 15:52:38 +0000 Subject: [PATCH 07/23] Fix some warnings in ISISEnergyTransferPresenterTest --- .../ISISEnergyTransferPresenterTest.h | 64 +++++++------------ 1 file changed, 22 insertions(+), 42 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index 1fde6fe86669..1d4aa7e4f6eb 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -12,12 +12,23 @@ #include "Reduction/ISISEnergyTransferPresenter.h" #include "Reduction/IndirectDataReduction.h" +#include "MantidAPI/AlgorithmProperties.h" #include "MantidKernel/WarningSuppressions.h" using namespace MantidQt::CustomInterfaces; using MantidQt::API::BatchAlgorithmRunner; using namespace testing; +namespace { + +std::unique_ptr defaultGroupingProps() { + auto properties = std::make_unique(); + Mantid::API::AlgorithmProperties::update("GroupingMethod", std::string("IPF"), *properties); + return properties; +} + +} // namespace + GNU_DIAG_OFF_SUGGEST_OVERRIDE class MockIETModel : public IETModel { @@ -35,7 +46,7 @@ class MockIETView : public IETView { MOCK_CONST_METHOD0(getCustomGrouping, std::string()); MOCK_CONST_METHOD0(getGroupOutputOption, std::string()); - MOCK_CONST_METHOD0(getPlotOptionsView, IndirectPlotOptionsView *()); + MOCK_CONST_METHOD0(getPlotOptionsView, OutputPlotOptionsView *()); MOCK_CONST_METHOD0(getGroupOutputCheckbox, bool()); MOCK_CONST_METHOD0(getFirstFilename, std::string()); @@ -71,16 +82,9 @@ class MockIETView : public IETView { MOCK_METHOD1(setOutputWorkspaces, void(std::vector const &outputWorkspaces)); MOCK_METHOD1(setInstrumentDefault, void(InstrumentData const &instrumentDetails)); - MOCK_METHOD4(updateRunButton, void(bool enabled, std::string const &enableOutputButtons, QString const &message, - QString const &tooltip)); }; -class MockIndirectDataReduction : public IndirectDataReduction { - Q_OBJECT - -public: - MockIndirectDataReduction() : IndirectDataReduction(nullptr) {} -}; +class MockIndirectDataReduction : public IIndirectDataReduction {}; class IETPresenterTest : public CxxTest::TestSuite { public: @@ -88,50 +92,26 @@ class IETPresenterTest : public CxxTest::TestSuite { static void destroySuite(IETPresenterTest *suite) { delete suite; } void setUp() override { - auto view = std::make_unique>(); auto model = std::make_unique>(); - m_view = view.get(); + m_view = std::make_unique>(); m_model = model.get(); - m_idrUI = new MockIndirectDataReduction(); + m_idrUI = std::make_unique>(); - m_presenter = std::make_unique(std::move(view), std::move(model), m_idrUI); + m_presenter = std::make_unique(m_idrUI.get(), m_view.get(), std::move(model)); } void tearDown() override { - TS_ASSERT(Mock::VerifyAndClearExpectations(m_view)); + TS_ASSERT(Mock::VerifyAndClearExpectations(&m_view)); TS_ASSERT(Mock::VerifyAndClearExpectations(m_model)); - TS_ASSERT(Mock::VerifyAndClearExpectations(m_idrUI)); + TS_ASSERT(Mock::VerifyAndClearExpectations(&m_idrUI)); m_presenter.reset(); } void test_fetch_instrument_data() { - QMap instDetails; - instDetails["spectra-min"] = "1"; - instDetails["spectra-max"] = "10"; - instDetails["Efixed"] = "0.85"; - instDetails["cm-1-convert-choice"] = "true"; - instDetails["save-nexus-choice"] = "true"; - instDetails["save-ascii-choice"] = "true"; - instDetails["fold-frames-choice"] = "true"; - - IETInputData inputData("iris26184_multi_graphite002_red"); - IETConversionData conversionData(0.5, 1, 2); - IETGroupingData groupingData(IETGroupingType::DEFAULT); - IETBackgroundData backgroundData(false); - IETAnalysisData analysisData; - IETRebinData rebinData; - IETOutputData outputData; - - IETRunData runData(inputData, conversionData, groupingData, backgroundData, analysisData, rebinData, outputData); - - auto instrument = QString::fromStdString("IRIS"); - auto analyser = QString::fromStdString("Analyser"); - auto reflection = QString::fromStdString("Reflection"); - ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); - ON_CALL(*m_view, getRunData()).WillByDefault(Return(runData)); + ON_CALL(*m_view, getRunData()); ExpectationSet expectRunData = EXPECT_CALL(*m_view, getRunData()).Times(1); ExpectationSet expectRunAlgo = EXPECT_CALL(*m_model, runIETAlgorithm(_, _, _)).Times(1).After(expectRunData); @@ -142,7 +122,7 @@ class IETPresenterTest : public CxxTest::TestSuite { private: std::unique_ptr m_presenter; - MockIETView *m_view; - MockIETModel *m_model; - IndirectDataReduction *m_idrUI; + std::unique_ptr> m_view; + NiceMock *m_model; + std::unique_ptr> m_idrUI; }; \ No newline at end of file From 42cd45bf4254676a5a447308bb7bec78ba021921 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 16:07:01 +0000 Subject: [PATCH 08/23] Create interface class for IndirectDataReduction class --- .../Indirect/Reduction/ILLEnergyTransfer.cpp | 2 +- .../Indirect/Reduction/ILLEnergyTransfer.h | 8 +++++--- .../Indirect/Reduction/ISISCalibration.cpp | 2 +- .../Indirect/Reduction/ISISCalibration.h | 4 +++- .../Indirect/Reduction/ISISDiagnostics.cpp | 2 +- .../Indirect/Reduction/ISISDiagnostics.h | 4 +++- .../Reduction/ISISEnergyTransferPresenter.cpp | 2 +- .../Reduction/ISISEnergyTransferPresenter.h | 2 +- .../Reduction/IndirectDataReduction.cpp | 4 ++++ .../Reduction/IndirectDataReduction.h | 19 +++++++++++++++---- .../Reduction/IndirectDataReductionTab.cpp | 4 ++-- .../Reduction/IndirectDataReductionTab.h | 6 +++--- .../Reduction/IndirectTransmission.cpp | 2 +- .../Indirect/Reduction/IndirectTransmission.h | 14 ++++++++------ 14 files changed, 49 insertions(+), 26 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.cpp b/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.cpp index 4f73d1d13208..0549b31be90b 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.cpp @@ -30,7 +30,7 @@ namespace MantidQt::CustomInterfaces { //---------------------------------------------------------------------------------------------- /** Constructor */ -ILLEnergyTransfer::ILLEnergyTransfer(IndirectDataReduction *idrUI, QWidget *parent) +ILLEnergyTransfer::ILLEnergyTransfer(IIndirectDataReduction *idrUI, QWidget *parent) : IndirectDataReductionTab(idrUI, parent) { m_uiForm.setupUi(parent); diff --git a/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.h b/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.h index 2e460a8c47d8..2902f6a246b5 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.h @@ -13,16 +13,18 @@ namespace MantidQt { namespace CustomInterfaces { +class IIndirectDataReduction; + /** ILLEnergyTransfer - @author Dan Nixon - @date 23/07/2014 +@author Dan Nixon +@date 23/07/2014 */ class MANTIDQT_INDIRECT_DLL ILLEnergyTransfer : public IndirectDataReductionTab { Q_OBJECT public: - ILLEnergyTransfer(IndirectDataReduction *idrUI, QWidget *parent = nullptr); + ILLEnergyTransfer(IIndirectDataReduction *idrUI, QWidget *parent = nullptr); ~ILLEnergyTransfer() override; void setup() override; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISCalibration.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISCalibration.cpp index 8f58cc01e53e..1b508f679ea4 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISCalibration.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISCalibration.cpp @@ -41,7 +41,7 @@ namespace MantidQt::CustomInterfaces { //---------------------------------------------------------------------------------------------- /** Constructor */ -ISISCalibration::ISISCalibration(IndirectDataReduction *idrUI, QWidget *parent) +ISISCalibration::ISISCalibration(IIndirectDataReduction *idrUI, QWidget *parent) : IndirectDataReductionTab(idrUI, parent), m_lastCalPlotFilename("") { m_uiForm.setupUi(parent); setOutputPlotOptionsPresenter( diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISCalibration.h b/qt/scientific_interfaces/Indirect/Reduction/ISISCalibration.h index 9e8383caab81..e2319afc5fe4 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISCalibration.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISCalibration.h @@ -13,6 +13,8 @@ namespace MantidQt { namespace CustomInterfaces { +class IIndirectDataReduction; + /** ISISCalibration Handles vanadium run calibration for ISIS instruments. @@ -23,7 +25,7 @@ class MANTIDQT_INDIRECT_DLL ISISCalibration : public IndirectDataReductionTab { Q_OBJECT public: - ISISCalibration(IndirectDataReduction *idrUI, QWidget *parent = nullptr); + ISISCalibration(IIndirectDataReduction *idrUI, QWidget *parent = nullptr); ~ISISCalibration() override; void setup() override; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISDiagnostics.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISDiagnostics.cpp index 8dd46d85f1db..951c7688f76e 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISDiagnostics.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISDiagnostics.cpp @@ -24,7 +24,7 @@ namespace MantidQt::CustomInterfaces { //---------------------------------------------------------------------------------------------- /** Constructor */ -ISISDiagnostics::ISISDiagnostics(IndirectDataReduction *idrUI, QWidget *parent) +ISISDiagnostics::ISISDiagnostics(IIndirectDataReduction *idrUI, QWidget *parent) : IndirectDataReductionTab(idrUI, parent) { m_uiForm.setupUi(parent); setOutputPlotOptionsPresenter( diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISDiagnostics.h b/qt/scientific_interfaces/Indirect/Reduction/ISISDiagnostics.h index 58df4b08d1d6..0c7a96c2f650 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISDiagnostics.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISDiagnostics.h @@ -32,6 +32,8 @@ namespace MantidQt { namespace CustomInterfaces { +class IIndirectDataReduction; + /** ISISDiagnostics Handles time integration diagnostics for ISIS instruments. @@ -42,7 +44,7 @@ class MANTIDQT_INDIRECT_DLL ISISDiagnostics : public IndirectDataReductionTab { Q_OBJECT public: - ISISDiagnostics(IndirectDataReduction *idrUI, QWidget *parent = nullptr); + ISISDiagnostics(IIndirectDataReduction *idrUI, QWidget *parent = nullptr); ~ISISDiagnostics() override; void setup() override; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp index b27fac56fb97..0c45dd63d8e8 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp @@ -28,7 +28,7 @@ using MantidQt::API::BatchAlgorithmRunner; namespace MantidQt::CustomInterfaces { -IETPresenter::IETPresenter(IndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model) +IETPresenter::IETPresenter(IIndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model) : IndirectDataReductionTab(idrUI), m_view(view), m_model(std::move(model)) { m_view->subscribePresenter(this); diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h index ed78f83d8e3e..21a2e515ac17 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h @@ -30,7 +30,7 @@ class MANTIDQT_INDIRECT_DLL IETPresenter : public IndirectDataReductionTab, publ Q_OBJECT public: - IETPresenter(IndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model); + IETPresenter(IIndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model); ~IETPresenter() override; void setup() override; diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp index 262cac0c1e96..648b9fe39ad7 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp @@ -210,6 +210,10 @@ void IndirectDataReduction::loadInstrumentIfNotExist(const std::string &instrume } } +MantidWidgets::IndirectInstrumentConfig *IndirectDataReduction::getInstrumentConfiguration() const { + return m_uiForm.iicInstrumentConfiguration; +} + /** * Gets the details for the current instrument configuration. * diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h index 445970ad5d25..ab9b8f71199e 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h @@ -22,6 +22,16 @@ namespace CustomInterfaces { class IndirectDataReductionTab; +class IIndirectDataReduction { +public: + virtual Mantid::API::MatrixWorkspace_sptr instrumentWorkspace() = 0; + + virtual MantidWidgets::IndirectInstrumentConfig *getInstrumentConfiguration() const = 0; + virtual QMap getInstrumentDetails() = 0; + + virtual void showAnalyserAndReflectionOptions(bool visible) = 0; +}; + /** This class defines the IndirectDataReduction interface. It handles the overall instrument settings @@ -33,7 +43,7 @@ mode is defined in the instrument definition file using the "deltaE-mode". @author Michael Whitty */ -class IndirectDataReduction : public IndirectInterface { +class IndirectDataReduction : public IndirectInterface, public IIndirectDataReduction { Q_OBJECT public: @@ -54,14 +64,15 @@ class IndirectDataReduction : public IndirectInterface { /// Handled configuration changes void handleConfigChange(Mantid::Kernel::ConfigValChangeNotification_ptr pNf); - Mantid::API::MatrixWorkspace_sptr instrumentWorkspace(); + Mantid::API::MatrixWorkspace_sptr instrumentWorkspace() override; void loadInstrumentIfNotExist(const std::string &instrumentName, const std::string &analyser = "", const std::string &reflection = ""); - QMap getInstrumentDetails(); + MantidWidgets::IndirectInstrumentConfig *getInstrumentConfiguration() const override; + QMap getInstrumentDetails() override; - void showAnalyserAndReflectionOptions(bool visible); + void showAnalyserAndReflectionOptions(bool visible) override; signals: /// Emitted when the instrument setup is changed diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.cpp b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.cpp index 580ae72b586f..88d15e8130a4 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.cpp @@ -24,7 +24,7 @@ Mantid::Kernel::Logger g_log("IndirectDataReductionTab"); namespace MantidQt::CustomInterfaces { -IndirectDataReductionTab::IndirectDataReductionTab(IndirectDataReduction *idrUI, QObject *parent) +IndirectDataReductionTab::IndirectDataReductionTab(IIndirectDataReduction *idrUI, QObject *parent) : IndirectTab(parent), m_idrUI(idrUI), m_tabRunning(false) { connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(tabExecutionComplete(bool))); } @@ -128,7 +128,7 @@ bool IndirectDataReductionTab::hasInstrumentDetail(QMap const * @return Instrument config widget */ MantidWidgets::IndirectInstrumentConfig *IndirectDataReductionTab::getInstrumentConfiguration() const { - return m_idrUI->m_uiForm.iicInstrumentConfiguration; + return m_idrUI->getInstrumentConfiguration(); } QString IndirectDataReductionTab::getInstrumentName() const { diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.h index 874fbdd5ee07..55ca72a407ac 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.h @@ -31,7 +31,7 @@ namespace MantidQt { namespace CustomInterfaces { -class IndirectDataReduction; +class IIndirectDataReduction; /** IndirectDataReductionTab @@ -45,7 +45,7 @@ class MANTIDQT_INDIRECT_DLL IndirectDataReductionTab : public IndirectTab { Q_OBJECT public: - IndirectDataReductionTab(IndirectDataReduction *idrUI, QObject *parent = nullptr); + IndirectDataReductionTab(IIndirectDataReduction *idrUI, QObject *parent = nullptr); ~IndirectDataReductionTab() override; /// Set the presenter for the output plotting options @@ -84,7 +84,7 @@ public slots: QString reflection = ""); protected: - IndirectDataReduction *m_idrUI; + IIndirectDataReduction *m_idrUI; private slots: void tabExecutionComplete(bool error); diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.cpp b/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.cpp index 24a367e13727..d1f98f6e12b6 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.cpp @@ -28,7 +28,7 @@ namespace MantidQt::CustomInterfaces { //---------------------------------------------------------------------------------------------- /** Constructor */ -IndirectTransmission::IndirectTransmission(IndirectDataReduction *idrUI, QWidget *parent) +IndirectTransmission::IndirectTransmission(IIndirectDataReduction *idrUI, QWidget *parent) : IndirectDataReductionTab(idrUI, parent) { m_uiForm.setupUi(parent); setOutputPlotOptionsPresenter( diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.h index 5a42c29aa469..3a7620ba27a1 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.h @@ -13,21 +13,23 @@ namespace MantidQt { namespace CustomInterfaces { +class IIndirectDataReduction; + /** IndirectTransmission - Provides the UI interface to the IndirectTransmissionMonitor algorithm to - calculate - sample transmission using a sample and container raw run file. +Provides the UI interface to the IndirectTransmissionMonitor algorithm to +calculate +sample transmission using a sample and container raw run file. - @author Samuel Jackson - @date 13/08/2013 +@author Samuel Jackson +@date 13/08/2013 */ class MANTIDQT_INDIRECT_DLL IndirectTransmission : public IndirectDataReductionTab { Q_OBJECT public: - IndirectTransmission(IndirectDataReduction *idrUI, QWidget *parent = nullptr); + IndirectTransmission(IIndirectDataReduction *idrUI, QWidget *parent = nullptr); ~IndirectTransmission() override; void setup() override; From 4d59dddf613d776ce4d55910e6a51fddeb6af7e9 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 16:18:12 +0000 Subject: [PATCH 09/23] Use interface classes for the mocks in IETPresenterTest --- .../ISISEnergyTransferPresenterTest.h | 61 +++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index 1d4aa7e4f6eb..3804eae109f8 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -31,47 +31,65 @@ std::unique_ptr defaultGroupingProps() { GNU_DIAG_OFF_SUGGEST_OVERRIDE -class MockIETModel : public IETModel { +class MockIETModel : public IIETModel { public: - MOCK_METHOD3(runIETAlgorithm, std::string(MantidQt::API::BatchAlgorithmRunner *, InstrumentData, IETRunData)); + MOCK_METHOD2(setInstrumentProperties, void(IAlgorithmRuntimeProps &properties, InstrumentData const &instData)); + + MOCK_METHOD1(validateRunData, std::vector(IETRunData const &runData)); + MOCK_METHOD1(validatePlotData, std::vector(IETPlotData const &plotData)); + + MOCK_METHOD3(runIETAlgorithm, std::string(MantidQt::API::BatchAlgorithmRunner *batchAlgoRunner, + InstrumentData const &instData, IETRunData &runParams)); + MOCK_CONST_METHOD2(plotRawAlgorithmQueue, + std::deque(InstrumentData const &instData, + IETPlotData const &plotData)); + + MOCK_METHOD2(saveWorkspace, void(std::string const &workspaceName, IETSaveData const &saveData)); + + MOCK_METHOD4(createGroupingWorkspace, void(std::string const &instrumentName, std::string const &analyser, + std::string const &customGrouping, std::string const &outputName)); + + MOCK_METHOD1(loadDetailedBalance, double(std::string const &filename)); + + MOCK_METHOD4(groupWorkspaces, std::vector(std::string const &groupName, std::string const &instrument, + std::string const &groupOption, bool const shouldGroup)); }; -class MockIETView : public IETView { +class MockIETView : public IIETView { public: + MOCK_METHOD1(subscribePresenter, void(IIETPresenter *presenter)); + MOCK_CONST_METHOD0(getRunData, IETRunData()); MOCK_CONST_METHOD0(getPlotData, IETPlotData()); MOCK_CONST_METHOD0(getSaveData, IETSaveData()); - - MOCK_CONST_METHOD0(getCustomGrouping, std::string()); - MOCK_CONST_METHOD0(getGroupOutputOption, std::string()); MOCK_CONST_METHOD0(getPlotOptionsView, OutputPlotOptionsView *()); MOCK_CONST_METHOD0(getGroupOutputCheckbox, bool()); - MOCK_CONST_METHOD0(getFirstFilename, std::string()); - MOCK_CONST_METHOD0(isRunFilesValid, bool()); - MOCK_CONST_METHOD1(validateCalibrationFileType, void(UserInputValidator &)); + MOCK_CONST_METHOD1(validateCalibrationFileType, void(UserInputValidator &uiv)); MOCK_CONST_METHOD1(validateRebinString, void(UserInputValidator &uiv)); - + MOCK_CONST_METHOD2(validateGroupingProperties, + std::optional(std::size_t const &spectraMin, std::size_t const &spectraMax)); MOCK_CONST_METHOD0(showRebinWidthPrompt, bool()); MOCK_CONST_METHOD3(showSaveCustomGroupingDialog, void(std::string const &customGroupingOutput, std::string const &defaultGroupingFilename, std::string const &saveDirectory)); MOCK_CONST_METHOD1(displayWarning, void(std::string const &message)); - + MOCK_METHOD1(setCalibVisible, void(bool visible)); + MOCK_METHOD1(setEfixedVisible, void(bool visible)); MOCK_METHOD1(setBackgroundSectionVisible, void(bool visible)); MOCK_METHOD1(setPlotTimeSectionVisible, void(bool visible)); + MOCK_METHOD1(setAnalysisSectionVisible, void(bool visible)); MOCK_METHOD1(setPlottingOptionsVisible, void(bool visible)); - MOCK_METHOD1(setScaleFactorVisible, void(bool visible)); MOCK_METHOD1(setAclimaxSaveVisible, void(bool visible)); - MOCK_METHOD1(setNXSPEVisible, void(bool visible)); + MOCK_METHOD1(setSPEVisible, void(bool visible)); MOCK_METHOD1(setFoldMultipleFramesVisible, void(bool visible)); MOCK_METHOD1(setOutputInCm1Visible, void(bool visible)); MOCK_METHOD1(setGroupOutputCheckBoxVisible, void(bool visible)); MOCK_METHOD1(setGroupOutputDropdownVisible, void(bool visible)); - + MOCK_METHOD1(setInstrumentDefault, void(InstrumentData const &instrumentDetails)); MOCK_METHOD1(setDetailedBalance, void(double detailedBalance)); MOCK_METHOD1(setRunFilesEnabled, void(bool enable)); MOCK_METHOD1(setSingleRebin, void(bool enable)); @@ -80,11 +98,18 @@ class MockIETView : public IETView { MOCK_METHOD1(setPlotTimeIsPlotting, void(bool plotting)); MOCK_METHOD2(setFileExtensionsByName, void(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes)); MOCK_METHOD1(setOutputWorkspaces, void(std::vector const &outputWorkspaces)); - - MOCK_METHOD1(setInstrumentDefault, void(InstrumentData const &instrumentDetails)); + MOCK_METHOD1(setRunButtonText, void(std::string const &runText)); + MOCK_METHOD1(setEnableOutputOptions, void(bool const enable)); }; -class MockIndirectDataReduction : public IIndirectDataReduction {}; +class MockIndirectDataReduction : public IIndirectDataReduction { + MOCK_METHOD0(instrumentWorkspace, Mantid::API::MatrixWorkspace_sptr()); + + MOCK_CONST_METHOD0(getInstrumentConfiguration, MantidQt::MantidWidgets::IndirectInstrumentConfig *()); + MOCK_METHOD0(getInstrumentDetails, QMap()); + + MOCK_METHOD1(showAnalyserAndReflectionOptions, void(bool visible)); +}; class IETPresenterTest : public CxxTest::TestSuite { public: @@ -107,6 +132,8 @@ class IETPresenterTest : public CxxTest::TestSuite { TS_ASSERT(Mock::VerifyAndClearExpectations(&m_idrUI)); m_presenter.reset(); + m_idrUI.reset(); + m_view.reset(); } void test_fetch_instrument_data() { From 90ac080680526719a81e2b0a4c6f10954f7b2080 Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 16:26:04 +0000 Subject: [PATCH 10/23] Move reduction mocks into separate MockObjects file --- .../Indirect/test/CMakeLists.txt | 3 + .../ISISEnergyTransferPresenterTest.h | 85 +------------- .../Indirect/test/Reduction/MockObjects.h | 106 ++++++++++++++++++ 3 files changed, 110 insertions(+), 84 deletions(-) create mode 100644 qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h diff --git a/qt/scientific_interfaces/Indirect/test/CMakeLists.txt b/qt/scientific_interfaces/Indirect/test/CMakeLists.txt index a609eac50e37..ef645e9c161b 100644 --- a/qt/scientific_interfaces/Indirect/test/CMakeLists.txt +++ b/qt/scientific_interfaces/Indirect/test/CMakeLists.txt @@ -2,6 +2,8 @@ set(ALL_TEST_FILES) add_subdirectory(Reduction) +set(TEST_HELPERS Reduction/MockObjects.h) + set(CXXTEST_EXTRA_HEADER_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/InterfacesIndirectTestInitialization.h) mtd_add_qt_tests( @@ -9,6 +11,7 @@ mtd_add_qt_tests( QT_VERSION 5 SRC ${ALL_TEST_FILES} INCLUDE_DIRS ../../../../Framework/DataObjects/inc ../ + TEST_HELPER_SRCS ${TEST_HELPERS} LINK_LIBS ${CORE_MANTIDLIBS} Mantid::DataObjects gmock diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index 3804eae109f8..563784cf9549 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -9,14 +9,13 @@ #include #include +#include "MockObjects.h" #include "Reduction/ISISEnergyTransferPresenter.h" -#include "Reduction/IndirectDataReduction.h" #include "MantidAPI/AlgorithmProperties.h" #include "MantidKernel/WarningSuppressions.h" using namespace MantidQt::CustomInterfaces; -using MantidQt::API::BatchAlgorithmRunner; using namespace testing; namespace { @@ -29,88 +28,6 @@ std::unique_ptr defaultGroupingProps() { } // namespace -GNU_DIAG_OFF_SUGGEST_OVERRIDE - -class MockIETModel : public IIETModel { - -public: - MOCK_METHOD2(setInstrumentProperties, void(IAlgorithmRuntimeProps &properties, InstrumentData const &instData)); - - MOCK_METHOD1(validateRunData, std::vector(IETRunData const &runData)); - MOCK_METHOD1(validatePlotData, std::vector(IETPlotData const &plotData)); - - MOCK_METHOD3(runIETAlgorithm, std::string(MantidQt::API::BatchAlgorithmRunner *batchAlgoRunner, - InstrumentData const &instData, IETRunData &runParams)); - MOCK_CONST_METHOD2(plotRawAlgorithmQueue, - std::deque(InstrumentData const &instData, - IETPlotData const &plotData)); - - MOCK_METHOD2(saveWorkspace, void(std::string const &workspaceName, IETSaveData const &saveData)); - - MOCK_METHOD4(createGroupingWorkspace, void(std::string const &instrumentName, std::string const &analyser, - std::string const &customGrouping, std::string const &outputName)); - - MOCK_METHOD1(loadDetailedBalance, double(std::string const &filename)); - - MOCK_METHOD4(groupWorkspaces, std::vector(std::string const &groupName, std::string const &instrument, - std::string const &groupOption, bool const shouldGroup)); -}; - -class MockIETView : public IIETView { -public: - MOCK_METHOD1(subscribePresenter, void(IIETPresenter *presenter)); - - MOCK_CONST_METHOD0(getRunData, IETRunData()); - MOCK_CONST_METHOD0(getPlotData, IETPlotData()); - MOCK_CONST_METHOD0(getSaveData, IETSaveData()); - MOCK_CONST_METHOD0(getGroupOutputOption, std::string()); - MOCK_CONST_METHOD0(getPlotOptionsView, OutputPlotOptionsView *()); - MOCK_CONST_METHOD0(getGroupOutputCheckbox, bool()); - MOCK_CONST_METHOD0(getFirstFilename, std::string()); - MOCK_CONST_METHOD0(isRunFilesValid, bool()); - MOCK_CONST_METHOD1(validateCalibrationFileType, void(UserInputValidator &uiv)); - MOCK_CONST_METHOD1(validateRebinString, void(UserInputValidator &uiv)); - MOCK_CONST_METHOD2(validateGroupingProperties, - std::optional(std::size_t const &spectraMin, std::size_t const &spectraMax)); - MOCK_CONST_METHOD0(showRebinWidthPrompt, bool()); - MOCK_CONST_METHOD3(showSaveCustomGroupingDialog, - void(std::string const &customGroupingOutput, std::string const &defaultGroupingFilename, - std::string const &saveDirectory)); - MOCK_CONST_METHOD1(displayWarning, void(std::string const &message)); - MOCK_METHOD1(setCalibVisible, void(bool visible)); - MOCK_METHOD1(setEfixedVisible, void(bool visible)); - MOCK_METHOD1(setBackgroundSectionVisible, void(bool visible)); - MOCK_METHOD1(setPlotTimeSectionVisible, void(bool visible)); - MOCK_METHOD1(setAnalysisSectionVisible, void(bool visible)); - MOCK_METHOD1(setPlottingOptionsVisible, void(bool visible)); - MOCK_METHOD1(setAclimaxSaveVisible, void(bool visible)); - MOCK_METHOD1(setSPEVisible, void(bool visible)); - MOCK_METHOD1(setFoldMultipleFramesVisible, void(bool visible)); - MOCK_METHOD1(setOutputInCm1Visible, void(bool visible)); - MOCK_METHOD1(setGroupOutputCheckBoxVisible, void(bool visible)); - MOCK_METHOD1(setGroupOutputDropdownVisible, void(bool visible)); - MOCK_METHOD1(setInstrumentDefault, void(InstrumentData const &instrumentDetails)); - MOCK_METHOD1(setDetailedBalance, void(double detailedBalance)); - MOCK_METHOD1(setRunFilesEnabled, void(bool enable)); - MOCK_METHOD1(setSingleRebin, void(bool enable)); - MOCK_METHOD1(setMultipleRebin, void(bool enable)); - MOCK_METHOD1(setSaveEnabled, void(bool enable)); - MOCK_METHOD1(setPlotTimeIsPlotting, void(bool plotting)); - MOCK_METHOD2(setFileExtensionsByName, void(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes)); - MOCK_METHOD1(setOutputWorkspaces, void(std::vector const &outputWorkspaces)); - MOCK_METHOD1(setRunButtonText, void(std::string const &runText)); - MOCK_METHOD1(setEnableOutputOptions, void(bool const enable)); -}; - -class MockIndirectDataReduction : public IIndirectDataReduction { - MOCK_METHOD0(instrumentWorkspace, Mantid::API::MatrixWorkspace_sptr()); - - MOCK_CONST_METHOD0(getInstrumentConfiguration, MantidQt::MantidWidgets::IndirectInstrumentConfig *()); - MOCK_METHOD0(getInstrumentDetails, QMap()); - - MOCK_METHOD1(showAnalyserAndReflectionOptions, void(bool visible)); -}; - class IETPresenterTest : public CxxTest::TestSuite { public: static IETPresenterTest *createSuite() { return new IETPresenterTest(); } diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h new file mode 100644 index 000000000000..44aec20bbd4e --- /dev/null +++ b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h @@ -0,0 +1,106 @@ +// Mantid Repository : https://github.com/mantidproject/mantid +// +// Copyright © 2024 ISIS Rutherford Appleton Laboratory UKRI, +// NScD Oak Ridge National Laboratory, European Spallation Source +// & Institut Laue - Langevin +// SPDX - License - Identifier: GPL - 3.0 + +#pragma once + +#include +#include + +#include "MantidKernel/WarningSuppressions.h" + +#include "Reduction/ISISEnergyTransferModel.h" +#include "Reduction/ISISEnergyTransferView.h" +#include "Reduction/IndirectDataReduction.h" + +#include +#include +#include + +using namespace MantidQt::CustomInterfaces; + +GNU_DIAG_OFF_SUGGEST_OVERRIDE + +class MockIndirectDataReduction : public IIndirectDataReduction { + MOCK_METHOD0(instrumentWorkspace, Mantid::API::MatrixWorkspace_sptr()); + + MOCK_CONST_METHOD0(getInstrumentConfiguration, MantidQt::MantidWidgets::IndirectInstrumentConfig *()); + MOCK_METHOD0(getInstrumentDetails, QMap()); + + MOCK_METHOD1(showAnalyserAndReflectionOptions, void(bool visible)); +}; + +class MockIETModel : public IIETModel { + +public: + MOCK_METHOD2(setInstrumentProperties, void(IAlgorithmRuntimeProps &properties, InstrumentData const &instData)); + + MOCK_METHOD1(validateRunData, std::vector(IETRunData const &runData)); + MOCK_METHOD1(validatePlotData, std::vector(IETPlotData const &plotData)); + + MOCK_METHOD3(runIETAlgorithm, std::string(MantidQt::API::BatchAlgorithmRunner *batchAlgoRunner, + InstrumentData const &instData, IETRunData &runParams)); + MOCK_CONST_METHOD2(plotRawAlgorithmQueue, + std::deque(InstrumentData const &instData, + IETPlotData const &plotData)); + + MOCK_METHOD2(saveWorkspace, void(std::string const &workspaceName, IETSaveData const &saveData)); + + MOCK_METHOD4(createGroupingWorkspace, void(std::string const &instrumentName, std::string const &analyser, + std::string const &customGrouping, std::string const &outputName)); + + MOCK_METHOD1(loadDetailedBalance, double(std::string const &filename)); + + MOCK_METHOD4(groupWorkspaces, std::vector(std::string const &groupName, std::string const &instrument, + std::string const &groupOption, bool const shouldGroup)); +}; + +class MockIETView : public IIETView { +public: + MOCK_METHOD1(subscribePresenter, void(IIETPresenter *presenter)); + + MOCK_CONST_METHOD0(getRunData, IETRunData()); + MOCK_CONST_METHOD0(getPlotData, IETPlotData()); + MOCK_CONST_METHOD0(getSaveData, IETSaveData()); + MOCK_CONST_METHOD0(getGroupOutputOption, std::string()); + MOCK_CONST_METHOD0(getPlotOptionsView, OutputPlotOptionsView *()); + MOCK_CONST_METHOD0(getGroupOutputCheckbox, bool()); + MOCK_CONST_METHOD0(getFirstFilename, std::string()); + MOCK_CONST_METHOD0(isRunFilesValid, bool()); + MOCK_CONST_METHOD1(validateCalibrationFileType, void(UserInputValidator &uiv)); + MOCK_CONST_METHOD1(validateRebinString, void(UserInputValidator &uiv)); + MOCK_CONST_METHOD2(validateGroupingProperties, + std::optional(std::size_t const &spectraMin, std::size_t const &spectraMax)); + MOCK_CONST_METHOD0(showRebinWidthPrompt, bool()); + MOCK_CONST_METHOD3(showSaveCustomGroupingDialog, + void(std::string const &customGroupingOutput, std::string const &defaultGroupingFilename, + std::string const &saveDirectory)); + MOCK_CONST_METHOD1(displayWarning, void(std::string const &message)); + MOCK_METHOD1(setCalibVisible, void(bool visible)); + MOCK_METHOD1(setEfixedVisible, void(bool visible)); + MOCK_METHOD1(setBackgroundSectionVisible, void(bool visible)); + MOCK_METHOD1(setPlotTimeSectionVisible, void(bool visible)); + MOCK_METHOD1(setAnalysisSectionVisible, void(bool visible)); + MOCK_METHOD1(setPlottingOptionsVisible, void(bool visible)); + MOCK_METHOD1(setAclimaxSaveVisible, void(bool visible)); + MOCK_METHOD1(setSPEVisible, void(bool visible)); + MOCK_METHOD1(setFoldMultipleFramesVisible, void(bool visible)); + MOCK_METHOD1(setOutputInCm1Visible, void(bool visible)); + MOCK_METHOD1(setGroupOutputCheckBoxVisible, void(bool visible)); + MOCK_METHOD1(setGroupOutputDropdownVisible, void(bool visible)); + MOCK_METHOD1(setInstrumentDefault, void(InstrumentData const &instrumentDetails)); + MOCK_METHOD1(setDetailedBalance, void(double detailedBalance)); + MOCK_METHOD1(setRunFilesEnabled, void(bool enable)); + MOCK_METHOD1(setSingleRebin, void(bool enable)); + MOCK_METHOD1(setMultipleRebin, void(bool enable)); + MOCK_METHOD1(setSaveEnabled, void(bool enable)); + MOCK_METHOD1(setPlotTimeIsPlotting, void(bool plotting)); + MOCK_METHOD2(setFileExtensionsByName, void(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes)); + MOCK_METHOD1(setOutputWorkspaces, void(std::vector const &outputWorkspaces)); + MOCK_METHOD1(setRunButtonText, void(std::string const &runText)); + MOCK_METHOD1(setEnableOutputOptions, void(bool const enable)); +}; + +GNU_DIAG_ON_SUGGEST_OVERRIDE \ No newline at end of file From 7922b87b9b4aa3a90dc1ad1874ee7c5a6482bf3f Mon Sep 17 00:00:00 2001 From: Applin Date: Tue, 19 Mar 2024 16:52:32 +0000 Subject: [PATCH 11/23] Mock the output options view --- .../Reduction/ISISEnergyTransferView.cpp | 2 +- .../Indirect/Reduction/ISISEnergyTransferView.h | 4 ++-- .../Reduction/ISISEnergyTransferPresenterTest.h | 17 ++++++++++++----- .../Indirect/test/Reduction/MockObjects.h | 10 ++++++++-- .../Inelastic/Common/OutputPlotOptionsModel.h | 2 +- .../Inelastic/Common/OutputPlotOptionsView.h | 2 +- 6 files changed, 25 insertions(+), 12 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp index 6b9e86a99c38..ca3b86386521 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp @@ -98,7 +98,7 @@ std::string IETView::getGroupOutputOption() const { return m_uiForm.cbGroupOutpu bool IETView::getGroupOutputCheckbox() const { return m_uiForm.ckGroupOutput->isChecked(); } -OutputPlotOptionsView *IETView::getPlotOptionsView() const { return m_uiForm.ipoPlotOptions; } +IOutputPlotOptionsView *IETView::getPlotOptionsView() const { return m_uiForm.ipoPlotOptions; } std::string IETView::getFirstFilename() const { return m_uiForm.dsRunFiles->getFirstFilename().toStdString(); } diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h index f60ff0e4bd52..a18340ed7983 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h @@ -27,7 +27,7 @@ class MANTIDQT_INDIRECT_DLL IIETView { virtual IETSaveData getSaveData() const = 0; virtual std::string getGroupOutputOption() const = 0; - virtual OutputPlotOptionsView *getPlotOptionsView() const = 0; + virtual IOutputPlotOptionsView *getPlotOptionsView() const = 0; virtual bool getGroupOutputCheckbox() const = 0; virtual std::string getFirstFilename() const = 0; @@ -91,7 +91,7 @@ class MANTIDQT_INDIRECT_DLL IETView : public QWidget, public IIETView { IETSaveData getSaveData() const override; std::string getGroupOutputOption() const override; - OutputPlotOptionsView *getPlotOptionsView() const override; + IOutputPlotOptionsView *getPlotOptionsView() const override; bool getGroupOutputCheckbox() const override; std::string getFirstFilename() const override; diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index 563784cf9549..81a09c9e634e 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -9,6 +9,7 @@ #include #include +#include "../../../Inelastic/test/Common/MockObjects.h" #include "MockObjects.h" #include "Reduction/ISISEnergyTransferPresenter.h" @@ -36,7 +37,11 @@ class IETPresenterTest : public CxxTest::TestSuite { void setUp() override { auto model = std::make_unique>(); + m_outputOptionsView = std::make_unique>(); + m_view = std::make_unique>(); + ON_CALL(*m_view, getPlotOptionsView()).WillByDefault(Return(m_outputOptionsView.get())); + m_model = model.get(); m_idrUI = std::make_unique>(); @@ -54,13 +59,13 @@ class IETPresenterTest : public CxxTest::TestSuite { } void test_fetch_instrument_data() { - ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); - ON_CALL(*m_view, getRunData()); + // ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); + // ON_CALL(*m_view, getRunData()); - ExpectationSet expectRunData = EXPECT_CALL(*m_view, getRunData()).Times(1); - ExpectationSet expectRunAlgo = EXPECT_CALL(*m_model, runIETAlgorithm(_, _, _)).Times(1).After(expectRunData); + // ExpectationSet expectRunData = EXPECT_CALL(*m_view, getRunData()).Times(1); + // ExpectationSet expectRunAlgo = EXPECT_CALL(*m_model, runIETAlgorithm(_, _, _)).Times(1).After(expectRunData); - m_presenter->run(); + // m_presenter->run(); } private: @@ -69,4 +74,6 @@ class IETPresenterTest : public CxxTest::TestSuite { std::unique_ptr> m_view; NiceMock *m_model; std::unique_ptr> m_idrUI; + + std::unique_ptr> m_outputOptionsView; }; \ No newline at end of file diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h index 44aec20bbd4e..a77456f34786 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h @@ -24,6 +24,9 @@ using namespace MantidQt::CustomInterfaces; GNU_DIAG_OFF_SUGGEST_OVERRIDE class MockIndirectDataReduction : public IIndirectDataReduction { +public: + virtual ~MockIndirectDataReduction() = default; + MOCK_METHOD0(instrumentWorkspace, Mantid::API::MatrixWorkspace_sptr()); MOCK_CONST_METHOD0(getInstrumentConfiguration, MantidQt::MantidWidgets::IndirectInstrumentConfig *()); @@ -33,8 +36,9 @@ class MockIndirectDataReduction : public IIndirectDataReduction { }; class MockIETModel : public IIETModel { - public: + virtual ~MockIETModel() = default; + MOCK_METHOD2(setInstrumentProperties, void(IAlgorithmRuntimeProps &properties, InstrumentData const &instData)); MOCK_METHOD1(validateRunData, std::vector(IETRunData const &runData)); @@ -59,13 +63,15 @@ class MockIETModel : public IIETModel { class MockIETView : public IIETView { public: + virtual ~MockIETView() = default; + MOCK_METHOD1(subscribePresenter, void(IIETPresenter *presenter)); MOCK_CONST_METHOD0(getRunData, IETRunData()); MOCK_CONST_METHOD0(getPlotData, IETPlotData()); MOCK_CONST_METHOD0(getSaveData, IETSaveData()); MOCK_CONST_METHOD0(getGroupOutputOption, std::string()); - MOCK_CONST_METHOD0(getPlotOptionsView, OutputPlotOptionsView *()); + MOCK_CONST_METHOD0(getPlotOptionsView, IOutputPlotOptionsView *()); MOCK_CONST_METHOD0(getGroupOutputCheckbox, bool()); MOCK_CONST_METHOD0(getFirstFilename, std::string()); MOCK_CONST_METHOD0(isRunFilesValid, bool()); diff --git a/qt/scientific_interfaces/Inelastic/Common/OutputPlotOptionsModel.h b/qt/scientific_interfaces/Inelastic/Common/OutputPlotOptionsModel.h index 19f0a18bdb80..bf8f576207d7 100644 --- a/qt/scientific_interfaces/Inelastic/Common/OutputPlotOptionsModel.h +++ b/qt/scientific_interfaces/Inelastic/Common/OutputPlotOptionsModel.h @@ -8,7 +8,7 @@ #include "MantidQtWidgets/Plotting/ExternalPlotter.h" -#include "DllConfig.h" +#include "../DllConfig.h" #include "MantidAPI/MatrixWorkspace_fwd.h" #include diff --git a/qt/scientific_interfaces/Inelastic/Common/OutputPlotOptionsView.h b/qt/scientific_interfaces/Inelastic/Common/OutputPlotOptionsView.h index 96e3fbcbab40..a0ba9b166501 100644 --- a/qt/scientific_interfaces/Inelastic/Common/OutputPlotOptionsView.h +++ b/qt/scientific_interfaces/Inelastic/Common/OutputPlotOptionsView.h @@ -8,7 +8,7 @@ #include "ui_OutputPlotOptions.h" -#include "DllConfig.h" +#include "../DllConfig.h" #include "MantidKernel/System.h" #include "MantidQtWidgets/Common/MantidWidget.h" From 52503ca3be355545ef64e20640251db9c2d3fe98 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 09:33:33 +0000 Subject: [PATCH 12/23] Add create and destroy suite functions to other Indirect test suites --- .../Indirect/test/Reduction/ISISEnergyTransferModelTest.h | 4 +++- .../test/Reduction/ISISEnergyTransferModelUtilsTest.h | 3 ++- .../Indirect/test/Reduction/ReductionAlgorithmUtilsTest.h | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h index b39cf5d667e7..eaf8c8270ed8 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h @@ -130,7 +130,9 @@ DECLARE_ALGORITHM(ISISIndirectEnergyTransfer) class ISISEnergyTransferModelTest : public CxxTest::TestSuite { public: - ISISEnergyTransferModelTest() = default; + static ISISEnergyTransferModelTest *createSuite() { return new ISISEnergyTransferModelTest(); } + static void destroySuite(ISISEnergyTransferModelTest *suite) { delete suite; } + void setUp() override { m_model = std::make_unique(); AnalysisDataService::Instance().clear(); diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelUtilsTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelUtilsTest.h index 7e7103dfbf1f..2e04416877d3 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelUtilsTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelUtilsTest.h @@ -20,7 +20,8 @@ using namespace MantidQt::CustomInterfaces; class ISISEnergyTransferModelUtilsTest : public CxxTest::TestSuite { public: - ISISEnergyTransferModelUtilsTest() = default; + static ISISEnergyTransferModelUtilsTest *createSuite() { return new ISISEnergyTransferModelUtilsTest(); } + static void destroySuite(ISISEnergyTransferModelUtilsTest *suite) { delete suite; } void testGetCustomGroupingNumbers() { auto result = getCustomGroupingNumbers("1,2,3-5,6"); diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ReductionAlgorithmUtilsTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ReductionAlgorithmUtilsTest.h index ff467304675e..d0ae7cae5892 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ReductionAlgorithmUtilsTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ReductionAlgorithmUtilsTest.h @@ -15,7 +15,8 @@ using namespace MantidQt::CustomInterfaces; class ReductionAlgorithmUtilsTest : public CxxTest::TestSuite { public: - ReductionAlgorithmUtilsTest() = default; + static ReductionAlgorithmUtilsTest *createSuite() { return new ReductionAlgorithmUtilsTest(); } + static void destroySuite(ReductionAlgorithmUtilsTest *suite) { delete suite; } void setUp() override { m_filename = "C:/path/to/file.raw"; From 3f2f22076a8590267b560e2397cee903f4f7620f Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 10:30:55 +0000 Subject: [PATCH 13/23] Set logging false for mock algorithm call --- .../Indirect/test/Reduction/ISISEnergyTransferModelTest.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h index eaf8c8270ed8..276b5c917954 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferModelTest.h @@ -511,7 +511,11 @@ class ISISEnergyTransferModelTest : public CxxTest::TestSuite { } private: - IAlgorithm_sptr makeReductionAlgorithm() { return AlgorithmManager::Instance().create("ISISIndirectEnergyTransfer"); } + IAlgorithm_sptr makeReductionAlgorithm() { + auto alg = AlgorithmManager::Instance().create("ISISIndirectEnergyTransfer"); + alg->setLogging(false); + return alg; + } std::unique_ptr m_model; IAlgorithm_sptr m_reductionAlg; From c3447b8b57bbb80a1c4a453e84ad99aac9cff926 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 10:42:41 +0000 Subject: [PATCH 14/23] Create interface class for InstrumentConfig --- .../Common/IndirectInstrumentConfig.h | 73 ++++++++++++++----- .../Reduction/IndirectDataReduction.cpp | 2 +- .../Reduction/IndirectDataReduction.h | 4 +- .../Reduction/IndirectDataReductionTab.cpp | 2 +- .../Reduction/IndirectDataReductionTab.h | 2 +- .../ISISEnergyTransferPresenterTest.h | 10 +-- 6 files changed, 63 insertions(+), 30 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Common/IndirectInstrumentConfig.h b/qt/scientific_interfaces/Indirect/Common/IndirectInstrumentConfig.h index 3766e3248f98..20026f8dc2bf 100644 --- a/qt/scientific_interfaces/Indirect/Common/IndirectInstrumentConfig.h +++ b/qt/scientific_interfaces/Indirect/Common/IndirectInstrumentConfig.h @@ -17,6 +17,39 @@ namespace MantidQt { namespace MantidWidgets { + +class IInstrumentConfig { +public: + virtual QStringList getTechniques() = 0; + virtual void setTechniques(const QStringList &techniques) = 0; + + virtual QStringList getDisabledInstruments() = 0; + virtual void setDisabledInstruments(const QStringList &instrumentNames) = 0; + + virtual QString getFacility() = 0; + virtual void setFacility(const QString &facilityName) = 0; + + virtual bool isDiffractionEnabled() = 0; + virtual void enableDiffraction(bool enabled) = 0; + + virtual bool isDiffractionForced() = 0; + virtual void forceDiffraction(bool forced) = 0; + + virtual bool isInstrumentLabelShown() = 0; + virtual void setShowInstrumentLabel(bool visible) = 0; + + virtual QString getInstrumentName() = 0; + virtual void setInstrument(const QString &instrumentName) = 0; + + virtual QString getAnalyserName() = 0; + virtual void setAnalyser(const QString &analyserName) = 0; + + virtual QString getReflectionName() = 0; + virtual void setReflection(const QString &reflectionName) = 0; + + virtual void showAnalyserAndReflectionOptions(bool visible) = 0; +}; + /** Widget used to select an instrument configuration for indirect geometry spectrometers @@ -29,7 +62,7 @@ are populated by loading an empty instrument. @author Dan Nixon */ -class MANTIDQT_INDIRECT_DLL IndirectInstrumentConfig : public API::MantidWidget { +class MANTIDQT_INDIRECT_DLL IndirectInstrumentConfig : public API::MantidWidget, public IInstrumentConfig { Q_OBJECT Q_PROPERTY(QStringList techniques READ getTechniques WRITE setTechniques) @@ -44,41 +77,41 @@ class MANTIDQT_INDIRECT_DLL IndirectInstrumentConfig : public API::MantidWidget ~IndirectInstrumentConfig() override; /* Getters and setters for Qt properties */ - QStringList getTechniques(); - void setTechniques(const QStringList &techniques); + QStringList getTechniques() override; + void setTechniques(const QStringList &techniques) override; - QStringList getDisabledInstruments(); - void setDisabledInstruments(const QStringList &instrumentNames); + QStringList getDisabledInstruments() override; + void setDisabledInstruments(const QStringList &instrumentNames) override; - QString getFacility(); - void setFacility(const QString &facilityName); + QString getFacility() override; + void setFacility(const QString &facilityName) override; - bool isDiffractionEnabled(); - void enableDiffraction(bool enabled); + bool isDiffractionEnabled() override; + void enableDiffraction(bool enabled) override; - bool isDiffractionForced(); - void forceDiffraction(bool forced); + bool isDiffractionForced() override; + void forceDiffraction(bool forced) override; - bool isInstrumentLabelShown(); - void setShowInstrumentLabel(bool visible); + bool isInstrumentLabelShown() override; + void setShowInstrumentLabel(bool visible) override; /// Gets the name of the selected instrument - QString getInstrumentName(); + QString getInstrumentName() override; /// Set the displayed instrument (if exists) - void setInstrument(const QString &instrumentName); + void setInstrument(const QString &instrumentName) override; /// Gets the name of the selected analyser - QString getAnalyserName(); + QString getAnalyserName() override; /// Set the displayed analyser bank (if exists) - void setAnalyser(const QString &analyserName); + void setAnalyser(const QString &analyserName) override; /// Gets the name of the selected reflection - QString getReflectionName(); + QString getReflectionName() override; /// Set the displayed reflection mode (if exists) - void setReflection(const QString &reflectionName); + void setReflection(const QString &reflectionName) override; /// Controls where to show analyser and reflection options or not - void showAnalyserAndReflectionOptions(bool visible); + void showAnalyserAndReflectionOptions(bool visible) override; public slots: /// Called when an instrument configuration is selected diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp index 648b9fe39ad7..0fdd5c95d527 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.cpp @@ -210,7 +210,7 @@ void IndirectDataReduction::loadInstrumentIfNotExist(const std::string &instrume } } -MantidWidgets::IndirectInstrumentConfig *IndirectDataReduction::getInstrumentConfiguration() const { +MantidWidgets::IInstrumentConfig *IndirectDataReduction::getInstrumentConfiguration() const { return m_uiForm.iicInstrumentConfiguration; } diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h index ab9b8f71199e..5f903ed53bb9 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h @@ -26,7 +26,7 @@ class IIndirectDataReduction { public: virtual Mantid::API::MatrixWorkspace_sptr instrumentWorkspace() = 0; - virtual MantidWidgets::IndirectInstrumentConfig *getInstrumentConfiguration() const = 0; + virtual MantidWidgets::IInstrumentConfig *getInstrumentConfiguration() const = 0; virtual QMap getInstrumentDetails() = 0; virtual void showAnalyserAndReflectionOptions(bool visible) = 0; @@ -69,7 +69,7 @@ class IndirectDataReduction : public IndirectInterface, public IIndirectDataRedu void loadInstrumentIfNotExist(const std::string &instrumentName, const std::string &analyser = "", const std::string &reflection = ""); - MantidWidgets::IndirectInstrumentConfig *getInstrumentConfiguration() const override; + MantidWidgets::IInstrumentConfig *getInstrumentConfiguration() const override; QMap getInstrumentDetails() override; void showAnalyserAndReflectionOptions(bool visible) override; diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.cpp b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.cpp index 88d15e8130a4..76c50e3e3d76 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.cpp @@ -127,7 +127,7 @@ bool IndirectDataReductionTab::hasInstrumentDetail(QMap const * * @return Instrument config widget */ -MantidWidgets::IndirectInstrumentConfig *IndirectDataReductionTab::getInstrumentConfiguration() const { +MantidWidgets::IInstrumentConfig *IndirectDataReductionTab::getInstrumentConfiguration() const { return m_idrUI->getInstrumentConfiguration(); } diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.h index 55ca72a407ac..be5e3cd16873 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReductionTab.h @@ -75,7 +75,7 @@ public slots: void validateInstrumentDetail(QString const &key) const; bool hasInstrumentDetail(QString const &key) const; bool hasInstrumentDetail(QMap const &instrumentDetails, QString const &key) const; - MantidWidgets::IndirectInstrumentConfig *getInstrumentConfiguration() const; + MantidWidgets::IInstrumentConfig *getInstrumentConfiguration() const; QString getInstrumentName() const; QString getAnalyserName() const; QString getReflectionName() const; diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index 81a09c9e634e..7e2001a17b40 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -59,13 +59,13 @@ class IETPresenterTest : public CxxTest::TestSuite { } void test_fetch_instrument_data() { - // ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); - // ON_CALL(*m_view, getRunData()); + ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); + ON_CALL(*m_view, getRunData()); - // ExpectationSet expectRunData = EXPECT_CALL(*m_view, getRunData()).Times(1); - // ExpectationSet expectRunAlgo = EXPECT_CALL(*m_model, runIETAlgorithm(_, _, _)).Times(1).After(expectRunData); + ExpectationSet expectRunData = EXPECT_CALL(*m_view, getRunData()).Times(1); + ExpectationSet expectRunAlgo = EXPECT_CALL(*m_model, runIETAlgorithm(_, _, _)).Times(1).After(expectRunData); - // m_presenter->run(); + m_presenter->run(); } private: From 9391c178a220a4b2ce57e85561595efb01edf337 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 10:50:04 +0000 Subject: [PATCH 15/23] Create mock class for InstrumentConfig --- .../Indirect/test/CMakeLists.txt | 2 +- .../Indirect/test/Common/MockObjects.h | 57 +++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 qt/scientific_interfaces/Indirect/test/Common/MockObjects.h diff --git a/qt/scientific_interfaces/Indirect/test/CMakeLists.txt b/qt/scientific_interfaces/Indirect/test/CMakeLists.txt index ef645e9c161b..b5500b6680b0 100644 --- a/qt/scientific_interfaces/Indirect/test/CMakeLists.txt +++ b/qt/scientific_interfaces/Indirect/test/CMakeLists.txt @@ -2,7 +2,7 @@ set(ALL_TEST_FILES) add_subdirectory(Reduction) -set(TEST_HELPERS Reduction/MockObjects.h) +set(TEST_HELPERS Common/MockObjects.h Reduction/MockObjects.h) set(CXXTEST_EXTRA_HEADER_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/InterfacesIndirectTestInitialization.h) diff --git a/qt/scientific_interfaces/Indirect/test/Common/MockObjects.h b/qt/scientific_interfaces/Indirect/test/Common/MockObjects.h new file mode 100644 index 000000000000..6cf9c987db05 --- /dev/null +++ b/qt/scientific_interfaces/Indirect/test/Common/MockObjects.h @@ -0,0 +1,57 @@ +// Mantid Repository : https://github.com/mantidproject/mantid +// +// Copyright © 2024 ISIS Rutherford Appleton Laboratory UKRI, +// NScD Oak Ridge National Laboratory, European Spallation Source +// & Institut Laue - Langevin +// SPDX - License - Identifier: GPL - 3.0 + +#pragma once + +#include +#include + +#include "MantidKernel/WarningSuppressions.h" + +#include "Common/IndirectInstrumentConfig.h" + +#include +#include + +using namespace MantidQt::MantidWidgets; + +GNU_DIAG_OFF_SUGGEST_OVERRIDE + +class MockInstrumentConfig : public IInstrumentConfig { +public: + virtual ~MockInstrumentConfig() = default; + + MOCK_METHOD0(getTechniques, QStringList()); + MOCK_METHOD1(setTechniques, void(const QStringList &techniques)); + + MOCK_METHOD0(getDisabledInstruments, QStringList()); + MOCK_METHOD1(setDisabledInstruments, void(const QStringList &instrumentNames)); + + MOCK_METHOD0(getFacility, QString()); + MOCK_METHOD1(setFacility, void(const QString &facilityName)); + + MOCK_METHOD0(isDiffractionEnabled, bool()); + MOCK_METHOD1(enableDiffraction, void(bool enabled)); + + MOCK_METHOD0(isDiffractionForced, bool()); + MOCK_METHOD1(forceDiffraction, void(bool forced)); + + MOCK_METHOD0(isInstrumentLabelShown, bool()); + MOCK_METHOD1(setShowInstrumentLabel, void(bool visible)); + + MOCK_METHOD0(getInstrumentName, QString()); + MOCK_METHOD1(setInstrument, void(const QString &instrumentName)); + + MOCK_METHOD0(getAnalyserName, QString()); + MOCK_METHOD1(setAnalyser, void(const QString &analyserName)); + + MOCK_METHOD0(getReflectionName, QString()); + MOCK_METHOD1(setReflection, void(const QString &reflectionName)); + + MOCK_METHOD1(showAnalyserAndReflectionOptions, void(bool visible)); +}; + +GNU_DIAG_ON_SUGGEST_OVERRIDE \ No newline at end of file From 218e6f3f7039cfe79509456ffd915032052d47aa Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 10:56:58 +0000 Subject: [PATCH 16/23] Create mock object of InstrumentConfig in presenter test --- .../ISISEnergyTransferPresenterTest.h | 18 +++++++++++++----- .../Indirect/test/Reduction/MockObjects.h | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index 7e2001a17b40..3be97fbbb007 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -10,6 +10,7 @@ #include #include "../../../Inelastic/test/Common/MockObjects.h" +#include "../Common/MockObjects.h" #include "MockObjects.h" #include "Reduction/ISISEnergyTransferPresenter.h" @@ -38,17 +39,21 @@ class IETPresenterTest : public CxxTest::TestSuite { auto model = std::make_unique>(); m_outputOptionsView = std::make_unique>(); + m_instrumentConfig = std::make_unique>(); m_view = std::make_unique>(); ON_CALL(*m_view, getPlotOptionsView()).WillByDefault(Return(m_outputOptionsView.get())); m_model = model.get(); m_idrUI = std::make_unique>(); + ON_CALL(*m_idrUI, getInstrumentConfiguration()).WillByDefault(Return(m_instrumentConfig.get())); m_presenter = std::make_unique(m_idrUI.get(), m_view.get(), std::move(model)); } void tearDown() override { + TS_ASSERT(Mock::VerifyAndClearExpectations(&m_outputOptionsView)); + TS_ASSERT(Mock::VerifyAndClearExpectations(&m_instrumentConfig)); TS_ASSERT(Mock::VerifyAndClearExpectations(&m_view)); TS_ASSERT(Mock::VerifyAndClearExpectations(m_model)); TS_ASSERT(Mock::VerifyAndClearExpectations(&m_idrUI)); @@ -56,16 +61,18 @@ class IETPresenterTest : public CxxTest::TestSuite { m_presenter.reset(); m_idrUI.reset(); m_view.reset(); + m_outputOptionsView.reset(); + m_instrumentConfig.reset(); } void test_fetch_instrument_data() { - ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); - ON_CALL(*m_view, getRunData()); + // ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); + // ON_CALL(*m_view, getRunData()); - ExpectationSet expectRunData = EXPECT_CALL(*m_view, getRunData()).Times(1); - ExpectationSet expectRunAlgo = EXPECT_CALL(*m_model, runIETAlgorithm(_, _, _)).Times(1).After(expectRunData); + // ExpectationSet expectRunData = EXPECT_CALL(*m_view, getRunData()).Times(1); + // ExpectationSet expectRunAlgo = EXPECT_CALL(*m_model, runIETAlgorithm(_, _, _)).Times(1).After(expectRunData); - m_presenter->run(); + // m_presenter->run(); } private: @@ -76,4 +83,5 @@ class IETPresenterTest : public CxxTest::TestSuite { std::unique_ptr> m_idrUI; std::unique_ptr> m_outputOptionsView; + std::unique_ptr> m_instrumentConfig; }; \ No newline at end of file diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h index a77456f34786..e86c4ed8da00 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h @@ -29,7 +29,7 @@ class MockIndirectDataReduction : public IIndirectDataReduction { MOCK_METHOD0(instrumentWorkspace, Mantid::API::MatrixWorkspace_sptr()); - MOCK_CONST_METHOD0(getInstrumentConfiguration, MantidQt::MantidWidgets::IndirectInstrumentConfig *()); + MOCK_CONST_METHOD0(getInstrumentConfiguration, MantidQt::MantidWidgets::IInstrumentConfig *()); MOCK_METHOD0(getInstrumentDetails, QMap()); MOCK_METHOD1(showAnalyserAndReflectionOptions, void(bool visible)); From 65e6e166787cef940224b75f3d3b4937d79c96c9 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 11:05:00 +0000 Subject: [PATCH 17/23] Move showMessageBox to view --- .../Reduction/ISISEnergyTransferPresenter.cpp | 12 +++++------- .../Indirect/Reduction/ISISEnergyTransferPresenter.h | 2 -- .../Indirect/Reduction/ISISEnergyTransferView.cpp | 6 ++++-- .../Indirect/Reduction/ISISEnergyTransferView.h | 5 ++++- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp index 0c45dd63d8e8..7bbf23141282 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp @@ -45,7 +45,7 @@ void IETPresenter::setup() {} bool IETPresenter::validateInstrumentDetails() { auto const instrument = getInstrumentName().toStdString(); if (instrument.empty()) { - showMessageBox("Please select a valid facility and/or instrument."); + m_view->showMessageBox("Please select a valid facility and/or instrument."); return false; } @@ -54,8 +54,8 @@ bool IETPresenter::validateInstrumentDetails() { for (const auto &key : keys) { if (!instrumentDetails.contains(QString::fromStdString(key)) || instrumentDetails[QString::fromStdString(key)].isEmpty()) { - showMessageBox(QString::fromStdString("Could not find " + key + " for the " + instrument + - " instrument. Please select a valid instrument.")); + m_view->showMessageBox("Could not find " + key + " for the " + instrument + + " instrument. Please select a valid instrument."); return false; } } @@ -163,7 +163,7 @@ bool IETPresenter::validate() { QString error = uiv.generateErrorMessage(); if (!error.isEmpty()) - showMessageBox(error); + m_view->showMessageBox(error.toStdString()); return validateInstrumentDetails() && uiv.isAllInputValid(); } @@ -219,7 +219,7 @@ void IETPresenter::notifyPlotRawClicked() { m_view->setPlotTimeIsPlotting(false); for (auto const &error : errors) { if (!error.empty()) - showMessageBox(QString::fromStdString(error)); + m_view->showMessageBox(error); } } } @@ -282,6 +282,4 @@ void IETPresenter::setFileExtensionsByName(bool filter) { m_view->setFileExtensionsByName(fbSuffixes, wsSuffixes); } -void IETPresenter::notifyNewMessage(QString const &message) { showMessageBox(message); } - } // namespace MantidQt::CustomInterfaces \ No newline at end of file diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h index 21a2e515ac17..69ed63fd2a56 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h @@ -18,7 +18,6 @@ namespace CustomInterfaces { class MANTIDQT_INDIRECT_DLL IIETPresenter { public: - virtual void notifyNewMessage(const QString &message) = 0; virtual void notifySaveClicked() = 0; virtual void notifyRunClicked() = 0; virtual void notifyPlotRawClicked() = 0; @@ -36,7 +35,6 @@ class MANTIDQT_INDIRECT_DLL IETPresenter : public IndirectDataReductionTab, publ void setup() override; void run() override; - void notifyNewMessage(const QString &message) override; void notifySaveClicked() override; void notifyRunClicked() override; void notifyPlotRawClicked() override; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp index ca3b86386521..ff3969ff8cf9 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp @@ -291,7 +291,9 @@ void IETView::setEnableOutputOptions(bool const enable) { setSaveEnabled(enable); } -void IETView::showMessageBox(const QString &message) { m_presenter->notifyNewMessage(message); } +void IETView::showMessageBox(std::string const &message) { + QMessageBox::warning(this, "Warning!", QString::fromStdString(message)); +} void IETView::saveClicked() { m_presenter->notifySaveClicked(); } @@ -311,7 +313,7 @@ void IETView::handleDataReady() { auto const errorMessage = uiv.generateErrorMessage(); if (!errorMessage.isEmpty()) - emit showMessageBox(errorMessage); + showMessageBox(errorMessage.toStdString()); } void IETView::pbRunEditing() { setRunButtonText("Editing..."); } diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h index a18340ed7983..0375af811e11 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h @@ -75,6 +75,8 @@ class MANTIDQT_INDIRECT_DLL IIETView { virtual void setInstrumentEFixed(std::string const &instrumentName, double eFixed) = 0; virtual void setInstrumentGrouping(std::string const &instrumentName) = 0; virtual void setInstrumentSpecDefault(std::map &specMap) = 0; + + virtual void showMessageBox(std::string const &message) = 0; }; class MANTIDQT_INDIRECT_DLL IETView : public QWidget, public IIETView { @@ -138,8 +140,9 @@ class MANTIDQT_INDIRECT_DLL IETView : public QWidget, public IIETView { void setInstrumentGrouping(std::string const &instrumentName) override; void setInstrumentSpecDefault(std::map &specMap) override; + void showMessageBox(std::string const &message) override; + private slots: - void showMessageBox(const QString &message); void saveClicked(); void runClicked(); void plotRawClicked(); From 717b9d7cecb2ecbd9d1f7430c32cd2e885f80a22 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 11:35:25 +0000 Subject: [PATCH 18/23] Add tests for saving data --- .../Reduction/ISISEnergyTransferModel.cpp | 8 +++--- .../Reduction/ISISEnergyTransferModel.h | 8 ++++++ .../Reduction/ISISEnergyTransferPresenter.cpp | 18 ++++++------ .../Reduction/ISISEnergyTransferPresenter.h | 1 - .../Reduction/ISISEnergyTransferView.cpp | 5 ---- .../Reduction/ISISEnergyTransferView.h | 3 -- .../ISISEnergyTransferPresenterTest.h | 28 +++++++++++++++++++ .../Indirect/test/Reduction/MockObjects.h | 5 +++- 8 files changed, 52 insertions(+), 24 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.cpp index d4f297dfb8f0..d74cbb7d0a19 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.cpp @@ -16,7 +16,7 @@ using namespace Mantid::API; namespace MantidQt::CustomInterfaces { -IETModel::IETModel() {} +IETModel::IETModel() : m_outputWorkspaces() {} std::vector IETModel::validateRunData(IETRunData const &runData) { std::vector errors; @@ -274,11 +274,11 @@ double IETModel::loadDetailedBalance(std::string const &filename) { std::vector IETModel::groupWorkspaces(std::string const &groupName, std::string const &instrument, std::string const &groupOption, bool const shouldGroup) { - std::vector outputWorkspaces; + m_outputWorkspaces.clear(); if (WorkspaceUtils::doesExistInADS(groupName)) { if (auto const outputGroup = WorkspaceUtils::getADSWorkspace(groupName)) { - outputWorkspaces = outputGroup->getNames(); + m_outputWorkspaces = outputGroup->getNames(); if (instrument == "OSIRIS") { if (!shouldGroup) { @@ -296,7 +296,7 @@ std::vector IETModel::groupWorkspaces(std::string const &groupName, } } - return outputWorkspaces; + return m_outputWorkspaces; } void IETModel::ungroupWorkspace(std::string const &workspaceName) { diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h index cfee4e864165..2b4ecf0e1849 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h @@ -38,6 +38,8 @@ class MANTIDQT_INDIRECT_DLL IIETModel { virtual std::vector groupWorkspaces(std::string const &groupName, std::string const &instrument, std::string const &groupOption, bool const shouldGroup) = 0; + + virtual std::vector outputWorkspaceNames() const = 0; }; class MANTIDQT_INDIRECT_DLL IETModel : public IIETModel { @@ -75,6 +77,10 @@ class MANTIDQT_INDIRECT_DLL IETModel : public IIETModel { std::string const &outputGroupName); std::string getOutputGroupName(InstrumentData const &instData, std::string const &inputFiles); + [[nodiscard]] inline std::vector outputWorkspaceNames() const noexcept override { + return m_outputWorkspaces; + } + private: void saveDaveGroup(std::string const &workspaceName, std::string const &outputName); void saveAclimax(std::string const &workspaceName, std::string const &outputName, @@ -88,6 +94,8 @@ class MANTIDQT_INDIRECT_DLL IETModel : public IIETModel { std::deque plotRawAlgorithmQueue(std::string const &rawFile, std::string const &basename, std::string const &instrumentName, std::vector const &detectorList, IETBackgroundData const &backgroundData) const; + + std::vector m_outputWorkspaces; }; } // namespace CustomInterfaces } // namespace MantidQt \ No newline at end of file diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp index 7bbf23141282..c9be4a3820a6 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp @@ -190,15 +190,13 @@ void IETPresenter::algorithmComplete(bool error) { if (!error) { InstrumentData instrumentData = getInstrumentData(); - m_outputWorkspaces = m_model->groupWorkspaces(m_outputGroupName, instrumentData.getInstrument(), - m_view->getGroupOutputOption(), m_view->getGroupOutputCheckbox()); - m_pythonExportWsName = m_outputWorkspaces[0]; - - if (m_outputWorkspaces.size() != 0) { - setOutputPlotOptionsWorkspaces(m_outputWorkspaces); - m_view->setOutputWorkspaces(m_outputWorkspaces); - m_view->setSaveEnabled(true); - } + auto const outputWorkspaceNames = + m_model->groupWorkspaces(m_outputGroupName, instrumentData.getInstrument(), m_view->getGroupOutputOption(), + m_view->getGroupOutputCheckbox()); + m_pythonExportWsName = outputWorkspaceNames[0]; + + setOutputPlotOptionsWorkspaces(outputWorkspaceNames); + m_view->setSaveEnabled(!outputWorkspaceNames.empty()); } } @@ -239,7 +237,7 @@ void IETPresenter::plotRawComplete(bool error) { void IETPresenter::notifySaveClicked() { IETSaveData saveData = m_view->getSaveData(); - for (auto const &workspaceName : m_outputWorkspaces) + for (auto const &workspaceName : m_model->outputWorkspaceNames()) if (WorkspaceUtils::doesExistInADS(workspaceName)) m_model->saveWorkspace(workspaceName, saveData); } diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h index 69ed63fd2a56..f531bf7a9d71 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h @@ -57,7 +57,6 @@ private slots: void setFileExtensionsByName(bool filter) override; std::string m_outputGroupName; - std::vector m_outputWorkspaces; IIETView *m_view; std::unique_ptr m_model; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp index ff3969ff8cf9..c38ad7333ec5 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp @@ -190,7 +190,6 @@ void IETView::setSingleRebin(bool enable) { void IETView::setMultipleRebin(bool enable) { m_uiForm.valRebinString->setVisible(enable); } void IETView::setSaveEnabled(bool enable) { - enable = !m_outputWorkspaces.empty() ? enable : false; m_uiForm.pbSave->setEnabled(enable); m_uiForm.ckSaveAclimax->setEnabled(enable); m_uiForm.ckSaveASCII->setEnabled(enable); @@ -209,10 +208,6 @@ void IETView::setFileExtensionsByName(QStringList calibrationFbSuffixes, QString m_uiForm.dsCalibrationFile->setWSSuffixes(calibrationWSSuffixes); } -void IETView::setOutputWorkspaces(std::vector const &outputWorkspaces) { - m_outputWorkspaces = outputWorkspaces; -} - void IETView::setInstrumentSpectraRange(int specMin, int specMax) { m_uiForm.spSpectraMin->setRange(specMin, specMax); m_uiForm.spSpectraMin->setValue(specMin); diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h index 0375af811e11..94b140bc5871 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h @@ -65,7 +65,6 @@ class MANTIDQT_INDIRECT_DLL IIETView { virtual void setSaveEnabled(bool enable) = 0; virtual void setPlotTimeIsPlotting(bool plotting) = 0; virtual void setFileExtensionsByName(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes) = 0; - virtual void setOutputWorkspaces(std::vector const &outputWorkspaces) = 0; virtual void setRunButtonText(std::string const &runText) = 0; virtual void setEnableOutputOptions(bool const enable) = 0; @@ -129,7 +128,6 @@ class MANTIDQT_INDIRECT_DLL IETView : public QWidget, public IIETView { void setSaveEnabled(bool enable) override; void setPlotTimeIsPlotting(bool plotting) override; void setFileExtensionsByName(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes) override; - void setOutputWorkspaces(std::vector const &outputWorkspaces) override; void setRunButtonText(std::string const &runText) override; void setEnableOutputOptions(bool const enable) override; @@ -157,7 +155,6 @@ private slots: private: void setPlotTimeEnabled(bool enable); - std::vector m_outputWorkspaces; Ui::ISISEnergyTransfer m_uiForm; IIETPresenter *m_presenter; DetectorGroupingOptions *m_groupingWidget; diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index 3be97fbbb007..7aa2af716ab2 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -15,6 +15,7 @@ #include "Reduction/ISISEnergyTransferPresenter.h" #include "MantidAPI/AlgorithmProperties.h" +#include "MantidFrameworkTestHelpers/IndirectFitDataCreationHelper.h" #include "MantidKernel/WarningSuppressions.h" using namespace MantidQt::CustomInterfaces; @@ -28,6 +29,8 @@ std::unique_ptr defaultGroupingProps() { return properties; } +IETSaveData createSaveData() { return IETSaveData(true, true, true, true, true); } + } // namespace class IETPresenterTest : public CxxTest::TestSuite { @@ -65,6 +68,31 @@ class IETPresenterTest : public CxxTest::TestSuite { m_instrumentConfig.reset(); } + void test_notifySaveClicked_will_not_save_the_workspace_if_its_not_in_the_ADS() { + std::vector names{"NotInADS"}; + + ON_CALL(*m_view, getSaveData()).WillByDefault(Return(createSaveData())); + ON_CALL(*m_model, outputWorkspaceNames()).WillByDefault(Return(names)); + + // Expect no call because the workspace is not in the ADS + EXPECT_CALL(*m_model, saveWorkspace(_, _)).Times(0); + + m_presenter->notifySaveClicked(); + } + + void test_notifySaveClicked_will_save_the_workspace_if_its_not_in_the_ADS() { + std::vector names{"InADS"}; + auto const workspace = Mantid::IndirectFitDataCreationHelper::createWorkspace(4, 5); + AnalysisDataService::Instance().addOrReplace(names[0], workspace); + + ON_CALL(*m_view, getSaveData()).WillByDefault(Return(createSaveData())); + ON_CALL(*m_model, outputWorkspaceNames()).WillByDefault(Return(names)); + + EXPECT_CALL(*m_model, saveWorkspace(names[0], _)).Times(1); + + m_presenter->notifySaveClicked(); + } + void test_fetch_instrument_data() { // ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); // ON_CALL(*m_view, getRunData()); diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h index e86c4ed8da00..1139aa961c2f 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h @@ -59,6 +59,8 @@ class MockIETModel : public IIETModel { MOCK_METHOD4(groupWorkspaces, std::vector(std::string const &groupName, std::string const &instrument, std::string const &groupOption, bool const shouldGroup)); + + MOCK_CONST_METHOD0(outputWorkspaceNames, std::vector()); }; class MockIETView : public IIETView { @@ -104,9 +106,10 @@ class MockIETView : public IIETView { MOCK_METHOD1(setSaveEnabled, void(bool enable)); MOCK_METHOD1(setPlotTimeIsPlotting, void(bool plotting)); MOCK_METHOD2(setFileExtensionsByName, void(QStringList calibrationFbSuffixes, QStringList calibrationWSSuffixes)); - MOCK_METHOD1(setOutputWorkspaces, void(std::vector const &outputWorkspaces)); MOCK_METHOD1(setRunButtonText, void(std::string const &runText)); MOCK_METHOD1(setEnableOutputOptions, void(bool const enable)); + + MOCK_METHOD1(showMessageBox, void(std::string const &message)); }; GNU_DIAG_ON_SUGGEST_OVERRIDE \ No newline at end of file From e3ab6031f4f9883271c226242592809f02fbbaf9 Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 11:44:37 +0000 Subject: [PATCH 19/23] Add tests for notifyRunFinished --- .../ISISEnergyTransferPresenterTest.h | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index 7aa2af716ab2..b4256389ea60 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -93,14 +93,29 @@ class IETPresenterTest : public CxxTest::TestSuite { m_presenter->notifySaveClicked(); } - void test_fetch_instrument_data() { - // ON_CALL(*m_model, runIETAlgorithm(_, _, _)).WillByDefault(Return("")); - // ON_CALL(*m_view, getRunData()); + void test_notifyRunFinished_sets_run_text_to_invalid_if_the_run_files_are_not_valid() { + ON_CALL(*m_view, isRunFilesValid()).WillByDefault(Return(false)); - // ExpectationSet expectRunData = EXPECT_CALL(*m_view, getRunData()).Times(1); - // ExpectationSet expectRunAlgo = EXPECT_CALL(*m_model, runIETAlgorithm(_, _, _)).Times(1).After(expectRunData); + EXPECT_CALL(*m_view, setRunButtonText("Invalid Run(s)")).Times(1); + EXPECT_CALL(*m_view, setRunFilesEnabled(true)).Times(1); - // m_presenter->run(); + m_presenter->notifyRunFinished(); + } + + void test_notifyRunFinished_sets_the_run_text_when_the_run_files_are_valid() { + std::string const filename = "filename.nxs"; + double const detailedBalance = 1.1; + + ON_CALL(*m_view, isRunFilesValid()).WillByDefault(Return(true)); + + ON_CALL(*m_view, getFirstFilename()).WillByDefault(Return(filename)); + ON_CALL(*m_model, loadDetailedBalance(filename)).WillByDefault(Return(detailedBalance)); + + EXPECT_CALL(*m_view, setDetailedBalance(detailedBalance)).Times(1); + EXPECT_CALL(*m_view, setRunButtonText("Run")).Times(1); + EXPECT_CALL(*m_view, setRunFilesEnabled(true)).Times(1); + + m_presenter->notifyRunFinished(); } private: From 3b40366aa06fc16044dc4ee650c51fca9fc5613c Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 12:18:03 +0000 Subject: [PATCH 20/23] Define default destructors for interface classes to ensure no memory leak when attempting to delete mock objects --- .../Indirect/Common/IndirectInstrumentConfig.h | 2 ++ .../Indirect/Reduction/ILLEnergyTransfer.h | 5 ----- .../Indirect/Reduction/ISISEnergyTransferModel.h | 2 ++ .../Indirect/Reduction/ISISEnergyTransferPresenter.cpp | 2 -- .../Indirect/Reduction/ISISEnergyTransferPresenter.h | 1 - .../Indirect/Reduction/ISISEnergyTransferView.cpp | 2 -- .../Indirect/Reduction/ISISEnergyTransferView.h | 3 ++- .../Indirect/Reduction/IndirectDataReduction.h | 2 ++ .../Indirect/Reduction/IndirectTransmission.h | 10 ---------- 9 files changed, 8 insertions(+), 21 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Common/IndirectInstrumentConfig.h b/qt/scientific_interfaces/Indirect/Common/IndirectInstrumentConfig.h index 20026f8dc2bf..4907690af2b8 100644 --- a/qt/scientific_interfaces/Indirect/Common/IndirectInstrumentConfig.h +++ b/qt/scientific_interfaces/Indirect/Common/IndirectInstrumentConfig.h @@ -20,6 +20,8 @@ namespace MantidWidgets { class IInstrumentConfig { public: + virtual ~IInstrumentConfig() = default; + virtual QStringList getTechniques() = 0; virtual void setTechniques(const QStringList &techniques) = 0; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.h b/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.h index 2902f6a246b5..11502477fcc4 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ILLEnergyTransfer.h @@ -15,11 +15,6 @@ namespace MantidQt { namespace CustomInterfaces { class IIndirectDataReduction; -/** ILLEnergyTransfer - -@author Dan Nixon -@date 23/07/2014 -*/ class MANTIDQT_INDIRECT_DLL ILLEnergyTransfer : public IndirectDataReductionTab { Q_OBJECT diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h index 2b4ecf0e1849..54860df647b8 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferModel.h @@ -20,6 +20,8 @@ namespace CustomInterfaces { class MANTIDQT_INDIRECT_DLL IIETModel { public: + virtual ~IIETModel() = default; + virtual void setInstrumentProperties(IAlgorithmRuntimeProps &properties, InstrumentData const &instData) = 0; virtual std::vector validateRunData(IETRunData const &runData) = 0; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp index c9be4a3820a6..c0c84c56b3e4 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.cpp @@ -38,8 +38,6 @@ IETPresenter::IETPresenter(IIndirectDataReduction *idrUI, IIETView *view, std::u connect(this, SIGNAL(newInstrumentConfiguration()), this, SLOT(setInstrumentDefault())); } -IETPresenter::~IETPresenter() = default; - void IETPresenter::setup() {} bool IETPresenter::validateInstrumentDetails() { diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h index f531bf7a9d71..9415206d9aa1 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferPresenter.h @@ -30,7 +30,6 @@ class MANTIDQT_INDIRECT_DLL IETPresenter : public IndirectDataReductionTab, publ public: IETPresenter(IIndirectDataReduction *idrUI, IIETView *view, std::unique_ptr model); - ~IETPresenter() override; void setup() override; void run() override; diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp index c38ad7333ec5..e5c89c25bbed 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.cpp @@ -39,8 +39,6 @@ IETView::IETView(QWidget *parent) { SLOT(saveCustomGroupingClicked(std::string const &))); } -IETView::~IETView() {} - void IETView::subscribePresenter(IIETPresenter *presenter) { m_presenter = presenter; } IETRunData IETView::getRunData() const { diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h index 94b140bc5871..931ee651054d 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h @@ -20,6 +20,8 @@ class IIETPresenter; class MANTIDQT_INDIRECT_DLL IIETView { public: + virtual ~IIETView() = default; + virtual void subscribePresenter(IIETPresenter *presenter) = 0; virtual IETRunData getRunData() const = 0; @@ -83,7 +85,6 @@ class MANTIDQT_INDIRECT_DLL IETView : public QWidget, public IIETView { public: IETView(QWidget *parent = nullptr); - ~IETView(); void subscribePresenter(IIETPresenter *presenter) override; diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h index 5f903ed53bb9..166a1a9c1510 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectDataReduction.h @@ -24,6 +24,8 @@ class IndirectDataReductionTab; class IIndirectDataReduction { public: + virtual ~IIndirectDataReduction() = default; + virtual Mantid::API::MatrixWorkspace_sptr instrumentWorkspace() = 0; virtual MantidWidgets::IInstrumentConfig *getInstrumentConfiguration() const = 0; diff --git a/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.h b/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.h index 3a7620ba27a1..c73e4fa02d8a 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.h +++ b/qt/scientific_interfaces/Indirect/Reduction/IndirectTransmission.h @@ -15,16 +15,6 @@ namespace MantidQt { namespace CustomInterfaces { class IIndirectDataReduction; -/** IndirectTransmission - -Provides the UI interface to the IndirectTransmissionMonitor algorithm to -calculate -sample transmission using a sample and container raw run file. - - -@author Samuel Jackson -@date 13/08/2013 -*/ class MANTIDQT_INDIRECT_DLL IndirectTransmission : public IndirectDataReductionTab { Q_OBJECT From 2b86678767d469bff62253955997e0c08c0f746a Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 14:34:33 +0000 Subject: [PATCH 21/23] Rename IETPresenterTest --- .../test/Reduction/ISISEnergyTransferPresenterTest.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index b4256389ea60..f59e6196cfbe 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -33,10 +33,10 @@ IETSaveData createSaveData() { return IETSaveData(true, true, true, true, true); } // namespace -class IETPresenterTest : public CxxTest::TestSuite { +class ISISEnergyTransferPresenterTest : public CxxTest::TestSuite { public: - static IETPresenterTest *createSuite() { return new IETPresenterTest(); } - static void destroySuite(IETPresenterTest *suite) { delete suite; } + static ISISEnergyTransferPresenterTest *createSuite() { return new ISISEnergyTransferPresenterTest(); } + static void destroySuite(ISISEnergyTransferPresenterTest *suite) { delete suite; } void setUp() override { auto model = std::make_unique>(); From 9a6dab00ca514e9812cad76017525c68b36c1def Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 20 Mar 2024 17:01:48 +0000 Subject: [PATCH 22/23] Remove unused function --- .../Indirect/Reduction/ISISEnergyTransferView.h | 5 ++--- .../test/Reduction/ISISEnergyTransferPresenterTest.h | 7 ------- .../Indirect/test/Reduction/MockObjects.h | 8 +++++++- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h index 931ee651054d..132a9ead5af5 100644 --- a/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h +++ b/qt/scientific_interfaces/Indirect/Reduction/ISISEnergyTransferView.h @@ -59,7 +59,6 @@ class MANTIDQT_INDIRECT_DLL IIETView { virtual void setGroupOutputCheckBoxVisible(bool visible) = 0; virtual void setGroupOutputDropdownVisible(bool visible) = 0; - virtual void setInstrumentDefault(InstrumentData const &instrumentDetails) = 0; virtual void setDetailedBalance(double detailedBalance) = 0; virtual void setRunFilesEnabled(bool enable) = 0; virtual void setSingleRebin(bool enable) = 0; @@ -71,8 +70,8 @@ class MANTIDQT_INDIRECT_DLL IIETView { virtual void setEnableOutputOptions(bool const enable) = 0; virtual void setInstrumentSpectraRange(int specMin, int specMax) = 0; - virtual void setInstrumentRebinning(std::vector const &rebinParams, std::string const &rebinText, bool checked, - int tabIndex) = 0; + virtual void setInstrumentRebinning(std::vector const &rebinParams, std::string const &rebinText, + bool checked, int tabIndex) = 0; virtual void setInstrumentEFixed(std::string const &instrumentName, double eFixed) = 0; virtual void setInstrumentGrouping(std::string const &instrumentName) = 0; virtual void setInstrumentSpecDefault(std::map &specMap) = 0; diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h index f59e6196cfbe..20077aa02d89 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/ISISEnergyTransferPresenterTest.h @@ -14,7 +14,6 @@ #include "MockObjects.h" #include "Reduction/ISISEnergyTransferPresenter.h" -#include "MantidAPI/AlgorithmProperties.h" #include "MantidFrameworkTestHelpers/IndirectFitDataCreationHelper.h" #include "MantidKernel/WarningSuppressions.h" @@ -23,12 +22,6 @@ using namespace testing; namespace { -std::unique_ptr defaultGroupingProps() { - auto properties = std::make_unique(); - Mantid::API::AlgorithmProperties::update("GroupingMethod", std::string("IPF"), *properties); - return properties; -} - IETSaveData createSaveData() { return IETSaveData(true, true, true, true, true); } } // namespace diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h index 1139aa961c2f..2cad26d6c0ae 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h +++ b/qt/scientific_interfaces/Indirect/test/Reduction/MockObjects.h @@ -98,7 +98,6 @@ class MockIETView : public IIETView { MOCK_METHOD1(setOutputInCm1Visible, void(bool visible)); MOCK_METHOD1(setGroupOutputCheckBoxVisible, void(bool visible)); MOCK_METHOD1(setGroupOutputDropdownVisible, void(bool visible)); - MOCK_METHOD1(setInstrumentDefault, void(InstrumentData const &instrumentDetails)); MOCK_METHOD1(setDetailedBalance, void(double detailedBalance)); MOCK_METHOD1(setRunFilesEnabled, void(bool enable)); MOCK_METHOD1(setSingleRebin, void(bool enable)); @@ -109,6 +108,13 @@ class MockIETView : public IIETView { MOCK_METHOD1(setRunButtonText, void(std::string const &runText)); MOCK_METHOD1(setEnableOutputOptions, void(bool const enable)); + MOCK_METHOD2(setInstrumentSpectraRange, void(int specMin, int specMax)); + MOCK_METHOD4(setInstrumentRebinning, + void(std::vector const &rebinParams, std::string const &rebinText, bool checked, int tabIndex)); + MOCK_METHOD2(setInstrumentEFixed, void(std::string const &instrumentName, double eFixed)); + MOCK_METHOD1(setInstrumentGrouping, void(std::string const &instrumentName)); + MOCK_METHOD1(setInstrumentSpecDefault, void(std::map &specMap)); + MOCK_METHOD1(showMessageBox, void(std::string const &message)); }; From 22927c68700257760ad495ffc15e82d9a06ed86d Mon Sep 17 00:00:00 2001 From: Applin Date: Wed, 27 Mar 2024 10:06:43 +0000 Subject: [PATCH 23/23] Update cmakelists for Indirect test directory --- qt/scientific_interfaces/Indirect/test/CMakeLists.txt | 6 +++--- .../Indirect/test/Common/CMakeLists.txt | 10 ++++++++++ .../Indirect/test/Reduction/CMakeLists.txt | 11 ++++++++++- 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 qt/scientific_interfaces/Indirect/test/Common/CMakeLists.txt diff --git a/qt/scientific_interfaces/Indirect/test/CMakeLists.txt b/qt/scientific_interfaces/Indirect/test/CMakeLists.txt index b5500b6680b0..202fc31154fd 100644 --- a/qt/scientific_interfaces/Indirect/test/CMakeLists.txt +++ b/qt/scientific_interfaces/Indirect/test/CMakeLists.txt @@ -1,9 +1,9 @@ set(ALL_TEST_FILES) +set(ALL_TEST_HELPERS) +add_subdirectory(Common) add_subdirectory(Reduction) -set(TEST_HELPERS Common/MockObjects.h Reduction/MockObjects.h) - set(CXXTEST_EXTRA_HEADER_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/InterfacesIndirectTestInitialization.h) mtd_add_qt_tests( @@ -11,7 +11,7 @@ mtd_add_qt_tests( QT_VERSION 5 SRC ${ALL_TEST_FILES} INCLUDE_DIRS ../../../../Framework/DataObjects/inc ../ - TEST_HELPER_SRCS ${TEST_HELPERS} + TEST_HELPER_SRCS ${ALL_TEST_HELPERS} LINK_LIBS ${CORE_MANTIDLIBS} Mantid::DataObjects gmock diff --git a/qt/scientific_interfaces/Indirect/test/Common/CMakeLists.txt b/qt/scientific_interfaces/Indirect/test/Common/CMakeLists.txt new file mode 100644 index 000000000000..aecc4af95acd --- /dev/null +++ b/qt/scientific_interfaces/Indirect/test/Common/CMakeLists.txt @@ -0,0 +1,10 @@ +get_filename_component(SUB_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" NAME) + +set(TEST_HELPERS MockObjects.h) + +list(TRANSFORM TEST_HELPERS PREPEND ${SUB_DIRECTORY}/) + +set(ALL_TEST_HELPERS + ${ALL_TEST_HELPERS} ${TEST_HELPERS} + PARENT_SCOPE +) diff --git a/qt/scientific_interfaces/Indirect/test/Reduction/CMakeLists.txt b/qt/scientific_interfaces/Indirect/test/Reduction/CMakeLists.txt index ef34ea0fd594..b3befd608c74 100644 --- a/qt/scientific_interfaces/Indirect/test/Reduction/CMakeLists.txt +++ b/qt/scientific_interfaces/Indirect/test/Reduction/CMakeLists.txt @@ -1,10 +1,19 @@ get_filename_component(SUB_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" NAME) -set(TEST_FILES ISISEnergyTransferModelTest.h ISISEnergyTransferModelUtilsTest.h ReductionAlgorithmUtilsTest.h) +set(TEST_FILES ISISEnergyTransferModelTest.h ISISEnergyTransferModelUtilsTest.h ISISEnergyTransferPresenterTest.h + ReductionAlgorithmUtilsTest.h +) + +set(TEST_HELPERS MockObjects.h) list(TRANSFORM TEST_FILES PREPEND ${SUB_DIRECTORY}/) +list(TRANSFORM TEST_HELPERS PREPEND ${SUB_DIRECTORY}/) set(ALL_TEST_FILES ${ALL_TEST_FILES} ${TEST_FILES} PARENT_SCOPE ) +set(ALL_TEST_HELPERS + ${ALL_TEST_HELPERS} ${TEST_HELPERS} + PARENT_SCOPE +)