1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================*/
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];
34 return NO_OUTPUT_OPTION;
37 std::string getTmpFileName(){
39 char fileName[L_tmpnam_s];
40 errno_t err = tmpnam_s(fileName);
42 char fileName[] = "/tmp/vvTempXXXXXX";
44 int fd = mkstemp(fileName);
48 std::cout<<"couldnot create file. Exiting"<<std::endl;
51 return std::string(fileName);
54 void assertFalse(int fail, const std::string &message=""){
56 std::cout<<message<<std::endl;
60 bool isLineToIgnore(const std::string line){
61 if(std::string::npos == line.find_first_of("ITK_InputFilterName")){
66 bool mhdCmp(const std::string &file, const std::string &refFile){
67 bool sameFiles = true;
68 std::ifstream in(file.c_str());
69 std::ifstream ref(file.c_str());
72 while ( in.good() && ref.good()){
74 //does the line begins by an attribute to ignore
75 if(isLineToIgnore(line)){
80 while(isLineToIgnore(refLine)){
90 //check files same length
95 void dosToUnixFile(std::string dosFile, std::string unixedFile){
97 std::ifstream ifile(dosFile.c_str(),std::ios::binary);
98 ifile.seekg(0,std::ios_base::end);
100 char *buffer=new char[s];
102 ifile.read(buffer,s);
104 std::string txt(buffer,s);
107 while ((off=txt.find("\r\n",off))!=std::string::npos)
108 txt.replace(off,sizeof("\r\n")-1,"\n");
109 std::ofstream ofile(unixedFile.c_str());
110 ofile.write(txt.c_str(),txt.size());
115 std::string mhdToRawName(const std::string &mhdName){
116 int found = mhdName.find_last_of(".");
117 return mhdName.substr(0, found)+".raw";
126 * [2.x] is optional. If set a temporary file will be generated. So NO need to pass a random outputFileName
128 int main(int argc, char** argv){
129 //reference file must exist or we fail
130 char* refFile = argv[argc-1];
131 std::string strRefFile = std::string(refFile);
132 assertFalse(!(itksys::SystemTools::FileExists(refFile, true)), "refFile "+strRefFile+" doesn't exist");
134 std::ostringstream cmd_line;
135 cmd_line<<CLITK_TEST_TOOLS_PATH;
136 for(int i=1; i<argc-1; i++){
137 //we should ensure the file exists, find an -i index or a long file name maybe?
138 cmd_line<<argv[i]<<" ";
141 //look for the need of generating an output file
142 int outputOptionIndex = getOutputOptionIndex(argc, argv);
144 if(NO_OUTPUT_OPTION==outputOptionIndex){
145 outFile = getTmpFileName();
146 cmd_line<<">"<<outFile;
148 outFile = argv[argc-2];
150 std::cout<<cmd_line.str()<<std::endl;;
151 //run the command line
152 system(cmd_line.str().c_str());
154 assertFalse(!itksys::SystemTools::FileExists(outFile.c_str(), true), "no mhd have been generated");
156 //compare source files
158 std::string unixedOutFile= getTmpFileName();
160 dosToUnixFile(outFile, unixedOutFile);
161 assertFalse(!mhdCmp(unixedOutFile, refFile), "Generated mhd file != ref File");
162 remove(unixedOutFile.c_str());
164 assertFalse(!mhdCmp(outFile.c_str(), refFile), "Generated mhd file != ref File");
166 std::string refRawFile = mhdToRawName(strRefFile);
167 std::string rawFile = mhdToRawName(outFile);
169 if((itksys::SystemTools::FileExists(refRawFile.c_str(), true))){
170 //compare the raw stuff
171 if((itksys::SystemTools::FileExists(rawFile.c_str(), true))){
172 std::cout<<"Checking raws"<<std::endl;
173 assertFalse(itksys::SystemTools::FilesDiffer(refRawFile.c_str(), rawFile.c_str()), "Raws are different");
175 //file is not removed if there is a fail
176 remove(rawFile.c_str());
179 remove(outFile.c_str());