]>
Commit | Line | Data |
---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | |
2 | // Name: tests/interactive/input.cpp | |
3 | // Purpose: Miscellaneous tests requiring user input | |
4 | // Author: Francesco Montorsi (extracted from console sample) | |
5 | // Created: 2010-06-21 | |
6 | // Copyright: (c) 2010 wxWidgets team | |
7 | /////////////////////////////////////////////////////////////////////////////// | |
8 | ||
9 | // ============================================================================ | |
10 | // declarations | |
11 | // ============================================================================ | |
12 | ||
13 | // ---------------------------------------------------------------------------- | |
14 | // headers | |
15 | // ---------------------------------------------------------------------------- | |
16 | ||
17 | #include "testprec.h" | |
18 | ||
19 | #ifdef __BORLANDC__ | |
20 | #pragma hdrstop | |
21 | #endif | |
22 | ||
23 | #include "wx/app.h" | |
24 | #include "wx/wxcrt.h" // for wxPuts | |
25 | #include "wx/wxcrtvararg.h" // for wxPrintf | |
26 | ||
27 | // ---------------------------------------------------------------------------- | |
28 | // conditional compilation | |
29 | // ---------------------------------------------------------------------------- | |
30 | ||
31 | #define TEST_SNGLINST | |
32 | #define TEST_FTP | |
33 | #define TEST_INFO_FUNCTIONS | |
34 | #if wxUSE_REGEX | |
35 | #define TEST_REGEX | |
36 | #endif | |
37 | #define TEST_DATETIME | |
38 | ||
39 | // ---------------------------------------------------------------------------- | |
40 | // test class | |
41 | // ---------------------------------------------------------------------------- | |
42 | ||
43 | class InteractiveInputTestCase : public CppUnit::TestCase | |
44 | { | |
45 | public: | |
46 | InteractiveInputTestCase() { } | |
47 | ||
48 | private: | |
49 | CPPUNIT_TEST_SUITE( InteractiveInputTestCase ); | |
50 | CPPUNIT_TEST( TestSingleIstance ); | |
51 | CPPUNIT_TEST( TestFtpInteractive ); | |
52 | CPPUNIT_TEST( TestDiskInfo ); | |
53 | CPPUNIT_TEST( TestRegExInteractive ); | |
54 | CPPUNIT_TEST( TestDateTimeInteractive ); | |
55 | CPPUNIT_TEST_SUITE_END(); | |
56 | ||
57 | void TestSingleIstance(); | |
58 | void TestFtpInteractive(); | |
59 | void TestDiskInfo(); | |
60 | void TestRegExInteractive(); | |
61 | void TestDateTimeInteractive(); | |
62 | ||
63 | wxDECLARE_NO_COPY_CLASS(InteractiveInputTestCase); | |
64 | }; | |
65 | ||
66 | // ---------------------------------------------------------------------------- | |
67 | // CppUnit macros | |
68 | // ---------------------------------------------------------------------------- | |
69 | ||
70 | //CPPUNIT_TEST_SUITE_REGISTRATION( InteractiveInputTestCase ); | |
71 | // do not run this test by default! | |
72 | ||
73 | CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( InteractiveInputTestCase, "InteractiveInputTestCase" ); | |
74 | ||
75 | // ============================================================================ | |
76 | // implementation | |
77 | // ============================================================================ | |
78 | ||
79 | // ---------------------------------------------------------------------------- | |
80 | // misc information functions | |
81 | // ---------------------------------------------------------------------------- | |
82 | ||
83 | #include "wx/utils.h" | |
84 | ||
85 | void InteractiveInputTestCase::TestDiskInfo() | |
86 | { | |
87 | #ifdef TEST_INFO_FUNCTIONS | |
88 | wxPuts(wxT("*** Testing wxGetDiskSpace() ***")); | |
89 | ||
90 | for ( ;; ) | |
91 | { | |
92 | wxChar pathname[128]; | |
93 | wxPrintf(wxT("Enter a directory name (press ENTER or type 'quit' to escape): ")); | |
94 | if ( !wxFgets(pathname, WXSIZEOF(pathname), stdin) ) | |
95 | break; | |
96 | ||
97 | // kill the last '\n' | |
98 | pathname[wxStrlen(pathname) - 1] = 0; | |
99 | ||
100 | if (pathname[0] == '\0' || wxStrcmp(pathname, "quit") == 0) | |
101 | break; | |
102 | ||
103 | wxLongLong total, free; | |
104 | if ( !wxGetDiskSpace(pathname, &total, &free) ) | |
105 | { | |
106 | wxPuts(wxT("ERROR: wxGetDiskSpace failed.")); | |
107 | } | |
108 | else | |
109 | { | |
110 | wxPrintf(wxT("%sKb total, %sKb free on '%s'.\n"), | |
111 | (total / 1024).ToString().c_str(), | |
112 | (free / 1024).ToString().c_str(), | |
113 | pathname); | |
114 | } | |
115 | ||
116 | wxPuts("\n"); | |
117 | } | |
118 | ||
119 | wxPuts("\n"); | |
120 | #endif // TEST_INFO_FUNCTIONS | |
121 | } | |
122 | ||
123 | ||
124 | // ---------------------------------------------------------------------------- | |
125 | // regular expressions | |
126 | // ---------------------------------------------------------------------------- | |
127 | ||
128 | #include "wx/regex.h" | |
129 | ||
130 | void InteractiveInputTestCase::TestRegExInteractive() | |
131 | { | |
132 | #ifdef TEST_REGEX | |
133 | wxPuts(wxT("*** Testing RE interactively ***")); | |
134 | ||
135 | for ( ;; ) | |
136 | { | |
137 | wxChar pattern[128]; | |
138 | wxPrintf(wxT("Enter a pattern (press ENTER or type 'quit' to escape): ")); | |
139 | if ( !wxFgets(pattern, WXSIZEOF(pattern), stdin) ) | |
140 | break; | |
141 | ||
142 | // kill the last '\n' | |
143 | pattern[wxStrlen(pattern) - 1] = 0; | |
144 | ||
145 | if (pattern[0] == '\0' || wxStrcmp(pattern, "quit") == 0) | |
146 | break; | |
147 | ||
148 | wxRegEx re; | |
149 | if ( !re.Compile(pattern) ) | |
150 | { | |
151 | continue; | |
152 | } | |
153 | ||
154 | wxChar text[128]; | |
155 | for ( ;; ) | |
156 | { | |
157 | wxPrintf(wxT("Enter text to match: ")); | |
158 | if ( !wxFgets(text, WXSIZEOF(text), stdin) ) | |
159 | break; | |
160 | ||
161 | // kill the last '\n' | |
162 | text[wxStrlen(text) - 1] = 0; | |
163 | ||
164 | if ( !re.Matches(text) ) | |
165 | { | |
166 | wxPrintf(wxT("No match.\n")); | |
167 | } | |
168 | else | |
169 | { | |
170 | wxPrintf(wxT("Pattern matches at '%s'\n"), re.GetMatch(text).c_str()); | |
171 | ||
172 | size_t start, len; | |
173 | for ( size_t n = 1; ; n++ ) | |
174 | { | |
175 | if ( !re.GetMatch(&start, &len, n) ) | |
176 | { | |
177 | break; | |
178 | } | |
179 | ||
180 | wxPrintf(wxT("Subexpr %u matched '%s'\n"), | |
181 | n, wxString(text + start, len).c_str()); | |
182 | } | |
183 | } | |
184 | } | |
185 | ||
186 | wxPuts("\n"); | |
187 | } | |
188 | #endif // TEST_REGEX | |
189 | } | |
190 | ||
191 | ||
192 | // ---------------------------------------------------------------------------- | |
193 | // FTP | |
194 | // ---------------------------------------------------------------------------- | |
195 | ||
196 | #include "wx/protocol/ftp.h" | |
197 | #include "wx/protocol/log.h" | |
198 | ||
199 | #define FTP_ANONYMOUS | |
200 | #ifdef FTP_ANONYMOUS | |
201 | static const wxChar *hostname = wxT("ftp.wxwidgets.org"); | |
202 | #else | |
203 | static const wxChar *hostname = "localhost"; | |
204 | #endif | |
205 | ||
206 | void InteractiveInputTestCase::TestFtpInteractive() | |
207 | { | |
208 | #ifdef TEST_FTP | |
209 | wxFTP ftp; | |
210 | ||
211 | wxPuts(wxT("\n*** Interactive wxFTP test ***")); | |
212 | ||
213 | #ifdef FTP_ANONYMOUS | |
214 | wxPrintf(wxT("--- Attempting to connect to %s:21 anonymously...\n"), hostname); | |
215 | #else // !FTP_ANONYMOUS | |
216 | wxChar user[256]; | |
217 | wxFgets(user, WXSIZEOF(user), stdin); | |
218 | user[wxStrlen(user) - 1] = '\0'; // chop off '\n' | |
219 | ftp.SetUser(user); | |
220 | ||
221 | wxChar password[256]; | |
222 | wxPrintf(wxT("Password for %s: "), password); | |
223 | wxFgets(password, WXSIZEOF(password), stdin); | |
224 | password[wxStrlen(password) - 1] = '\0'; // chop off '\n' | |
225 | ftp.SetPassword(password); | |
226 | ||
227 | wxPrintf(wxT("--- Attempting to connect to %s:21 as %s...\n"), hostname, user); | |
228 | #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS | |
229 | ||
230 | if ( !ftp.Connect(hostname) ) | |
231 | { | |
232 | wxPrintf(wxT("ERROR: failed to connect to %s\n"), hostname); | |
233 | ||
234 | return; | |
235 | } | |
236 | else | |
237 | { | |
238 | wxPrintf(wxT("--- Connected to %s, current directory is '%s'\n"), | |
239 | hostname, ftp.Pwd().c_str()); | |
240 | } | |
241 | ||
242 | wxChar buf[128]; | |
243 | for ( ;; ) | |
244 | { | |
245 | wxPrintf(wxT("Enter FTP command (press ENTER or type 'quit' to escape): ")); | |
246 | if ( !wxFgets(buf, WXSIZEOF(buf), stdin) ) | |
247 | break; | |
248 | ||
249 | // kill the last '\n' | |
250 | buf[wxStrlen(buf) - 1] = 0; | |
251 | ||
252 | if (buf[0] == '\0' || wxStrcmp(buf, "quit") == 0) | |
253 | break; | |
254 | ||
255 | // special handling of LIST and NLST as they require data connection | |
256 | wxString start(buf, 4); | |
257 | start.MakeUpper(); | |
258 | if ( start == wxT("LIST") || start == wxT("NLST") ) | |
259 | { | |
260 | wxString wildcard; | |
261 | if ( wxStrlen(buf) > 4 ) | |
262 | wildcard = buf + 5; | |
263 | ||
264 | wxArrayString files; | |
265 | if ( !ftp.GetList(files, wildcard, start == wxT("LIST")) ) | |
266 | { | |
267 | wxPrintf(wxT("ERROR: failed to get %s of files\n"), start.c_str()); | |
268 | } | |
269 | else | |
270 | { | |
271 | wxPrintf(wxT("--- %s of '%s' under '%s':\n"), | |
272 | start.c_str(), wildcard.c_str(), ftp.Pwd().c_str()); | |
273 | size_t count = files.GetCount(); | |
274 | for ( size_t n = 0; n < count; n++ ) | |
275 | { | |
276 | wxPrintf(wxT("\t%s\n"), files[n].c_str()); | |
277 | } | |
278 | wxPuts(wxT("--- End of the file list")); | |
279 | } | |
280 | } | |
281 | else // !list | |
282 | { | |
283 | wxChar ch = ftp.SendCommand(buf); | |
284 | wxPrintf(wxT("Command %s"), ch ? wxT("succeeded") : wxT("failed")); | |
285 | if ( ch ) | |
286 | { | |
287 | wxPrintf(wxT(" (return code %c)"), ch); | |
288 | } | |
289 | ||
290 | wxPrintf(wxT(", server reply:\n%s\n\n"), ftp.GetLastResult().c_str()); | |
291 | } | |
292 | } | |
293 | ||
294 | wxPuts(wxT("\n")); | |
295 | #endif // TEST_FTP | |
296 | } | |
297 | ||
298 | // ---------------------------------------------------------------------------- | |
299 | // date time | |
300 | // ---------------------------------------------------------------------------- | |
301 | ||
302 | #include "wx/math.h" | |
303 | #include "wx/datetime.h" | |
304 | ||
305 | void InteractiveInputTestCase::TestDateTimeInteractive() | |
306 | { | |
307 | #ifdef TEST_DATETIME | |
308 | wxPuts(wxT("\n*** interactive wxDateTime tests ***")); | |
309 | ||
310 | wxChar buf[128]; | |
311 | ||
312 | for ( ;; ) | |
313 | { | |
314 | wxPrintf(wxT("Enter a date (press ENTER or type 'quit' to escape): ")); | |
315 | if ( !wxFgets(buf, WXSIZEOF(buf), stdin) ) | |
316 | break; | |
317 | ||
318 | // kill the last '\n' | |
319 | buf[wxStrlen(buf) - 1] = 0; | |
320 | ||
321 | if ( buf[0] == '\0' || wxStrcmp(buf, "quit") == 0 ) | |
322 | break; | |
323 | ||
324 | wxDateTime dt; | |
325 | const wxChar *p = dt.ParseDate(buf); | |
326 | if ( !p ) | |
327 | { | |
328 | wxPrintf(wxT("ERROR: failed to parse the date '%s'.\n"), buf); | |
329 | ||
330 | continue; | |
331 | } | |
332 | else if ( *p ) | |
333 | { | |
334 | wxPrintf(wxT("WARNING: parsed only first %u characters.\n"), p - buf); | |
335 | } | |
336 | ||
337 | wxPrintf(wxT("%s: day %u, week of month %u/%u, week of year %u\n"), | |
338 | dt.Format(wxT("%b %d, %Y")).c_str(), | |
339 | dt.GetDayOfYear(), | |
340 | dt.GetWeekOfMonth(wxDateTime::Monday_First), | |
341 | dt.GetWeekOfMonth(wxDateTime::Sunday_First), | |
342 | dt.GetWeekOfYear(wxDateTime::Monday_First)); | |
343 | } | |
344 | ||
345 | wxPuts("\n"); | |
346 | #endif // TEST_DATETIME | |
347 | } | |
348 | ||
349 | ||
350 | // ---------------------------------------------------------------------------- | |
351 | // single instance | |
352 | // ---------------------------------------------------------------------------- | |
353 | ||
354 | #include "wx/snglinst.h" | |
355 | ||
356 | void InteractiveInputTestCase::TestSingleIstance() | |
357 | { | |
358 | #ifdef TEST_SNGLINST | |
359 | wxPuts(wxT("\n*** Testing wxSingleInstanceChecker ***")); | |
360 | ||
361 | wxSingleInstanceChecker checker; | |
362 | if ( checker.Create(wxT(".wxconsole.lock")) ) | |
363 | { | |
364 | if ( checker.IsAnotherRunning() ) | |
365 | { | |
366 | wxPrintf(wxT("Another instance of the program is running, exiting.\n")); | |
367 | return; | |
368 | } | |
369 | ||
370 | // wait some time to give time to launch another instance | |
371 | wxPuts(wxT("If you try to run another instance of this program now, it won't start.")); | |
372 | wxPrintf(wxT("Press \"Enter\" to exit wxSingleInstanceChecker test and proceed...")); | |
373 | wxFgetc(stdin); | |
374 | } | |
375 | else // failed to create | |
376 | { | |
377 | wxPrintf(wxT("Failed to init wxSingleInstanceChecker.\n")); | |
378 | } | |
379 | ||
380 | wxPuts("\n"); | |
381 | #endif // defined(TEST_SNGLINST) | |
382 | } | |
383 |