Files Classes Functions Hierarchy
00001 #include <projunittest.h> 00002 #include <stringconvert.h> 00003 #include <stringserialization.h> 00004 #include <systemcalls.h> 00005 #include <tokenizer.h> 00006 00007 string projunittest::fileresults="unittestreport.txt"; 00008 string unittestcmd::tempfile="/tmp/projunittestcmdtemp.txt"; 00009 00010 unittestcmd::unittestcmd() 00011 { 00012 } 00013 00014 unittestcmd::unittestcmd(stringc& line_) 00015 : line(line_) 00016 { 00017 } 00018 00019 int unittestcmd::eval() 00020 { 00021 //cout << SHOW3(line) << endl; 00022 assert(line.empty()==false); 00023 00024 stringc cmdline("$ " + line + "\n"); 00025 00026 if (terminal.isall()) 00027 cout << cmdline; 00028 00029 { 00030 systemcalls sys(line,tempfile); 00031 sys.combine=true; 00032 exitstatus=sys.eval(); 00033 00034 // Summary takes the first few lines only. 00035 //if (printstate!=summary) 00036 if (!terminal.issummary()) 00037 output= sys.output(); 00038 } 00039 //cout << SHOW3(exitstatus) << endl; 00040 //cout << SHOW3(printstate) << endl; 00041 00042 if (terminal.issummary()) 00043 { 00044 00045 systemcalls sys2("head -n 15 " + tempfile); 00046 sys2.combine=true; 00047 sys2.eval(); 00048 output= sys2.output(); 00049 //cout << SHOW(output) << endl; 00050 } 00051 00052 //if (printstate==all) 00053 if (terminal.isall()) 00054 cout << output << endl; 00055 00056 return exitstatus; 00057 } 00058 00059 stringc unittestcmd::xml() const 00060 { 00061 string s1; 00062 s1 += stringtag(exitstatus,"exitstatus"); 00063 s1 += stringtag(line,"line"); 00064 s1 += stringtag(output,"output"); 00065 00066 return s1=stringtag(s1,"cmd"); 00067 } 00068 00069 projunittest::projunittest() 00070 { 00071 } 00072 00073 projunittest::projunittest(stringc& filename_) 00074 : filename(filename_) 00075 { 00076 } 00077 00078 int projunittest::eval() 00079 { 00080 string s1; 00081 if (!filestring::serialize(s1,filename)) 00082 { 00083 cout << "error: Can not open " << filename << "." << endl; 00084 return 1; 00085 } 00086 00087 //cout << SHOW3(s1) << endl; 00088 tokenizer ss; 00089 ss.readaslines(s1); 00090 00091 ss.reset(); 00092 for ( ; !ss; ++ss) 00093 { 00094 vi.push_back( unittestcmd(ss()) ); 00095 } 00096 ss.trim_and_prune(); 00097 00098 //cout << SHOW(vi.size()) << endl; 00099 00100 for (uint i=0; i<vi.size(); ++i) 00101 { 00102 // cout << SHOW(vi[i].line) << endl; 00103 assert(vi[i].line.empty()==false); 00104 vi[i].terminal.changestate(terminal); 00105 } 00106 00107 //cout << SHOW(vi.size()) << endl; 00108 00109 /* 00110 string temp=vi[0].xml(); 00111 cout << SHOW(temp) << endl; 00112 vi[0].eval(); 00113 temp=vi[0].xml(); 00114 cout << SHOW3(temp) << endl; 00115 */ 00116 00117 // for ( uint i=0; i<vi.size(); ++i) 00118 // cout << vi[i].xml() << endl; 00119 00120 // Loop through and execute the commands. 00121 // If one test fails then the unit 00122 // test has failed. 00123 int exitstatus2=0; 00124 for (uint i=0; i<vi.size(); ++i) 00125 { 00126 int status = vi[i].eval(); 00127 if (status != 0) 00128 { 00129 // Only change exitstatus2 on the first error. 00130 if (exitstatus2==0) 00131 exitstatus2=status; 00132 continue; 00133 } 00134 } 00135 exitstatus=exitstatus2; 00136 00137 // write to fileresults 00138 string s2=xml(); 00139 //cout << SHOW3(s2) << endl; 00140 00141 bool res; 00142 res=filestring::serializeInverse(fileresults,s2); 00143 if (res==false) 00144 cout << "error: could not write file " + fileresults << endl; 00145 assert(res); 00146 if ((res==false)&&(exitstatus==0)) 00147 exitstatus=1; 00148 //cout << SHOW(res) << endl; 00149 00150 if (!terminal.issilent()) 00151 cout << report(); 00152 flush(cout); 00153 00154 return exitstatus; 00155 } 00156 00157 stringc projunittest::xml() const 00158 { 00159 if (filename.empty()) 00160 return ""; 00161 00162 string s1; 00163 00164 //s1 += stringtag( stringtag(exitstatus,"exitstatus"),"state"); 00165 s1 += stringtag(exitstatus,"exitstatus"); 00166 s1 += stringtag(filename,"file"); 00167 00168 string s2; 00169 00170 for (uint i=0; i<vi.size(); ++i) 00171 s2 += vi[i].xml(); 00172 00173 string s3 = stringtag(s2,"commandlines"); 00174 s1 += s3; 00175 00176 string s4( stringtag(s1,"unittest") ); 00177 00178 return s4; 00179 } 00180 00181 stringc projunittest::report() const 00182 { 00183 string s1; 00184 s1 = "Report " + filename + " " + isvalidtext() + endln; 00185 00186 for (uint i=0; i<vi.size(); ++i) 00187 { 00188 s1 += (vi[i].line + endln); 00189 s1 += (" " + vi[i].isvalidtext() + endln); 00190 } 00191 00192 return s1; 00193 } 00194 00195
1.5.8