Add unit tests for checking wxTE_PROCESS_ENTER handling
Verify that pressing Enter in a dialog activates its default button when a text-like (i.e. wxTextCtrl or wxComboBox) has focus either if it doesn't have wxTE_PROCESS_ENTER style or if it does, but its handler skips the event, but not if the style is used and the event is handled.
This commit is contained in:
		| @@ -231,4 +231,22 @@ void ComboBoxTestCase::IsEmpty() | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  | TEST_CASE("wxComboBox::ProcessEnter", "[wxComboBox][enter]") | ||||||
|  | { | ||||||
|  |     struct ComboBoxCreator | ||||||
|  |     { | ||||||
|  |         static wxControl* Do(wxWindow* parent, int style) | ||||||
|  |         { | ||||||
|  |             const wxString choices[] = { "foo", "bar", "baz" }; | ||||||
|  |  | ||||||
|  |             return new wxComboBox(parent, wxID_ANY, wxString(), | ||||||
|  |                                   wxDefaultPosition, wxDefaultSize, | ||||||
|  |                                   WXSIZEOF(choices), choices, | ||||||
|  |                                   style); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     TestProcessEnter(&ComboBoxCreator::Do); | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif //wxUSE_COMBOBOX | #endif //wxUSE_COMBOBOX | ||||||
|   | |||||||
| @@ -1249,4 +1249,19 @@ void TextCtrlTestCase::XYToPositionSingleLine() | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | TEST_CASE("wxTextCtrl::ProcessEnter", "[wxTextCtrl][enter]") | ||||||
|  | { | ||||||
|  |     struct TextCtrlCreator | ||||||
|  |     { | ||||||
|  |         static wxControl* Do(wxWindow* parent, int style) | ||||||
|  |         { | ||||||
|  |             return new wxTextCtrl(parent, wxID_ANY, wxString(), | ||||||
|  |                                   wxDefaultPosition, wxDefaultSize, | ||||||
|  |                                   style); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     TestProcessEnter(&TextCtrlCreator::Do); | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif //wxUSE_TEXTCTRL | #endif //wxUSE_TEXTCTRL | ||||||
|   | |||||||
| @@ -10,8 +10,12 @@ | |||||||
|  |  | ||||||
| #ifndef WX_PRECOMP | #ifndef WX_PRECOMP | ||||||
|     #include "wx/app.h" |     #include "wx/app.h" | ||||||
|  |     #include "wx/dialog.h" | ||||||
|     #include "wx/event.h" |     #include "wx/event.h" | ||||||
|  |     #include "wx/sizer.h" | ||||||
|  |     #include "wx/textctrl.h" | ||||||
|     #include "wx/textentry.h" |     #include "wx/textentry.h" | ||||||
|  |     #include "wx/timer.h" | ||||||
|     #include "wx/window.h" |     #include "wx/window.h" | ||||||
| #endif // WX_PRECOMP | #endif // WX_PRECOMP | ||||||
|  |  | ||||||
| @@ -364,3 +368,122 @@ void TextEntryTestCase::UndoRedo() | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #if wxUSE_UIACTIONSIMULATOR | ||||||
|  |  | ||||||
|  | namespace | ||||||
|  | { | ||||||
|  |  | ||||||
|  | enum ProcessEnter | ||||||
|  | { | ||||||
|  |     ProcessEnter_No, | ||||||
|  |     ProcessEnter_ButSkip, | ||||||
|  |     ProcessEnter_WithoutSkipping | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | class TestDialog : public wxDialog | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     explicit TestDialog(TextLikeControlCreator controlCreator, | ||||||
|  |                         ProcessEnter processEnter) | ||||||
|  |         : wxDialog(wxTheApp->GetTopWindow(), wxID_ANY, "Test dialog"), | ||||||
|  |           m_control((*controlCreator)(this, | ||||||
|  |                                       processEnter == ProcessEnter_No | ||||||
|  |                                         ? 0 | ||||||
|  |                                         : wxTE_PROCESS_ENTER)), | ||||||
|  |           m_processEnter(processEnter), | ||||||
|  |           m_gotEnter(false) | ||||||
|  |     { | ||||||
|  |         // We can't always bind this handler because wx will helpfully | ||||||
|  |         // complain if we bind it without using wxTE_PROCESS_ENTER. | ||||||
|  |         if ( processEnter != ProcessEnter_No ) | ||||||
|  |             m_control->Bind(wxEVT_TEXT_ENTER, &TestDialog::OnTextEnter, this); | ||||||
|  |  | ||||||
|  |         wxSizer* const sizer = new wxBoxSizer(wxVERTICAL); | ||||||
|  |         sizer->Add(m_control, wxSizerFlags().Expand()); | ||||||
|  |         sizer->Add(CreateStdDialogButtonSizer(wxOK)); | ||||||
|  |         SetSizerAndFit(sizer); | ||||||
|  |  | ||||||
|  |         CallAfter(&TestDialog::SimulateEnter); | ||||||
|  |  | ||||||
|  |         m_timer.Bind(wxEVT_TIMER, &TestDialog::OnTimeOut, this); | ||||||
|  |         m_timer.StartOnce(2000); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     bool GotEnter() const { return m_gotEnter; } | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     void OnTextEnter(wxCommandEvent& e) | ||||||
|  |     { | ||||||
|  |         m_gotEnter = true; | ||||||
|  |  | ||||||
|  |         switch ( m_processEnter ) | ||||||
|  |         { | ||||||
|  |             case ProcessEnter_No: | ||||||
|  |                 FAIL("Shouldn't be getting wxEVT_TEXT_ENTER at all"); | ||||||
|  |                 break; | ||||||
|  |  | ||||||
|  |             case ProcessEnter_ButSkip: | ||||||
|  |                 e.Skip(); | ||||||
|  |                 break; | ||||||
|  |  | ||||||
|  |             case ProcessEnter_WithoutSkipping: | ||||||
|  |                 // Close the dialog with a different exit code than what | ||||||
|  |                 // pressing the OK button would have generated. | ||||||
|  |                 EndModal(wxID_APPLY); | ||||||
|  |                 break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void OnTimeOut(wxTimerEvent&) | ||||||
|  |     { | ||||||
|  |         EndModal(wxID_CANCEL); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void SimulateEnter() | ||||||
|  |     { | ||||||
|  |         wxUIActionSimulator sim; | ||||||
|  |         m_control->SetFocus(); | ||||||
|  |         sim.Char(WXK_RETURN); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     wxControl* const m_control; | ||||||
|  |     const ProcessEnter m_processEnter; | ||||||
|  |     wxTimer m_timer; | ||||||
|  |     bool m_gotEnter; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | } // anonymous namespace | ||||||
|  |  | ||||||
|  | void TestProcessEnter(TextLikeControlCreator controlCreator) | ||||||
|  | { | ||||||
|  |     SECTION("Without wxTE_PROCESS_ENTER") | ||||||
|  |     { | ||||||
|  |         TestDialog dlg(controlCreator, ProcessEnter_No); | ||||||
|  |         REQUIRE( dlg.ShowModal() == wxID_OK ); | ||||||
|  |         CHECK( !dlg.GotEnter() ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SECTION("With wxTE_PROCESS_ENTER but skipping") | ||||||
|  |     { | ||||||
|  |         TestDialog dlgProcessEnter(controlCreator, ProcessEnter_ButSkip); | ||||||
|  |         REQUIRE( dlgProcessEnter.ShowModal() == wxID_OK ); | ||||||
|  |         CHECK( dlgProcessEnter.GotEnter() ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SECTION("With wxTE_PROCESS_ENTER without skipping") | ||||||
|  |     { | ||||||
|  |         TestDialog dlgProcessEnter(controlCreator, ProcessEnter_WithoutSkipping); | ||||||
|  |         REQUIRE( dlgProcessEnter.ShowModal() == wxID_APPLY ); | ||||||
|  |         CHECK( dlgProcessEnter.GotEnter() ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #else // !wxUSE_UIACTIONSIMULATOR | ||||||
|  |  | ||||||
|  | void TestProcessEnter(TextLikeControlCreator WXUNUSED(controlCreator)) | ||||||
|  | { | ||||||
|  |     WARN("Skipping wxTE_PROCESS_ENTER tests: wxUIActionSimulator not available"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #endif // wxUSE_UIACTIONSIMULATOR/!wxUSE_UIACTIONSIMULATOR | ||||||
|   | |||||||
| @@ -75,4 +75,11 @@ private: | |||||||
|     wxDECLARE_NO_COPY_CLASS(TextEntryTestCase); |     wxDECLARE_NO_COPY_CLASS(TextEntryTestCase); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | // Function to call to test that wxTE_PROCESS_ENTER is handled correctly for | ||||||
|  | // the controls of the type created by the given creator function when they're | ||||||
|  | // placed in a dialog with a default button. | ||||||
|  | typedef wxControl* (*TextLikeControlCreator)(wxWindow* parent, int style); | ||||||
|  |  | ||||||
|  | void TestProcessEnter(TextLikeControlCreator controlCreator); | ||||||
|  |  | ||||||
| #endif // _WX_TESTS_CONTROLS_TEXTENTRYTEST_H_ | #endif // _WX_TESTS_CONTROLS_TEXTENTRYTEST_H_ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user