/** @file

    $Id$

    $Date$
    $Author$

    @copy &copy; Marc W&auml;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() {
      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;
 }
