Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:49:19

0001 /**
0002 spath_test.cc
0003 ===============
0004 
0005 ::
0006 
0007      ~/opticks/sysrap/tests/spath_test.sh
0008      TEST=ResolveToken ~/opticks/sysrap/tests/spath_test.sh
0009      TEST=Resolve_null ~/opticks/sysrap/tests/spath_test.sh
0010      TEST=Resolve      ~/opticks/sysrap/tests/spath_test.sh
0011      TEST=Resolve3     ~/opticks/sysrap/tests/spath_test.sh
0012      TEST=Resolve_setenvvar ~/opticks/sysrap/tests/spath_test.sh
0013      TEST=Resolve_setenvmap ~/opticks/sysrap/tests/spath_test.sh
0014 
0015      TEST=DefaultOutputPath ~/opticks/sysrap/tests/spath_test.sh
0016 
0017      TEST=CFBaseFromGEOM ~/opticks/sysrap/tests/spath_test.sh
0018      TEST=is_readable ~/opticks/sysrap/tests/spath_test.sh
0019      TEST=GEOMSub ~/opticks/sysrap/tests/spath_test.sh
0020      TEST=GDMLPathFromGEOM ~/opticks/sysrap/tests/spath_test.sh
0021      TEST=Dirname ~/opticks/sysrap/tests/spath_test.sh
0022      TEST=Dirname0 ~/opticks/sysrap/tests/spath_test.sh
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     //const char* path = spath::Resolve(nullptr,"reldir", "sidx");  // spath::_Join doesnt like nullptr
0093     const char* path = spath::Resolve("","reldir", "sidx");  // spath::_Join handles blanks OK
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     //const char* stem = "stem_" ;
0141     //const char* stem = "%Y%m%d_" ;
0142     //const char* stem = "%Y%m%d_%H%M%S_" ;
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     //ResolveToken_("$DefaultOutputDir");
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     //const char* path = spath::Resolve(spec);
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     //assert( validmatch );
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     //if(ALL||strcmp(TEST, "DefaultOutputPath")==0) rc += DefaultOutputPath();
0847     //if(ALL||strcmp(TEST, "WriteIntoInvokingDirectory")==0) rc += WriteIntoInvokingDirectory();
0848     //if(ALL||strcmp(TEST, "Read")==0) rc += Read();
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