proj home

Files   Classes   Functions   Hierarchy  

projunittest.cpp

Go to the documentation of this file.
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 

Generated on Fri Mar 4 00:49:28 2011 for Chelton Evans Source by  doxygen 1.5.8