]> Creatis software - clitk.git/blob - tests/tools/toolTestRunner.cxx
7237c686323869d285771c2bee2977ff31b2b99c
[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   
39   
40   #ifdef _WIN32
41         char fileName[L_tmpnam_s];
42     errno_t err = tmpnam_s(fileName);
43   #else
44         char fileName[] = "/tmp/vvTempXXXXXX";
45     int err=0;
46     int fd = mkstemp(fileName);
47     if(fd==-1) err=1;
48   #endif
49   if(err){
50    std::cout<<"couldnot create file. Exiting"<<std::endl;
51    exit(TEST_EXITED);
52   }
53   return std::string(fileName);
54 }
55
56
57 /**
58  * argv
59  * [1] executable
60  * [2] random options
61  * [2.x] -o
62  * [2.x+1] outFileName
63  * [3] reference file
64  * 
65  * [2.x] and [2.x+1] are optional
66  */
67 int main(int argc, char** argv){
68   //reference file must exist or we fail
69   char* refFile = argv[argc-1];
70   if(!(itksys::SystemTools::FileExists(refFile, true))){
71     std::cout<<"refFile "<<refFile<<" doesn't exist"<<std::endl; 
72     return 1;
73   } 
74   
75   std::ostringstream cmd_line;
76   cmd_line<<CLITK_TEST_TOOLS_PATH;
77   for(int i=1; i<argc-1; i++){
78       //we should ensure the file exists, find an -i index or a long file name maybe?
79       cmd_line<<argv[i]<<" ";
80   }
81
82   //look for the need of generating an output file
83   int outputOptionIndex = getOutputOptionIndex(argc, argv);
84   std::string outFile;
85   if(NO_OUTPUT_OPTION==outputOptionIndex){
86     outFile = getTmpFileName();
87     std::cout<<outFile<<std::endl;
88     cmd_line<<">"<<outFile;
89   }else{
90     //todo test this else branch
91     outFile =  std::string(CLITK_TEST_DATA_PATH);
92     outFile += argv[outputOptionIndex];
93   }
94   //run the command line
95   system(cmd_line.str().c_str());
96   
97   //files should be equal, so if this is the case return success=0
98   int fail = (itksys::SystemTools::FilesDiffer(outFile.c_str(), refFile))?1:0;
99   remove(outFile.c_str());
100   return fail;
101 }