]> git.saurik.com Git - wxWidgets.git/blame - samples/console/console.cpp
Small changes
[wxWidgets.git] / samples / console / console.cpp
CommitLineData
37667812
VZ
1/////////////////////////////////////////////////////////////////////////////
2// Name: samples/console/console.cpp
3// Purpose: a sample console (as opposed to GUI) progam using wxWindows
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 04.10.99
7// RCS-ID: $Id$
8// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9// Licence: wxWindows license
10/////////////////////////////////////////////////////////////////////////////
11
e87271f3
VZ
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
37667812
VZ
20#include <stdio.h>
21
22#include <wx/string.h>
bbfa0322 23#include <wx/file.h>
37667812 24#include <wx/app.h>
e87271f3
VZ
25
26// ----------------------------------------------------------------------------
27// conditional compilation
28// ----------------------------------------------------------------------------
29
30// what to test?
378b05f7
VZ
31
32//#define TEST_ARRAYS
211c2250 33//#define TEST_DIR
b568d04f 34//#define TEST_LOG
2ea24d9f 35#define TEST_LONGLONG
1944c6bd 36//#define TEST_MIME
9fc3ad34 37//#define TEST_STRINGS
696e1ea0 38//#define TEST_THREADS
2ea24d9f 39//#define TEST_TIME
e87271f3
VZ
40
41// ============================================================================
42// implementation
43// ============================================================================
44
1944c6bd
VZ
45// ----------------------------------------------------------------------------
46// wxDir
47// ----------------------------------------------------------------------------
48
49#ifdef TEST_DIR
50
51#include <wx/dir.h>
52
53static void TestDirEnumHelper(wxDir& dir,
54 int flags = wxDIR_DEFAULT,
55 const wxString& filespec = wxEmptyString)
56{
57 wxString filename;
58
59 if ( !dir.IsOpened() )
60 return;
61
62 bool cont = dir.GetFirst(&filename, filespec, flags);
63 while ( cont )
64 {
65 printf("\t%s\n", filename.c_str());
66
67 cont = dir.GetNext(&filename);
68 }
69
70 puts("");
71}
72
73static void TestDirEnum()
74{
75 wxDir dir(wxGetCwd());
76
77 puts("Enumerating everything in current directory:");
78 TestDirEnumHelper(dir);
79
80 puts("Enumerating really everything in current directory:");
81 TestDirEnumHelper(dir, wxDIR_DEFAULT | wxDIR_DOTDOT);
82
83 puts("Enumerating object files in current directory:");
84 TestDirEnumHelper(dir, wxDIR_DEFAULT, "*.o");
85
86 puts("Enumerating directories in current directory:");
87 TestDirEnumHelper(dir, wxDIR_DIRS);
88
89 puts("Enumerating files in current directory:");
90 TestDirEnumHelper(dir, wxDIR_FILES);
91
92 puts("Enumerating files including hidden in current directory:");
93 TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN);
94
95#ifdef __UNIX__
96 dir.Open("/");
97#elif defined(__WXMSW__)
98 dir.Open("c:\\");
99#else
100 #error "don't know where the root directory is"
101#endif
102
103 puts("Enumerating everything in root directory:");
104 TestDirEnumHelper(dir, wxDIR_DEFAULT);
105
106 puts("Enumerating directories in root directory:");
107 TestDirEnumHelper(dir, wxDIR_DIRS);
108
109 puts("Enumerating files in root directory:");
110 TestDirEnumHelper(dir, wxDIR_FILES);
111
112 puts("Enumerating files including hidden in root directory:");
113 TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN);
114
115 puts("Enumerating files in non existing directory:");
116 wxDir dirNo("nosuchdir");
117 TestDirEnumHelper(dirNo);
118}
119
120#endif // TEST_DIR
121
696e1ea0
VZ
122// ----------------------------------------------------------------------------
123// MIME types
124// ----------------------------------------------------------------------------
125
126#ifdef TEST_MIME
127
128#include <wx/mimetype.h>
129
130static void TestMimeEnum()
131{
132 wxMimeTypesManager mimeTM;
133 wxArrayString mimetypes;
134
135 size_t count = mimeTM.EnumAllFileTypes(mimetypes);
136
137 printf("*** All %u known filetypes: ***\n", count);
138
139 wxArrayString exts;
140 wxString desc;
141
142 for ( size_t n = 0; n < count; n++ )
143 {
144 wxFileType *filetype = mimeTM.GetFileTypeFromMimeType(mimetypes[n]);
145 if ( !filetype )
c61f4f6d 146 {
97e0ceea
VZ
147 printf("nothing known about the filetype '%s'!\n",
148 mimetypes[n].c_str());
696e1ea0 149 continue;
c61f4f6d
VZ
150 }
151
696e1ea0
VZ
152 filetype->GetDescription(&desc);
153 filetype->GetExtensions(exts);
154
299fcbfe
VZ
155 filetype->GetIcon(NULL);
156
696e1ea0
VZ
157 wxString extsAll;
158 for ( size_t e = 0; e < exts.GetCount(); e++ )
159 {
160 if ( e > 0 )
161 extsAll << _T(", ");
162 extsAll += exts[e];
163 }
164
54acce90
VZ
165 printf("\t%s: %s (%s)\n",
166 mimetypes[n].c_str(), desc.c_str(), extsAll.c_str());
696e1ea0
VZ
167 }
168}
169
170#endif // TEST_MIME
171
b76b015e
VZ
172// ----------------------------------------------------------------------------
173// long long
174// ----------------------------------------------------------------------------
175
176#ifdef TEST_LONGLONG
177
178#include <wx/longlong.h>
179#include <wx/timer.h>
180
181static void TestSpeed()
182{
183 static const long max = 100000000;
184 long n;
9fc3ad34 185
b76b015e
VZ
186 {
187 wxStopWatch sw;
188
189 long l = 0;
190 for ( n = 0; n < max; n++ )
191 {
192 l += n;
193 }
194
195 printf("Summing longs took %ld milliseconds.\n", sw.Time());
196 }
197
2ea24d9f 198#if wxUSE_LONGLONG_NATIVE
b76b015e
VZ
199 {
200 wxStopWatch sw;
201
2ea24d9f 202 wxLongLong_t l = 0;
b76b015e
VZ
203 for ( n = 0; n < max; n++ )
204 {
205 l += n;
206 }
207
2ea24d9f 208 printf("Summing wxLongLong_t took %ld milliseconds.\n", sw.Time());
b76b015e 209 }
2ea24d9f 210#endif // wxUSE_LONGLONG_NATIVE
b76b015e
VZ
211
212 {
213 wxStopWatch sw;
214
215 wxLongLong l;
216 for ( n = 0; n < max; n++ )
217 {
218 l += n;
219 }
220
221 printf("Summing wxLongLongs took %ld milliseconds.\n", sw.Time());
222 }
223}
224
225static void TestDivision()
226{
2f02cb89 227 #define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
b76b015e 228
2f02cb89
VZ
229 // seed pseudo random generator
230 //srand((unsigned)time(NULL));
231
2ea24d9f 232 wxLongLong q, r;
2f02cb89
VZ
233 size_t nTested = 0;
234 for ( size_t n = 0; n < 10000; n++ )
235 {
236 // get a random wxLongLong (shifting by 12 the MSB ensures that the
237 // multiplication will not overflow)
238 wxLongLong ll = MAKE_LL((rand() >> 12), rand(), rand(), rand());
239
2ea24d9f
VZ
240 // get a random long (not wxLongLong for now) to divide it with
241 long l = rand();
242 q = ll / l;
243 r = ll % l;
244
245 wxASSERT_MSG( ll == q*l + r, "division failure" );
2f02cb89
VZ
246
247 nTested++;
248 }
249
250 printf("\n*** Tested %u divisions/multiplications: ok\n", nTested);
251
252 #undef MAKE_LL
b76b015e
VZ
253}
254
255#endif // TEST_LONGLONG
256
257// ----------------------------------------------------------------------------
258// date time
259// ----------------------------------------------------------------------------
260
261#ifdef TEST_TIME
262
97e0ceea
VZ
263#include <wx/date.h>
264
b76b015e
VZ
265#include <wx/datetime.h>
266
299fcbfe
VZ
267// the test data
268struct Date
269{
270 wxDateTime::wxDateTime_t day;
271 wxDateTime::Month month;
272 int year;
273 wxDateTime::wxDateTime_t hour, min, sec;
274 double jdn;
211c2250 275 wxDateTime::WeekDay wday;
299fcbfe
VZ
276 time_t gmticks, ticks;
277
278 void Init(const wxDateTime::Tm& tm)
279 {
280 day = tm.mday;
281 month = tm.mon;
282 year = tm.year;
283 hour = tm.hour;
284 min = tm.min;
285 sec = tm.sec;
286 jdn = 0.0;
287 gmticks = ticks = -1;
288 }
289
290 wxDateTime DT() const
291 { return wxDateTime(day, month, year, hour, min, sec); }
292
239446b4
VZ
293 bool SameDay(const wxDateTime::Tm& tm) const
294 {
295 return day == tm.mday && month == tm.mon && year == tm.year;
296 }
297
299fcbfe
VZ
298 wxString Format() const
299 {
300 wxString s;
301 s.Printf("%02d:%02d:%02d %10s %02d, %4d%s",
302 hour, min, sec,
303 wxDateTime::GetMonthName(month).c_str(),
304 day,
305 abs(wxDateTime::ConvertYearToBC(year)),
306 year > 0 ? "AD" : "BC");
307 return s;
308 }
239446b4
VZ
309
310 wxString FormatDate() const
311 {
312 wxString s;
313 s.Printf("%02d-%s-%4d%s",
314 day,
f0f951fa 315 wxDateTime::GetMonthName(month, wxDateTime::Name_Abbr).c_str(),
239446b4
VZ
316 abs(wxDateTime::ConvertYearToBC(year)),
317 year > 0 ? "AD" : "BC");
318 return s;
319 }
299fcbfe
VZ
320};
321
322static const Date testDates[] =
323{
211c2250
VZ
324 { 1, wxDateTime::Jan, 1970, 00, 00, 00, 2440587.5, wxDateTime::Thu, 0, -3600 },
325 { 21, wxDateTime::Jan, 2222, 00, 00, 00, 2532648.5, wxDateTime::Mon, -1, -1 },
326 { 29, wxDateTime::May, 1976, 12, 00, 00, 2442928.0, wxDateTime::Sat, 202219200, 202212000 },
327 { 29, wxDateTime::Feb, 1976, 00, 00, 00, 2442837.5, wxDateTime::Sun, 194400000, 194396400 },
328 { 1, wxDateTime::Jan, 1900, 12, 00, 00, 2415021.0, wxDateTime::Mon, -1, -1 },
329 { 1, wxDateTime::Jan, 1900, 00, 00, 00, 2415020.5, wxDateTime::Mon, -1, -1 },
330 { 15, wxDateTime::Oct, 1582, 00, 00, 00, 2299160.5, wxDateTime::Fri, -1, -1 },
331 { 4, wxDateTime::Oct, 1582, 00, 00, 00, 2299149.5, wxDateTime::Mon, -1, -1 },
332 { 1, wxDateTime::Mar, 1, 00, 00, 00, 1721484.5, wxDateTime::Thu, -1, -1 },
333 { 1, wxDateTime::Jan, 1, 00, 00, 00, 1721425.5, wxDateTime::Mon, -1, -1 },
239446b4
VZ
334 { 31, wxDateTime::Dec, 0, 00, 00, 00, 1721424.5, wxDateTime::Sun, -1, -1 },
335 { 1, wxDateTime::Jan, 0, 00, 00, 00, 1721059.5, wxDateTime::Sat, -1, -1 },
336 { 12, wxDateTime::Aug, -1234, 00, 00, 00, 1270573.5, wxDateTime::Fri, -1, -1 },
337 { 12, wxDateTime::Aug, -4000, 00, 00, 00, 260313.5, wxDateTime::Sat, -1, -1 },
211c2250 338 { 24, wxDateTime::Nov, -4713, 00, 00, 00, -0.5, wxDateTime::Mon, -1, -1 },
299fcbfe
VZ
339};
340
2f02cb89
VZ
341// this test miscellaneous static wxDateTime functions
342static void TestTimeStatic()
343{
344 puts("\n*** wxDateTime static methods test ***");
345
346 // some info about the current date
347 int year = wxDateTime::GetCurrentYear();
348 printf("Current year %d is %sa leap one and has %d days.\n",
349 year,
350 wxDateTime::IsLeapYear(year) ? "" : "not ",
351 wxDateTime::GetNumberOfDays(year));
352
353 wxDateTime::Month month = wxDateTime::GetCurrentMonth();
354 printf("Current month is '%s' ('%s') and it has %d days\n",
f0f951fa 355 wxDateTime::GetMonthName(month, wxDateTime::Name_Abbr).c_str(),
2f02cb89
VZ
356 wxDateTime::GetMonthName(month).c_str(),
357 wxDateTime::GetNumberOfDays(month));
358
359 // leap year logic
fcc3d7cb
VZ
360 static const size_t nYears = 5;
361 static const size_t years[2][nYears] =
2f02cb89
VZ
362 {
363 // first line: the years to test
364 { 1990, 1976, 2000, 2030, 1984, },
365
366 // second line: TRUE if leap, FALSE otherwise
367 { FALSE, TRUE, TRUE, FALSE, TRUE }
368 };
369
370 for ( size_t n = 0; n < nYears; n++ )
371 {
372 int year = years[0][n];
239446b4
VZ
373 bool should = years[1][n] != 0,
374 is = wxDateTime::IsLeapYear(year);
2f02cb89 375
239446b4 376 printf("Year %d is %sa leap year (%s)\n",
2f02cb89 377 year,
239446b4
VZ
378 is ? "" : "not ",
379 should == is ? "ok" : "ERROR");
2f02cb89
VZ
380
381 wxASSERT( should == wxDateTime::IsLeapYear(year) );
382 }
383}
384
385// test constructing wxDateTime objects
386static void TestTimeSet()
387{
388 puts("\n*** wxDateTime construction test ***");
389
299fcbfe
VZ
390 for ( size_t n = 0; n < WXSIZEOF(testDates); n++ )
391 {
392 const Date& d1 = testDates[n];
393 wxDateTime dt = d1.DT();
394
395 Date d2;
396 d2.Init(dt.GetTm());
397
398 wxString s1 = d1.Format(),
399 s2 = d2.Format();
400
401 printf("Date: %s == %s (%s)\n",
402 s1.c_str(), s2.c_str(),
403 s1 == s2 ? "ok" : "ERROR");
404 }
2f02cb89
VZ
405}
406
fcc3d7cb
VZ
407// test time zones stuff
408static void TestTimeZones()
409{
410 puts("\n*** wxDateTime timezone test ***");
411
412 wxDateTime now = wxDateTime::Now();
413
299fcbfe
VZ
414 printf("Current GMT time:\t%s\n", now.Format("%c", wxDateTime::GMT0).c_str());
415 printf("Unix epoch (GMT):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::GMT0).c_str());
416 printf("Unix epoch (EST):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::EST).c_str());
417 printf("Current time in Paris:\t%s\n", now.Format("%c", wxDateTime::CET).c_str());
418 printf(" Moscow:\t%s\n", now.Format("%c", wxDateTime::MSK).c_str());
419 printf(" New York:\t%s\n", now.Format("%c", wxDateTime::EST).c_str());
fcc3d7cb
VZ
420}
421
e6ec579c
VZ
422// test some minimal support for the dates outside the standard range
423static void TestTimeRange()
424{
425 puts("\n*** wxDateTime out-of-standard-range dates test ***");
426
211c2250
VZ
427 static const char *fmt = "%d-%b-%Y %H:%M:%S";
428
1ef54dcf 429 printf("Unix epoch:\t%s\n",
211c2250 430 wxDateTime(2440587.5).Format(fmt).c_str());
1ef54dcf 431 printf("Feb 29, 0: \t%s\n",
211c2250 432 wxDateTime(29, wxDateTime::Feb, 0).Format(fmt).c_str());
e6ec579c 433 printf("JDN 0: \t%s\n",
211c2250 434 wxDateTime(0.0).Format(fmt).c_str());
e6ec579c 435 printf("Jan 1, 1AD:\t%s\n",
211c2250 436 wxDateTime(1, wxDateTime::Jan, 1).Format(fmt).c_str());
e6ec579c 437 printf("May 29, 2099:\t%s\n",
211c2250 438 wxDateTime(29, wxDateTime::May, 2099).Format(fmt).c_str());
e6ec579c
VZ
439}
440
299fcbfe 441static void TestTimeTicks()
e6ec579c 442{
299fcbfe 443 puts("\n*** wxDateTime ticks test ***");
e6ec579c 444
299fcbfe 445 for ( size_t n = 0; n < WXSIZEOF(testDates); n++ )
1ef54dcf 446 {
299fcbfe
VZ
447 const Date& d = testDates[n];
448 if ( d.ticks == -1 )
449 continue;
1ef54dcf 450
299fcbfe
VZ
451 wxDateTime dt = d.DT();
452 long ticks = (dt.GetValue() / 1000).ToLong();
453 printf("Ticks of %s:\t% 10ld", d.Format().c_str(), ticks);
454 if ( ticks == d.ticks )
455 {
456 puts(" (ok)");
457 }
458 else
459 {
460 printf(" (ERROR: should be %ld, delta = %ld)\n",
461 d.ticks, ticks - d.ticks);
462 }
463
464 dt = d.DT().ToTimezone(wxDateTime::GMT0);
465 ticks = (dt.GetValue() / 1000).ToLong();
466 printf("GMtks of %s:\t% 10ld", d.Format().c_str(), ticks);
467 if ( ticks == d.gmticks )
468 {
469 puts(" (ok)");
470 }
471 else
472 {
473 printf(" (ERROR: should be %ld, delta = %ld)\n",
474 d.gmticks, ticks - d.gmticks);
475 }
476 }
477
478 puts("");
479}
480
481// test conversions to JDN &c
482static void TestTimeJDN()
483{
484 puts("\n*** wxDateTime to JDN test ***");
1ef54dcf
VZ
485
486 for ( size_t n = 0; n < WXSIZEOF(testDates); n++ )
487 {
488 const Date& d = testDates[n];
299fcbfe 489 wxDateTime dt(d.day, d.month, d.year, d.hour, d.min, d.sec);
1ef54dcf
VZ
490 double jdn = dt.GetJulianDayNumber();
491
299fcbfe 492 printf("JDN of %s is:\t% 15.6f", d.Format().c_str(), jdn);
1ef54dcf
VZ
493 if ( jdn == d.jdn )
494 {
495 puts(" (ok)");
496 }
497 else
498 {
499 printf(" (ERROR: should be %f, delta = %f)\n",
500 d.jdn, jdn - d.jdn);
501 }
502 }
e6ec579c
VZ
503}
504
211c2250
VZ
505// test week days computation
506static void TestTimeWDays()
507{
508 puts("\n*** wxDateTime weekday test ***");
509
239446b4
VZ
510 // test GetWeekDay()
511 size_t n;
512 for ( n = 0; n < WXSIZEOF(testDates); n++ )
211c2250
VZ
513 {
514 const Date& d = testDates[n];
515 wxDateTime dt(d.day, d.month, d.year, d.hour, d.min, d.sec);
516
517 wxDateTime::WeekDay wday = dt.GetWeekDay();
518 printf("%s is: %s",
519 d.Format().c_str(),
239446b4 520 wxDateTime::GetWeekDayName(wday).c_str());
211c2250
VZ
521 if ( wday == d.wday )
522 {
523 puts(" (ok)");
524 }
525 else
526 {
527 printf(" (ERROR: should be %s)\n",
239446b4
VZ
528 wxDateTime::GetWeekDayName(d.wday).c_str());
529 }
530 }
531
532 puts("");
533
534 // test SetToWeekDay()
535 struct WeekDateTestData
536 {
537 Date date; // the real date (precomputed)
538 int nWeek; // its week index in the month
539 wxDateTime::WeekDay wday; // the weekday
540 wxDateTime::Month month; // the month
541 int year; // and the year
542
543 wxString Format() const
544 {
545 wxString s, which;
546 switch ( nWeek < -1 ? -nWeek : nWeek )
547 {
548 case 1: which = "first"; break;
549 case 2: which = "second"; break;
550 case 3: which = "third"; break;
551 case 4: which = "fourth"; break;
552 case 5: which = "fifth"; break;
553
554 case -1: which = "last"; break;
555 }
556
557 if ( nWeek < -1 )
558 {
559 which += " from end";
560 }
561
562 s.Printf("The %s %s of %s in %d",
563 which.c_str(),
564 wxDateTime::GetWeekDayName(wday).c_str(),
565 wxDateTime::GetMonthName(month).c_str(),
566 year);
567
568 return s;
569 }
570 };
571
572 // the array data was generated by the following python program
573 /*
574from DateTime import *
575from whrandom import *
576from string import *
577
578monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
579wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
580
581week = DateTimeDelta(7)
582
583for n in range(20):
584 year = randint(1900, 2100)
585 month = randint(1, 12)
586 day = randint(1, 28)
587 dt = DateTime(year, month, day)
588 wday = dt.day_of_week
589
590 countFromEnd = choice([-1, 1])
591 weekNum = 0;
592
593 while dt.month is month:
594 dt = dt - countFromEnd * week
595 weekNum = weekNum + countFromEnd
596
597 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'wday': wdayNames[wday] }
97e0ceea 598
239446b4
VZ
599 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)d, "\
600 "wxDateTime::%(wday)s, wxDateTime::%(month)s, %(year)d }," % data
97e0ceea 601 */
239446b4
VZ
602
603 static const WeekDateTestData weekDatesTestData[] =
604 {
605 { { 20, wxDateTime::Mar, 2045 }, 3, wxDateTime::Mon, wxDateTime::Mar, 2045 },
606 { { 5, wxDateTime::Jun, 1985 }, -4, wxDateTime::Wed, wxDateTime::Jun, 1985 },
607 { { 12, wxDateTime::Nov, 1961 }, -3, wxDateTime::Sun, wxDateTime::Nov, 1961 },
608 { { 27, wxDateTime::Feb, 2093 }, -1, wxDateTime::Fri, wxDateTime::Feb, 2093 },
609 { { 4, wxDateTime::Jul, 2070 }, -4, wxDateTime::Fri, wxDateTime::Jul, 2070 },
610 { { 2, wxDateTime::Apr, 1906 }, -5, wxDateTime::Mon, wxDateTime::Apr, 1906 },
611 { { 19, wxDateTime::Jul, 2023 }, -2, wxDateTime::Wed, wxDateTime::Jul, 2023 },
612 { { 5, wxDateTime::May, 1958 }, -4, wxDateTime::Mon, wxDateTime::May, 1958 },
613 { { 11, wxDateTime::Aug, 1900 }, 2, wxDateTime::Sat, wxDateTime::Aug, 1900 },
614 { { 14, wxDateTime::Feb, 1945 }, 2, wxDateTime::Wed, wxDateTime::Feb, 1945 },
615 { { 25, wxDateTime::Jul, 1967 }, -1, wxDateTime::Tue, wxDateTime::Jul, 1967 },
616 { { 9, wxDateTime::May, 1916 }, -4, wxDateTime::Tue, wxDateTime::May, 1916 },
617 { { 20, wxDateTime::Jun, 1927 }, 3, wxDateTime::Mon, wxDateTime::Jun, 1927 },
618 { { 2, wxDateTime::Aug, 2000 }, 1, wxDateTime::Wed, wxDateTime::Aug, 2000 },
619 { { 20, wxDateTime::Apr, 2044 }, 3, wxDateTime::Wed, wxDateTime::Apr, 2044 },
620 { { 20, wxDateTime::Feb, 1932 }, -2, wxDateTime::Sat, wxDateTime::Feb, 1932 },
621 { { 25, wxDateTime::Jul, 2069 }, 4, wxDateTime::Thu, wxDateTime::Jul, 2069 },
622 { { 3, wxDateTime::Apr, 1925 }, 1, wxDateTime::Fri, wxDateTime::Apr, 1925 },
623 { { 21, wxDateTime::Mar, 2093 }, 3, wxDateTime::Sat, wxDateTime::Mar, 2093 },
624 { { 3, wxDateTime::Dec, 2074 }, -5, wxDateTime::Mon, wxDateTime::Dec, 2074 },
625 };
626
627 static const char *fmt = "%d-%b-%Y";
628
629 wxDateTime dt;
630 for ( n = 0; n < WXSIZEOF(weekDatesTestData); n++ )
631 {
632 const WeekDateTestData& wd = weekDatesTestData[n];
633
634 dt.SetToWeekDay(wd.wday, wd.nWeek, wd.month, wd.year);
635
636 printf("%s is %s", wd.Format().c_str(), dt.Format(fmt).c_str());
637
638 const Date& d = wd.date;
639 if ( d.SameDay(dt.GetTm()) )
640 {
641 puts(" (ok)");
642 }
643 else
644 {
645 dt.Set(d.day, d.month, d.year);
646
647 printf(" (ERROR: should be %s)\n", dt.Format(fmt).c_str());
211c2250
VZ
648 }
649 }
650}
651
239446b4
VZ
652// test the computation of (ISO) week numbers
653static void TestTimeWNumber()
654{
655 puts("\n*** wxDateTime week number test ***");
656
657 struct WeekNumberTestData
658 {
659 Date date; // the date
660 wxDateTime::wxDateTime_t week; // the week number
661 wxDateTime::wxDateTime_t dnum; // day number in the year
662 };
663
664 // data generated with the following python script:
665 /*
666from DateTime import *
667from whrandom import *
668from string import *
669
670monthNames = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
671wdayNames = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ]
672
673for n in range(20):
674 year = randint(1900, 2100)
675 month = randint(1, 12)
676 day = randint(1, 28)
677 dt = DateTime(year, month, day)
678 dayNum = dt.day_of_year
679 weekNum = dt.iso_week[1]
680
681 data = { 'day': rjust(`day`, 2), 'month': monthNames[month - 1], 'year': year, 'weekNum': rjust(`weekNum`, 2), 'dayNum': rjust(`dayNum`, 3) }
97e0ceea 682
239446b4
VZ
683 print "{ { %(day)s, wxDateTime::%(month)s, %(year)d }, %(weekNum)s, "\
684 "%(dayNum)s }," % data
685 */
686 static const WeekNumberTestData weekNumberTestDates[] =
687 {
688 { { 2, wxDateTime::Jul, 2093 }, 27, 183 },
689 { { 25, wxDateTime::Jun, 1986 }, 26, 176 },
690 { { 15, wxDateTime::Jun, 2014 }, 24, 166 },
691 { { 20, wxDateTime::Jul, 2018 }, 29, 201 },
692 { { 3, wxDateTime::Aug, 2074 }, 31, 215 },
693 { { 26, wxDateTime::Jul, 2012 }, 30, 208 },
694 { { 4, wxDateTime::Nov, 1915 }, 44, 308 },
695 { { 11, wxDateTime::Feb, 2035 }, 6, 42 },
696 { { 15, wxDateTime::Feb, 1942 }, 7, 46 },
697 { { 5, wxDateTime::Jan, 2087 }, 1, 5 },
698 { { 6, wxDateTime::Nov, 2016 }, 44, 311 },
699 { { 6, wxDateTime::Jun, 2057 }, 23, 157 },
700 { { 25, wxDateTime::Feb, 1976 }, 9, 56 },
701 { { 12, wxDateTime::Jan, 2073 }, 2, 12 },
702 { { 12, wxDateTime::Sep, 2040 }, 37, 256 },
703 { { 15, wxDateTime::Jul, 1931 }, 29, 196 },
704 { { 23, wxDateTime::Mar, 2084 }, 12, 83 },
705 { { 12, wxDateTime::Dec, 1970 }, 50, 346 },
706 { { 6, wxDateTime::Sep, 1996 }, 36, 250 },
707 { { 7, wxDateTime::Jan, 2076 }, 2, 7 },
708 };
709
710 for ( size_t n = 0; n < WXSIZEOF(weekNumberTestDates); n++ )
711 {
712 const WeekNumberTestData& wn = weekNumberTestDates[n];
713 const Date& d = wn.date;
714
715 wxDateTime dt = d.DT();
716
717 wxDateTime::wxDateTime_t week = dt.GetWeekOfYear(),
718 dnum = dt.GetDayOfYear();
719
720 printf("%s: the day number is %d",
721 d.FormatDate().c_str(), dnum);
722 if ( dnum == wn.dnum )
723 {
724 printf(" (ok)");
725 }
726 else
727 {
728 printf(" (ERROR: should be %d)", wn.dnum);
729 }
730
731 printf(", week number is %d", week);
732 if ( week == wn.week )
733 {
734 puts(" (ok)");
735 }
736 else
737 {
738 printf(" (ERROR: should be %d)\n", wn.week);
739 }
740 }
741}
742
743// test DST calculations
744static void TestTimeDST()
745{
746 puts("\n*** wxDateTime DST test ***");
747
748 printf("DST is%s in effect now.\n\n",
749 wxDateTime::Now().IsDST() ? "" : " not");
750
751 // taken from http://www.energy.ca.gov/daylightsaving.html
752 static const Date datesDST[2][2004 - 1900 + 1] =
753 {
754 {
755 { 1, wxDateTime::Apr, 1990 },
756 { 7, wxDateTime::Apr, 1991 },
757 { 5, wxDateTime::Apr, 1992 },
758 { 4, wxDateTime::Apr, 1993 },
759 { 3, wxDateTime::Apr, 1994 },
760 { 2, wxDateTime::Apr, 1995 },
761 { 7, wxDateTime::Apr, 1996 },
762 { 6, wxDateTime::Apr, 1997 },
763 { 5, wxDateTime::Apr, 1998 },
764 { 4, wxDateTime::Apr, 1999 },
765 { 2, wxDateTime::Apr, 2000 },
766 { 1, wxDateTime::Apr, 2001 },
767 { 7, wxDateTime::Apr, 2002 },
768 { 6, wxDateTime::Apr, 2003 },
769 { 4, wxDateTime::Apr, 2004 },
770 },
771 {
772 { 28, wxDateTime::Oct, 1990 },
773 { 27, wxDateTime::Oct, 1991 },
774 { 25, wxDateTime::Oct, 1992 },
775 { 31, wxDateTime::Oct, 1993 },
776 { 30, wxDateTime::Oct, 1994 },
777 { 29, wxDateTime::Oct, 1995 },
778 { 27, wxDateTime::Oct, 1996 },
779 { 26, wxDateTime::Oct, 1997 },
780 { 25, wxDateTime::Oct, 1998 },
781 { 31, wxDateTime::Oct, 1999 },
782 { 29, wxDateTime::Oct, 2000 },
783 { 28, wxDateTime::Oct, 2001 },
784 { 27, wxDateTime::Oct, 2002 },
785 { 26, wxDateTime::Oct, 2003 },
786 { 31, wxDateTime::Oct, 2004 },
787 }
788 };
789
790 int year;
791 for ( year = 1990; year < 2005; year++ )
792 {
793 wxDateTime dtBegin = wxDateTime::GetBeginDST(year, wxDateTime::USA),
794 dtEnd = wxDateTime::GetEndDST(year, wxDateTime::USA);
795
796 printf("DST period in the US for year %d: from %s to %s",
797 year, dtBegin.Format().c_str(), dtEnd.Format().c_str());
798
799 size_t n = year - 1990;
800 const Date& dBegin = datesDST[0][n];
801 const Date& dEnd = datesDST[1][n];
97e0ceea 802
239446b4
VZ
803 if ( dBegin.SameDay(dtBegin.GetTm()) && dEnd.SameDay(dtEnd.GetTm()) )
804 {
805 puts(" (ok)");
806 }
807 else
808 {
809 printf(" (ERROR: should be %s %d to %s %d)\n",
810 wxDateTime::GetMonthName(dBegin.month).c_str(), dBegin.day,
811 wxDateTime::GetMonthName(dEnd.month).c_str(), dEnd.day);
812 }
813 }
814
815 puts("");
816
817 for ( year = 1990; year < 2005; year++ )
818 {
819 printf("DST period in Europe for year %d: from %s to %s\n",
820 year,
821 wxDateTime::GetBeginDST(year, wxDateTime::Country_EEC).Format().c_str(),
822 wxDateTime::GetEndDST(year, wxDateTime::Country_EEC).Format().c_str());
823 }
824}
825
68ee7c47
VZ
826// test wxDateTime -> text conversion
827static void TestTimeFormat()
828{
829 puts("\n*** wxDateTime formatting test ***");
830
b38e2f7d
VZ
831 // some information may be lost during conversion, so store what kind
832 // of info should we recover after a round trip
833 enum CompareKind
68ee7c47 834 {
b38e2f7d
VZ
835 CompareNone, // don't try comparing
836 CompareBoth, // dates and times should be identical
837 CompareDate, // dates only
838 CompareTime // time only
839 };
840
841 static const struct
842 {
843 CompareKind compareKind;
844 const char *format;
845 } formatTestFormats[] =
846 {
847 { CompareBoth, "---> %c" },
848 { CompareDate, "Date is %A, %d of %B, in year %Y" },
849 { CompareBoth, "Date is %x, time is %X" },
850 { CompareTime, "Time is %H:%M:%S or %I:%M:%S %p" },
851 { CompareNone, "The day of year: %j, the week of year: %W" },
68ee7c47
VZ
852 };
853
854 static const Date formatTestDates[] =
855 {
68ee7c47
VZ
856 { 29, wxDateTime::May, 1976, 18, 30, 00 },
857 { 31, wxDateTime::Dec, 1999, 23, 30, 00 },
b38e2f7d
VZ
858#if 0
859 // this test can't work for other centuries because it uses two digit
860 // years in formats, so don't even try it
68ee7c47
VZ
861 { 29, wxDateTime::May, 2076, 18, 30, 00 },
862 { 29, wxDateTime::Feb, 2400, 02, 15, 25 },
863 { 01, wxDateTime::Jan, -52, 03, 16, 47 },
b38e2f7d 864#endif
68ee7c47
VZ
865 };
866
867 // an extra test (as it doesn't depend on date, don't do it in the loop)
868 printf("%s\n", wxDateTime::Now().Format("Our timezone is %Z").c_str());
869
b38e2f7d 870 for ( size_t d = 0; d < WXSIZEOF(formatTestDates) + 1; d++ )
68ee7c47
VZ
871 {
872 puts("");
873
b38e2f7d 874 wxDateTime dt = d == 0 ? wxDateTime::Now() : formatTestDates[d - 1].DT();
68ee7c47
VZ
875 for ( size_t n = 0; n < WXSIZEOF(formatTestFormats); n++ )
876 {
b38e2f7d 877 wxString s = dt.Format(formatTestFormats[n].format);
f0f951fa
VZ
878 printf("%s", s.c_str());
879
b38e2f7d
VZ
880 // what can we recover?
881 int kind = formatTestFormats[n].compareKind;
882
f0f951fa
VZ
883 // convert back
884 wxDateTime dt2;
b38e2f7d 885 const wxChar *result = dt2.ParseFormat(s, formatTestFormats[n].format);
f0f951fa
VZ
886 if ( !result )
887 {
b38e2f7d
VZ
888 // converion failed - should it have?
889 if ( kind == CompareNone )
890 puts(" (ok)");
891 else
892 puts(" (ERROR: conversion back failed)");
f0f951fa
VZ
893 }
894 else if ( *result )
895 {
896 // should have parsed the entire string
897 puts(" (ERROR: conversion back stopped too soon)");
898 }
f0f951fa
VZ
899 else
900 {
b38e2f7d
VZ
901 bool equal = FALSE; // suppress compilaer warning
902 switch ( kind )
903 {
904 case CompareBoth:
905 equal = dt2 == dt;
906 break;
907
908 case CompareDate:
909 equal = dt.IsSameDate(dt2);
910 break;
911
912 case CompareTime:
913 equal = dt.IsSameTime(dt2);
914 break;
915 }
916
917 if ( !equal )
918 {
919 printf(" (ERROR: got back '%s' instead of '%s')\n",
920 dt2.Format().c_str(), dt.Format().c_str());
921 }
922 else
923 {
924 puts(" (ok)");
925 }
f0f951fa 926 }
68ee7c47
VZ
927 }
928 }
929}
930
97e0ceea
VZ
931// test text -> wxDateTime conversion
932static void TestTimeParse()
933{
934 puts("\n*** wxDateTime parse test ***");
935
936 struct ParseTestData
937 {
938 const char *format;
939 Date date;
940 bool good;
941 };
942
943 static const ParseTestData parseTestDates[] =
944 {
68ee7c47
VZ
945 { "Sat, 18 Dec 1999 00:46:40 +0100", { 18, wxDateTime::Dec, 1999, 00, 46, 40 }, TRUE },
946 { "Wed, 1 Dec 1999 05:17:20 +0300", { 1, wxDateTime::Dec, 1999, 03, 17, 20 }, TRUE },
97e0ceea
VZ
947 };
948
949 for ( size_t n = 0; n < WXSIZEOF(parseTestDates); n++ )
950 {
951 const char *format = parseTestDates[n].format;
952
953 printf("%s => ", format);
954
955 wxDateTime dt;
956 if ( dt.ParseRfc822Date(format) )
957 {
958 printf("%s ", dt.Format().c_str());
959
960 if ( parseTestDates[n].good )
961 {
962 wxDateTime dtReal = parseTestDates[n].date.DT();
963 if ( dt == dtReal )
964 {
965 puts("(ok)");
966 }
967 else
968 {
969 printf("(ERROR: should be %s)\n", dtReal.Format().c_str());
970 }
971 }
972 else
973 {
974 puts("(ERROR: bad format)");
975 }
976 }
977 else
978 {
979 printf("bad format (%s)\n",
980 parseTestDates[n].good ? "ERROR" : "ok");
981 }
982 }
983}
984
68ee7c47
VZ
985#if 0
986
97e0ceea
VZ
987// test compatibility with the old wxDate/wxTime classes
988static void TestTimeCompatibility()
989{
990 puts("\n*** wxDateTime compatibility test ***");
991
992 printf("wxDate for JDN 0: %s\n", wxDate(0l).FormatDate().c_str());
993 printf("wxDate for MJD 0: %s\n", wxDate(2400000).FormatDate().c_str());
994
995 double jdnNow = wxDateTime::Now().GetJDN();
996 long jdnMidnight = (long)(jdnNow - 0.5);
997 printf("wxDate for today: %s\n", wxDate(jdnMidnight).FormatDate().c_str());
998
999 jdnMidnight = wxDate().Set().GetJulianDate();
1000 printf("wxDateTime for today: %s\n",
1001 wxDateTime((double)(jdnMidnight + 0.5)).Format("%c", wxDateTime::GMT0).c_str());
1002
1003 int flags = wxEUROPEAN;//wxFULL;
1004 wxDate date;
1005 date.Set();
1006 printf("Today is %s\n", date.FormatDate(flags).c_str());
1007 for ( int n = 0; n < 7; n++ )
1008 {
1009 printf("Previous %s is %s\n",
1010 wxDateTime::GetWeekDayName((wxDateTime::WeekDay)n),
1011 date.Previous(n + 1).FormatDate(flags).c_str());
1012 }
1013}
1014
68ee7c47
VZ
1015#endif // 0
1016
b76b015e
VZ
1017#endif // TEST_TIME
1018
e87271f3
VZ
1019// ----------------------------------------------------------------------------
1020// threads
1021// ----------------------------------------------------------------------------
1022
1023#ifdef TEST_THREADS
1024
bbfa0322 1025#include <wx/thread.h>
37667812 1026
bbfa0322
VZ
1027static size_t gs_counter = (size_t)-1;
1028static wxCriticalSection gs_critsect;
b568d04f 1029static wxCondition gs_cond;
bbfa0322 1030
b568d04f 1031class MyJoinableThread : public wxThread
bbfa0322
VZ
1032{
1033public:
b568d04f
VZ
1034 MyJoinableThread(size_t n) : wxThread(wxTHREAD_JOINABLE)
1035 { m_n = n; Create(); }
bbfa0322
VZ
1036
1037 // thread execution starts here
b568d04f 1038 virtual ExitCode Entry();
bbfa0322 1039
b568d04f
VZ
1040private:
1041 size_t m_n;
bbfa0322
VZ
1042};
1043
b568d04f 1044wxThread::ExitCode MyJoinableThread::Entry()
bbfa0322 1045{
b568d04f
VZ
1046 unsigned long res = 1;
1047 for ( size_t n = 1; n < m_n; n++ )
1048 {
1049 res *= n;
1050
1051 // it's a loooong calculation :-)
1052 Sleep(100);
1053 }
bbfa0322 1054
b568d04f 1055 return (ExitCode)res;
bbfa0322
VZ
1056}
1057
b568d04f
VZ
1058class MyDetachedThread : public wxThread
1059{
1060public:
fcc3d7cb
VZ
1061 MyDetachedThread(size_t n, char ch)
1062 {
1063 m_n = n;
1064 m_ch = ch;
1065 m_cancelled = FALSE;
1066
1067 Create();
1068 }
b568d04f
VZ
1069
1070 // thread execution starts here
1071 virtual ExitCode Entry();
1072
1073 // and stops here
1074 virtual void OnExit();
1075
1076private:
9fc3ad34
VZ
1077 size_t m_n; // number of characters to write
1078 char m_ch; // character to write
fcc3d7cb
VZ
1079
1080 bool m_cancelled; // FALSE if we exit normally
b568d04f
VZ
1081};
1082
1083wxThread::ExitCode MyDetachedThread::Entry()
bbfa0322
VZ
1084{
1085 {
1086 wxCriticalSectionLocker lock(gs_critsect);
1087 if ( gs_counter == (size_t)-1 )
1088 gs_counter = 1;
1089 else
1090 gs_counter++;
1091 }
1092
9fc3ad34 1093 for ( size_t n = 0; n < m_n; n++ )
bbfa0322
VZ
1094 {
1095 if ( TestDestroy() )
fcc3d7cb
VZ
1096 {
1097 m_cancelled = TRUE;
1098
bbfa0322 1099 break;
fcc3d7cb 1100 }
bbfa0322
VZ
1101
1102 putchar(m_ch);
1103 fflush(stdout);
1104
1105 wxThread::Sleep(100);
1106 }
1107
b568d04f 1108 return 0;
bbfa0322
VZ
1109}
1110
b568d04f 1111void MyDetachedThread::OnExit()
bbfa0322 1112{
9fc3ad34
VZ
1113 wxLogTrace("thread", "Thread %ld is in OnExit", GetId());
1114
bbfa0322 1115 wxCriticalSectionLocker lock(gs_critsect);
fcc3d7cb 1116 if ( !--gs_counter && !m_cancelled )
b568d04f 1117 gs_cond.Signal();
bbfa0322
VZ
1118}
1119
9fc3ad34
VZ
1120void TestDetachedThreads()
1121{
2f02cb89 1122 puts("\n*** Testing detached threads ***");
9fc3ad34
VZ
1123
1124 static const size_t nThreads = 3;
1125 MyDetachedThread *threads[nThreads];
1126 size_t n;
1127 for ( n = 0; n < nThreads; n++ )
1128 {
1129 threads[n] = new MyDetachedThread(10, 'A' + n);
1130 }
1131
1132 threads[0]->SetPriority(WXTHREAD_MIN_PRIORITY);
1133 threads[1]->SetPriority(WXTHREAD_MAX_PRIORITY);
1134
1135 for ( n = 0; n < nThreads; n++ )
1136 {
1137 threads[n]->Run();
1138 }
1139
1140 // wait until all threads terminate
1141 gs_cond.Wait();
1142
1143 puts("");
1144}
1145
1146void TestJoinableThreads()
1147{
2f02cb89 1148 puts("\n*** Testing a joinable thread (a loooong calculation...) ***");
9fc3ad34
VZ
1149
1150 // calc 10! in the background
1151 MyJoinableThread thread(10);
1152 thread.Run();
1153
1154 printf("\nThread terminated with exit code %lu.\n",
1155 (unsigned long)thread.Wait());
1156}
1157
1158void TestThreadSuspend()
1159{
2f02cb89
VZ
1160 puts("\n*** Testing thread suspend/resume functions ***");
1161
1162 MyDetachedThread *thread = new MyDetachedThread(15, 'X');
9fc3ad34
VZ
1163
1164 thread->Run();
1165
1166 // this is for this demo only, in a real life program we'd use another
1167 // condition variable which would be signaled from wxThread::Entry() to
1168 // tell us that the thread really started running - but here just wait a
1169 // bit and hope that it will be enough (the problem is, of course, that
1170 // the thread might still not run when we call Pause() which will result
1171 // in an error)
1172 wxThread::Sleep(300);
1173
1174 for ( size_t n = 0; n < 3; n++ )
1175 {
1176 thread->Pause();
1177
1178 puts("\nThread suspended");
1179 if ( n > 0 )
1180 {
1181 // don't sleep but resume immediately the first time
1182 wxThread::Sleep(300);
1183 }
1184 puts("Going to resume the thread");
1185
1186 thread->Resume();
1187 }
1188
4c460b34
VZ
1189 puts("Waiting until it terminates now");
1190
9fc3ad34
VZ
1191 // wait until the thread terminates
1192 gs_cond.Wait();
1193
1194 puts("");
1195}
1196
2f02cb89
VZ
1197void TestThreadDelete()
1198{
1199 // As above, using Sleep() is only for testing here - we must use some
1200 // synchronisation object instead to ensure that the thread is still
1201 // running when we delete it - deleting a detached thread which already
1202 // terminated will lead to a crash!
1203
1204 puts("\n*** Testing thread delete function ***");
1205
4c460b34
VZ
1206 MyDetachedThread *thread0 = new MyDetachedThread(30, 'W');
1207
1208 thread0->Delete();
1209
1210 puts("\nDeleted a thread which didn't start to run yet.");
1211
2f02cb89
VZ
1212 MyDetachedThread *thread1 = new MyDetachedThread(30, 'Y');
1213
1214 thread1->Run();
1215
1216 wxThread::Sleep(300);
1217
1218 thread1->Delete();
1219
1220 puts("\nDeleted a running thread.");
1221
1222 MyDetachedThread *thread2 = new MyDetachedThread(30, 'Z');
1223
1224 thread2->Run();
1225
1226 wxThread::Sleep(300);
1227
1228 thread2->Pause();
1229
1230 thread2->Delete();
1231
1232 puts("\nDeleted a sleeping thread.");
1233
4c460b34
VZ
1234 MyJoinableThread thread3(20);
1235 thread3.Run();
2f02cb89 1236
4c460b34 1237 thread3.Delete();
2f02cb89
VZ
1238
1239 puts("\nDeleted a joinable thread.");
1240
4c460b34
VZ
1241 MyJoinableThread thread4(2);
1242 thread4.Run();
2f02cb89
VZ
1243
1244 wxThread::Sleep(300);
1245
4c460b34 1246 thread4.Delete();
2f02cb89
VZ
1247
1248 puts("\nDeleted a joinable thread which already terminated.");
1249
1250 puts("");
1251}
1252
e87271f3
VZ
1253#endif // TEST_THREADS
1254
1255// ----------------------------------------------------------------------------
1256// arrays
1257// ----------------------------------------------------------------------------
1258
1259#ifdef TEST_ARRAYS
1260
1261void PrintArray(const char* name, const wxArrayString& array)
1262{
1263 printf("Dump of the array '%s'\n", name);
1264
1265 size_t nCount = array.GetCount();
1266 for ( size_t n = 0; n < nCount; n++ )
1267 {
1268 printf("\t%s[%u] = '%s'\n", name, n, array[n].c_str());
1269 }
1270}
1271
1272#endif // TEST_ARRAYS
1273
9fc3ad34
VZ
1274// ----------------------------------------------------------------------------
1275// strings
1276// ----------------------------------------------------------------------------
1277
1278#ifdef TEST_STRINGS
1279
1280#include "wx/timer.h"
1281
299fcbfe 1282static void TestString()
9fc3ad34
VZ
1283{
1284 wxStopWatch sw;
1285
1286 wxString a, b, c;
1287
1288 a.reserve (128);
1289 b.reserve (128);
1290 c.reserve (128);
1291
1292 for (int i = 0; i < 1000000; ++i)
1293 {
1294 a = "Hello";
1295 b = " world";
1296 c = "! How'ya doin'?";
1297 a += b;
1298 a += c;
1299 c = "Hello world! What's up?";
1300 if (c != a)
1301 c = "Doh!";
1302 }
1303
1304 printf ("TestString elapsed time: %ld\n", sw.Time());
1305}
1306
299fcbfe 1307static void TestPChar()
9fc3ad34
VZ
1308{
1309 wxStopWatch sw;
1310
1311 char a [128];
1312 char b [128];
1313 char c [128];
1314
1315 for (int i = 0; i < 1000000; ++i)
1316 {
1317 strcpy (a, "Hello");
1318 strcpy (b, " world");
1319 strcpy (c, "! How'ya doin'?");
1320 strcat (a, b);
1321 strcat (a, c);
1322 strcpy (c, "Hello world! What's up?");
1323 if (strcmp (c, a) == 0)
1324 strcpy (c, "Doh!");
1325 }
1326
1327 printf ("TestPChar elapsed time: %ld\n", sw.Time());
1328}
1329
299fcbfe
VZ
1330static void TestStringSub()
1331{
1332 wxString s("Hello, world!");
1333
1334 puts("*** Testing wxString substring extraction ***");
1335
1336 printf("String = '%s'\n", s.c_str());
1337 printf("Left(5) = '%s'\n", s.Left(5).c_str());
1338 printf("Right(6) = '%s'\n", s.Right(6).c_str());
1339 printf("Mid(3, 5) = '%s'\n", s(3, 5).c_str());
1340 printf("Mid(3) = '%s'\n", s.Mid(3).c_str());
1341 printf("substr(3, 5) = '%s'\n", s.substr(3, 5).c_str());
1342 printf("substr(3) = '%s'\n", s.substr(3).c_str());
1343
1344 puts("");
1345}
1346
f0f951fa
VZ
1347static void TestStringFormat()
1348{
1349 puts("*** Testing wxString formatting ***");
1350
1351 wxString s;
1352 s.Printf("%03d", 18);
1353
1354 printf("Number 18: %s\n", wxString::Format("%03d", 18).c_str());
1355 printf("Number 18: %s\n", s.c_str());
1356
1357 puts("");
1358}
1359
9fc3ad34
VZ
1360#endif // TEST_STRINGS
1361
e87271f3
VZ
1362// ----------------------------------------------------------------------------
1363// entry point
1364// ----------------------------------------------------------------------------
1365
bbfa0322 1366int main(int argc, char **argv)
37667812
VZ
1367{
1368 if ( !wxInitialize() )
1369 {
1370 fprintf(stderr, "Failed to initialize the wxWindows library, aborting.");
1371 }
1372
9fc3ad34 1373#ifdef TEST_STRINGS
299fcbfe
VZ
1374 if ( 0 )
1375 {
1376 TestPChar();
1377 TestString();
1378 }
f0f951fa
VZ
1379 if ( 0 )
1380 {
1381 TestStringSub();
1382 }
1383 TestStringFormat();
9fc3ad34
VZ
1384#endif // TEST_STRINGS
1385
e87271f3
VZ
1386#ifdef TEST_ARRAYS
1387 wxArrayString a1;
1388 a1.Add("tiger");
1389 a1.Add("cat");
1390 a1.Add("lion");
1391 a1.Add("dog");
1392 a1.Add("human");
1393 a1.Add("ape");
1394
1395 puts("*** Initially:");
1396
1397 PrintArray("a1", a1);
1398
1399 wxArrayString a2(a1);
1400 PrintArray("a2", a2);
1401
1402 wxSortedArrayString a3(a1);
1403 PrintArray("a3", a3);
1404
1405 puts("*** After deleting a string from a1");
1406 a1.Remove(2);
1407
1408 PrintArray("a1", a1);
1409 PrintArray("a2", a2);
1410 PrintArray("a3", a3);
1411
1412 puts("*** After reassigning a1 to a2 and a3");
1413 a3 = a2 = a1;
1414 PrintArray("a2", a2);
1415 PrintArray("a3", a3);
1416#endif // TEST_ARRAYS
1417
1944c6bd
VZ
1418#ifdef TEST_DIR
1419 TestDirEnum();
1420#endif // TEST_DIR
1421
378b05f7
VZ
1422#ifdef TEST_LOG
1423 wxString s;
1424 for ( size_t n = 0; n < 8000; n++ )
1425 {
1426 s << (char)('A' + (n % 26));
1427 }
1428
1429 wxString msg;
1430 msg.Printf("A very very long message: '%s', the end!\n", s.c_str());
1431
1432 // this one shouldn't be truncated
1433 printf(msg);
1434
1435 // but this one will because log functions use fixed size buffer
b568d04f
VZ
1436 // (note that it doesn't need '\n' at the end neither - will be added
1437 // by wxLog anyhow)
1438 wxLogMessage("A very very long message 2: '%s', the end!", s.c_str());
378b05f7
VZ
1439#endif // TEST_LOG
1440
e87271f3 1441#ifdef TEST_THREADS
696e1ea0
VZ
1442 int nCPUs = wxThread::GetCPUCount();
1443 printf("This system has %d CPUs\n", nCPUs);
1444 if ( nCPUs != -1 )
1445 wxThread::SetConcurrency(nCPUs);
ef8d96c2 1446
9fc3ad34
VZ
1447 if ( argc > 1 && argv[1][0] == 't' )
1448 wxLog::AddTraceMask("thread");
b568d04f 1449
4c460b34 1450 if ( 1 )
2f02cb89 1451 TestDetachedThreads();
4c460b34 1452 if ( 1 )
2f02cb89 1453 TestJoinableThreads();
4c460b34 1454 if ( 1 )
2f02cb89
VZ
1455 TestThreadSuspend();
1456 if ( 1 )
1457 TestThreadDelete();
1458
e87271f3 1459#endif // TEST_THREADS
37667812 1460
b76b015e
VZ
1461#ifdef TEST_LONGLONG
1462 if ( 0 )
1463 TestSpeed();
1464 if ( 1 )
1465 TestDivision();
1466#endif // TEST_LONGLONG
1467
696e1ea0
VZ
1468#ifdef TEST_MIME
1469 TestMimeEnum();
1470#endif // TEST_MIME
1471
b76b015e 1472#ifdef TEST_TIME
299fcbfe
VZ
1473 if ( 0 )
1474 {
211c2250 1475 TestTimeSet();
299fcbfe 1476 TestTimeStatic();
fcc3d7cb 1477 TestTimeZones();
e6ec579c 1478 TestTimeRange();
299fcbfe 1479 TestTimeTicks();
151d66be 1480 TestTimeJDN();
239446b4 1481 TestTimeDST();
211c2250 1482 TestTimeWDays();
239446b4 1483 TestTimeWNumber();
97e0ceea
VZ
1484 TestTimeParse();
1485 }
68ee7c47
VZ
1486
1487 TestTimeFormat();
b76b015e
VZ
1488#endif // TEST_TIME
1489
37667812
VZ
1490 wxUninitialize();
1491
1492 return 0;
1493}