#ifndef CPPUNIT_EXCEPTION_H
#define CPPUNIT_EXCEPTION_H

#include <cppunit/Portability.h>
#include <cppunit/Message.h>
#include <cppunit/SourceLine.h>
#include <exception>


CPPUNIT_NS_BEGIN


/*! \brief Exceptions thrown by failed assertions.
 * \ingroup BrowsingCollectedTestResult
 *
 * Exception is an exception that serves
 * descriptive strings through its what() method
 */
class CPPUNIT_API Exception : public std::exception
{
public:
  /*! \brief Constructs the exception with the specified message and source location.
   * \param message Message associated to the exception.
   * \param sourceLine Source location related to the exception.
   */
  Exception( const Message &message = Message(), 
             const SourceLine &sourceLine = SourceLine() );

#ifdef CPPUNIT_ENABLE_SOURCELINE_DEPRECATED
  /*!
   * \deprecated Use other constructor instead.
   */
  Exception( std::string  message, 
	     long lineNumber, 
	     std::string fileName );
#endif

  /*! \brief Constructs a copy of an exception.
   * \param other Exception to copy.
   */
  Exception( const Exception &other );

  /// Destructs the exception
  virtual ~Exception() throw();

  /// Performs an assignment
  Exception &operator =( const Exception &other );

  /// Returns descriptive message
  const char *what() const throw();

  /// Location where the error occured
  SourceLine sourceLine() const;

  /// Message related to the exception.
  Message message() const;

  /// Set the message.
  void setMessage( const Message &message );

#ifdef CPPUNIT_ENABLE_SOURCELINE_DEPRECATED
  /// The line on which the error occurred
  long lineNumber() const;

  /// The file in which the error occurred
  std::string fileName() const;

  static const std::string UNKNOWNFILENAME;
  static const long UNKNOWNLINENUMBER;
#endif

  /// Clones the exception.
  virtual Exception *clone() const;

protected:
  // VC++ does not recognize call to parent class when prefixed
  // with a namespace. This is a workaround.
  typedef std::exception SuperClass;

  Message m_message;
  SourceLine m_sourceLine;
  std::string m_whatMessage;
};


CPPUNIT_NS_END


#endif // CPPUNIT_EXCEPTION_H