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 | ||||
| } | ||||
|  | ||||
| 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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -10,8 +10,12 @@ | ||||
|  | ||||
| #ifndef WX_PRECOMP | ||||
|     #include "wx/app.h" | ||||
|     #include "wx/dialog.h" | ||||
|     #include "wx/event.h" | ||||
|     #include "wx/sizer.h" | ||||
|     #include "wx/textctrl.h" | ||||
|     #include "wx/textentry.h" | ||||
|     #include "wx/timer.h" | ||||
|     #include "wx/window.h" | ||||
| #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); | ||||
| }; | ||||
|  | ||||
| // 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_ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user