100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/** @file
 | 
						|
 | 
						|
    $Id$
 | 
						|
 | 
						|
    $Date$
 | 
						|
    $Author$
 | 
						|
 | 
						|
    @copy © Marc Wäckerlin
 | 
						|
    @license LGPL, see file <a href="license.html">COPYING</a>
 | 
						|
 | 
						|
    $Log$
 | 
						|
    Revision 1.2  2004/08/28 16:21:25  marc
 | 
						|
    mrw-c++-0.92 (mrw)
 | 
						|
    - new file: version.cxx
 | 
						|
    - new file header for all sources
 | 
						|
    - work around warning in mrw::auto<T>
 | 
						|
    - possibility to compile without log4cxx
 | 
						|
    - work around bugs in demangle.h and libiberty.h
 | 
						|
    - corrections in documentation
 | 
						|
    - added simple tracing mechanism
 | 
						|
    - more warnings
 | 
						|
    - small corrections in Auto<>::Free and a new test for it
 | 
						|
    - possibility to compile without stack trace
 | 
						|
 | 
						|
*/
 | 
						|
#include <mrw/exception.hxx>
 | 
						|
#include <cppunit/TestFixture.h>
 | 
						|
#include <cppunit/ui/text/TestRunner.h>
 | 
						|
#include <cppunit/extensions/HelperMacros.h>
 | 
						|
#include <cppunit/extensions/TestFactoryRegistry.h>
 | 
						|
#include <cppunit/XmlOutputter.h>
 | 
						|
#include <fstream>
 | 
						|
 | 
						|
namespace mrw {
 | 
						|
  class AutoExcStderrTest: public CppUnit::TestFixture {
 | 
						|
  private:
 | 
						|
    bool enter_unexpectedThrow;
 | 
						|
    bool exit_unexpectedThrow;
 | 
						|
    bool enter_passUnexpected;
 | 
						|
    bool exit_passUnexpected;
 | 
						|
    bool enter_catchUnexpected;
 | 
						|
    bool exit_catchUnexpected;
 | 
						|
  public:
 | 
						|
    void setUp() {
 | 
						|
      enter_unexpectedThrow = false;
 | 
						|
      exit_unexpectedThrow = false;
 | 
						|
      enter_passUnexpected = false;
 | 
						|
      exit_passUnexpected = false;
 | 
						|
      enter_catchUnexpected = false;
 | 
						|
      exit_catchUnexpected = false;
 | 
						|
    }
 | 
						|
    void unexpectedThrow() throw(std::bad_exception) {
 | 
						|
      enter_unexpectedThrow = true;
 | 
						|
      throw mrw::exception();
 | 
						|
      exit_unexpectedThrow = true;
 | 
						|
    }
 | 
						|
    void passUnexpected() throw(std::bad_exception) {
 | 
						|
      enter_passUnexpected = true;
 | 
						|
      unexpectedThrow();
 | 
						|
      exit_passUnexpected = true;
 | 
						|
    }
 | 
						|
    void catchUnexpected() throw() {
 | 
						|
      enter_catchUnexpected = true;
 | 
						|
      bool caught(false);
 | 
						|
      try {
 | 
						|
        passUnexpected();
 | 
						|
      } catch (std::bad_exception&) {
 | 
						|
        caught = true;
 | 
						|
      }
 | 
						|
      CPPUNIT_ASSERT(caught);
 | 
						|
      exit_catchUnexpected = true;
 | 
						|
    }
 | 
						|
    void testcase() {
 | 
						|
      std::set_unexpected([]{throw std::bad_exception();});
 | 
						|
      catchUnexpected();
 | 
						|
      CPPUNIT_ASSERT(enter_catchUnexpected &&
 | 
						|
                     enter_passUnexpected &&
 | 
						|
                     enter_unexpectedThrow &&
 | 
						|
                     exit_catchUnexpected &&
 | 
						|
                     !exit_passUnexpected &&
 | 
						|
                     !exit_unexpectedThrow);
 | 
						|
    }
 | 
						|
    CPPUNIT_TEST_SUITE(AutoExcStderrTest);
 | 
						|
    CPPUNIT_TEST(testcase);
 | 
						|
    CPPUNIT_TEST_SUITE_END();
 | 
						|
  };
 | 
						|
  CPPUNIT_TEST_SUITE_REGISTRATION(AutoExcStderrTest);
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char** argv) try {
 | 
						|
  std::ofstream ofs((*argv+std::string(".xml")).c_str());
 | 
						|
  CppUnit::TextUi::TestRunner runner;
 | 
						|
  runner.setOutputter(new CppUnit::XmlOutputter(&runner.result(), ofs));
 | 
						|
  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
 | 
						|
  return runner.run() ? 0 : 1;
 | 
						|
 } catch (std::exception& e) {
 | 
						|
  std::cerr<<"***Exception: "<<e.what()<<std::endl;
 | 
						|
  return 1;
 | 
						|
 }
 |