//This file is a part of G4MICE // //G4MICE 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. // //G4MICE 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 G4MICE in the doc folder. If not, see //. //! Testing getListOfProperties in MiceModules #include #include #include #include #include #include #include "gtest/gtest.h" #include "Config/MiceModule.hh" namespace { // TODO(Rogers): // * would be better to pass micemodules a string stream (istream ref) - current // implementation is dangerous /////////////// MiceModule Tests /////////////// //Fixture - allows to set up some default sets of data //for testing against class MiceModuleTest : public ::testing::Test { protected: MiceModuleTest() {SetUp();} virtual ~MiceModuleTest() { delete moduleTest;} static void SetUpTestCase(); virtual void SetUp(); virtual void TearDown() {} MiceModule* moduleTest; static std::string test_module_path; static std::string test_module_name; }; std::string MiceModuleTest::test_module_path = ""; std::string MiceModuleTest::test_module_name = ""; TEST_F(MiceModuleTest, ReadModuleTest) {//name test... EXPECT_EQ(moduleTest->fullName(), test_module_name); EXPECT_THROW(MiceModule(""), MAUS::Exception); } TEST_F(MiceModuleTest, GetBoolTest) {//bool test std::map t = moduleTest->getListOfProperties(); EXPECT_EQ(t.size(),(unsigned)1); EXPECT_EQ(t["Invisible"], true); EXPECT_EQ(moduleTest->propertyBool("Invisible"), true); EXPECT_THROW(moduleTest->propertyBool("NOTEXIST_Invisible"), MAUS::Exception); } TEST_F(MiceModuleTest, GetIntTest) {//int test std::map t = moduleTest->getListOfProperties(); EXPECT_EQ(t.size(),(unsigned)1); EXPECT_EQ(t["Copies"],1); } TEST_F(MiceModuleTest, GetStringTest) {//string test std::map t = moduleTest->getListOfProperties(); EXPECT_EQ(t.size(),(unsigned)2); EXPECT_EQ(t["Material"], "AIR"); EXPECT_EQ(t["Volume"], "Box"); EXPECT_EQ(moduleTest->propertyString("Material"), "AIR"); EXPECT_EQ(moduleTest->propertyString("Volume"), "Box"); EXPECT_THROW(moduleTest->propertyString("NONEXIST_Material"), MAUS::Exception); } TEST_F(MiceModuleTest, GetDoubleTest) {//double test std::map t = moduleTest->getListOfProperties(); EXPECT_EQ(t.size(),(unsigned)2); EXPECT_EQ(t["GreenColour"], 0.5); //These are all represented exactly EXPECT_EQ(t["RedColour"], 1.0); } TEST_F(MiceModuleTest, Get3VecTest) {//Hep3Vec test std::map t = moduleTest->getListOfProperties(); EXPECT_EQ(t.size(),(unsigned)3); EXPECT_EQ(t["Dimensions"], Hep3Vector(390,2600,1000)); EXPECT_EQ(t["Position"], Hep3Vector(100,200,300)); EXPECT_EQ(t["Rotation"].x(),0.); EXPECT_EQ(t["Rotation"].y(),0.); EXPECT_LT(fabs(t["Rotation"].z()-1.5707963267948966),1.e-8); EXPECT_EQ(moduleTest->propertyHep3Vector("Dimensions"), Hep3Vector(390,2600,1000)); EXPECT_EQ(moduleTest->propertyHep3Vector("Position"), Hep3Vector(100,200,300)); EXPECT_THROW(moduleTest->propertyHep3Vector("NONEXIST_Position"), MAUS::Exception); } TEST_F(MiceModuleTest, propertyDoubleAccessors) { //AddPropertyDouble(string, string), AddPropertyDouble(string, double), propertyDouble(string), propertyDoubleThis(string) MiceModule mod; mod.addPropertyDouble("MyProp", "3. m"); EXPECT_EQ (mod.propertyDouble("MyProp"), 3000.); mod.setProperty("MyProp", 1000.); EXPECT_EQ (mod.propertyDouble("MyProp"), 1000.); mod.addPropertyDouble("MyProp2", "3000."); EXPECT_EQ (mod.propertyDouble("MyProp2"), 3000.); mod.addPropertyDouble("MyProp3", 3000.); EXPECT_EQ (mod.propertyDouble("MyProp3"), 3000.); EXPECT_EQ (mod.propertyDoubleThis("MyProp3"), 3000.); mod.addPropertyDouble("MyProp4", "3000. fish"); EXPECT_THROW(mod.propertyDouble("MyProp4"), MAUS::Exception); EXPECT_THROW(mod.addPropertyDouble("MyProp4", "3000."), MAUS::Exception); } TEST_F(MiceModuleTest, propertyHep3VecAccessors) { //AddPropertyHep3Vector(string, string), AddPropertyH3V(string, H3V), propertyh3v(string), propertyH3VThis(string) MiceModule mod; mod.addPropertyHep3Vector("MyProp", "1. 2. 3. m"); EXPECT_EQ (mod.propertyHep3Vector("MyProp"), CLHEP::Hep3Vector(1000., 2000., 3000.) ); mod.setProperty("MyProp", CLHEP::Hep3Vector(4000., 5000., 6000.)); EXPECT_EQ (mod.propertyHep3Vector("MyProp"), CLHEP::Hep3Vector(4000., 5000., 6000.)); mod.addPropertyHep3Vector("MyProp2", "1000. 2000. 3000."); EXPECT_EQ (mod.propertyHep3Vector("MyProp2"), CLHEP::Hep3Vector(1000., 2000., 3000.) ); mod.addPropertyHep3Vector("MyProp3", CLHEP::Hep3Vector(1000., 2000., 3000.) ); EXPECT_EQ (mod.propertyHep3Vector("MyProp3"), CLHEP::Hep3Vector(1000., 2000., 3000.) ); EXPECT_EQ (mod.propertyHep3VectorThis("MyProp3"), CLHEP::Hep3Vector(1000., 2000., 3000.)); mod.addPropertyHep3Vector("MyProp4", "1000. 2000."); EXPECT_THROW(mod.propertyHep3Vector("MyProp4"), MAUS::Exception); mod.addPropertyHep3Vector("MyProp5", "1000. 2000. 3000. fish"); EXPECT_THROW(mod.propertyHep3Vector("MyProp5"), MAUS::Exception); EXPECT_THROW(mod.addPropertyHep3Vector("MyProp2", "1000. 2000. 3000."), MAUS::Exception); } TEST_F(MiceModuleTest, printTree) { // printTree doesn't print root module data std::ostringstream OutGDML(""); moduleTest->printTree( 0, OutGDML ); std::string MMPrint("Configuration "+test_module_name+"\n"); EXPECT_EQ(MMPrint.compare(OutGDML.str()), 0); } TEST_F(MiceModuleTest, DumpMiceModule) { std::ostringstream OutMM(""); std::ostringstream MMPrint(""); std::string Indent(""); moduleTest->DumpMiceModule(Indent, OutMM); MMPrint << "Configuration " << test_module_name << std::endl << "{" << std::endl << " Dimensions 390 2600 1000" << std::endl << " PropertyDouble GreenColour 0.5" << std::endl << " PropertyDouble RedColour 1.0" << std::endl << " PropertyBool Invisible 1" << std::endl << " PropertyInt Copies 1" << std::endl << " PropertyString Material AIR" << std::endl << "}" << std::endl; EXPECT_EQ(MMPrint.str().compare(OutMM.str()), 0); } //Make a MiceModule //nb: this fails if we dont have write access to the disk, filename already // exists as a directory, ... - basically flaky. Better to pass an istream& void MiceModuleTest::SetUpTestCase() { std::stringstream mice_mod_test; mice_mod_test << "// ModuleTest.cards\n" << "//\n" << "// A test module for MiceModule\n" << "//\n" << "// \n" << "// \n" << "\n" << "Module TestModule\n" << "{\n" << " Dimensions 39.0 260.0 100.0 cm\n" << " Position 10.0 20.0 30.0 cm\n" << " Rotation 0.0 0.0 90.0 degree\n" << " PropertyString Material AIR\n" << " PropertyBool Invisible 1\n" << " PropertyInt Copies 1\n" << " PropertyDouble GreenColour 0.5\n" << " PropertyDouble RedColour 1.0\n" << "}\n"; ASSERT_TRUE(getenv( "MAUS_ROOT_DIR" ) != NULL) << "MAUS_ROOT_DIR not set - test failed"; test_module_path = getenv( "MAUS_ROOT_DIR" ); test_module_path += "/tmp/"; test_module_name = "mice_module_test.dat"; std::ofstream fout((test_module_path+test_module_name).c_str()); fout << mice_mod_test.str(); fout.close(); } void MiceModuleTest::SetUp() { moduleTest = new MiceModule(test_module_path+test_module_name); } } //namespace