Fix test for Windows in the new wxExecute() unit test.
[wxWidgets.git] / tests / controls / textentrytest.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/controls/textentrytest.cpp
3 // Purpose: TestEntryTestCase implementation
4 // Author: Vadim Zeitlin
5 // Created: 2008-09-19 (extracted from textctrltest.cpp)
6 // RCS-ID: $Id$
7 // Copyright: (c) 2007, 2008 Vadim Zeitlin <vadim@wxwidgets.org>
8 ///////////////////////////////////////////////////////////////////////////////
9
10 #include "testprec.h"
11
12 #ifndef WX_PRECOMP
13 #include "wx/app.h"
14 #include "wx/event.h"
15 #include "wx/textentry.h"
16 #include "wx/window.h"
17 #endif // WX_PRECOMP
18
19 #include "textentrytest.h"
20 #include "testableframe.h"
21 #include "wx/uiaction.h"
22
23 void TextEntryTestCase::SetValue()
24 {
25 wxTextEntry * const entry = GetTestEntry();
26
27 CPPUNIT_ASSERT( entry->IsEmpty() );
28
29 entry->SetValue("foo");
30 CPPUNIT_ASSERT_EQUAL( "foo", entry->GetValue() );
31
32 entry->SetValue("");
33 CPPUNIT_ASSERT( entry->IsEmpty() );
34
35 entry->SetValue("hi");
36 CPPUNIT_ASSERT_EQUAL( "hi", entry->GetValue() );
37
38 entry->SetValue("bye");
39 CPPUNIT_ASSERT_EQUAL( "bye", entry->GetValue() );
40 }
41
42 void TextEntryTestCase::TextChangeEvents()
43 {
44 EventCounter updated(GetTestWindow(), wxEVT_TEXT);
45
46 wxTextEntry * const entry = GetTestEntry();
47
48 // notice that SetValue() generates an event even if the text didn't change
49 entry->SetValue("");
50 CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
51 updated.Clear();
52
53 entry->SetValue("foo");
54 CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
55 updated.Clear();
56
57 entry->SetValue("foo");
58 CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
59 updated.Clear();
60
61 entry->ChangeValue("bar");
62 CPPUNIT_ASSERT_EQUAL( 0, updated.GetCount() );
63
64 entry->AppendText("bar");
65 CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
66 updated.Clear();
67
68 entry->Replace(3, 6, "baz");
69 CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
70 updated.Clear();
71
72 entry->Remove(0, 3);
73 CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
74 updated.Clear();
75
76 entry->WriteText("foo");
77 CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
78 updated.Clear();
79
80 entry->Clear();
81 CPPUNIT_ASSERT_EQUAL( 1, updated.GetCount() );
82 updated.Clear();
83 }
84
85 void TextEntryTestCase::CheckStringSelection(const char *sel)
86 {
87 CPPUNIT_ASSERT_EQUAL( sel, GetTestEntry()->GetStringSelection() );
88 }
89
90 void TextEntryTestCase::AssertSelection(int from, int to, const char *sel)
91 {
92 wxTextEntry * const entry = GetTestEntry();
93
94 CPPUNIT_ASSERT( entry->HasSelection() );
95
96 long fromReal,
97 toReal;
98 entry->GetSelection(&fromReal, &toReal);
99 CPPUNIT_ASSERT_EQUAL( from, fromReal );
100 CPPUNIT_ASSERT_EQUAL( to, toReal );
101
102 CPPUNIT_ASSERT_EQUAL( from, entry->GetInsertionPoint() );
103
104 CheckStringSelection(sel);
105 }
106
107 void TextEntryTestCase::Selection()
108 {
109 wxTextEntry * const entry = GetTestEntry();
110
111 entry->SetValue("0123456789");
112
113 entry->SetSelection(2, 4);
114 AssertSelection(2, 4, "23"); // not "234"!
115
116 entry->SetSelection(3, -1);
117 AssertSelection(3, 10, "3456789");
118
119 entry->SelectAll();
120 AssertSelection(0, 10, "0123456789");
121
122 entry->SetSelection(0, 0);
123 CPPUNIT_ASSERT( !entry->HasSelection() );
124 }
125
126 void TextEntryTestCase::InsertionPoint()
127 {
128 wxTextEntry * const entry = GetTestEntry();
129
130 CPPUNIT_ASSERT_EQUAL( 0, entry->GetLastPosition() );
131 CPPUNIT_ASSERT_EQUAL( 0, entry->GetInsertionPoint() );
132
133 entry->SetValue("0"); // should put the insertion point in front
134 CPPUNIT_ASSERT_EQUAL( 1, entry->GetLastPosition() );
135 CPPUNIT_ASSERT_EQUAL( 0, entry->GetInsertionPoint() );
136
137 entry->AppendText("12"); // should update the insertion point position
138 CPPUNIT_ASSERT_EQUAL( 3, entry->GetLastPosition() );
139 CPPUNIT_ASSERT_EQUAL( 3, entry->GetInsertionPoint() );
140
141 entry->SetInsertionPoint(1);
142 CPPUNIT_ASSERT_EQUAL( 3, entry->GetLastPosition() );
143 CPPUNIT_ASSERT_EQUAL( 1, entry->GetInsertionPoint() );
144
145 entry->SetInsertionPointEnd();
146 CPPUNIT_ASSERT_EQUAL( 3, entry->GetInsertionPoint() );
147
148 entry->SetInsertionPoint(0);
149 entry->WriteText("-"); // should move it after the written text
150 CPPUNIT_ASSERT_EQUAL( 4, entry->GetLastPosition() );
151 CPPUNIT_ASSERT_EQUAL( 1, entry->GetInsertionPoint() );
152
153 entry->SetValue("something different"); // should still reset the caret
154 CPPUNIT_ASSERT_EQUAL( 0, entry->GetInsertionPoint() );
155 }
156
157 void TextEntryTestCase::Replace()
158 {
159 wxTextEntry * const entry = GetTestEntry();
160
161 entry->SetValue("Hello replace!"
162 "0123456789012");
163 entry->SetInsertionPoint(0);
164
165 entry->Replace(6, 13, "changed");
166
167 CPPUNIT_ASSERT_EQUAL("Hello changed!"
168 "0123456789012",
169 entry->GetValue());
170 CPPUNIT_ASSERT_EQUAL(13, entry->GetInsertionPoint());
171
172 entry->Replace(13, -1, "");
173 CPPUNIT_ASSERT_EQUAL("Hello changed", entry->GetValue());
174 CPPUNIT_ASSERT_EQUAL(13, entry->GetInsertionPoint());
175
176 entry->Replace(0, 6, "Un");
177 CPPUNIT_ASSERT_EQUAL("Unchanged", entry->GetValue());
178 CPPUNIT_ASSERT_EQUAL(2, entry->GetInsertionPoint());
179 }
180
181 void TextEntryTestCase::Editable()
182 {
183 #if wxUSE_UIACTIONSIMULATOR
184
185 #ifdef __WXGTK__
186 // FIXME: For some reason this test regularly (although not always) fails
187 // in wxGTK build bot builds when testing wxBitmapComboBox, but I
188 // can't reproduce the failure locally. For now, disable this check
189 // to let the entire test suite pass in automatic tests instead of
190 // failing sporadically.
191 if ( wxStrcmp(GetTestWindow()->GetClassInfo()->GetClassName(),
192 "wxBitmapComboBox") == 0 &&
193 IsAutomaticTest() )
194 {
195 return;
196 }
197 #endif // __WGTK__
198
199 wxTextEntry * const entry = GetTestEntry();
200 wxWindow * const window = GetTestWindow();
201
202 EventCounter updated(window, wxEVT_TEXT);
203
204 window->SetFocus();
205 wxYield();
206
207 wxUIActionSimulator sim;
208 sim.Text("abcdef");
209 wxYield();
210
211 CPPUNIT_ASSERT_EQUAL("abcdef", entry->GetValue());
212 CPPUNIT_ASSERT_EQUAL(6, updated.GetCount());
213
214 updated.Clear();
215
216 entry->SetEditable(false);
217 sim.Text("gh");
218 wxYield();
219
220 CPPUNIT_ASSERT_EQUAL("abcdef", entry->GetValue());
221 CPPUNIT_ASSERT_EQUAL(0, updated.GetCount());
222 #endif
223 }
224
225 void TextEntryTestCase::Hint()
226 {
227 GetTestEntry()->SetHint("This is a hint");
228 CPPUNIT_ASSERT_EQUAL("", GetTestEntry()->GetValue());
229 }
230
231 void TextEntryTestCase::CopyPaste()
232 {
233 #ifndef __WXOSX__
234 wxTextEntry * const entry = GetTestEntry();
235
236 entry->AppendText("sometext");
237 entry->SelectAll();
238
239 if(entry->CanCopy() && entry->CanPaste())
240 {
241 entry->Copy();
242 entry->Clear();
243 CPPUNIT_ASSERT(entry->IsEmpty());
244
245 wxYield();
246
247 entry->Paste();
248 CPPUNIT_ASSERT_EQUAL("sometext", entry->GetValue());
249 }
250 #endif
251 }
252
253 void TextEntryTestCase::UndoRedo()
254 {
255 wxTextEntry * const entry = GetTestEntry();
256
257 entry->AppendText("sometext");
258
259 if(entry->CanUndo())
260 {
261 entry->Undo();
262 CPPUNIT_ASSERT(entry->IsEmpty());
263
264 if(entry->CanRedo())
265 {
266 entry->Redo();
267 CPPUNIT_ASSERT_EQUAL("sometext", entry->GetValue());
268 }
269 }
270 }