// Detector_t.cpp #include "DetectorTest.h" #include "LayerPtr.h" #include #include #include #include "objstream/ObjData.hpp" #include "objstream/StdObjStream.hpp" #include "trfutil/trfstream.h" #include "trfbase/PropDirectedTest.h" #include "LayerTest.h" using std::cout; using std::cerr; using std::endl; using std::string; using std::ostringstream; using std::istringstream; using namespace trf; //********************************************************************** int main( ) { string component = "Detector"; string ok_prefix = component + " (I): "; string error_prefix = component + " test (E): "; cout << ok_prefix << "---------- Testing component " + component + ". ----------" << endl; // Make sure assert is enabled. bool assert_flag = false; assert ( ( assert_flag = true, assert_flag ) ); if ( ! assert_flag ) { cerr << "Assert is disabled" << endl; return 1; } //******************************************************************** cout << trf_format; cout << ok_prefix << "Test subclass constructor." << endl; ObjTable::register_type(); double x1 = 5.0; LayerPtr plyr1; plyr1 = new LayerTest(x1); DetectorPtr pdet1; pdet1 = new OneLayerDetectorTest("Layer One", plyr1); const Detector& det1 = *pdet1; cout << det1 << endl; assert( det1.is_ok() ); assert( det1.get_layer_names().size() == 1 ); assert( det1.get_layer_names().front() == "Layer One" ); assert( det1.is_assigned( "Layer One" ) ); assert( ! det1.is_assigned( "Layer 1" ) ); assert( det1.get_layer("Layer One").get_type() == plyr1->get_type() ); assert( &det1.get_layer("Layer One") == det1.get_layer_pointer("Layer One") ); //******************************************************************** cout << ok_prefix << "Test composite detector." << endl; double x2 = 2.0; double x3 = 3.0; LayerPtr plyr2; plyr2 = new LayerTest(x2); LayerPtr plyr3; plyr3 = new LayerTest(x3); DetectorPtr pdet2; pdet2 = new TwoLayerDetectorTest("layer 2", plyr2, "layer 3", plyr3); cout << *pdet2 << endl; TwoSubDetectorTest det3(pdet1,pdet2); cout << det3 << endl; assert( det3.is_ok() ); assert( det3.get_layer_names().size() == 3 ); assert( det3.get_layer_names().front() == "Layer One" ); assert( det3.get_layer_names().back() == "layer 3" ); assert( det3.is_assigned( "Layer One" ) ); assert( det3.is_assigned( "layer 2" ) ); assert( det3.is_assigned( "layer 3" ) ); assert( ! det1.is_assigned( "Layer 1" ) ); assert( det3.get_layer("Layer One").get_type() == plyr1->get_type() ); assert( det3.get_layer("layer 2").get_type() == plyr2->get_type() ); //******************************************************************** cout << ok_prefix << "Check registration." << endl; { LayerPtr plyrreg1( new LayerTest(5.0) ); LayerPtr plyrreg2( new LayerTest(6.0) ); TwoLayerDetectorTest detreg("reg layer 1", plyrreg1, "reglyr2", plyrreg2); cout << detreg << endl; assert( ! ObjTable::has_object_name("reg_layer_1") ); assert( ! ObjTable::has_object_name("reglyr2") ); assert( detreg.register_with_objtable() == 0 ); assert( detreg.register_with_objtable() == 0 ); assert( ObjTable::has_object_name("reg_layer_1") ); assert( ObjTable::has_object_name("reglyr2") ); } //******************************************************************** cout << ok_prefix << "Write object data." << endl; { ostringstream sstrm; StdObjStream obstrm(sstrm); obstrm.write_object("lyr1",plyr1); obstrm.write_object("lyr2",plyr2); obstrm.write_object("lyr3",plyr3); obstrm.write_object("det1",pdet1); obstrm.write_object("det2",pdet2); cout << sstrm.str() << endl; string::size_type pos = 0; // det 1 assert( (pos=sstrm.str().find("det1 ",pos)) != string::npos ); assert( (pos=sstrm.str().find("Detector ",pos)) != string::npos ); #ifdef ObjData_supports_lists assert( (pos=sstrm.str().find("layer_names",pos)) != string::npos ); assert( (pos=sstrm.str().find("Layer One",pos)) != string::npos ); assert( (pos=sstrm.str().find("layers",pos)) != string::npos ); assert( (pos=sstrm.str().find("lyr1 ",pos)) != string::npos ); assert( (pos=sstrm.str().find("subdetectors",pos)) != string::npos ); #endif // det2 assert( (pos=sstrm.str().find("det2 ",pos)) != string::npos ); assert( (pos=sstrm.str().find("Detector ",pos)) != string::npos ); #ifdef ObjData_supports_lists assert( (pos=sstrm.str().find("layer_names",pos)) != string::npos ); assert( (pos=sstrm.str().find("layer 2",pos)) != string::npos ); assert( (pos=sstrm.str().find("layer 3",pos)) != string::npos ); assert( (pos=sstrm.str().find("layers",pos)) != string::npos ); assert( (pos=sstrm.str().find("lyr2 ",pos)) != string::npos ); assert( (pos=sstrm.str().find("lyr3 ",pos)) != string::npos ); assert( (pos=sstrm.str().find("subdetectors",pos)) != string::npos ); #endif cout << pos << endl; assert( sstrm.str().find("Detector ",++pos) == string::npos ); } //******************************************************************** cout << ok_prefix << "Read object data." << endl; { string istring = "[ det4 Detector"; #ifdef ObjData_supports_lists istring += " \nlayer_names = string( \"L1\" )"; istring += " \nlayers = @( lyr3 )"; istring += " \nsubdetectors = @( det2 )"; #endif istring += "\n]"; istringstream isstrm(istring); { StdObjStream obstr(isstrm); string name = obstr.read_object(); assert( name == "det4" ); DetectorPtr pdet; assert( pdet == 0 ); ObjTable::get_object("det4",pdet); assert( pdet != 0 ); cout << *pdet << endl; assert( pdet->get_type() == Detector::get_static_type() ); #ifdef ObjData_supports_lists Detector::LayerNameList lnames = pdet->get_layer_names(); assert( lnames.size() == 3 ); assert( &pdet->get_layer("layer 3") == plyr3 ); #endif } } //******************************************************************** cout << ok_prefix << "------------- All tests passed. -------------" << endl; return 0; //******************************************************************** }