Add another test for the insertion point position after SetValue().
[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 wxTestableFrame* frame = wxStaticCast(wxTheApp->GetTopWindow(),
45 wxTestableFrame);
46
47 EventCounter count(GetTestWindow(), wxEVT_COMMAND_TEXT_UPDATED);
48
49 wxTextEntry * const entry = GetTestEntry();
50
51 // notice that SetValue() generates an event even if the text didn't change
52 entry->SetValue("");
53 CPPUNIT_ASSERT_EQUAL( 1, frame->GetEventCount() );
54
55 entry->SetValue("foo");
56 CPPUNIT_ASSERT_EQUAL( 1, frame->GetEventCount() );
57
58 entry->SetValue("foo");
59 CPPUNIT_ASSERT_EQUAL( 1, frame->GetEventCount() );
60
61 entry->ChangeValue("bar");
62 CPPUNIT_ASSERT_EQUAL( 0, frame->GetEventCount() );
63
64 entry->AppendText("bar");
65 CPPUNIT_ASSERT_EQUAL( 1, frame->GetEventCount() );
66
67 entry->Replace(3, 6, "baz");
68 CPPUNIT_ASSERT_EQUAL( 1, frame->GetEventCount() );
69
70 entry->Remove(0, 3);
71 CPPUNIT_ASSERT_EQUAL( 1, frame->GetEventCount() );
72
73 entry->WriteText("foo");
74 CPPUNIT_ASSERT_EQUAL( 1, frame->GetEventCount() );
75
76 entry->Clear();
77 CPPUNIT_ASSERT_EQUAL( 1, frame->GetEventCount() );
78 }
79
80 void TextEntryTestCase::CheckStringSelection(const char *sel)
81 {
82 CPPUNIT_ASSERT_EQUAL( sel, GetTestEntry()->GetStringSelection() );
83 }
84
85 void TextEntryTestCase::AssertSelection(int from, int to, const char *sel)
86 {
87 wxTextEntry * const entry = GetTestEntry();
88
89 CPPUNIT_ASSERT( entry->HasSelection() );
90
91 long fromReal,
92 toReal;
93 entry->GetSelection(&fromReal, &toReal);
94 CPPUNIT_ASSERT_EQUAL( from, fromReal );
95 CPPUNIT_ASSERT_EQUAL( to, toReal );
96
97 CPPUNIT_ASSERT_EQUAL( from, entry->GetInsertionPoint() );
98
99 CheckStringSelection(sel);
100 }
101
102 void TextEntryTestCase::Selection()
103 {
104 wxTextEntry * const entry = GetTestEntry();
105
106 entry->SetValue("0123456789");
107
108 entry->SetSelection(2, 4);
109 AssertSelection(2, 4, "23"); // not "234"!
110
111 entry->SetSelection(3, -1);
112 AssertSelection(3, 10, "3456789");
113
114 entry->SelectAll();
115 AssertSelection(0, 10, "0123456789");
116
117 entry->SetSelection(0, 0);
118 CPPUNIT_ASSERT( !entry->HasSelection() );
119 }
120
121 void TextEntryTestCase::InsertionPoint()
122 {
123 wxTextEntry * const entry = GetTestEntry();
124
125 CPPUNIT_ASSERT_EQUAL( 0, entry->GetLastPosition() );
126 CPPUNIT_ASSERT_EQUAL( 0, entry->GetInsertionPoint() );
127
128 entry->SetValue("0"); // should put the insertion point in front
129 CPPUNIT_ASSERT_EQUAL( 1, entry->GetLastPosition() );
130 CPPUNIT_ASSERT_EQUAL( 0, entry->GetInsertionPoint() );
131
132 entry->AppendText("12"); // should update the insertion point position
133 CPPUNIT_ASSERT_EQUAL( 3, entry->GetLastPosition() );
134 CPPUNIT_ASSERT_EQUAL( 3, entry->GetInsertionPoint() );
135
136 entry->SetInsertionPoint(1);
137 CPPUNIT_ASSERT_EQUAL( 3, entry->GetLastPosition() );
138 CPPUNIT_ASSERT_EQUAL( 1, entry->GetInsertionPoint() );
139
140 entry->SetInsertionPointEnd();
141 CPPUNIT_ASSERT_EQUAL( 3, entry->GetInsertionPoint() );
142
143 entry->SetInsertionPoint(0);
144 entry->WriteText("-"); // should move it after the written text
145 CPPUNIT_ASSERT_EQUAL( 4, entry->GetLastPosition() );
146 CPPUNIT_ASSERT_EQUAL( 1, entry->GetInsertionPoint() );
147
148 entry->SetValue("something different"); // should still reset the caret
149 CPPUNIT_ASSERT_EQUAL( 0, entry->GetInsertionPoint() );
150 }
151
152 void TextEntryTestCase::Replace()
153 {
154 wxTextEntry * const entry = GetTestEntry();
155
156 entry->SetValue("Hello replace!"
157 "0123456789012");
158 entry->SetInsertionPoint(0);
159
160 entry->Replace(6, 13, "changed");
161
162 CPPUNIT_ASSERT_EQUAL("Hello changed!"
163 "0123456789012",
164 entry->GetValue());
165 CPPUNIT_ASSERT_EQUAL(13, entry->GetInsertionPoint());
166
167 entry->Replace(13, -1, "");
168 CPPUNIT_ASSERT_EQUAL("Hello changed", entry->GetValue());
169 CPPUNIT_ASSERT_EQUAL(13, entry->GetInsertionPoint());
170
171 entry->Replace(0, 6, "Un");
172 CPPUNIT_ASSERT_EQUAL("Unchanged", entry->GetValue());
173 CPPUNIT_ASSERT_EQUAL(2, entry->GetInsertionPoint());
174 }
175
176 void TextEntryTestCase::Editable()
177 {
178 #if wxUSE_UIACTIONSIMULATOR
179 wxTestableFrame* frame = wxStaticCast(wxTheApp->GetTopWindow(),
180 wxTestableFrame);
181
182 wxTextEntry * const entry = GetTestEntry();
183 wxWindow * const window = GetTestWindow();
184
185 EventCounter count(window, wxEVT_COMMAND_TEXT_UPDATED);
186
187 window->SetFocus();
188 wxYield();
189
190 wxUIActionSimulator sim;
191 sim.Text("abcdef");
192 wxYield();
193
194 CPPUNIT_ASSERT_EQUAL("abcdef", entry->GetValue());
195 CPPUNIT_ASSERT_EQUAL(6, frame->GetEventCount());
196
197 entry->SetEditable(false);
198 sim.Text("gh");
199 wxYield();
200
201 CPPUNIT_ASSERT_EQUAL("abcdef", entry->GetValue());
202 CPPUNIT_ASSERT_EQUAL(0, frame->GetEventCount());
203 #endif
204 }
205
206 void TextEntryTestCase::Hint()
207 {
208 GetTestEntry()->SetHint("This is a hint");
209 CPPUNIT_ASSERT_EQUAL("", GetTestEntry()->GetValue());
210 }
211
212 void TextEntryTestCase::CopyPaste()
213 {
214 #ifndef __WXOSX__
215 wxTextEntry * const entry = GetTestEntry();
216
217 entry->AppendText("sometext");
218 entry->SelectAll();
219
220 if(entry->CanCopy() && entry->CanPaste())
221 {
222 entry->Copy();
223 entry->Clear();
224 CPPUNIT_ASSERT(entry->IsEmpty());
225
226 wxYield();
227
228 entry->Paste();
229 CPPUNIT_ASSERT_EQUAL("sometext", entry->GetValue());
230 }
231 #endif
232 }
233
234 void TextEntryTestCase::UndoRedo()
235 {
236 wxTextEntry * const entry = GetTestEntry();
237
238 entry->AppendText("sometext");
239
240 if(entry->CanUndo())
241 {
242 entry->Undo();
243 CPPUNIT_ASSERT(entry->IsEmpty());
244
245 if(entry->CanRedo())
246 {
247 entry->Redo();
248 CPPUNIT_ASSERT_EQUAL("sometext", entry->GetValue());
249 }
250 }
251 }