]> Creatis software - clitk.git/blob - tests/tools/toolTestRunner.cxx
42226b781d9634bc1919c97d16391b3bd0da49e5
[clitk.git] / tests / tools / toolTestRunner.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://www.centreleonberard.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================*/
18 #include <iostream>
19 #include <sstream>
20 #include <string>
21 #include <fstream>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <itksys/SystemTools.hxx>
25 const int NO_OUTPUT_OPTION=-1;
26 const int TEST_EXITED=1;
27 int getOutputOptionIndex(int argc, char** argv){
28   for(int i=1; i<argc; i++){
29       std::string s = argv[i];
30       if(s=="-o"){
31          return i+1;
32       }
33   }
34   return NO_OUTPUT_OPTION;
35 }
36
37 std::string getTmpFileName(){
38 #ifdef _WIN32
39   char fileName[L_tmpnam_s];
40   errno_t err = tmpnam_s(fileName);
41 #else
42   char fileName[] = "/tmp/vvTempXXXXXX";
43   int err=0;
44   int fd = mkstemp(fileName);
45   if(fd==-1) err=1;
46 #endif
47   if(err){
48    std::cout<<"couldnot create file. Exiting"<<std::endl;
49    exit(TEST_EXITED);
50   }
51   return std::string(fileName);
52 }
53
54 void assertFalse(int fail, const std::string &message=""){
55   if(fail){
56     std::cout<<message<<std::endl; 
57     exit(1);
58   }
59 }
60 /**
61  * argv
62  * [1] executable
63  * [2] random options
64  * [2.x] -o
65  * [3] reference file
66  * 
67  * [2.x] is optional. If set a temporary file will be generated. So NO need to pass a random outputFileName
68  */
69 int main(int argc, char** argv){
70   //reference file must exist or we fail
71   char* refFile = argv[argc-1];
72   assertFalse(!(itksys::SystemTools::FileExists(refFile, true)), "refFile "+std::string(refFile)+" doesn't exist");
73   
74   std::ostringstream cmd_line;
75   cmd_line<<CLITK_TEST_TOOLS_PATH;
76   for(int i=1; i<argc-1; i++){
77       //we should ensure the file exists, find an -i index or a long file name maybe?
78       cmd_line<<argv[i]<<" ";
79   }
80
81   //look for the need of generating an output file
82   int outputOptionIndex = getOutputOptionIndex(argc, argv);
83   std::string outFile;
84   if(NO_OUTPUT_OPTION==outputOptionIndex){
85      outFile = getTmpFileName();
86      cmd_line<<">"<<outFile;
87   }else{
88      outFile = argv[argc-2];
89   }
90   std::cout<<cmd_line.str()<<std::endl;;
91   //run the command line
92   system(cmd_line.str().c_str());
93   
94   //compare source files
95   assertFalse((itksys::SystemTools::FilesDiffer(outFile.c_str(), refFile)), "Source Files are different");
96   
97   //eventually raw files associated
98   //should be passed as a boolean to check also for raw or not
99   
100   std::string refRawFile = std::string(refFile)+".raw";
101   
102   
103   int found=outFile.find_last_of(".");
104   std::string rawFile = outFile.substr(0, found)+".raw";
105   if((itksys::SystemTools::FileExists(refRawFile.c_str(), true))){
106     //compare the raw stuff
107     if((itksys::SystemTools::FileExists(rawFile.c_str(), true))){
108        std::cout<<"Checking raws"<<std::endl;
109        assertFalse(itksys::SystemTools::FilesDiffer(refRawFile.c_str(), rawFile.c_str()), "Raws are different");
110     }
111     //file is not removed if there is a fail
112     remove(rawFile.c_str());
113   }
114   //neither the mhd is
115   remove(outFile.c_str());
116   
117   //success
118   return 0;
119 }