/////////////////////////////////////////////////////////////////////////////// // Name: tests/controls/dialogtest.cpp // Purpose: wxWindow unit test // Author: Vaclav Slavik // Created: 2012-08-30 // Copyright: (c) 2012 Vaclav Slavik /////////////////////////////////////////////////////////////////////////////// #include "testprec.h" #include "wx/testing.h" #include "wx/msgdlg.h" #include "wx/filedlg.h" // This test suite tests helpers from wx/testing.h intended for testing of code // that calls modal dialogs. It does not test the implementation of wxWidgets' // dialogs. TEST_CASE("Modal::MessageDialog", "[modal]") { int rc; #if wxUSE_FILEDLG #define FILE_DIALOG_TEST ,\ wxExpectModal(wxGetCwd() + "/test.txt").Optional() #else #define FILE_DIALOG_TEST #endif wxTEST_DIALOG ( rc = wxMessageBox("Should I fail?", "Question", wxYES|wxNO), wxExpectModal(wxNO) FILE_DIALOG_TEST ); CHECK( rc == wxNO ); } #if wxUSE_FILEDLG TEST_CASE("Modal::FileDialog", "[modal]") { #if defined(__WXQT__) && defined(__WINDOWS__) WARN("Skipping test known to fail under wxQt for Windows"); return; #else wxFileDialog dlg(nullptr); int rc; wxTEST_DIALOG ( rc = dlg.ShowModal(), wxExpectModal(wxGetCwd() + "/test.txt") ); CHECK( rc == wxID_OK ); CHECK( dlg.GetFilename() == "test.txt" ); #ifdef __WXGTK3__ // The native file dialog in GTK+ 3 launches an async operation which tries // to dereference the already deleted dialog object if we don't let it to // complete before leaving this function. wxYield(); #endif #endif } #endif class MyDialog : public wxDialog { public: MyDialog(wxWindow *parent) : wxDialog(parent, wxID_ANY, "Entry"), m_value(-1) { // Dummy. Imagine it's a real dialog that shows some number-entry // controls. } int m_value; }; template<> class wxExpectModal : public wxExpectModalBase { public: wxExpectModal(int valueToSet) : m_valueToSet(valueToSet) {} protected: virtual int OnInvoked(MyDialog *dlg) const override { // Simulate the user entering the expected number: dlg->m_value = m_valueToSet; return wxID_OK; } int m_valueToSet; }; TEST_CASE("Modal::CustomDialog", "[modal]") { MyDialog dlg(nullptr); wxTEST_DIALOG ( dlg.ShowModal(), wxExpectModal(42) ); CHECK( dlg.m_value == 42 ); } class MyModalDialog : public wxDialog { public: MyModalDialog() : wxDialog (nullptr, wxID_ANY, "Modal Dialog") { m_wasModal = false; Bind( wxEVT_INIT_DIALOG, &MyModalDialog::OnInit, this ); } void OnInit(wxInitDialogEvent& WXUNUSED(event)) { m_wasModal = IsModal(); CallAfter( &MyModalDialog::EndModal, wxID_OK ); } bool WasModal() const { return m_wasModal; } private: bool m_wasModal; }; TEST_CASE("Modal::InitDialog", "[modal]") { MyModalDialog dlg; dlg.ShowModal(); CHECK( dlg.WasModal() ); }