diff --git a/testsuite/dejagnu.h b/testsuite/dejagnu.h index 0d47fdfa176136be2ec6113d0b5f7b1791d131f8..45ee070913436fee92c45a4894b81d7b45ea24ad 100644 --- a/testsuite/dejagnu.h +++ b/testsuite/dejagnu.h @@ -1,271 +1,316 @@ -/* - * Copyright (C) 2000, 2001 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ +/* DejaGnu unit testing header. + Copyright (C) 2000, 2001, 2002, 2004, 2006 Free Software + Foundation, Inc. + +This file is part of DejaGnu. + +DejaGnu is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3 of the License, or +(at your option) any later version. + +DejaGnu is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with DejaGnu; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __DEJAGNU_H__ #define __DEJAGNU_H__ #include <stdio.h> -#include <stdarg.h> +#include <stdarg.h> #include <string.h> -#define _BUFFER_SIZE_ 512 +/* If you have problems with DejaGnu dropping failed, untested, or + * unresolved messages generated by a unit testcase, then: */ + +/* #define _DEJAGNU_WAIT_ */ -static int passed = 0; -static int failed = 0; -static int untest = 0; -static int unresolve = 0; -static int tests = 0; +#ifdef _DEJAGNU_WAIT_ +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> +#endif -static char buffer[ _BUFFER_SIZE_ ]; +static int passed; +static int failed; +static int untest; +static int unresolve; +static int xfailed; +static int xpassed; +static char buffer[512]; -inline void -pass (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2))); -inline void -pass (const char* fmt, ... ) { - va_list ap; +void +wait (void) +{ +#ifdef _DEJAGNU_WAIT_ + fd_set rfds; + struct timeval tv; - tests++; - passed++; - va_start( ap, fmt ); - vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap ); - va_end( ap ); - printf ("\tPASSED: #%d %s\n", tests, buffer ); - fflush( stdout ); + FD_ZERO (&rfds); + tv.tv_sec = 0; + tv.tv_usec = 1; + + select (0, &rfds, NULL, NULL, &tv); +#endif } -inline void -fail (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2))); -inline void -fail (const char* fmt, ... ) { - va_list ap; +static inline void +pass (const char* fmt, ...) +{ + va_list ap; + + passed++; + va_start (ap, fmt); + vsnprintf (buffer, sizeof (buffer), fmt, ap); + va_end (ap); + printf ("\tPASSED: %s\n", buffer); + wait (); +} - tests++; - failed++; - va_start( ap, fmt ); - vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap ); - va_end( ap ); - printf ("\tFAILED: #%d %s\n", tests, buffer ); - fflush( stdout ); +static inline void +xpass (const char* fmt, ...) +{ + va_list ap; + + passed++; + va_start (ap, fmt); + vsnprintf (buffer, sizeof (buffer), fmt, ap); + va_end (ap); + printf ("\tXPASSED: %s\n", buffer); + wait (); } -inline void -untested (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2))); -inline void -untested (const char* fmt, ... ) { - va_list ap; +static inline void +fail (const char* fmt, ...) +{ + va_list ap; + + failed++; + va_start (ap, fmt); + vsnprintf (buffer, sizeof (buffer), fmt, ap); + va_end (ap); + printf ("\tFAILED: %s\n", buffer); + wait (); +} - tests++; - untest++; - va_start( ap, fmt ); - vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap ); - va_end( ap ); - printf ("\tUNTESTED: #%d %s\n", tests, buffer ); - fflush( stdout ); +static inline void +xfail (const char* fmt, ...) +{ + va_list ap; + + failed++; + va_start (ap, fmt); + vsnprintf (buffer, sizeof (buffer), fmt, ap); + va_end (ap); + printf ("\tXFAILED: %s\n", buffer); + wait (); } -inline void -unresolved (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2))); -inline void -unresolved (const char* fmt, ... ) { - va_list ap; +static inline void +untested (const char* fmt, ...) +{ + va_list ap; + + untest++; + va_start (ap, fmt); + vsnprintf (buffer, sizeof (buffer), fmt, ap); + va_end (ap); + printf ("\tUNTESTED: %s\n", buffer); + wait (); +} - tests++; - unresolve++; - va_start( ap, fmt ); - vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap ); - va_end( ap ); - printf ("\tUNRESOLVED: #%d %s\n", tests, buffer ); - fflush( stdout ); +static inline void +unresolved (const char* fmt, ...) +{ + va_list ap; + + unresolve++; + va_start (ap, fmt); + vsnprintf (buffer, sizeof (buffer), fmt, ap); + va_end (ap); + printf ("\tUNRESOLVED: %s\n", buffer); + wait (); } -inline void -note (const char* fmt, ... ) __attribute__ ((format (printf, 1, 2))); -inline void -note (const char* fmt, ... ) { - va_list ap; - - va_start( ap, fmt ); - vsnprintf( buffer, _BUFFER_SIZE_, fmt, ap ); - va_end( ap ); - printf ("\tNOTE: %s\n", buffer ); - fflush( stdout ); +static inline void +note (const char* fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + vsnprintf (buffer, sizeof (buffer), fmt, ap); + va_end (ap); + printf ("\tNOTE: %s\n", buffer); + wait (); } -inline void -totals (void) { - printf ("\nTotals:\n"); - printf ("\t#passed:\t\t%d\n", passed); - printf ("\t#failed:\t\t%d\n", failed); - if (untest) - printf ("\t#untested:\t\t%d\n", untest); - if (unresolve) - printf ("\t#unresolved:\t\t%d\n", unresolve); +static inline void +totals (void) +{ + printf ("\nTotals:\n"); + printf ("\t#passed:\t\t%d\n", passed); + printf ("\t#real failed:\t\t%d\n", failed); + if (xfailed) + printf ("\t#expected failures:\t\t%d\n", xfailed); + if (untest) + printf ("\t#untested:\t\t%d\n", untest); + if (unresolve) + printf ("\t#unresolved:\t\t%d\n", unresolve); } #ifdef __cplusplus - #include <iostream> #include <iomanip> #include <fstream> #include <string> -#if 0 -#if HAVE_STL3 -#include <sstream> -#else -#include <strstream> -#endif -#endif const char *outstate_list[] = { - "FAILED: ", - "PASSED: ", - "UNTESTED: ", - "UNRESOLVED: " + "FAILED: ", "PASSED: ", "UNTESTED: ", "UNRESOLVED: ", "XFAILED: ", "XPASSED: " }; const char ** outstate = outstate_list; -#if 0 -extern ios& __iomanip_testout (ios&, int); -inline smanip<int> testout (int n) { - return smanip<int> (__iomanip_testout, n); -} -ios & __iomanip_testout (ios& i, int x) { - return i; -} - -template<class T> -class OMANIP { - private: - T i; - ostream &(*f)(ostream&, T); - public: - OMANIP(ostream& (*ff)(ostream&, T), T ii) : f(ff), i(ii) { - } - friend ostream operator<<(ostream& us, OMANIP& m) { - return m.f(os,m.i); - } -}; - -ostream& -freakout(ostream& os, int x) { - return os << "FREAKOUT" ; - // return x << "TESTOUT " << x ; -} - -OMANIP<int> testout(int i) { - return OMANIP<int>(&freakout,i); -} -#endif - -enum teststate {FAILED, PASSED,UNTESTED,UNRESOLVED} laststate; +enum teststate { FAILED, PASSED, UNTESTED, UNRESOLVED, XFAILED, XPASSED} laststate; class TestState { - private: - teststate laststate; - std::string lastmsg; - public: - TestState(void) { - passed = 0; - failed = 0; - untest = 0; - unresolve = 0; - } - ~TestState(void) { - totals(); - }; - - void testrun (bool b, std::string s) { - if (b) - pass (s); - else - fail (s); - } - - void pass (std::string s) { - passed++; - laststate = PASSED; - lastmsg = s; - std::cout << "\t" << outstate[PASSED] << s << std::endl; - } - void pass (const char *c) { - std::string s = c; - pass (s); - } - - void fail (std::string s) { - failed++; - laststate = FAILED; - lastmsg = s; - std::cout << "\t" << outstate[FAILED] << s << std::endl; - } - void fail (const char *c) { - std::string s = c; - fail (s); - } - - void untested (std::string s) { - untest++; - laststate = UNTESTED; - lastmsg = s; - std::cout << "\t" << outstate[UNTESTED] << s << std::endl; - } - void untested (const char *c) { - std::string s = c; - untested (s); - } - - void unresolved (std::string s) { - unresolve++; - laststate = UNRESOLVED; - lastmsg = s; - std::cout << "\t" << outstate[UNRESOLVED] << s << std::endl; - } - void unresolved (const char *c) { - std::string s = c; - unresolved (s); - } - - void totals (void) { - std::cout << "\t#passed:\t\t" << passed << std::endl; - std::cout << "\t#failed:\t\t" << failed << std::endl; - if (untest) - std::cout << "\t#untested:\t\t" << untest << std::endl; - if (unresolve) - std::cout << "\t#unresolved:\t\t" << unresolve << std::endl; - } - - // This is so this class can be printed in an ostream. - friend std::ostream & operator << (std::ostream &os, TestState& t) { - return os << "\t" << outstate[t.laststate] << t.lastmsg ; - } - - int GetState(void) { - return laststate; - } - std::string GetMsg(void) { - return lastmsg; - } -}; + private: + teststate laststate; + std::string lastmsg; + public: + TestState (void) + { + passed = 0; + failed = 0; + untest = 0; + xpassed = 0; + xfailed = 0; + unresolve = 0; + } + + ~TestState (void) { totals(); } + + void testrun (bool b, std::string s) + { + if (b) + pass (s); + else + fail (s); + } + + void pass (std::string s) + { + passed++; + laststate = PASSED; + lastmsg = s; + std::cout << "\t" << outstate[PASSED] << s << std::endl; + } + + void pass (const char *c) + { + std::string s = c; + pass (s); + } + + void xpass (std::string s) + { + xpassed++; + laststate = PASSED; + lastmsg = s; + std::cout << "\t" << outstate[XPASSED] << s << std::endl; + } + + void xpass (const char *c) + { + std::string s = c; + xpass (s); + } + + void fail (std::string s) + { + failed++; + laststate = FAILED; + lastmsg = s; + std::cout << "\t" << outstate[FAILED] << s << std::endl; + } + + void fail (const char *c) + { + std::string s = c; + fail (s); + } + + void xfail (std::string s) + { + xfailed++; + laststate = XFAILED; + lastmsg = s; + std::cout << "\t" << outstate[XFAILED] << s << std::endl; + } + + void xfail (const char *c) + { + std::string s = c; + xfail (s); + } + + void untested (std::string s) + { + untest++; + laststate = UNTESTED; + lastmsg = s; + std::cout << "\t" << outstate[UNTESTED] << s << std::endl; + } + + void untested (const char *c) + { + std::string s = c; + untested (s); + } + + void unresolved (std::string s) + { + unresolve++; + laststate = UNRESOLVED; + lastmsg = s; + std::cout << "\t" << outstate[UNRESOLVED] << s << std::endl; + } + + void unresolved (const char *c) + { + std::string s = c; + unresolved (s); + } + + void totals (void) + { + std::cout << "\t#passed:\t\t" << passed << std::endl; + std::cout << "\t#real failed:\t\t" << failed << std::endl; + if (xfailed) + std::cout << "\t#expected failures:\t\t" << xfailed << std::endl; + if (xpassed) + std::cout << "\t#unexpected passes:\t\t" << xpassed << std::endl; + if (untest) + std::cout << "\t#untested:\t\t" << untest << std::endl; + if (unresolve) + std::cout << "\t#unresolved:\t\t" << unresolve << std::endl; + } -#endif // __cplusplus -#endif // _DEJAGNU_H_ + // This is so this class can be printed in an ostream. + friend std::ostream & operator << (std::ostream &os, TestState& t) + { + return os << "\t" << outstate[t.laststate] << t.lastmsg ; + } + int GetState (void) { return laststate; } + std::string GetMsg (void) { return lastmsg; } +}; +#endif /* __cplusplus */ +#endif /* _DEJAGNU_H_ */