File indexing completed on 2026-04-09 07:49:19
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include <cassert>
0027 #include <iostream>
0028 #include <iomanip>
0029
0030
0031 #include "ssys.h"
0032 #include "sstr.h"
0033 #include "spath.h"
0034 #include "sdirectory.h"
0035 #include "sstamp.h"
0036
0037
0038 struct spath_test
0039 {
0040 static int Resolve_null();
0041 static int Resolve_name();
0042 static int Resolve_inline();
0043 static int Resolve_defaultOutputPath();
0044 static int DefaultOutputPath();
0045
0046 static int Resolve_with_undefined_token();
0047 static int Resolve_with_undefined_TMP();
0048 static int IsTokenWithFallback();
0049 static int ResolveTokenWithFallback();
0050 static int _ResolveToken();
0051 static int ResolveToken();
0052 static int ResolveToken_(const char* token);
0053 static int ResolveToken1();
0054
0055 static int Resolve_(const char* spec);
0056 static int Resolve1();
0057 static int Resolve3();
0058 static int Resolve();
0059 static int LooksUnresolved_0();
0060 static int LooksUnresolved_1();
0061 static int Resolve_setenvvar();
0062 static int Resolve_setenvmap();
0063
0064 static int Exists();
0065 static int Exists2();
0066 static int Dirname0();
0067 static int Dirname();
0068 static int Basename();
0069 static int Name();
0070 static int Remove();
0071
0072 static int _Check();
0073 static int Write();
0074 static int WriteIntoInvokingDirectory();
0075 static int Read();
0076 static int EndsWith();
0077 static int SplitExt(int impl);
0078 static int Filesize();
0079 static int CFBaseFromGEOM();
0080 static int is_readable();
0081 static int GEOMSub();
0082 static int GDMLPathFromGEOM();
0083 static int last_write_time();
0084
0085 static int Main();
0086 };
0087
0088
0089
0090 int spath_test::Resolve_null()
0091 {
0092
0093 const char* path = spath::Resolve("","reldir", "sidx");
0094 std::cout
0095 << " path [" << path << "]" << std::endl
0096 ;
0097 return 0 ;
0098 }
0099
0100 int spath_test::Resolve_name()
0101 {
0102 const char* name_ = "${SGLFW_Evt__shader_name:-rec_flying_point_persist}" ;
0103 const char* name = spath::Resolve(name_);
0104 std::cout
0105 << " name_ [" << name_ << "]" << std::endl
0106 << " name [" << name << "]" << std::endl
0107 ;
0108 return 0 ;
0109 }
0110
0111
0112 int spath_test::Resolve_inline()
0113 {
0114 const char* path_ = "$TMP/$ExecutableName/ALL${VERSION:-0}" ;
0115 const char* path = spath::Resolve(path_);
0116 std::cout
0117 << " path_ [" << path_ << "]" << std::endl
0118 << " path [" << path << "]" << std::endl
0119 ;
0120 return 0 ;
0121 }
0122
0123 int spath_test::Resolve_defaultOutputPath()
0124 {
0125 std::cout << "[spath_test::Resolve_defaultOutputPath\n" ;
0126 const char* path_ = "$TMP/GEOM/$GEOM/$ExecutableName" ;
0127 const char* path = spath::Resolve(path_);
0128 std::cout
0129 << " path_ [" << path_ << "]" << std::endl
0130 << " path [" << path << "]" << std::endl
0131 ;
0132 std::cout << "]spath_test::Resolve_defaultOutputPath\n" ;
0133 return 0 ;
0134 }
0135
0136
0137
0138 int spath_test::DefaultOutputPath()
0139 {
0140
0141
0142
0143 const char* stem = nullptr ;
0144 int index = 0 ;
0145 const char* ext = ".txt" ;
0146 bool unique = true ;
0147
0148 const char* path = spath::DefaultOutputPath(stem, index, ext, unique);
0149
0150 spath::MakeDirsForFile(path);
0151
0152 const char* txt = "yo : hello from spath_test::DefaultOutputPath\n" ;
0153 sstr::Write(path, txt);
0154
0155 std::cout
0156 << __FUNCTION__ << std::endl
0157 << " path [" << ( path ? path : "-" )
0158 << std::endl
0159 ;
0160
0161 return 0 ;
0162 }
0163
0164
0165
0166
0167
0168 int spath_test::Resolve_with_undefined_token()
0169 {
0170 std::cout << "[spath_test::Resolve_with_undefined_token\n" ;
0171
0172 const char* path_ = "$HOME/.opticks/GEOM/$TYPO/CSGFoundry" ;
0173 const char* path = spath::Resolve(path_);
0174 std::cout
0175 << " path_ [" << path_ << "]" << std::endl
0176 << " path [" << path << "]" << std::endl
0177 ;
0178 std::cout << "]spath_test::Resolve_with_undefined_token\n" ;
0179 return 0 ;
0180 }
0181
0182 int spath_test::Resolve_with_undefined_TMP()
0183 {
0184 const char* path_ = "$TMP/GEOM/$TYPO/CSGFoundry" ;
0185 const char* path = spath::Resolve(path_);
0186 std::cout
0187 << " path_ [" << path_ << "]" << std::endl
0188 << " path [" << path << "]" << std::endl
0189 ;
0190 return 0 ;
0191 }
0192
0193 int spath_test::IsTokenWithFallback()
0194 {
0195 const char* token = "{U4Debug_SaveDir:-$TMP}" ;
0196 bool is_twf = spath::IsTokenWithFallback(token) ;
0197
0198 std::cout << " token " << token << " spath::IsTokenWithFallback " << ( is_twf ? "YES" : "NO " ) << std::endl ;
0199 return 0 ;
0200 }
0201
0202 int spath_test::ResolveTokenWithFallback()
0203 {
0204 std::cout << "\nspath_test::ResolveTokenWithFallback\n\n" ;
0205
0206 std::vector<std::string> tokens = {
0207 "{U4Debug_SaveDir:-$TMP}",
0208 "${U4Debug_SaveDir:-$TMP}",
0209 "{VERSION:-99}",
0210 "${VERSION:-99}"
0211 };
0212
0213 for(unsigned i=0 ; i < tokens.size() ; i++)
0214 {
0215 const char* token = tokens[i].c_str();
0216 const char* result = spath::_ResolveTokenWithFallback(token);
0217 std::cout
0218 << " token " << token << std::endl
0219 << " result " << ( result ? result : "-" ) << std::endl
0220 << std::endl
0221 ;
0222 }
0223 return 0 ;
0224 }
0225
0226 int spath_test::_ResolveToken()
0227 {
0228 std::cout << "\nspath_test::_ResolveToken\n\n" ;
0229 std::vector<std::string> tokens = {
0230 "$TMP",
0231 "TMP" ,
0232 "$ExecutableName",
0233 "ExecutableName",
0234 };
0235
0236 for(unsigned i=0 ; i < tokens.size() ; i++)
0237 {
0238 const char* token = tokens[i].c_str();
0239 const char* result = spath::ResolveToken(token);
0240 std::cout
0241 << " token " << token << std::endl
0242 << " result " << ( result ? result : "-" ) << std::endl
0243 << std::endl
0244 ;
0245 }
0246 return 0 ;
0247 }
0248
0249
0250 int spath_test::ResolveToken_(const char* token)
0251 {
0252 const char* result = spath::ResolveToken(token);
0253 std::cout
0254 << "spath_test::ResolveToken_" << std::endl
0255 << " token " << token << std::endl
0256 << " result " << ( result ? result : "-" ) << std::endl
0257 << std::endl
0258 ;
0259 return 0 ;
0260 }
0261
0262 int spath_test::ResolveToken1()
0263 {
0264
0265 ResolveToken_("{RNGDir:-$HOME/.opticks/rngcache/RNG}") ;
0266 return 0 ;
0267 }
0268 int spath_test::ResolveToken()
0269 {
0270 std::cout << "\nspath_test::ResolveToken\n\n" ;
0271 std::vector<std::string> tokens = {
0272 "$TMP",
0273 "${TMP}",
0274 "TMP" ,
0275 "${TMP:-/some/other/path}",
0276 "${VERSION:-0}"
0277 };
0278
0279 for(unsigned i=0 ; i < tokens.size() ; i++)
0280 {
0281 const char* token = tokens[i].c_str();
0282 ResolveToken_(token) ;
0283 }
0284 return 0 ;
0285 }
0286
0287
0288
0289 int spath_test::Resolve_(const char* spec)
0290 {
0291
0292 const char* path = spath::ResolvePathGeneralized(spec);
0293 std::cout
0294 << " spec " << spec << std::endl
0295 << " path " << path << std::endl
0296 << std::endl
0297 ;
0298 return 0 ;
0299 }
0300
0301 int spath_test::Resolve1()
0302 {
0303 std::vector<std::string> pp = {
0304 "${RNGDir:-$HOME/.opticks/rngcache/RNG}",
0305 "$DefaultOutputDir",
0306 "$DefaultOutputDir/$TEST",
0307 "$DefaultOutputDir/${TEST:-notest}",
0308 } ;
0309
0310 for(int i=0 ; i < int(pp.size()) ; i++)
0311 {
0312 const char* p = pp[i].c_str();
0313 const char* path0 = spath::ResolvePath(p) ;
0314 const char* path1 = spath::ResolvePathGeneralized(p) ;
0315 std::cout
0316 << "spath_test::Resolve1\n"
0317 << " p : " << p << "\n"
0318 << " spath::ResolvePath : " << ( path0 ? path0 : "-" ) << "\n"
0319 << " spath::ResolvePathGeneralized : " << ( path1 ? path1 : "-" ) << "\n"
0320 << "\n"
0321 ;
0322 }
0323
0324 return 0 ;
0325 }
0326
0327 int spath_test::Resolve3()
0328 {
0329 const char* base = "$TMP/GEOM/$GEOM/$ExecutableName" ;
0330 const char* sidx = "A000" ;
0331
0332 std::vector<std::string> pp = {
0333 "ALL${VERSION:-0}",
0334 "ALL${VERSION:-0}${TEST:-}",
0335 "ALL${VERSION:-0}${XTEST:-}",
0336 "ALL${VERSION:-0}${XTEST:-notest}"
0337 } ;
0338
0339
0340 for(int i=0 ; i < int(pp.size()) ; i++)
0341 {
0342 const char* reldir = pp[i].c_str();
0343 const char* path = spath::Resolve(base,reldir,sidx ) ;
0344 std::cout
0345 << "spath_test::Resolve3\n"
0346 << " base : " << base << "\n"
0347 << " reldir : " << reldir << "\n"
0348 << " sidx : " << sidx << "\n"
0349 << " path : " << ( path ? path : "-" ) << "\n\n"
0350 ;
0351 }
0352
0353 return 0 ;
0354
0355 }
0356
0357 int spath_test::Resolve()
0358 {
0359 std::cout << "\nspath_test::Resolve\n\n" ;
0360 std::vector<std::string> specs = {
0361 "$HOME/hello.npy",
0362 "$HOME",
0363 "$HOME/red/green/blue$HOME",
0364 "$HOME/red/green/blue$HOME/cyan/magenta",
0365 "${VERSION:-99}",
0366 "ALL${VERSION:-99}",
0367 "$TMP/GEOM/$GEOM/$ExecutableName/ALL${VERSION:-0}",
0368 "$TMP/GEOM/$GEOM/$ExecutableName/ALL${VERSION:-0}/tail",
0369 "$TMP",
0370 "${TMP}",
0371 "${TMP:-/some/fallback}",
0372 "${XMP:-/some/fallback}",
0373 "TMP",
0374 "{TMP}",
0375 "$DefaultOutputDir",
0376 "$DefaultOutputDir/some/further/relative/path",
0377 "${RNGDir:-$HOME/.opticks/rngcache/RNG}",
0378 "${SEvt__INPUT_PHOTON_DIR:-$HOME/.opticks/InputPhotons}",
0379 "${PrecookedDir:-$HOME/.opticks/precooked}/QSimTest/rng_sequence/rng_sequence_f_ni1000000_nj16_nk16_tranche100000/rng_sequence_f_ni100000_nj16_nk16_ioffset000000.npy",
0380 "${CSGOptiX__cu_ptx:-$OPTICKS_PREFIX/ptx/CSGOptiX_generated_CSGOptiX7.cu.ptx}"
0381 } ;
0382
0383 for(unsigned i=0 ; i < specs.size() ; i++) Resolve_( specs[i].c_str() );
0384 return 0 ;
0385 }
0386
0387 int spath_test::LooksUnresolved_0()
0388 {
0389 const char* _path = "$SOME_NON_EXISTING_TOKEN/And/Something/More" ;
0390 const char* path = spath::Resolve(_path);
0391 std::cout << "LooksUnresolved_0[" << ( path ? path : "-" ) << "]\n" ;
0392
0393 const char* xpath = "SOME_NON_EXISTING_TOKEN/And/Something/More" ;
0394 assert( strcmp( path, xpath) == 0 );
0395
0396 bool unresolved = spath::LooksUnresolved(path, _path);
0397 assert( unresolved == true );
0398 return 0 ;
0399 }
0400
0401 int spath_test::LooksUnresolved_1()
0402 {
0403 const char* _path = "$SOME_NON_EXISTING_TOKEN/And/Something/More" ;
0404 const char* path = spath::Resolve(_path, "record.npy");
0405 std::cout << "LooksUnresolved_1[" << ( path ? path : "-" ) << "]\n" ;
0406
0407 const char* xpath = "SOME_NON_EXISTING_TOKEN/And/Something/More/record.npy" ;
0408 assert( strcmp( path, xpath) == 0 );
0409
0410 bool unresolved = spath::LooksUnresolved(path, _path);
0411 assert( unresolved == true );
0412 return 0 ;
0413 }
0414
0415
0416
0417
0418
0419
0420 int spath_test::Resolve_setenvvar()
0421 {
0422 std::cout << "\nspath_test::Resolve_setenvvar\n\n" ;
0423 std::vector<std::string> eye = {
0424 "0,0,0",
0425 "1,1,1",
0426 "2,2,2"
0427 } ;
0428
0429 std::vector<std::string> look = {
0430 "0,0,0",
0431 "0,0,0",
0432 "10,10,10"
0433 } ;
0434
0435 std::vector<std::string> up = {
0436 "0,0,1",
0437 "0,0,2",
0438 "0,0,3"
0439 } ;
0440
0441
0442 assert( eye.size() == look.size() );
0443 assert( eye.size() == up.size() );
0444
0445 const char* spec = "EYE=${EYE}_LOOK=${LOOK}_UP=${UP}" ;
0446 for(unsigned i=0 ; i < eye.size() ; i++)
0447 {
0448 ssys::setenvctx(
0449 "EYE", eye[i].c_str(),
0450 "LOOK", look[i].c_str(),
0451 "UP", up[i].c_str() );
0452
0453 Resolve_( spec );
0454 }
0455 return 0 ;
0456 }
0457
0458
0459
0460 int spath_test::Resolve_setenvmap()
0461 {
0462 std::cout << "\nspath_test::Resolve_setenvmap\n\n" ;
0463
0464 std::map<std::string, std::string> m =
0465 {
0466 { "EYE", "1,1,0" },
0467 { "LOOK", "0,0,0" },
0468 { "UP", "0,0,1" },
0469 };
0470
0471 const char* spec = "EYE=${EYE}_LOOK=${LOOK}_UP=${UP}" ;
0472 ssys::setenvmap( m );
0473 Resolve_( spec );
0474
0475 return 0 ;
0476 }
0477
0478
0479
0480 int spath_test::Exists()
0481 {
0482 std::vector<std::string> specs = {"$HOME/hello.npy", "$HOME", "$OPTICKS_HOME/sysrap/tests/spath_test.cc" } ;
0483 for(unsigned i=0 ; i < specs.size() ; i++)
0484 {
0485 const char* spec = specs[i].c_str();
0486 bool exists= spath::Exists(spec);
0487 std::cout
0488 << " spec " << std::setw(100) << spec
0489 << " exists " << ( exists ? "YES" : "NO " )
0490 << std::endl
0491 ;
0492 }
0493 return 0 ;
0494 }
0495
0496 int spath_test::Exists2()
0497 {
0498 const char* base = "$OPTICKS_HOME/sysrap/tests" ;
0499
0500 std::vector<std::string> names = {"hello.cc", "spath_test.cc", "spath_test.sh"} ;
0501 for(unsigned i=0 ; i < names.size() ; i++)
0502 {
0503 const char* name = names[i].c_str();
0504 const char* path = spath::Resolve(base, name);
0505 bool exists= spath::Exists(base, name);
0506 std::cout
0507 << " path " << std::setw(100) << path
0508 << " exists " << ( exists ? "YES" : "NO " )
0509 << std::endl
0510 ;
0511 }
0512 return 0 ;
0513 }
0514
0515
0516
0517 int spath_test::Dirname0()
0518 {
0519 const char* path = "record.npy" ;
0520 const char* fold = spath::Dirname(path) ;
0521 bool expect = strcmp( fold, "") == 0 ;
0522
0523 std::cout
0524 << "spath_test::Dirname0\n"
0525 << " path [" << path << "]\n"
0526 << " fold [" << ( fold ? fold : "-" ) << "]\n"
0527 << " expect [" << (expect ? "YES" : "NO " ) << "]\n"
0528 ;
0529
0530 assert( expect );
0531 return 0 ;
0532 }
0533
0534
0535
0536 int spath_test::Dirname()
0537 {
0538 const char* path = "/tmp/some/long/path/with/an/interesting/base" ;
0539 const char* fold = spath::Dirname(path) ;
0540 bool expect = strcmp( fold, "/tmp/some/long/path/with/an/interesting") == 0 ;
0541
0542 std::cout
0543 << "spath_test::Dirname\n"
0544 << " path [" << path << "]\n"
0545 << " fold [" << ( fold ? fold : "-" ) << "]\n"
0546 << " expect [" << (expect ? "YES" : "NO " ) << "]\n"
0547 ;
0548
0549 assert( expect );
0550 return 0 ;
0551 }
0552
0553 int spath_test::Basename()
0554 {
0555 const char* path = "/tmp/some/long/path/with/an/interesting/base" ;
0556 const char* base = spath::Basename(path) ;
0557 assert( strcmp( base, "base") == 0 );
0558 return 0 ;
0559 }
0560
0561 int spath_test::Name()
0562 {
0563 const char* name = spath::Name("red_","green_","blue") ;
0564 assert( strcmp( name, "red_green_blue") == 0 );
0565 return 0 ;
0566 }
0567
0568
0569 int spath_test::Remove()
0570 {
0571 const char* path_ = "/tmp/$USER/opticks/spath_test/file_test_Remove.gdml" ;
0572 const char* path = spath::Resolve(path_);
0573 sdirectory::MakeDirsForFile(path,0);
0574 sstr::Write(path, "42:test_Remove\n" );
0575
0576 std::cout
0577 << " path_ " << path_
0578 << " path " << path
0579 << std::endl
0580 ;
0581
0582 bool exists_0 = spath::Exists(path);
0583 int rc = spath::Remove(path);
0584 bool exists_1 = spath::Exists(path);
0585
0586 std::cout
0587 << " path_ " << path_
0588 << " path " << path
0589 << " rc " << rc
0590 << " exists_0 " << exists_0
0591 << " exists_1 " << exists_1
0592 << std::endl
0593 ;
0594
0595 assert( exists_0 == 1);
0596 assert( exists_1 == 0);
0597 return 0 ;
0598 }
0599
0600 int spath_test::_Check()
0601 {
0602 std::string chk0 = spath::_Check('A', "red", "green", "blue");
0603 std::string chk1 = spath::_Check('B', "red", "green", "blue");
0604 std::cout << "spath_test::_Check [" << chk0 << "]" << std::endl ;
0605 std::cout << "spath_test::_Check [" << chk1 << "]" << std::endl ;
0606 return 0 ;
0607 }
0608
0609
0610 int spath_test::Write()
0611 {
0612 const char* path = "$TMP/spath_test_Write/some/deep/path/spath_test.txt" ;
0613 bool ok0 = spath::Write("hello\n", path );
0614 std::cout << __FUNCTION__ << std::endl << path << " ok0 " << ( ok0 ? "YES" : "NO " ) << std::endl;
0615
0616 const char* base = "$TMP/spath_test_Write/some/deep/path" ;
0617 const char* name = "spath_test.txt" ;
0618
0619 bool ok1 = spath::Write("world\n", base, name );
0620 std::cout
0621 << __FUNCTION__ << std::endl
0622 << base << std::endl
0623 << name << std::endl
0624 << " ok1 " << ( ok1 ? "YES" : "NO " )
0625 << std::endl
0626 ;
0627
0628 return 0 ;
0629 }
0630
0631 int spath_test::WriteIntoInvokingDirectory()
0632 {
0633 const char* name = "spath_test.txt" ;
0634 bool ok2 = spath::Write("jelly\n", nullptr, name );
0635 std::cout
0636 << __FUNCTION__ << std::endl
0637 << " name " << ( name ? name : "-" ) << std::endl
0638 << " ok2 " << ( ok2 ? "YES" : "NO " )
0639 << std::endl
0640 ;
0641 return 0 ;
0642 }
0643
0644 int spath_test::Read()
0645 {
0646 std::vector<char> data ;
0647 bool ok = spath::Read(data, "$EXECUTABLE" );
0648 std::cout
0649 << __FUNCTION__ << std::endl
0650 << " ok " << ( ok ? "YES" : "NO " )
0651 << " data.size " << data.size()
0652 << std::endl
0653 ;
0654 return 0 ;
0655 }
0656
0657 int spath_test::EndsWith()
0658 {
0659 bool ok = spath::EndsWith("$EXECUTABLE", "spath_test" );
0660 std::cout
0661 << __FUNCTION__ << std::endl
0662 << " ok " << ( ok ? "YES" : "NO " )
0663 << std::endl
0664 ;
0665 return ok ? 0 : 1 ;
0666 }
0667
0668 int spath_test::SplitExt(int impl)
0669 {
0670 const char* path = "/tmp/blyth/opticks/GEOM/J_2024aug27/CSGOptiXRenderTest/CVD1/70500/ALL/scan-emm/cxr_overview_emm_t10,_elv_t_moi__ALL00000.jpg" ;
0671
0672 std::string dir ;
0673 std::string stem ;
0674 std::string ext ;
0675
0676 int rc = impl == 0 ? spath::SplitExt0(dir, stem, ext, path ) : spath::SplitExt(dir, stem, ext, path ) ;
0677
0678 std::cout
0679 << __FUNCTION__ << " impl " << impl << "\n"
0680 << " path [" << path << "]\n"
0681 << " dir [" << dir << "]\n"
0682 << " stem [" << stem << "]\n"
0683 << " ext [" << ext << "]\n"
0684 << " rc [" << rc << "]\n"
0685 << std::endl
0686 ;
0687 return rc ;
0688 }
0689
0690 int spath_test::Filesize()
0691 {
0692 long sz = spath::Filesize(spath::CWD(), __FILE__);
0693
0694 std::cout
0695 << "spath_test::Filesize"
0696 << "[" << __FILE__ << "]"
0697 << " sz : " << sz
0698 << "\n"
0699 ;
0700
0701 return sz > 0 ? 0 : 1 ;
0702 }
0703
0704 int spath_test::CFBaseFromGEOM()
0705 {
0706 const char* cfb = spath::CFBaseFromGEOM() ;
0707 const char* ori = spath::Resolve("$CFBaseFromGEOM/origin.gdml") ;
0708
0709 bool has = spath::has_CFBaseFromGEOM() ;
0710
0711 std::cout
0712 << " spath::CFBaseFromGEOM() [" << ( cfb ? cfb : "-" ) << "]\n"
0713 << " spath::Resolve(\"$CFBaseFromGEOM/origin.gdml\") [" << ( ori ? ori : "-" ) << "]\n"
0714 << " spath::has_CFBaseFromGEOM() [" << ( has ? "YES" : "NO " ) << "]\n"
0715 ;
0716 return 0 ;
0717 }
0718
0719 int spath_test::is_readable()
0720 {
0721 bool is0 = spath::is_readable("$CFBaseFromGEOM/origin.gdml") ;
0722 bool is1 = spath::is_readable("$CFBaseFromGEOM", "origin.gdml") ;
0723 bool is2 = spath::is_readable("$CFBaseFromGEOM") ;
0724 bool is3 = spath::is_readable("$CFBaseFromGEOM/") ;
0725 bool is4 = spath::is_readable("$SomeNonExistingToken") ;
0726 bool is5 = spath::is_readable("$CFBaseFromGEOM/CSGFoundry/SSim/extra/jpmt") ;
0727
0728
0729 std::cout
0730 << " spath::is_readable(\"$CFBaseFromGEOM/origin.gdml\") [" << ( is0 ? "YES" : "NO " ) << "]\n"
0731 << " spath::is_readable(\"$CFBaseFromGEOM\",\"origin.gdml\") [" << ( is1 ? "YES" : "NO " ) << "]\n"
0732 << " spath::is_readable(\"$CFBaseFromGEOM\") [" << ( is2 ? "YES" : "NO " ) << "]\n"
0733 << " spath::is_readable(\"$CFBaseFromGEOM/\") [" << ( is3 ? "YES" : "NO " ) << "]\n"
0734 << " spath::is_readable(\"$SomeNonExistingToken\") [" << ( is4 ? "YES" : "NO " ) << "]\n"
0735 << " spath::is_readable(\"$CFBaseFromGEOM/CSGFoundry/SSim/extra/jpmt\") [" << ( is5 ? "YES" : "NO " ) << "]\n"
0736 ;
0737 assert( is0 == is1 );
0738 return 0 ;
0739 }
0740
0741 int spath_test::GEOMSub()
0742 {
0743 const char* x_gsub = getenv("hello_GEOMSub");
0744 const char* gsub = spath::GEOMSub("hello") ;
0745 bool validmatch = x_gsub != nullptr && gsub != nullptr && strcmp( x_gsub, gsub ) == 0 ;
0746
0747 std::cout
0748 << "spath_test::GEOMSub"
0749 << " x_gsub " << ( x_gsub ? x_gsub : "-" )
0750 << " gsub " << ( gsub ? gsub : "-" )
0751 << " validmatch " << ( validmatch ? "YES" : "NO " )
0752 << "\n"
0753 ;
0754
0755
0756 return 0 ;
0757 }
0758
0759 int spath_test::GDMLPathFromGEOM()
0760 {
0761 const char* path = spath::GDMLPathFromGEOM();
0762
0763 std::cout
0764 << "spath_test::GDMLPathFromGEOM"
0765 << " [" << ( path ? path : "-" ) << "]\n"
0766 ;
0767
0768 return 0 ;
0769 }
0770
0771
0772
0773 int spath_test::last_write_time()
0774 {
0775 const char* path = spath::Resolve("$HOME/.bash_profile");
0776 if(!spath::Exists(path)) return 0 ;
0777
0778 int64_t now = sstamp::Now();
0779 int64_t mtime = spath::last_write_time(path);
0780
0781 int64_t age_secs = sstamp::age_seconds(mtime);
0782 int64_t age_days = sstamp::age_days(mtime);
0783
0784 std::cout
0785 << "spath_test::last_write_time\n"
0786 << " path [" << ( path ? path : "-" ) << "]\n"
0787 << " int64_t mtime = spath::last_write_time(\"" << path << "\")\n"
0788 << " mtime [" << mtime << "]\n"
0789 << " sstamp::Now() [" << now << "]\n"
0790 << " sstamp::Format(now) [" << sstamp::Format(now) << "]\n"
0791 << " sstamp::Format(mtime) [" << sstamp::Format(mtime) << "]\n"
0792 << " age_secs " << age_secs << "\n"
0793 << " age_days " << age_days << "\n"
0794 ;
0795
0796 return 0 ;
0797 }
0798
0799 int spath_test::Main()
0800 {
0801 const char* test = "ALL" ;
0802
0803 const char* TEST = ssys::getenvvar("TEST", test );
0804 bool ALL = strcmp(TEST, "ALL") == 0 ;
0805 std::cout << "[spath_test::Main TEST [" << ( TEST ? TEST : "-" ) << "]\n" ;
0806
0807 int rc = 0 ;
0808 if(ALL||strcmp(TEST, "Resolve_defaultOutputPath")==0 ) rc += Resolve_defaultOutputPath();
0809 if(ALL||strcmp(TEST, "Resolve_with_undefined_token")==0) rc += Resolve_with_undefined_token();
0810 if(ALL||strcmp(TEST, "Resolve_with_undefined_TMP")==0) rc += Resolve_with_undefined_TMP();
0811 if(ALL||strcmp(TEST, "Resolve_null")==0) rc += Resolve_null();
0812 if(ALL||strcmp(TEST, "Resolve_name")==0) rc += Resolve_name();
0813 if(ALL||strcmp(TEST, "Resolve_inline")==0) rc += Resolve_inline();
0814 if(ALL||strcmp(TEST, "ResolveToken")==0) rc += ResolveToken();
0815 if(ALL||strcmp(TEST, "Resolve")==0) rc += Resolve();
0816 if(ALL||strcmp(TEST, "Exists")==0) rc += Exists();
0817 if(ALL||strcmp(TEST, "Exists2")==0) rc += Exists2();
0818 if(ALL||strcmp(TEST, "Dirname0")==0) Dirname0();
0819 if(ALL||strcmp(TEST, "Dirname")==0) Dirname();
0820 if(ALL||strcmp(TEST, "Basename")==0) Basename();
0821 if(ALL||strcmp(TEST, "Name")==0) rc += Name();
0822 if(ALL||strcmp(TEST, "Remove")==0) rc += Remove();
0823 if(ALL||strcmp(TEST, "IsTokenWithFallback")==0) rc += IsTokenWithFallback();
0824 if(ALL||strcmp(TEST, "ResolveTokenWithFallback")==0) rc += ResolveTokenWithFallback();
0825 if(ALL||strcmp(TEST, "_ResolveToken")==0) rc += _ResolveToken();
0826 if(ALL||strcmp(TEST, "Resolve")==0) rc += Resolve();
0827 if(ALL||strcmp(TEST, "LooksUnresolved_0")==0) rc += LooksUnresolved_0();
0828 if(ALL||strcmp(TEST, "LooksUnresolved_1")==0) rc += LooksUnresolved_1();
0829 if(ALL||strcmp(TEST, "Resolve_setenvvar")==0) rc += Resolve_setenvvar();
0830 if(ALL||strcmp(TEST, "Resolve_setenvmap")==0) rc += Resolve_setenvmap();
0831 if(ALL||strcmp(TEST, "ResolveToken1")==0) rc += ResolveToken1();
0832 if(ALL||strcmp(TEST, "Resolve1")==0) rc += Resolve1();
0833 if(ALL||strcmp(TEST, "Resolve3")==0) rc += Resolve3();
0834 if(ALL||strcmp(TEST, "_Check")==0) rc += _Check();
0835 if(ALL||strcmp(TEST, "Write")==0) rc += Write();
0836 if(ALL||strcmp(TEST, "EndsWith")==0) rc += EndsWith();
0837 if(ALL||strcmp(TEST, "SplitExt0")==0) rc += SplitExt(0);
0838 if(ALL||strcmp(TEST, "SplitExt")==0) rc += SplitExt(1);
0839 if(ALL||strcmp(TEST, "Filesize")==0) rc += Filesize();
0840 if(ALL||strcmp(TEST, "CFBaseFromGEOM")==0) rc += CFBaseFromGEOM();
0841 if(ALL||strcmp(TEST, "is_readable")==0) rc += is_readable();
0842 if(ALL||strcmp(TEST, "GEOMSub")==0) rc += GEOMSub();
0843 if(ALL||strcmp(TEST, "GDMLPathFromGEOM")==0) rc += GDMLPathFromGEOM();
0844 if(ALL||strcmp(TEST, "last_write_time")==0) rc += last_write_time();
0845
0846
0847
0848
0849
0850 std::cout << "]spath_test::Main TEST [" << ( TEST ? TEST : "-" ) << "]" << " rc " << rc << "\n" ;
0851 return rc ;
0852 }
0853
0854 int main(int argc, char** argv)
0855 {
0856 return spath_test::Main();
0857 }
0858
0859