#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
// ----------------------------------------------------------------------------
#include <queue>
#include "wx/afterstd.h"
#include "wx/cpp.h"
+#include "wx/dialog.h"
+#include "wx/msgdlg.h"
+#include "wx/filedlg.h"
class wxTestingModalHook;
int m_id;
};
+#if wxUSE_FILEDLG
template<>
class wxExpectModal<wxFileDialog> : public wxExpectModalBase<wxFileDialog>
int m_id;
};
+#endif
// Implementation of wxModalDialogHook for use in testing, with
// wxExpectModal<T> and the wxTEST_DIALOG() macro. It is not intended for
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() )
{
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)
{
}
private:
- wxModalDialogHook *m_prevHook;
std::queue<const wxModalExpectation*> m_expectations;
wxDECLARE_NO_COPY_CLASS(wxTestingModalHook);
wxExpectModal<> for your dialog type and implement its OnInvoked()
method.
*/
+#ifdef wxHAS_VARIADIC_MACROS
#define wxTEST_DIALOG(codeToRun, ...) \
{ \
wxTEST_DIALOG_HOOK_CLASS wx_hook; \
codeToRun; \
wx_hook.CheckUnmetExpectations(); \
}
-
+#endif /* wxHAS_VARIADIC_MACROS */
#endif // !WXBUILDING