+
+using CppUnit::Test;
+using CppUnit::TestSuite;
+using CppUnit::TestFactoryRegistry;
+
+// exception class for MSVC debug CRT assertion failures
+#ifdef wxUSE_VC_CRTDBG
+
+struct CrtAssertFailure
+{
+ CrtAssertFailure(const char *message) : m_msg(message) { }
+
+ const wxString m_msg;
+
+ wxDECLARE_NO_ASSIGN_CLASS(CrtAssertFailure);
+};
+
+#endif // wxUSE_VC_CRTDBG
+
+// this function should only be called from a catch clause
+static string GetExceptionMessage()
+{
+ wxString msg;
+
+ try
+ {
+ throw;
+ }
+#if wxDEBUG_LEVEL
+ catch ( TestAssertFailure& e )
+ {
+ msg << "wxWidgets assert: " << e.m_cond << " failed "
+ "at " << e.m_file << ":" << e.m_line << " in " << e.m_func
+ << " with message " << e.m_msg;
+ }
+#endif // wxDEBUG_LEVEL
+#ifdef wxUSE_VC_CRTDBG
+ catch ( CrtAssertFailure& e )
+ {
+ msg << "CRT assert failure: " << e.m_msg;
+ }
+#endif // wxUSE_VC_CRTDBG
+ catch ( std::exception& e )
+ {
+ msg << "std::exception: " << e.what();
+ }
+ catch ( ... )
+ {
+ msg = "Unknown exception caught.";
+ }
+
+ return string(msg.mb_str());
+}
+
+// Protector adding handling of wx-specific (this includes MSVC debug CRT in
+// this context) exceptions
+class wxUnitTestProtector : public CppUnit::Protector
+{
+public:
+ virtual bool protect(const CppUnit::Functor &functor,
+ const CppUnit::ProtectorContext& context)
+ {
+ try
+ {
+ return functor();
+ }
+ catch ( ... )
+ {
+ reportError(context, CppUnit::Message("Uncaught exception",
+ GetExceptionMessage()));
+ }
+
+ return false;
+ }
+};
+
+// Displays the test name before starting to execute it: this helps with
+// diagnosing where exactly does a test crash or hang when/if it does.
+class DetailListener : public CppUnit::TestListener
+{
+public:
+ DetailListener(bool doTiming = false):
+ CppUnit::TestListener(),
+ m_timing(doTiming)
+ {
+ }
+
+ virtual void startTest(CppUnit::Test *test)
+ {
+ std::cout << test->getName () << " ";
+ m_watch.Start();
+ }
+
+ virtual void endTest(CppUnit::Test * WXUNUSED(test))
+ {
+ m_watch.Pause();
+ if ( m_timing )
+ std::cout << " (in "<< m_watch.Time() << " ms )";
+ std::cout << "\n";
+ }
+
+protected :
+ bool m_timing;
+ wxStopWatch m_watch;
+};
+
+#if wxUSE_GUI
+ typedef wxApp TestAppBase;
+#else
+ typedef wxAppConsole TestAppBase;
+#endif