diff --git a/Framework/Kernel/inc/MantidKernel/DataService.h b/Framework/Kernel/inc/MantidKernel/DataService.h index 3d6de5faf49853b46c7b000922b295f1dc3808d4..28f8871f0406f9d8a3d565295d8efb4b3b16c1c0 100644 --- a/Framework/Kernel/inc/MantidKernel/DataService.h +++ b/Framework/Kernel/inc/MantidKernel/DataService.h @@ -482,15 +482,23 @@ public: } /// Get a vector of the pointers to the data objects stored by the service - std::vector<boost::shared_ptr<T>> getObjects() const { + std::vector<boost::shared_ptr<T>> getObjects(DataServiceHidden includeHidden = DataServiceHidden::Auto) const { std::lock_guard<std::recursive_mutex> _lock(m_mutex); - const bool showingHidden = showingHiddenObjects(); + if (includeHidden == DataServiceHidden::Include) { + // Return all elements including hidden ones + } + + const bool alwaysIncludeHidden = includeHidden == DataServiceHidden::Include; + const bool usingAuto = includeHidden == DataServiceHidden::Auto && showingHiddenObjects(); + + const bool showingHidden = alwaysIncludeHidden || usingAuto; + std::vector<boost::shared_ptr<T>> objects; objects.reserve(datamap.size()); - for (auto it = datamap.begin(); it != datamap.end(); ++it) { - if (showingHidden || !isHiddenDataServiceObject(it->first)) { - objects.push_back(it->second); + for (const auto &it : datamap) { + if (showingHidden || !isHiddenDataServiceObject(it.first)) { + objects.push_back(it.second); } } return objects; diff --git a/Framework/Kernel/test/DataServiceTest.h b/Framework/Kernel/test/DataServiceTest.h index 6dfa57de8dd36099f36898365854f1ebd3416ddb..78cfd6fbabf885b73295d0051c03f9ad669939ad 100644 --- a/Framework/Kernel/test/DataServiceTest.h +++ b/Framework/Kernel/test/DataServiceTest.h @@ -6,6 +6,9 @@ #include <cxxtest/TestSuite.h> #include <Poco/NObserver.h> #include <boost/make_shared.hpp> + +#include <iostream> +#include <sstream> #include <mutex> using namespace Mantid; @@ -327,6 +330,84 @@ public: TS_ASSERT_EQUALS(objects.at(std::distance(names.cbegin(), cit)), three); } + void test_getObjectsReturnsConfigOption() { + svc.clear(); + + ConfigService::Instance().setString("MantidOptions.InvisibleWorkspaces", + "0"); + auto one = boost::make_shared<int>(1); + auto two = boost::make_shared<int>(2); + auto three = boost::make_shared<int>(3); + svc.add("One", one); + svc.add("Two", two); + svc.add("TwoAgain", + two); // Same pointer again - should appear twice in getObjects() + svc.add("__Three", three); + + auto objects = svc.getObjects(DataServiceHidden::Auto); + auto objectsDefaultCall = svc.getObjects(); + + TSM_ASSERT_EQUALS("Default parameter is not set to auto", objects, objectsDefaultCall); + + TSM_ASSERT_EQUALS("Hidden entries should not be returned", objects.size(), + 3); + // Check the hidden ws isn't present + TS_ASSERT_EQUALS(objects.at(0), one); + TS_ASSERT_EQUALS(objects.at(1), two); + TS_ASSERT_EQUALS(objects.at(2), two); + TSM_ASSERT_EQUALS("Hidden entries should not be returned", std::find(objects.cbegin(), objects.cend(), three), + objects.end()); + + ConfigService::Instance().setString("MantidOptions.InvisibleWorkspaces", + "1"); + objects = svc.getObjects(); + TS_ASSERT_EQUALS(objects.size(), 4); + } + + void test_getObjectsReturnsNoHiddenOption() { + svc.clear(); + + ConfigService::Instance().setString("MantidOptions.InvisibleWorkspaces", + "1"); + auto one = boost::make_shared<int>(1); + auto two = boost::make_shared<int>(2); + auto three = boost::make_shared<int>(3); + svc.add("One", one); + svc.add("Two", two); + svc.add("__Three", three); + + auto objects = svc.getObjects(DataServiceHidden::Exclude); + TSM_ASSERT_EQUALS("Hidden entries should not be returned", objects.size(), + 2); + // Check the hidden ws isn't present + TS_ASSERT_EQUALS(objects.at(0), one); + TS_ASSERT_EQUALS(objects.at(1), two); + TSM_ASSERT_EQUALS("Hidden entries should not be returned", std::find(objects.cbegin(), objects.cend(), three), + objects.end()); + } + + void test_getObjectsReturnsHiddenOption() { + svc.clear(); + + ConfigService::Instance().setString("MantidOptions.InvisibleWorkspaces", + "0"); + auto one = boost::make_shared<int>(1); + auto two = boost::make_shared<int>(2); + auto three = boost::make_shared<int>(3); + svc.add("One", one); + svc.add("Two", two); + svc.add("__Three", three); + + auto objects = svc.getObjects(DataServiceHidden::Include); + TSM_ASSERT_EQUALS("Hidden entries should be returned", objects.size(), + 3); + // Check the hidden ws isn't present + TS_ASSERT_DIFFERS(std::find(objects.begin(), objects.end(), one), objects.end()); + TS_ASSERT_DIFFERS(std::find(objects.begin(), objects.end(), two), objects.end()); + TSM_ASSERT_DIFFERS("Hidden entries should be returned", std::find(objects.cbegin(), objects.cend(), three), + objects.end()); + } + void test_sortedAndHiddenGetNames() { auto one = boost::make_shared<int>(1); auto two = boost::make_shared<int>(2);