/* This file is part of MAUS: http://micewww.pp.rl.ac.uk/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . * */ #include #include "gtest/gtest.h" #include "Utils/Exception.hh" #include "src/legacy/Interface/MICERun.hh" #include "src/legacy/Interface/dataCards.hh" #include "src/legacy/Config/MiceModule.hh" #include "src/common_cpp/Utils/JsonWrapper.hh" #include "src/common_cpp/Utils/Globals.hh" #include "src/common_cpp/Utils/RunActionManager.hh" #include "src/common_cpp/Simulation/MAUSGeant4Manager.hh" #include "src/common_cpp/Globals/GlobalsManager.hh" Json::Value SetupConfig(); // tests Globals and Globals namespace MAUS { // Globals allocates and deletes MICERun ... so need to cache // that information somewhere to make it available to the other tests... class GlobalsTest : public ::testing::Test { public: GlobalsTest() { str = JsonWrapper::JsonToString (*Globals::GetInstance()->GetConfigurationCards()); // watch out - this breaks the test order! // always force GlobalsManager to not exist at start root = MiceModule::deepCopy (*Globals::GetMonteCarloMiceModules(), false); if (Globals::HasInstance()) { GlobalsManager::DeleteGlobals(); } } ~GlobalsTest() { // always force GlobalsManager to exist at end (i.e. leave self- // consistent globals universe) if (!Globals::HasInstance()) { GlobalsManager::InitialiseGlobals(str); } GlobalsManager::SetMonteCarloMiceModules(root); } void SetUp() {} void TearDown() {} std::string str; private: MiceModule* root; }; // Also here we check that GetProcessDataManager works TEST_F(GlobalsTest, TestInitialiseDestruct) { // Check that we get an exception if initialising with bad data and that // _process is still NULL EXPECT_THROW (GlobalsManager::InitialiseGlobals("not json"), MAUS::Exception); EXPECT_THROW(Globals::GetInstance(), MAUS::Exception); // Check that we don't get an exception if initialising with good data and // that _process is not NULL. We will check the member data initialisation // later... GlobalsManager::InitialiseGlobals(str); EXPECT_NE(Globals::GetInstance(), static_cast(NULL)); // Try deleting GlobalsManager::DeleteGlobals(); // Check that we now get an exception on delete (already deleted) EXPECT_THROW(GlobalsManager::DeleteGlobals(), MAUS::Exception); // Check that we now get an exception (the pointer allocated to NULL) EXPECT_THROW(Globals::GetInstance(), MAUS::Exception); // Check that we can reinitialise okay GlobalsManager::InitialiseGlobals(str); Globals::GetInstance(); EXPECT_NE(Globals::GetInstance(), static_cast(NULL)); // Clean up GlobalsManager::DeleteGlobals(); } // Check that HasInstance works TEST_F(GlobalsTest, TestHasInstance) { EXPECT_FALSE(Globals::HasInstance()); GlobalsManager::InitialiseGlobals(str); EXPECT_TRUE(Globals::HasInstance()); GlobalsManager::DeleteGlobals(); EXPECT_FALSE(Globals::HasInstance()); } // check that we can Get and Set okay. Use test as sample data - note // Globals now owns memory allocated by test (if not pointing at NULL). template void test_accessors(TEMP* GetFunction(), void SetFunction(TEMP* tmp), TEMP* test) { TEMP* my_temp = GetFunction(); // check that default is non-NULL ASSERT_NE(my_temp, static_cast(NULL)) << typeid(test).name(); // check that we can reallocate to NULL SetFunction(NULL); EXPECT_EQ(GetFunction(), static_cast(NULL)) << typeid(test).name(); // check that we can reallocate from NULL (no double free) SetFunction(test); EXPECT_EQ(GetFunction(), static_cast(test)) << typeid(test).name(); // leave as NULL (check DeleteGlobals() copes okay in this case) SetFunction(NULL); } // Go through each accessor one by one, check they don't return NULL TEST_F(GlobalsTest, TestAccessors) { GlobalsManager::InitialiseGlobals(str); EXPECT_NE(Globals::GetInstance(), static_cast(NULL)); test_accessors(Globals::GetRunActionManager, GlobalsManager::SetRunActionManager, static_cast(NULL)); test_accessors(Globals::GetLegacyCards, GlobalsManager::SetLegacyCards, new dataCards()); test_accessors(Globals::GetMonteCarloMiceModules, GlobalsManager::SetMonteCarloMiceModules, new MiceModule("Test.dat")); test_accessors(Globals::GetReconstructionMiceModules, GlobalsManager::SetReconstructionMiceModules, new MiceModule()); /* test_accessors(Globals::GetBTFieldConstructor, GlobalsManager::SetBTFieldConstructor, new BTFieldConstructor()); test_accessors(Globals::GetErrorHandler, GlobalsManager::SetErrorHandler, static_cast(NULL)); test_accessors(Globals::GetConfigurationCards, GlobalsManager::SetConfigurationCards, new Json::Value()); test_accessors(Globals::GetGeant4Manager, GlobalsManager::SetGeant4Manager, static_cast(NULL)); */ GlobalsManager::DeleteGlobals(); } TEST_F(GlobalsTest, TestResetFields) { std::string mod_name = std::string(getenv("MAUS_ROOT_DIR"))+ std::string("/tests/cpp_unit/Globals/QuadTest.dat"); // initialise; check field = 0 GlobalsManager::InitialiseGlobals(str); double point[] = {500., 0., 0., 0.}; double field[] = {0., 0., 0., 0., 0., 0.}; Globals::GetMCFieldConstructor()->GetFieldValue(point, field); EXPECT_DOUBLE_EQ(field[1], 0.); // now reset fields; check field != 0 MiceModule* test_mod = new MiceModule(mod_name); GlobalsManager::SetMonteCarloMiceModules(test_mod); Globals::GetMCFieldConstructor()->GetFieldValue(point, field); // check field value EXPECT_DOUBLE_EQ(fabs(field[0]), 1.); EXPECT_DOUBLE_EQ(fabs(field[1]), 2.); EXPECT_DOUBLE_EQ(fabs(field[2]), 3.); } TEST_F(GlobalsTest, TestResetGeant4Geometry) { // Check that Virtual Planes are rebuilt okay // Check that Materials and volumes are rebuilt okay // Check that sensitive detectors are rebuilt okay } // Version number is tested in PyGlobals }