diff --git a/Framework/API/src/ScriptBuilder.cpp b/Framework/API/src/ScriptBuilder.cpp index d852516ec45cb830b9e4041fa03b3ded94021dad..4b021582bd4b856c4c5294f8b27588fca1042c9e 100644 --- a/Framework/API/src/ScriptBuilder.cpp +++ b/Framework/API/src/ScriptBuilder.cpp @@ -12,6 +12,8 @@ #include "MantidKernel/Property.h" #include "MantidKernel/PropertyHistory.h" +#include <boost/range/algorithm/remove_if.hpp> +#include <boost/algorithm/string/classification.hpp> #include <boost/utility.hpp> #include <set> @@ -219,7 +221,10 @@ ScriptBuilder::buildAlgorithmString(const AlgorithmHistory &algHistory) { propStr.erase(propStr.size() - 1); } - return name + "(" + propStr + ")"; + std::string historyEntry = name + "(" + propStr + ")"; + historyEntry.erase(boost::remove_if(historyEntry, boost::is_any_of("\n\r")), + historyEntry.end()); + return historyEntry; } /** diff --git a/Framework/API/test/ScriptBuilderTest.h b/Framework/API/test/ScriptBuilderTest.h index 31e8e8a5bb66a4bc78db0ea85390f7be51c6aa4a..db06f122bdc8bb60bcd8e7e7030bc299ad2260a3 100644 --- a/Framework/API/test/ScriptBuilderTest.h +++ b/Framework/API/test/ScriptBuilderTest.h @@ -85,6 +85,38 @@ class ScriptBuilderTest : public CxxTest::TestSuite { } }; + class NewlineAlgorithm : public Algorithm { + public: + NewlineAlgorithm() : Algorithm() {} + ~NewlineAlgorithm() override {} + const std::string name() const override { return "Foo\n\rBar"; } + const std::string summary() const override { return "Test"; } + int version() const override { return 1; } + const std::string category() const override { return "Cat;Leopard;Mink"; } + + void afterPropertySet(const std::string &name) override { + if (name == "InputWorkspace") + declareProperty("DynamicInputProperty", ""); + } + + void init() override { + declareProperty(make_unique<WorkspaceProperty<MatrixWorkspace>>( + "InputWorkspace", "", Direction::Input)); + declareProperty(make_unique<WorkspaceProperty<MatrixWorkspace>>( + "OutputWorkspace", "", Direction::Output)); + declareProperty("PropertyA", "Hello"); + declareProperty("PropertyB", "World"); + } + void exec() override { + declareProperty("DynamicProperty1", "value", Direction::Output); + setPropertyValue("DynamicProperty1", "outputValue"); + + boost::shared_ptr<MatrixWorkspace> output = + boost::make_shared<WorkspaceTester>(); + setProperty("OutputWorkspace", output); + } + }; + // middle layer algorithm executed by a top level algorithm class NestedAlgorithm : public DataProcessorAlgorithm { public: @@ -205,6 +237,7 @@ public: Mantid::API::AlgorithmFactory::Instance().subscribe<NestedAlgorithm>(); Mantid::API::AlgorithmFactory::Instance().subscribe<BasicAlgorithm>(); Mantid::API::AlgorithmFactory::Instance().subscribe<SubAlgorithm>(); + Mantid::API::AlgorithmFactory::Instance().subscribe<NewlineAlgorithm>(); Mantid::API::AlgorithmFactory::Instance() .subscribe<AlgorithmWithDynamicProperty>(); } @@ -217,6 +250,7 @@ public: Mantid::API::AlgorithmFactory::Instance().unsubscribe("SubAlgorithm", 1); Mantid::API::AlgorithmFactory::Instance().unsubscribe( "AlgorithmWithDynamicProperty", 1); + Mantid::API::AlgorithmFactory::Instance().unsubscribe("Foo\n\rBar", 1); } void test_Build_Simple() { @@ -254,6 +288,42 @@ public: AnalysisDataService::Instance().remove("test_input_workspace"); } + void test_newline_chars_removed() { + // Check that any newline chars are removed + std::string result[] = {"FooBar(InputWorkspace='test_input_workspace'," + " OutputWorkspace='test_output_workspace')", + ""}; + + boost::shared_ptr<WorkspaceTester> input = + boost::make_shared<WorkspaceTester>(); + AnalysisDataService::Instance().addOrReplace("test_input_workspace", input); + + auto alg = AlgorithmFactory::Instance().create("Foo\n\rBar", 1); + alg->initialize(); + alg->setRethrows(true); + alg->setProperty("InputWorkspace", input); + alg->setPropertyValue("OutputWorkspace", "test_output_workspace"); + alg->execute(); + + auto ws = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>( + "test_output_workspace"); + auto wsHist = ws->getHistory(); + + ScriptBuilder builder(wsHist.createView()); + std::string scriptText = builder.build(); + + std::vector<std::string> scriptLines; + boost::split(scriptLines, scriptText, boost::is_any_of("\n")); + + int i = 0; + for (auto it = scriptLines.begin(); it != scriptLines.end(); ++it, ++i) { + TS_ASSERT_EQUALS(*it, result[i]) + } + + AnalysisDataService::Instance().remove("test_output_workspace"); + AnalysisDataService::Instance().remove("test_input_workspace"); + } + void test_Build_Simple_Timestamped() { boost::shared_ptr<WorkspaceTester> input = boost::make_shared<WorkspaceTester>();