From be8f3c04d9053f00a9fde98c5151856898633ad7 Mon Sep 17 00:00:00 2001
From: Martyn Gigg <martyn.gigg@stfc.ac.uk>
Date: Thu, 3 Jan 2019 10:45:23 +0000
Subject: [PATCH] Add missing tests for history propagation.

Refs #24372
---
 Framework/API/test/AlgorithmTest.h | 126 ++++++++++++++++++++++-------
 1 file changed, 96 insertions(+), 30 deletions(-)

diff --git a/Framework/API/test/AlgorithmTest.h b/Framework/API/test/AlgorithmTest.h
index 2d6c805eee6..cf7eeae99f7 100644
--- a/Framework/API/test/AlgorithmTest.h
+++ b/Framework/API/test/AlgorithmTest.h
@@ -12,10 +12,12 @@
 #include "FakeAlgorithms.h"
 #include "MantidAPI/Algorithm.tcc"
 #include "MantidAPI/AlgorithmFactory.h"
+#include "MantidAPI/AlgorithmHistory.h"
 #include "MantidAPI/FrameworkManager.h"
 #include "MantidAPI/HistogramValidator.h"
 #include "MantidAPI/WorkspaceFactory.h"
 #include "MantidAPI/WorkspaceGroup.h"
+#include "MantidAPI/WorkspaceHistory.h"
 #include "MantidAPI/WorkspaceProperty.h"
 #include "MantidKernel/ArrayProperty.h"
 #include "MantidKernel/Property.h"
@@ -58,21 +60,20 @@ public:
   }
 
   void exec() override {
-    boost::shared_ptr<WorkspaceTester> out1 =
-        boost::make_shared<WorkspaceTester>();
+    const std::string outName = getPropertyValue("InputWorkspace1") + "+" +
+                                getPropertyValue("InputWorkspace2") + "+" +
+                                getPropertyValue("InOutWorkspace");
+    auto out1 = boost::make_shared<WorkspaceTester>();
     out1->initialize(10, 10, 10);
-    boost::shared_ptr<WorkspaceTester> out2 =
-        boost::make_shared<WorkspaceTester>();
-    out2->initialize(10, 10, 10);
-    std::string outName = getPropertyValue("InputWorkspace1") + "+" +
-                          getPropertyValue("InputWorkspace2") + "+" +
-                          getPropertyValue("InOutWorkspace");
     out1->setTitle(outName);
-    out2->setTitle(outName);
-    double val = getProperty("Number");
-    out1->dataY(0)[0] = val;
+    out1->dataY(0)[0] = getProperty("Number");
     setProperty("OutputWorkspace1", out1);
-    setProperty("OutputWorkspace2", out2);
+    if (!getPropertyValue("OutputWorkspace2").empty()) {
+      auto out2 = boost::make_shared<WorkspaceTester>();
+      out2->initialize(10, 10, 10);
+      out2->setTitle(outName);
+      setProperty("OutputWorkspace2", out2);
+    }
   }
 };
 DECLARE_ALGORITHM(StubbedWorkspaceAlgorithm)
@@ -214,6 +215,8 @@ public:
     Mantid::API::AlgorithmFactory::Instance().unsubscribe("ToyAlgorithmTwo", 1);
   }
 
+  void setUp() override { AnalysisDataService::Instance().clear(); }
+
   void testAlgorithm() {
     std::string theName = alg.name();
     TS_ASSERT(!theName.compare("ToyAlgorithm"));
@@ -572,32 +575,33 @@ public:
    * @param group1 :: name of the group. Do nothing if blank.
    * @param contents1 :: comma-sep names of fake workspaces in the group
    *        Make no group if blank, just 1 workspace
+   * @return The new WorkspaceGroup object
    */
-  void makeWorkspaceGroup(std::string group1, std::string contents1) {
+  Workspace_sptr makeWorkspaceGroup(std::string group1, std::string contents1) {
+    auto &ads = AnalysisDataService::Instance();
     if (contents1.empty()) {
       if (group1.empty())
-        return;
-      boost::shared_ptr<WorkspaceTester> ws =
-          boost::make_shared<WorkspaceTester>();
-      AnalysisDataService::Instance().addOrReplace(group1, ws);
-      return;
+        return Workspace_sptr();
+      auto ws = boost::make_shared<WorkspaceTester>();
+      ads.addOrReplace(group1, ws);
+      return ws;
     }
 
     std::vector<std::string> names;
     boost::split(names, contents1,
                  boost::algorithm::detail::is_any_ofF<char>(","));
     if (names.size() >= 1) {
-      WorkspaceGroup_sptr wsGroup = WorkspaceGroup_sptr(new WorkspaceGroup());
-      AnalysisDataService::Instance().addOrReplace(group1, wsGroup);
-      std::vector<std::string>::iterator it = names.begin();
-      for (; it != names.end(); it++) {
-        boost::shared_ptr<WorkspaceTester> ws =
-            boost::make_shared<WorkspaceTester>();
+      auto wsGroup = WorkspaceGroup_sptr(new WorkspaceGroup());
+      ads.addOrReplace(group1, wsGroup);
+      for (const auto &name : names) {
+        auto ws = boost::make_shared<WorkspaceTester>();
         ws->initialize(10, 10, 10);
-        AnalysisDataService::Instance().addOrReplace(*it, ws);
-        wsGroup->add(*it);
+        ads.addOrReplace(name, ws);
+        wsGroup->add(name);
       }
+      return wsGroup;
     }
+    return Workspace_sptr();
   }
 
   //------------------------------------------------------------------------
@@ -650,7 +654,6 @@ public:
 
   /// All groups are the same size
   void test_processGroups_allSameSize() {
-    Mantid::API::AnalysisDataService::Instance().clear();
     WorkspaceGroup_sptr group = do_test_groups(
         "A", "A_1,A_2,A_3", "B", "B_1,B_2,B_3", "C", "C_1,C_2,C_3");
 
@@ -762,7 +765,6 @@ public:
 
   /// Rewrite first input group
   void test_processGroups_rewriteFirstGroup() {
-    Mantid::API::AnalysisDataService::Instance().clear();
     WorkspaceGroup_sptr group =
         do_test_groups("D", "D1,D2,D3", "B", "B1,B2,B3", "C", "C1,C2,C3");
 
@@ -777,7 +779,6 @@ public:
 
   /// Rewrite second group
   void test_processGroups_rewriteSecondGroup() {
-    Mantid::API::AnalysisDataService::Instance().clear();
     WorkspaceGroup_sptr group =
         do_test_groups("A", "A1,A2,A3", "D", "D1,D2,D3", "C", "C1,C2,C3");
 
@@ -792,7 +793,6 @@ public:
 
   /// Rewrite multiple group
   void test_processGroups_rewriteMultipleGroup() {
-    Mantid::API::AnalysisDataService::Instance().clear();
     WorkspaceGroup_sptr group =
         do_test_groups("A", "A1,A2,A3", "D", "D1,D2,D3", "D", "D1,D2,D3");
 
@@ -805,6 +805,72 @@ public:
     TS_ASSERT_EQUALS(ws3->getTitle(), "A3+D3+D3");
   }
 
+  void doHistoryCopyTest(const std::string &inputWSName,
+                         const std::string &outputWSName) {
+    auto inputWS = boost::make_shared<WorkspaceTester>();
+    inputWS->history().addHistory(boost::make_shared<AlgorithmHistory>(
+        "Load", 1, "b5b65a94-e656-468e-987c-644288fac655"));
+    auto &ads = AnalysisDataService::Instance();
+    ads.addOrReplace(inputWSName, inputWS);
+
+    StubbedWorkspaceAlgorithm nextStep;
+    nextStep.initialize();
+    nextStep.setPropertyValue("InputWorkspace1", inputWSName);
+    nextStep.setPropertyValue("OutputWorkspace1", outputWSName);
+    nextStep.execute();
+
+    auto outputWS = ads.retrieve(outputWSName);
+    const auto &outputHistory = outputWS->history();
+    TS_ASSERT_EQUALS(2, outputHistory.size());
+    TS_ASSERT_EQUALS("Load", outputHistory.getAlgorithmHistory(0)->name());
+    TS_ASSERT_EQUALS("StubbedWorkspaceAlgorithm",
+                     outputHistory.getAlgorithmHistory(1)->name());
+  }
+
+  void test_singleInputWorkspaceHistoryCopiedToOutputWorkspace() {
+    doHistoryCopyTest("copyHistoryIn", "copyHistoryOut");
+  }
+
+  void test_singleInputWorkspaceHistoryCopiedToReplacedOutputWorkspace() {
+    doHistoryCopyTest("copyHistoryInOut", "copyHistoryInOut");
+  }
+
+  void doHistoryCopyOnGroupsTest(const std::string &inputWSName,
+                                 const std::string &outputWSName) {
+    const auto group =
+        boost::dynamic_pointer_cast<WorkspaceGroup>(makeWorkspaceGroup(
+            inputWSName, inputWSName + "_1," + inputWSName + "_2"));
+    const auto execDate{Mantid::Types::Core::DateAndTime::getCurrentTime()};
+    for (auto &item : *group) {
+      item->history().addHistory(boost::make_shared<AlgorithmHistory>(
+          "Load", 1, "49ea7cb9-6172-4e5c-acf5-c3edccd0bb27", execDate));
+    }
+    auto &ads = AnalysisDataService::Instance();
+    StubbedWorkspaceAlgorithm nextStep;
+    nextStep.initialize();
+    nextStep.setPropertyValue("InputWorkspace1", inputWSName);
+    nextStep.setPropertyValue("OutputWorkspace1", outputWSName);
+    nextStep.execute();
+
+    auto outputGroup = ads.retrieveWS<WorkspaceGroup>(outputWSName);
+    TS_ASSERT(outputGroup);
+    for (auto &item : *outputGroup) {
+      const auto &outputHistory = item->history();
+      TS_ASSERT_EQUALS(2, outputHistory.size());
+      TS_ASSERT_EQUALS("Load", outputHistory.getAlgorithmHistory(0)->name());
+      TS_ASSERT_EQUALS("StubbedWorkspaceAlgorithm",
+                       outputHistory.getAlgorithmHistory(1)->name());
+    }
+  }
+
+  void test_InputWorkspaceGroupHistoryCopiedToOutputWorkspaceGroup() {
+    doHistoryCopyOnGroupsTest("copyHistoryGroupIn", "copyHistoryGroupOut");
+  }
+
+  void test_InputWorkspaceGroupHistoryCopiedToReplacedOutputWorkspaceGroup() {
+    doHistoryCopyOnGroupsTest("copyHistoryGroupInOut", "copyHistoryGroupInOut");
+  }
+
   /**
    * Test declaring an algorithm property and retrieving as const
    * and non-const
-- 
GitLab