]>
Commit | Line | Data |
---|---|---|
c0d9b217 VZ |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: tests/textctrl/textctrltest.cpp | |
3 | // Purpose: wxTextCtrl unit test | |
4 | // Author: Vadim Zeitlin | |
5 | // Created: 2007-09-25 | |
6 | // RCS-ID: $Id$ | |
7 | // Copyright: (c) 2007 Vadim Zeitlin <vadim@wxwidgets.org> | |
8 | /////////////////////////////////////////////////////////////////////////////// | |
9 | ||
10 | // ---------------------------------------------------------------------------- | |
11 | // headers | |
12 | // ---------------------------------------------------------------------------- | |
13 | ||
14 | #include "testprec.h" | |
15 | ||
16 | #ifdef __BORLANDC__ | |
17 | #pragma hdrstop | |
18 | #endif | |
19 | ||
20 | #ifndef WX_PRECOMP | |
21 | #include "wx/app.h" | |
22 | #include "wx/textctrl.h" | |
23 | #endif // WX_PRECOMP | |
24 | ||
25 | // ---------------------------------------------------------------------------- | |
26 | // test class | |
27 | // ---------------------------------------------------------------------------- | |
28 | ||
29 | class TextCtrlTestCase : public CppUnit::TestCase | |
30 | { | |
31 | public: | |
32 | TextCtrlTestCase() { } | |
33 | ||
34 | virtual void setUp(); | |
35 | virtual void tearDown(); | |
36 | ||
37 | private: | |
38 | CPPUNIT_TEST_SUITE( TextCtrlTestCase ); | |
39 | CPPUNIT_TEST( SetValue ); | |
40 | CPPUNIT_TEST( TextChangeEvents ); | |
b2b0bee6 | 41 | CPPUNIT_TEST( Selection ); |
5166d04e | 42 | CPPUNIT_TEST( InsertionPoint ); |
c0d9b217 VZ |
43 | CPPUNIT_TEST_SUITE_END(); |
44 | ||
45 | void SetValue(); | |
46 | void TextChangeEvents(); | |
b2b0bee6 | 47 | void Selection(); |
5166d04e | 48 | void InsertionPoint(); |
b2b0bee6 VZ |
49 | |
50 | // Selection() test helper: verify that selection is as described by the | |
51 | // function parameters | |
52 | void AssertSelection(int from, int to, const char *sel); | |
c0d9b217 VZ |
53 | |
54 | wxTextCtrl *m_text; | |
55 | wxFrame *m_frame; | |
56 | ||
57 | DECLARE_NO_COPY_CLASS(TextCtrlTestCase) | |
58 | }; | |
59 | ||
60 | // register in the unnamed registry so that these tests are run by default | |
61 | CPPUNIT_TEST_SUITE_REGISTRATION( TextCtrlTestCase ); | |
62 | ||
63 | // also include in it's own registry so that these tests can be run alone | |
64 | CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TextCtrlTestCase, "TextCtrlTestCase" ); | |
65 | ||
66 | // ---------------------------------------------------------------------------- | |
67 | // test initialization | |
68 | // ---------------------------------------------------------------------------- | |
69 | ||
70 | void TextCtrlTestCase::setUp() | |
71 | { | |
72 | m_text = new wxTextCtrl(wxTheApp->GetTopWindow(), wxID_ANY); | |
73 | } | |
74 | ||
75 | void TextCtrlTestCase::tearDown() | |
76 | { | |
77 | delete m_text; | |
78 | m_text = NULL; | |
79 | } | |
80 | ||
81 | // ---------------------------------------------------------------------------- | |
82 | // tests themselves | |
83 | // ---------------------------------------------------------------------------- | |
84 | ||
85 | void TextCtrlTestCase::SetValue() | |
86 | { | |
87 | CPPUNIT_ASSERT( m_text->IsEmpty() ); | |
88 | ||
89 | m_text->SetValue("foo"); | |
1de532f5 | 90 | CPPUNIT_ASSERT_EQUAL( "foo", m_text->GetValue() ); |
c0d9b217 VZ |
91 | |
92 | m_text->SetValue(""); | |
93 | CPPUNIT_ASSERT( m_text->IsEmpty() ); | |
94 | ||
95 | m_text->SetValue("hi"); | |
1de532f5 | 96 | CPPUNIT_ASSERT_EQUAL( "hi", m_text->GetValue() ); |
c0d9b217 VZ |
97 | |
98 | m_text->SetValue("bye"); | |
1de532f5 | 99 | CPPUNIT_ASSERT_EQUAL( "bye", m_text->GetValue() ); |
c0d9b217 VZ |
100 | } |
101 | ||
102 | void TextCtrlTestCase::TextChangeEvents() | |
103 | { | |
104 | class TextTestEventHandler : public wxEvtHandler | |
105 | { | |
106 | public: | |
107 | TextTestEventHandler() { m_events = 0; } | |
108 | ||
109 | // calling this automatically resets the events counter | |
110 | int GetEvents() | |
111 | { | |
112 | const int events = m_events; | |
113 | m_events = 0; | |
114 | return events; | |
115 | } | |
116 | ||
117 | void OnText(wxCommandEvent& WXUNUSED(event)) { m_events++; } | |
118 | ||
119 | private: | |
120 | int m_events; | |
121 | } handler; | |
122 | ||
123 | m_text->Connect(wxEVT_COMMAND_TEXT_UPDATED, | |
124 | wxCommandEventHandler(TextTestEventHandler::OnText), | |
125 | NULL, | |
126 | &handler); | |
127 | ||
128 | // notice that SetValue() generates an event even if the text didn't change | |
129 | m_text->SetValue(""); | |
130 | CPPUNIT_ASSERT_EQUAL( 1, handler.GetEvents() ); | |
131 | ||
132 | m_text->SetValue("foo"); | |
133 | CPPUNIT_ASSERT_EQUAL( 1, handler.GetEvents() ); | |
134 | ||
135 | m_text->SetValue("foo"); | |
136 | CPPUNIT_ASSERT_EQUAL( 1, handler.GetEvents() ); | |
137 | ||
138 | m_text->ChangeValue("bar"); | |
139 | CPPUNIT_ASSERT_EQUAL( 0, handler.GetEvents() ); | |
140 | ||
141 | m_text->AppendText("bar"); | |
142 | CPPUNIT_ASSERT_EQUAL( 1, handler.GetEvents() ); | |
143 | ||
144 | m_text->Replace(3, 6, "baz"); | |
145 | CPPUNIT_ASSERT_EQUAL( 1, handler.GetEvents() ); | |
146 | ||
147 | m_text->Remove(0, 3); | |
148 | CPPUNIT_ASSERT_EQUAL( 1, handler.GetEvents() ); | |
149 | ||
150 | m_text->WriteText("foo"); | |
151 | CPPUNIT_ASSERT_EQUAL( 1, handler.GetEvents() ); | |
152 | ||
153 | m_text->Clear(); | |
154 | CPPUNIT_ASSERT_EQUAL( 1, handler.GetEvents() ); | |
155 | } | |
156 | ||
b2b0bee6 VZ |
157 | void TextCtrlTestCase::AssertSelection(int from, int to, const char *sel) |
158 | { | |
159 | CPPUNIT_ASSERT( m_text->HasSelection() ); | |
160 | ||
161 | long fromReal, | |
162 | toReal; | |
163 | m_text->GetSelection(&fromReal, &toReal); | |
164 | CPPUNIT_ASSERT_EQUAL( from, fromReal ); | |
165 | CPPUNIT_ASSERT_EQUAL( to, toReal ); | |
166 | CPPUNIT_ASSERT_EQUAL( sel, m_text->GetStringSelection() ); | |
167 | ||
168 | CPPUNIT_ASSERT_EQUAL( from, m_text->GetInsertionPoint() ); | |
169 | } | |
170 | ||
171 | void TextCtrlTestCase::Selection() | |
172 | { | |
173 | m_text->SetValue("0123456789"); | |
174 | ||
175 | m_text->SetSelection(2, 4); | |
176 | AssertSelection(2, 4, "23"); // not "234"! | |
177 | ||
178 | m_text->SetSelection(3, -1); | |
179 | AssertSelection(3, 10, "3456789"); | |
180 | ||
181 | m_text->SelectAll(); | |
182 | AssertSelection(0, 10, "0123456789"); | |
183 | ||
184 | m_text->SetSelection(0, 0); | |
185 | CPPUNIT_ASSERT( !m_text->HasSelection() ); | |
186 | } | |
5166d04e VZ |
187 | |
188 | void TextCtrlTestCase::InsertionPoint() | |
189 | { | |
190 | CPPUNIT_ASSERT_EQUAL( 0, m_text->GetLastPosition() ); | |
191 | CPPUNIT_ASSERT_EQUAL( 0, m_text->GetInsertionPoint() ); | |
192 | ||
193 | m_text->SetValue("0"); // should put the insertion point in front | |
194 | CPPUNIT_ASSERT_EQUAL( 1, m_text->GetLastPosition() ); | |
195 | CPPUNIT_ASSERT_EQUAL( 0, m_text->GetInsertionPoint() ); | |
196 | ||
197 | m_text->AppendText("12"); // should update the insertion point position | |
198 | CPPUNIT_ASSERT_EQUAL( 3, m_text->GetLastPosition() ); | |
199 | CPPUNIT_ASSERT_EQUAL( 3, m_text->GetInsertionPoint() ); | |
200 | ||
201 | m_text->SetInsertionPoint(1); | |
202 | CPPUNIT_ASSERT_EQUAL( 3, m_text->GetLastPosition() ); | |
203 | CPPUNIT_ASSERT_EQUAL( 1, m_text->GetInsertionPoint() ); | |
204 | ||
205 | m_text->SetInsertionPointEnd(); | |
206 | CPPUNIT_ASSERT_EQUAL( 3, m_text->GetInsertionPoint() ); | |
207 | ||
208 | m_text->SetInsertionPoint(0); | |
209 | m_text->WriteText("-"); // should move it after the written text | |
210 | CPPUNIT_ASSERT_EQUAL( 4, m_text->GetLastPosition() ); | |
211 | CPPUNIT_ASSERT_EQUAL( 1, m_text->GetInsertionPoint() ); | |
212 | } | |
213 |