X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/643e9cf9f61fdbe517b15477f9247ca8ac0b3578..d642db66a5efc82d374b813022c72ba88bc50839:/include/wx/testing.h diff --git a/include/wx/testing.h b/include/wx/testing.h index 905184e493..dc1bd5ec33 100644 --- a/include/wx/testing.h +++ b/include/wx/testing.h @@ -13,56 +13,11 @@ #include "wx/debug.h" #include "wx/string.h" +#include "wx/modalhook.h" -class WXDLLIMPEXP_FWD_CORE wxDialog; class WXDLLIMPEXP_FWD_CORE wxMessageDialogBase; class WXDLLIMPEXP_FWD_CORE wxFileDialogBase; -// ---------------------------------------------------------------------------- -// implementation helpers -// ---------------------------------------------------------------------------- - -// Helper hook class used to redirect ShowModal() to testing code. -// Instead of showing a dialog modally, hook code is called to simulate what -// the user would do and return appropriate ID from ShowModal(). -class WXDLLIMPEXP_CORE wxModalDialogHook -{ -public: - wxModalDialogHook() {} - virtual ~wxModalDialogHook() {} - - /// Returns currently active hook object or NULL. - static wxModalDialogHook *Get() { return ms_instance; } - - /// Set the hook and returns the previously set one. - static wxModalDialogHook *Set(wxModalDialogHook *hook) - { - wxModalDialogHook *old = ms_instance; - ms_instance = hook; - return old; - } - - /// Entry point that is called from ShowModal(). - virtual int Invoke(wxDialog *dlg) = 0; - -private: - static wxModalDialogHook *ms_instance; - - wxDECLARE_NO_COPY_CLASS(wxModalDialogHook); -}; - -// This macro needs to be used at the top of every implementation of -// ShowModal() in order for the above modal dialogs testing code to work. -#define WX_TESTING_SHOW_MODAL_HOOK() \ - if ( wxModalDialogHook::Get() ) \ - { \ - int rc = wxModalDialogHook::Get()->Invoke(this); \ - if ( rc != wxID_NONE ) \ - return rc; \ - } \ - struct wxDummyTestingStruct /* just to force a semicolon */ - - // ---------------------------------------------------------------------------- // testing API // ---------------------------------------------------------------------------- @@ -76,6 +31,9 @@ private: #include #include "wx/afterstd.h" #include "wx/cpp.h" +#include "wx/dialog.h" +#include "wx/msgdlg.h" +#include "wx/filedlg.h" class wxTestingModalHook; @@ -198,6 +156,7 @@ protected: int m_id; }; +#if wxUSE_FILEDLG template<> class wxExpectModal : public wxExpectModalBase @@ -219,6 +178,7 @@ protected: int m_id; }; +#endif // Implementation of wxModalDialogHook for use in testing, with // wxExpectModal and the wxTEST_DIALOG() macro. It is not intended for @@ -228,15 +188,42 @@ class wxTestingModalHook : public wxModalDialogHook public: wxTestingModalHook() { - m_prevHook = wxModalDialogHook::Set(this); + Register(); + } + + // Called to verify that all expectations were met. This cannot be done in + // the destructor, because ReportFailure() may throw (either because it's + // overriden or because wx's assertions handling is, globally). And + // throwing from the destructor would introduce all sort of problems, + // including messing up the order of errors in some cases. + void CheckUnmetExpectations() + { + while ( !m_expectations.empty() ) + { + const wxModalExpectation *expect = m_expectations.front(); + m_expectations.pop(); + if ( expect->IsOptional() ) + continue; + + ReportFailure + ( + wxString::Format + ( + "Expected %s dialog was not shown.", + expect->GetDescription() + ) + ); + break; + } } - virtual ~wxTestingModalHook() + void AddExpectation(const wxModalExpectation& e) { - wxModalDialogHook::Set(m_prevHook); + m_expectations.push(&e); } - virtual int Invoke(wxDialog *dlg) +protected: + virtual int Enter(wxDialog *dlg) { while ( !m_expectations.empty() ) { @@ -276,37 +263,6 @@ public: return wxID_NONE; } - // Called to verify that all expectations were met. This cannot be done in - // the destructor, because ReportFailure() may throw (either because it's - // overriden or because wx's assertions handling is, globally). And - // throwing from the destructor would introduce all sort of problems, - // including messing up the order of errors in some cases. - void CheckUnmetExpectations() - { - while ( !m_expectations.empty() ) - { - const wxModalExpectation *expect = m_expectations.front(); - m_expectations.pop(); - if ( expect->IsOptional() ) - continue; - - ReportFailure - ( - wxString::Format - ( - "Expected %s dialog was not shown.", - expect->GetDescription() - ) - ); - break; - } - } - - void AddExpectation(const wxModalExpectation& e) - { - m_expectations.push(&e); - } - protected: virtual void ReportFailure(const wxString& msg) { @@ -314,7 +270,6 @@ protected: } private: - wxModalDialogHook *m_prevHook; std::queue m_expectations; wxDECLARE_NO_COPY_CLASS(wxTestingModalHook); @@ -382,6 +337,7 @@ private: wxExpectModal<> for your dialog type and implement its OnInvoked() method. */ +#ifdef wxHAS_VARIADIC_MACROS #define wxTEST_DIALOG(codeToRun, ...) \ { \ wxTEST_DIALOG_HOOK_CLASS wx_hook; \ @@ -389,7 +345,7 @@ private: codeToRun; \ wx_hook.CheckUnmetExpectations(); \ } - +#endif /* wxHAS_VARIADIC_MACROS */ #endif // !WXBUILDING