1
/////////////////////////////////////////////////////////////////////////////
2
// Name: samples/console/console.cpp
3
// Purpose: A sample console (as opposed to GUI) program using wxWidgets
4
// Author: Vadim Zeitlin
7
// RCS-ID: $Id: console.cpp,v 1.192.2.2 2005/09/29 12:34:47 ABX Exp $
8
// Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9
// Licence: wxWindows license
10
/////////////////////////////////////////////////////////////////////////////
12
// ============================================================================
14
// ============================================================================
16
// ----------------------------------------------------------------------------
18
// ----------------------------------------------------------------------------
24
#include "wx/string.h"
29
// without this pragma, the stupid compiler precompiles #defines below so that
30
// changing them doesn't "take place" later!
35
// ----------------------------------------------------------------------------
36
// conditional compilation
37
// ----------------------------------------------------------------------------
40
A note about all these conditional compilation macros: this file is used
41
both as a test suite for various non-GUI wxWidgets classes and as a
42
scratchpad for quick tests. So there are two compilation modes: if you
43
define TEST_ALL all tests are run, otherwise you may enable the individual
44
tests individually in the "#else" branch below.
47
// what to test (in alphabetic order)? Define TEST_ALL to 0 to do a single
48
// test, define it to 1 to do all tests.
63
// #define TEST_FTP --FIXME! (RN)
64
#define TEST_INFO_FUNCTIONS
74
#define TEST_SCOPEGUARD
76
// #define TEST_SOCKETS --FIXME! (RN)
77
#define TEST_STACKWALKER
80
#define TEST_TEXTSTREAM
83
// #define TEST_VCARD -- don't enable this (VZ)
84
// #define TEST_VOLUME --FIXME! (RN)
91
// some tests are interactive, define this to run them
92
#ifdef TEST_INTERACTIVE
93
#undef TEST_INTERACTIVE
95
#define TEST_INTERACTIVE 1
97
#define TEST_INTERACTIVE 0
100
// ============================================================================
102
// ============================================================================
104
// ----------------------------------------------------------------------------
106
// ----------------------------------------------------------------------------
108
#if defined(TEST_SOCKETS)
110
// replace TABs with \t and CRs with \n
111
static wxString MakePrintable(const wxChar *s)
114
(void)str.Replace(_T("\t"), _T("\\t"));
115
(void)str.Replace(_T("\n"), _T("\\n"));
116
(void)str.Replace(_T("\r"), _T("\\r"));
121
#endif // MakePrintable() is used
123
// ----------------------------------------------------------------------------
125
// ----------------------------------------------------------------------------
129
#include "wx/cmdline.h"
130
#include "wx/datetime.h"
132
#if wxUSE_CMDLINE_PARSER
134
static void ShowCmdLine(const wxCmdLineParser& parser)
136
wxString s = _T("Input files: ");
138
size_t count = parser.GetParamCount();
139
for ( size_t param = 0; param < count; param++ )
141
s << parser.GetParam(param) << ' ';
145
<< _T("Verbose:\t") << (parser.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'
146
<< _T("Quiet:\t") << (parser.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';
151
if ( parser.Found(_T("o"), &strVal) )
152
s << _T("Output file:\t") << strVal << '\n';
153
if ( parser.Found(_T("i"), &strVal) )
154
s << _T("Input dir:\t") << strVal << '\n';
155
if ( parser.Found(_T("s"), &lVal) )
156
s << _T("Size:\t") << lVal << '\n';
157
if ( parser.Found(_T("d"), &dt) )
158
s << _T("Date:\t") << dt.FormatISODate() << '\n';
159
if ( parser.Found(_T("project_name"), &strVal) )
160
s << _T("Project:\t") << strVal << '\n';
165
#endif // wxUSE_CMDLINE_PARSER
167
static void TestCmdLineConvert()
169
static const wxChar *cmdlines[] =
172
_T("-a \"-bstring 1\" -c\"string 2\" \"string 3\""),
173
_T("literal \\\" and \"\""),
176
for ( size_t n = 0; n < WXSIZEOF(cmdlines); n++ )
178
const wxChar *cmdline = cmdlines[n];
179
wxPrintf(_T("Parsing: %s\n"), cmdline);
180
wxArrayString args = wxCmdLineParser::ConvertStringToArgs(cmdline);
182
size_t count = args.GetCount();
183
wxPrintf(_T("\targc = %u\n"), count);
184
for ( size_t arg = 0; arg < count; arg++ )
186
wxPrintf(_T("\targv[%u] = %s\n"), arg, args[arg].c_str());
191
#endif // TEST_CMDLINE
193
// ----------------------------------------------------------------------------
195
// ----------------------------------------------------------------------------
202
static const wxChar *ROOTDIR = _T("/");
203
static const wxChar *TESTDIR = _T("/usr/local/share");
204
#elif defined(__WXMSW__) || defined(__DOS__) || defined(__OS2__)
205
static const wxChar *ROOTDIR = _T("c:\\");
206
static const wxChar *TESTDIR = _T("d:\\");
208
#error "don't know where the root directory is"
211
static void TestDirEnumHelper(wxDir& dir,
212
int flags = wxDIR_DEFAULT,
213
const wxString& filespec = wxEmptyString)
217
if ( !dir.IsOpened() )
220
bool cont = dir.GetFirst(&filename, filespec, flags);
223
wxPrintf(_T("\t%s\n"), filename.c_str());
225
cont = dir.GetNext(&filename);
228
wxPuts(wxEmptyString);
233
static void TestDirEnum()
235
wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
237
wxString cwd = wxGetCwd();
238
if ( !wxDir::Exists(cwd) )
240
wxPrintf(_T("ERROR: current directory '%s' doesn't exist?\n"), cwd.c_str());
245
if ( !dir.IsOpened() )
247
wxPrintf(_T("ERROR: failed to open current directory '%s'.\n"), cwd.c_str());
251
wxPuts(_T("Enumerating everything in current directory:"));
252
TestDirEnumHelper(dir);
254
wxPuts(_T("Enumerating really everything in current directory:"));
255
TestDirEnumHelper(dir, wxDIR_DEFAULT | wxDIR_DOTDOT);
257
wxPuts(_T("Enumerating object files in current directory:"));
258
TestDirEnumHelper(dir, wxDIR_DEFAULT, _T("*.o*"));
260
wxPuts(_T("Enumerating directories in current directory:"));
261
TestDirEnumHelper(dir, wxDIR_DIRS);
263
wxPuts(_T("Enumerating files in current directory:"));
264
TestDirEnumHelper(dir, wxDIR_FILES);
266
wxPuts(_T("Enumerating files including hidden in current directory:"));
267
TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN);
271
wxPuts(_T("Enumerating everything in root directory:"));
272
TestDirEnumHelper(dir, wxDIR_DEFAULT);
274
wxPuts(_T("Enumerating directories in root directory:"));
275
TestDirEnumHelper(dir, wxDIR_DIRS);
277
wxPuts(_T("Enumerating files in root directory:"));
278
TestDirEnumHelper(dir, wxDIR_FILES);
280
wxPuts(_T("Enumerating files including hidden in root directory:"));
281
TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN);
283
wxPuts(_T("Enumerating files in non existing directory:"));
284
wxDir dirNo(_T("nosuchdir"));
285
TestDirEnumHelper(dirNo);
290
class DirPrintTraverser : public wxDirTraverser
293
virtual wxDirTraverseResult OnFile(const wxString& WXUNUSED(filename))
295
return wxDIR_CONTINUE;
298
virtual wxDirTraverseResult OnDir(const wxString& dirname)
300
wxString path, name, ext;
301
wxSplitPath(dirname, &path, &name, &ext);
304
name << _T('.') << ext;
307
for ( const wxChar *p = path.c_str(); *p; p++ )
309
if ( wxIsPathSeparator(*p) )
313
wxPrintf(_T("%s%s\n"), indent.c_str(), name.c_str());
315
return wxDIR_CONTINUE;
319
static void TestDirTraverse()
321
wxPuts(_T("*** Testing wxDir::Traverse() ***"));
325
size_t n = wxDir::GetAllFiles(TESTDIR, &files);
326
wxPrintf(_T("There are %u files under '%s'\n"), n, TESTDIR);
329
wxPrintf(_T("First one is '%s'\n"), files[0u].c_str());
330
wxPrintf(_T(" last one is '%s'\n"), files[n - 1].c_str());
333
// enum again with custom traverser
334
wxPuts(_T("Now enumerating directories:"));
336
DirPrintTraverser traverser;
337
dir.Traverse(traverser, wxEmptyString, wxDIR_DIRS | wxDIR_HIDDEN);
342
static void TestDirExists()
344
wxPuts(_T("*** Testing wxDir::Exists() ***"));
346
static const wxChar *dirnames[] =
349
#if defined(__WXMSW__)
352
_T("\\\\share\\file"),
356
_T("c:\\autoexec.bat"),
357
#elif defined(__UNIX__)
366
for ( size_t n = 0; n < WXSIZEOF(dirnames); n++ )
368
wxPrintf(_T("%-40s: %s\n"),
370
wxDir::Exists(dirnames[n]) ? _T("exists")
371
: _T("doesn't exist"));
379
// ----------------------------------------------------------------------------
381
// ----------------------------------------------------------------------------
385
#include "wx/dynlib.h"
387
static void TestDllLoad()
389
#if defined(__WXMSW__)
390
static const wxChar *LIB_NAME = _T("kernel32.dll");
391
static const wxChar *FUNC_NAME = _T("lstrlenA");
392
#elif defined(__UNIX__)
393
// weird: using just libc.so does *not* work!
394
static const wxChar *LIB_NAME = _T("/lib/libc.so.6");
395
static const wxChar *FUNC_NAME = _T("strlen");
397
#error "don't know how to test wxDllLoader on this platform"
400
wxPuts(_T("*** testing basic wxDynamicLibrary functions ***\n"));
402
wxDynamicLibrary lib(LIB_NAME);
403
if ( !lib.IsLoaded() )
405
wxPrintf(_T("ERROR: failed to load '%s'.\n"), LIB_NAME);
409
typedef int (wxSTDCALL *wxStrlenType)(const char *);
410
wxStrlenType pfnStrlen = (wxStrlenType)lib.GetSymbol(FUNC_NAME);
413
wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
414
FUNC_NAME, LIB_NAME);
418
wxPrintf(_T("Calling %s dynamically loaded from %s "),
419
FUNC_NAME, LIB_NAME);
421
if ( pfnStrlen("foo") != 3 )
423
wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
427
wxPuts(_T("... ok"));
432
static const wxChar *FUNC_NAME_AW = _T("lstrlen");
434
typedef int (wxSTDCALL *wxStrlenTypeAorW)(const wxChar *);
436
pfnStrlenAorW = (wxStrlenTypeAorW)lib.GetSymbolAorW(FUNC_NAME_AW);
437
if ( !pfnStrlenAorW )
439
wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
440
FUNC_NAME_AW, LIB_NAME);
444
if ( pfnStrlenAorW(_T("foobar")) != 6 )
446
wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
453
#if defined(__WXMSW__) || defined(__UNIX__)
455
static void TestDllListLoaded()
457
wxPuts(_T("*** testing wxDynamicLibrary::ListLoaded() ***\n"));
459
puts("\nLoaded modules:");
460
wxDynamicLibraryDetailsArray dlls = wxDynamicLibrary::ListLoaded();
461
const size_t count = dlls.GetCount();
462
for ( size_t n = 0; n < count; ++n )
464
const wxDynamicLibraryDetails& details = dlls[n];
465
printf("%-45s", details.GetPath().mb_str());
469
if ( details.GetAddress(&addr, &len) )
471
printf(" %08lx:%08lx",
472
(unsigned long)addr, (unsigned long)((char *)addr + len));
475
printf(" %s\n", details.GetVersion().mb_str());
481
#endif // TEST_DYNLIB
483
// ----------------------------------------------------------------------------
485
// ----------------------------------------------------------------------------
489
#include "wx/utils.h"
491
static wxString MyGetEnv(const wxString& var)
494
if ( !wxGetEnv(var, &val) )
497
val = wxString(_T('\'')) + val + _T('\'');
502
static void TestEnvironment()
504
const wxChar *var = _T("wxTestVar");
506
wxPuts(_T("*** testing environment access functions ***"));
508
wxPrintf(_T("Initially getenv(%s) = %s\n"), var, MyGetEnv(var).c_str());
509
wxSetEnv(var, _T("value for wxTestVar"));
510
wxPrintf(_T("After wxSetEnv: getenv(%s) = %s\n"), var, MyGetEnv(var).c_str());
511
wxSetEnv(var, _T("another value"));
512
wxPrintf(_T("After 2nd wxSetEnv: getenv(%s) = %s\n"), var, MyGetEnv(var).c_str());
514
wxPrintf(_T("After wxUnsetEnv: getenv(%s) = %s\n"), var, MyGetEnv(var).c_str());
515
wxPrintf(_T("PATH = %s\n"), MyGetEnv(_T("PATH")).c_str());
518
#endif // TEST_ENVIRON
520
// ----------------------------------------------------------------------------
522
// ----------------------------------------------------------------------------
526
#include "wx/utils.h"
528
static void TestExecute()
530
wxPuts(_T("*** testing wxExecute ***"));
533
#define COMMAND "cat -n ../../Makefile" // "echo hi"
534
#define SHELL_COMMAND "echo hi from shell"
535
#define REDIRECT_COMMAND COMMAND // "date"
536
#elif defined(__WXMSW__)
537
#define COMMAND "command.com /c echo hi"
538
#define SHELL_COMMAND "echo hi"
539
#define REDIRECT_COMMAND COMMAND
541
#error "no command to exec"
544
wxPrintf(_T("Testing wxShell: "));
546
if ( wxShell(_T(SHELL_COMMAND)) )
549
wxPuts(_T("ERROR."));
551
wxPrintf(_T("Testing wxExecute: "));
553
if ( wxExecute(_T(COMMAND), true /* sync */) == 0 )
556
wxPuts(_T("ERROR."));
558
#if 0 // no, it doesn't work (yet?)
559
wxPrintf(_T("Testing async wxExecute: "));
561
if ( wxExecute(COMMAND) != 0 )
562
wxPuts(_T("Ok (command launched)."));
564
wxPuts(_T("ERROR."));
567
wxPrintf(_T("Testing wxExecute with redirection:\n"));
568
wxArrayString output;
569
if ( wxExecute(_T(REDIRECT_COMMAND), output) != 0 )
571
wxPuts(_T("ERROR."));
575
size_t count = output.GetCount();
576
for ( size_t n = 0; n < count; n++ )
578
wxPrintf(_T("\t%s\n"), output[n].c_str());
585
#endif // TEST_EXECUTE
587
// ----------------------------------------------------------------------------
589
// ----------------------------------------------------------------------------
594
#include "wx/ffile.h"
595
#include "wx/textfile.h"
597
static void TestFileRead()
599
wxPuts(_T("*** wxFile read test ***"));
601
wxFile file(_T("testdata.fc"));
602
if ( file.IsOpened() )
604
wxPrintf(_T("File length: %lu\n"), file.Length());
606
wxPuts(_T("File dump:\n----------"));
608
static const size_t len = 1024;
612
size_t nRead = file.Read(buf, len);
613
if ( nRead == (size_t)wxInvalidOffset )
615
wxPrintf(_T("Failed to read the file."));
619
fwrite(buf, nRead, 1, stdout);
625
wxPuts(_T("----------"));
629
wxPrintf(_T("ERROR: can't open test file.\n"));
632
wxPuts(wxEmptyString);
635
static void TestTextFileRead()
637
wxPuts(_T("*** wxTextFile read test ***"));
639
wxTextFile file(_T("testdata.fc"));
642
wxPrintf(_T("Number of lines: %u\n"), file.GetLineCount());
643
wxPrintf(_T("Last line: '%s'\n"), file.GetLastLine().c_str());
647
wxPuts(_T("\nDumping the entire file:"));
648
for ( s = file.GetFirstLine(); !file.Eof(); s = file.GetNextLine() )
650
wxPrintf(_T("%6u: %s\n"), file.GetCurrentLine() + 1, s.c_str());
652
wxPrintf(_T("%6u: %s\n"), file.GetCurrentLine() + 1, s.c_str());
654
wxPuts(_T("\nAnd now backwards:"));
655
for ( s = file.GetLastLine();
656
file.GetCurrentLine() != 0;
657
s = file.GetPrevLine() )
659
wxPrintf(_T("%6u: %s\n"), file.GetCurrentLine() + 1, s.c_str());
661
wxPrintf(_T("%6u: %s\n"), file.GetCurrentLine() + 1, s.c_str());
665
wxPrintf(_T("ERROR: can't open '%s'\n"), file.GetName());
668
wxPuts(wxEmptyString);
671
static void TestFileCopy()
673
wxPuts(_T("*** Testing wxCopyFile ***"));
675
static const wxChar *filename1 = _T("testdata.fc");
676
static const wxChar *filename2 = _T("test2");
677
if ( !wxCopyFile(filename1, filename2) )
679
wxPuts(_T("ERROR: failed to copy file"));
683
wxFFile f1(filename1, _T("rb")),
684
f2(filename2, _T("rb"));
686
if ( !f1.IsOpened() || !f2.IsOpened() )
688
wxPuts(_T("ERROR: failed to open file(s)"));
693
if ( !f1.ReadAll(&s1) || !f2.ReadAll(&s2) )
695
wxPuts(_T("ERROR: failed to read file(s)"));
699
if ( (s1.length() != s2.length()) ||
700
(memcmp(s1.c_str(), s2.c_str(), s1.length()) != 0) )
702
wxPuts(_T("ERROR: copy error!"));
706
wxPuts(_T("File was copied ok."));
712
if ( !wxRemoveFile(filename2) )
714
wxPuts(_T("ERROR: failed to remove the file"));
717
wxPuts(wxEmptyString);
722
// ----------------------------------------------------------------------------
724
// ----------------------------------------------------------------------------
728
#include "wx/confbase.h"
729
#include "wx/fileconf.h"
731
static const struct FileConfTestData
733
const wxChar *name; // value name
734
const wxChar *value; // the value from the file
737
{ _T("value1"), _T("one") },
738
{ _T("value2"), _T("two") },
739
{ _T("novalue"), _T("default") },
742
static void TestFileConfRead()
744
wxPuts(_T("*** testing wxFileConfig loading/reading ***"));
746
wxFileConfig fileconf(_T("test"), wxEmptyString,
747
_T("testdata.fc"), wxEmptyString,
748
wxCONFIG_USE_RELATIVE_PATH);
750
// test simple reading
751
wxPuts(_T("\nReading config file:"));
752
wxString defValue(_T("default")), value;
753
for ( size_t n = 0; n < WXSIZEOF(fcTestData); n++ )
755
const FileConfTestData& data = fcTestData[n];
756
value = fileconf.Read(data.name, defValue);
757
wxPrintf(_T("\t%s = %s "), data.name, value.c_str());
758
if ( value == data.value )
764
wxPrintf(_T("(ERROR: should be %s)\n"), data.value);
768
// test enumerating the entries
769
wxPuts(_T("\nEnumerating all root entries:"));
772
bool cont = fileconf.GetFirstEntry(name, dummy);
775
wxPrintf(_T("\t%s = %s\n"),
777
fileconf.Read(name.c_str(), _T("ERROR")).c_str());
779
cont = fileconf.GetNextEntry(name, dummy);
782
static const wxChar *testEntry = _T("TestEntry");
783
wxPrintf(_T("\nTesting deletion of newly created \"Test\" entry: "));
784
fileconf.Write(testEntry, _T("A value"));
785
fileconf.DeleteEntry(testEntry);
786
wxPrintf(fileconf.HasEntry(testEntry) ? _T("ERROR\n") : _T("ok\n"));
789
#endif // TEST_FILECONF
791
// ----------------------------------------------------------------------------
793
// ----------------------------------------------------------------------------
797
#include "wx/filename.h"
800
static void DumpFileName(const wxChar *desc, const wxFileName& fn)
804
wxString full = fn.GetFullPath();
806
wxString vol, path, name, ext;
807
wxFileName::SplitPath(full, &vol, &path, &name, &ext);
809
wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
810
full.c_str(), vol.c_str(), path.c_str(), name.c_str(), ext.c_str());
812
wxFileName::SplitPath(full, &path, &name, &ext);
813
wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
814
path.c_str(), name.c_str(), ext.c_str());
816
wxPrintf(_T("path is also:\t'%s'\n"), fn.GetPath().c_str());
817
wxPrintf(_T("with volume: \t'%s'\n"),
818
fn.GetPath(wxPATH_GET_VOLUME).c_str());
819
wxPrintf(_T("with separator:\t'%s'\n"),
820
fn.GetPath(wxPATH_GET_SEPARATOR).c_str());
821
wxPrintf(_T("with both: \t'%s'\n"),
822
fn.GetPath(wxPATH_GET_SEPARATOR | wxPATH_GET_VOLUME).c_str());
824
wxPuts(_T("The directories in the path are:"));
825
wxArrayString dirs = fn.GetDirs();
826
size_t count = dirs.GetCount();
827
for ( size_t n = 0; n < count; n++ )
829
wxPrintf(_T("\t%u: %s\n"), n, dirs[n].c_str());
834
static void TestFileNameTemp()
836
wxPuts(_T("*** testing wxFileName temp file creation ***"));
838
static const wxChar *tmpprefixes[] =
846
_T("/tmp/foo/bar"), // this one must be an error
850
for ( size_t n = 0; n < WXSIZEOF(tmpprefixes); n++ )
852
wxString path = wxFileName::CreateTempFileName(tmpprefixes[n]);
855
// "error" is not in upper case because it may be ok
856
wxPrintf(_T("Prefix '%s'\t-> error\n"), tmpprefixes[n]);
860
wxPrintf(_T("Prefix '%s'\t-> temp file '%s'\n"),
861
tmpprefixes[n], path.c_str());
863
if ( !wxRemoveFile(path) )
865
wxLogWarning(_T("Failed to remove temp file '%s'"),
872
static void TestFileNameDirManip()
874
// TODO: test AppendDir(), RemoveDir(), ...
877
static void TestFileNameComparison()
882
static void TestFileNameOperations()
887
static void TestFileNameCwd()
892
#endif // TEST_FILENAME
894
// ----------------------------------------------------------------------------
895
// wxFileName time functions
896
// ----------------------------------------------------------------------------
900
#include <wx/filename.h>
901
#include <wx/datetime.h>
903
static void TestFileGetTimes()
905
wxFileName fn(_T("testdata.fc"));
907
wxDateTime dtAccess, dtMod, dtCreate;
908
if ( !fn.GetTimes(&dtAccess, &dtMod, &dtCreate) )
910
wxPrintf(_T("ERROR: GetTimes() failed.\n"));
914
static const wxChar *fmt = _T("%Y-%b-%d %H:%M:%S");
916
wxPrintf(_T("File times for '%s':\n"), fn.GetFullPath().c_str());
917
wxPrintf(_T("Creation: \t%s\n"), dtCreate.Format(fmt).c_str());
918
wxPrintf(_T("Last read: \t%s\n"), dtAccess.Format(fmt).c_str());
919
wxPrintf(_T("Last write: \t%s\n"), dtMod.Format(fmt).c_str());
924
static void TestFileSetTimes()
926
wxFileName fn(_T("testdata.fc"));
930
wxPrintf(_T("ERROR: Touch() failed.\n"));
935
#endif // TEST_FILETIME
937
// ----------------------------------------------------------------------------
939
// ----------------------------------------------------------------------------
944
#include "wx/utils.h" // for wxSetEnv
946
static wxLocale gs_localeDefault(wxLANGUAGE_ENGLISH);
948
// find the name of the language from its value
949
static const wxChar *GetLangName(int lang)
951
static const wxChar *languageNames[] =
961
_T("ARABIC_ALGERIA"),
962
_T("ARABIC_BAHRAIN"),
967
_T("ARABIC_LEBANON"),
969
_T("ARABIC_MOROCCO"),
972
_T("ARABIC_SAUDI_ARABIA"),
975
_T("ARABIC_TUNISIA"),
982
_T("AZERI_CYRILLIC"),
997
_T("CHINESE_SIMPLIFIED"),
998
_T("CHINESE_TRADITIONAL"),
999
_T("CHINESE_HONGKONG"),
1000
_T("CHINESE_MACAU"),
1001
_T("CHINESE_SINGAPORE"),
1002
_T("CHINESE_TAIWAN"),
1008
_T("DUTCH_BELGIAN"),
1012
_T("ENGLISH_AUSTRALIA"),
1013
_T("ENGLISH_BELIZE"),
1014
_T("ENGLISH_BOTSWANA"),
1015
_T("ENGLISH_CANADA"),
1016
_T("ENGLISH_CARIBBEAN"),
1017
_T("ENGLISH_DENMARK"),
1019
_T("ENGLISH_JAMAICA"),
1020
_T("ENGLISH_NEW_ZEALAND"),
1021
_T("ENGLISH_PHILIPPINES"),
1022
_T("ENGLISH_SOUTH_AFRICA"),
1023
_T("ENGLISH_TRINIDAD"),
1024
_T("ENGLISH_ZIMBABWE"),
1032
_T("FRENCH_BELGIAN"),
1033
_T("FRENCH_CANADIAN"),
1034
_T("FRENCH_LUXEMBOURG"),
1035
_T("FRENCH_MONACO"),
1041
_T("GERMAN_AUSTRIAN"),
1042
_T("GERMAN_BELGIUM"),
1043
_T("GERMAN_LIECHTENSTEIN"),
1044
_T("GERMAN_LUXEMBOURG"),
1062
_T("ITALIAN_SWISS"),
1067
_T("KASHMIRI_INDIA"),
1085
_T("MALAY_BRUNEI_DARUSSALAM"),
1086
_T("MALAY_MALAYSIA"),
1096
_T("NORWEGIAN_BOKMAL"),
1097
_T("NORWEGIAN_NYNORSK"),
1104
_T("PORTUGUESE_BRAZILIAN"),
1107
_T("RHAETO_ROMANCE"),
1110
_T("RUSSIAN_UKRAINE"),
1116
_T("SERBIAN_CYRILLIC"),
1117
_T("SERBIAN_LATIN"),
1118
_T("SERBO_CROATIAN"),
1129
_T("SPANISH_ARGENTINA"),
1130
_T("SPANISH_BOLIVIA"),
1131
_T("SPANISH_CHILE"),
1132
_T("SPANISH_COLOMBIA"),
1133
_T("SPANISH_COSTA_RICA"),
1134
_T("SPANISH_DOMINICAN_REPUBLIC"),
1135
_T("SPANISH_ECUADOR"),
1136
_T("SPANISH_EL_SALVADOR"),
1137
_T("SPANISH_GUATEMALA"),
1138
_T("SPANISH_HONDURAS"),
1139
_T("SPANISH_MEXICAN"),
1140
_T("SPANISH_MODERN"),
1141
_T("SPANISH_NICARAGUA"),
1142
_T("SPANISH_PANAMA"),
1143
_T("SPANISH_PARAGUAY"),
1145
_T("SPANISH_PUERTO_RICO"),
1146
_T("SPANISH_URUGUAY"),
1148
_T("SPANISH_VENEZUELA"),
1152
_T("SWEDISH_FINLAND"),
1170
_T("URDU_PAKISTAN"),
1172
_T("UZBEK_CYRILLIC"),
1185
if ( (size_t)lang < WXSIZEOF(languageNames) )
1186
return languageNames[lang];
1188
return _T("INVALID");
1191
static void TestDefaultLang()
1193
wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
1195
static const wxChar *langStrings[] =
1197
NULL, // system default
1204
_T("de_DE.iso88591"),
1206
_T("?"), // invalid lang spec
1207
_T("klingonese"), // I bet on some systems it does exist...
1210
wxPrintf(_T("The default system encoding is %s (%d)\n"),
1211
wxLocale::GetSystemEncodingName().c_str(),
1212
wxLocale::GetSystemEncoding());
1214
for ( size_t n = 0; n < WXSIZEOF(langStrings); n++ )
1216
const wxChar *langStr = langStrings[n];
1219
// FIXME: this doesn't do anything at all under Windows, we need
1220
// to create a new wxLocale!
1221
wxSetEnv(_T("LC_ALL"), langStr);
1224
int lang = gs_localeDefault.GetSystemLanguage();
1225
wxPrintf(_T("Locale for '%s' is %s.\n"),
1226
langStr ? langStr : _T("system default"), GetLangName(lang));
1230
#endif // TEST_LOCALE
1232
// ----------------------------------------------------------------------------
1234
// ----------------------------------------------------------------------------
1238
#include "wx/mimetype.h"
1240
static void TestMimeEnum()
1242
wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
1244
wxArrayString mimetypes;
1246
size_t count = wxTheMimeTypesManager->EnumAllFileTypes(mimetypes);
1248
wxPrintf(_T("*** All %u known filetypes: ***\n"), count);
1253
for ( size_t n = 0; n < count; n++ )
1255
wxFileType *filetype =
1256
wxTheMimeTypesManager->GetFileTypeFromMimeType(mimetypes[n]);
1259
wxPrintf(_T("nothing known about the filetype '%s'!\n"),
1260
mimetypes[n].c_str());
1264
filetype->GetDescription(&desc);
1265
filetype->GetExtensions(exts);
1267
filetype->GetIcon(NULL);
1270
for ( size_t e = 0; e < exts.GetCount(); e++ )
1273
extsAll << _T(", ");
1277
wxPrintf(_T("\t%s: %s (%s)\n"),
1278
mimetypes[n].c_str(), desc.c_str(), extsAll.c_str());
1281
wxPuts(wxEmptyString);
1284
static void TestMimeOverride()
1286
wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
1288
static const wxChar *mailcap = _T("/tmp/mailcap");
1289
static const wxChar *mimetypes = _T("/tmp/mime.types");
1291
if ( wxFile::Exists(mailcap) )
1292
wxPrintf(_T("Loading mailcap from '%s': %s\n"),
1294
wxTheMimeTypesManager->ReadMailcap(mailcap) ? _T("ok") : _T("ERROR"));
1296
wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
1299
if ( wxFile::Exists(mimetypes) )
1300
wxPrintf(_T("Loading mime.types from '%s': %s\n"),
1302
wxTheMimeTypesManager->ReadMimeTypes(mimetypes) ? _T("ok") : _T("ERROR"));
1304
wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
1307
wxPuts(wxEmptyString);
1310
static void TestMimeFilename()
1312
wxPuts(_T("*** Testing MIME type from filename query ***\n"));
1314
static const wxChar *filenames[] =
1322
for ( size_t n = 0; n < WXSIZEOF(filenames); n++ )
1324
const wxString fname = filenames[n];
1325
wxString ext = fname.AfterLast(_T('.'));
1326
wxFileType *ft = wxTheMimeTypesManager->GetFileTypeFromExtension(ext);
1329
wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext.c_str());
1334
if ( !ft->GetDescription(&desc) )
1335
desc = _T("<no description>");
1338
if ( !ft->GetOpenCommand(&cmd,
1339
wxFileType::MessageParameters(fname, wxEmptyString)) )
1340
cmd = _T("<no command available>");
1342
cmd = wxString(_T('"')) + cmd + _T('"');
1344
wxPrintf(_T("To open %s (%s) do %s.\n"),
1345
fname.c_str(), desc.c_str(), cmd.c_str());
1351
wxPuts(wxEmptyString);
1354
static void TestMimeAssociate()
1356
wxPuts(_T("*** Testing creation of filetype association ***\n"));
1358
wxFileTypeInfo ftInfo(
1359
_T("application/x-xyz"),
1360
_T("xyzview '%s'"), // open cmd
1361
_T(""), // print cmd
1362
_T("XYZ File"), // description
1363
_T(".xyz"), // extensions
1364
NULL // end of extensions
1366
ftInfo.SetShortDesc(_T("XYZFile")); // used under Win32 only
1368
wxFileType *ft = wxTheMimeTypesManager->Associate(ftInfo);
1371
wxPuts(_T("ERROR: failed to create association!"));
1375
// TODO: read it back
1379
wxPuts(wxEmptyString);
1384
// ----------------------------------------------------------------------------
1385
// misc information functions
1386
// ----------------------------------------------------------------------------
1388
#ifdef TEST_INFO_FUNCTIONS
1390
#include "wx/utils.h"
1392
static void TestDiskInfo()
1394
wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
1398
wxChar pathname[128];
1399
wxPrintf(_T("\nEnter a directory name: "));
1400
if ( !wxFgets(pathname, WXSIZEOF(pathname), stdin) )
1403
// kill the last '\n'
1404
pathname[wxStrlen(pathname) - 1] = 0;
1406
wxLongLong total, free;
1407
if ( !wxGetDiskSpace(pathname, &total, &free) )
1409
wxPuts(_T("ERROR: wxGetDiskSpace failed."));
1413
wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
1414
(total / 1024).ToString().c_str(),
1415
(free / 1024).ToString().c_str(),
1421
static void TestOsInfo()
1423
wxPuts(_T("*** Testing OS info functions ***\n"));
1426
wxGetOsVersion(&major, &minor);
1427
wxPrintf(_T("Running under: %s, version %d.%d\n"),
1428
wxGetOsDescription().c_str(), major, minor);
1430
wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
1432
wxPrintf(_T("Host name is %s (%s).\n"),
1433
wxGetHostName().c_str(), wxGetFullHostName().c_str());
1435
wxPuts(wxEmptyString);
1438
static void TestUserInfo()
1440
wxPuts(_T("*** Testing user info functions ***\n"));
1442
wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
1443
wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
1444
wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
1445
wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
1447
wxPuts(wxEmptyString);
1450
#endif // TEST_INFO_FUNCTIONS
1452
// ----------------------------------------------------------------------------
1454
// ----------------------------------------------------------------------------
1456
#ifdef TEST_PATHLIST
1459
#define CMD_IN_PATH _T("ls")
1461
#define CMD_IN_PATH _T("command.com")
1464
static void TestPathList()
1466
wxPuts(_T("*** Testing wxPathList ***\n"));
1468
wxPathList pathlist;
1469
pathlist.AddEnvList(_T("PATH"));
1470
wxString path = pathlist.FindValidPath(CMD_IN_PATH);
1473
wxPrintf(_T("ERROR: command not found in the path.\n"));
1477
wxPrintf(_T("Command found in the path as '%s'.\n"), path.c_str());
1481
#endif // TEST_PATHLIST
1483
// ----------------------------------------------------------------------------
1484
// regular expressions
1485
// ----------------------------------------------------------------------------
1489
#include "wx/regex.h"
1491
static void TestRegExInteractive()
1493
wxPuts(_T("*** Testing RE interactively ***"));
1497
wxChar pattern[128];
1498
wxPrintf(_T("\nEnter a pattern: "));
1499
if ( !wxFgets(pattern, WXSIZEOF(pattern), stdin) )
1502
// kill the last '\n'
1503
pattern[wxStrlen(pattern) - 1] = 0;
1506
if ( !re.Compile(pattern) )
1514
wxPrintf(_T("Enter text to match: "));
1515
if ( !wxFgets(text, WXSIZEOF(text), stdin) )
1518
// kill the last '\n'
1519
text[wxStrlen(text) - 1] = 0;
1521
if ( !re.Matches(text) )
1523
wxPrintf(_T("No match.\n"));
1527
wxPrintf(_T("Pattern matches at '%s'\n"), re.GetMatch(text).c_str());
1530
for ( size_t n = 1; ; n++ )
1532
if ( !re.GetMatch(&start, &len, n) )
1537
wxPrintf(_T("Subexpr %u matched '%s'\n"),
1538
n, wxString(text + start, len).c_str());
1545
#endif // TEST_REGEX
1547
// ----------------------------------------------------------------------------
1549
// ----------------------------------------------------------------------------
1559
static void TestDbOpen()
1567
// ----------------------------------------------------------------------------
1569
// ----------------------------------------------------------------------------
1572
NB: this stuff was taken from the glibc test suite and modified to build
1573
in wxWidgets: if I read the copyright below properly, this shouldn't
1579
#ifdef wxTEST_PRINTF
1580
// use our functions from wxchar.cpp
1584
// NB: do _not_ use ATTRIBUTE_PRINTF here, we have some invalid formats
1585
// in the tests below
1586
int wxPrintf( const wxChar *format, ... );
1587
int wxSprintf( wxChar *str, const wxChar *format, ... );
1590
#include "wx/longlong.h"
1594
static void rfg1 (void);
1595
static void rfg2 (void);
1599
fmtchk (const wxChar *fmt)
1601
(void) wxPrintf(_T("%s:\t`"), fmt);
1602
(void) wxPrintf(fmt, 0x12);
1603
(void) wxPrintf(_T("'\n"));
1607
fmtst1chk (const wxChar *fmt)
1609
(void) wxPrintf(_T("%s:\t`"), fmt);
1610
(void) wxPrintf(fmt, 4, 0x12);
1611
(void) wxPrintf(_T("'\n"));
1615
fmtst2chk (const wxChar *fmt)
1617
(void) wxPrintf(_T("%s:\t`"), fmt);
1618
(void) wxPrintf(fmt, 4, 4, 0x12);
1619
(void) wxPrintf(_T("'\n"));
1622
/* This page is covered by the following copyright: */
1624
/* (C) Copyright C E Chew
1626
* Feel free to copy, use and distribute this software provided:
1628
* 1. you do not pretend that you wrote it
1629
* 2. you leave this copyright notice intact.
1633
* Extracted from exercise.c for glibc-1.05 bug report by Bruce Evans.
1640
/* Formatted Output Test
1642
* This exercises the output formatting code.
1645
wxChar *PointerNull = NULL;
1652
wxChar *prefix = buf;
1655
wxPuts(_T("\nFormatted output test"));
1656
wxPrintf(_T("prefix 6d 6o 6x 6X 6u\n"));
1657
wxStrcpy(prefix, _T("%"));
1658
for (i = 0; i < 2; i++) {
1659
for (j = 0; j < 2; j++) {
1660
for (k = 0; k < 2; k++) {
1661
for (l = 0; l < 2; l++) {
1662
wxStrcpy(prefix, _T("%"));
1663
if (i == 0) wxStrcat(prefix, _T("-"));
1664
if (j == 0) wxStrcat(prefix, _T("+"));
1665
if (k == 0) wxStrcat(prefix, _T("#"));
1666
if (l == 0) wxStrcat(prefix, _T("0"));
1667
wxPrintf(_T("%5s |"), prefix);
1668
wxStrcpy(tp, prefix);
1669
wxStrcat(tp, _T("6d |"));
1671
wxStrcpy(tp, prefix);
1672
wxStrcat(tp, _T("6o |"));
1674
wxStrcpy(tp, prefix);
1675
wxStrcat(tp, _T("6x |"));
1677
wxStrcpy(tp, prefix);
1678
wxStrcat(tp, _T("6X |"));
1680
wxStrcpy(tp, prefix);
1681
wxStrcat(tp, _T("6u |"));
1688
wxPrintf(_T("%10s\n"), PointerNull);
1689
wxPrintf(_T("%-10s\n"), PointerNull);
1692
static void TestPrintf()
1694
static wxChar shortstr[] = _T("Hi, Z.");
1695
static wxChar longstr[] = _T("Good morning, Doctor Chandra. This is Hal. \
1696
I am ready for my first lesson today.");
1698
wxString test_format;
1702
fmtchk(_T("%4.4x"));
1703
fmtchk(_T("%04.4x"));
1704
fmtchk(_T("%4.3x"));
1705
fmtchk(_T("%04.3x"));
1707
fmtst1chk(_T("%.*x"));
1708
fmtst1chk(_T("%0*x"));
1709
fmtst2chk(_T("%*.*x"));
1710
fmtst2chk(_T("%0*.*x"));
1712
wxString bad_format = _T("bad format:\t\"%b\"\n");
1713
wxPrintf(bad_format.c_str());
1714
wxPrintf(_T("nil pointer (padded):\t\"%10p\"\n"), (void *) NULL);
1716
wxPrintf(_T("decimal negative:\t\"%d\"\n"), -2345);
1717
wxPrintf(_T("octal negative:\t\"%o\"\n"), -2345);
1718
wxPrintf(_T("hex negative:\t\"%x\"\n"), -2345);
1719
wxPrintf(_T("long decimal number:\t\"%ld\"\n"), -123456L);
1720
wxPrintf(_T("long octal negative:\t\"%lo\"\n"), -2345L);
1721
wxPrintf(_T("long unsigned decimal number:\t\"%lu\"\n"), -123456L);
1722
wxPrintf(_T("zero-padded LDN:\t\"%010ld\"\n"), -123456L);
1723
test_format = _T("left-adjusted ZLDN:\t\"%-010ld\"\n");
1724
wxPrintf(test_format.c_str(), -123456);
1725
wxPrintf(_T("space-padded LDN:\t\"%10ld\"\n"), -123456L);
1726
wxPrintf(_T("left-adjusted SLDN:\t\"%-10ld\"\n"), -123456L);
1728
test_format = _T("zero-padded string:\t\"%010s\"\n");
1729
wxPrintf(test_format.c_str(), shortstr);
1730
test_format = _T("left-adjusted Z string:\t\"%-010s\"\n");
1731
wxPrintf(test_format.c_str(), shortstr);
1732
wxPrintf(_T("space-padded string:\t\"%10s\"\n"), shortstr);
1733
wxPrintf(_T("left-adjusted S string:\t\"%-10s\"\n"), shortstr);
1734
wxPrintf(_T("null string:\t\"%s\"\n"), PointerNull);
1735
wxPrintf(_T("limited string:\t\"%.22s\"\n"), longstr);
1737
wxPrintf(_T("e-style >= 1:\t\"%e\"\n"), 12.34);
1738
wxPrintf(_T("e-style >= .1:\t\"%e\"\n"), 0.1234);
1739
wxPrintf(_T("e-style < .1:\t\"%e\"\n"), 0.001234);
1740
wxPrintf(_T("e-style big:\t\"%.60e\"\n"), 1e20);
1741
wxPrintf(_T("e-style == .1:\t\"%e\"\n"), 0.1);
1742
wxPrintf(_T("f-style >= 1:\t\"%f\"\n"), 12.34);
1743
wxPrintf(_T("f-style >= .1:\t\"%f\"\n"), 0.1234);
1744
wxPrintf(_T("f-style < .1:\t\"%f\"\n"), 0.001234);
1745
wxPrintf(_T("g-style >= 1:\t\"%g\"\n"), 12.34);
1746
wxPrintf(_T("g-style >= .1:\t\"%g\"\n"), 0.1234);
1747
wxPrintf(_T("g-style < .1:\t\"%g\"\n"), 0.001234);
1748
wxPrintf(_T("g-style big:\t\"%.60g\"\n"), 1e20);
1750
wxPrintf (_T(" %6.5f\n"), .099999999860301614);
1751
wxPrintf (_T(" %6.5f\n"), .1);
1752
wxPrintf (_T("x%5.4fx\n"), .5);
1754
wxPrintf (_T("%#03x\n"), 1);
1756
//wxPrintf (_T("something really insane: %.10000f\n"), 1.0);
1762
while (niter-- != 0)
1763
wxPrintf (_T("%.17e\n"), d / 2);
1768
// Open Watcom cause compiler error here
1769
// Error! E173: col(24) floating-point constant too small to represent
1770
wxPrintf (_T("%15.5e\n"), 4.9406564584124654e-324);
1773
#define FORMAT _T("|%12.4f|%12.4e|%12.4g|\n")
1774
wxPrintf (FORMAT, 0.0, 0.0, 0.0);
1775
wxPrintf (FORMAT, 1.0, 1.0, 1.0);
1776
wxPrintf (FORMAT, -1.0, -1.0, -1.0);
1777
wxPrintf (FORMAT, 100.0, 100.0, 100.0);
1778
wxPrintf (FORMAT, 1000.0, 1000.0, 1000.0);
1779
wxPrintf (FORMAT, 10000.0, 10000.0, 10000.0);
1780
wxPrintf (FORMAT, 12345.0, 12345.0, 12345.0);
1781
wxPrintf (FORMAT, 100000.0, 100000.0, 100000.0);
1782
wxPrintf (FORMAT, 123456.0, 123456.0, 123456.0);
1787
int rc = wxSnprintf (buf, WXSIZEOF(buf), _T("%30s"), _T("foo"));
1789
wxPrintf(_T("snprintf (\"%%30s\", \"foo\") == %d, \"%.*s\"\n"),
1790
rc, WXSIZEOF(buf), buf);
1793
wxPrintf ("snprintf (\"%%.999999u\", 10)\n",
1794
wxSnprintf(buf2, WXSIZEOFbuf2), "%.999999u", 10));
1800
wxPrintf (_T("%e should be 1.234568e+06\n"), 1234567.8);
1801
wxPrintf (_T("%f should be 1234567.800000\n"), 1234567.8);
1802
wxPrintf (_T("%g should be 1.23457e+06\n"), 1234567.8);
1803
wxPrintf (_T("%g should be 123.456\n"), 123.456);
1804
wxPrintf (_T("%g should be 1e+06\n"), 1000000.0);
1805
wxPrintf (_T("%g should be 10\n"), 10.0);
1806
wxPrintf (_T("%g should be 0.02\n"), 0.02);
1810
wxPrintf(_T("%.17f\n"),(1.0/x/10.0+1.0)*x-x);
1816
wxSprintf(buf,_T("%*s%*s%*s"),-1,_T("one"),-20,_T("two"),-30,_T("three"));
1818
result |= wxStrcmp (buf,
1819
_T("onetwo three "));
1821
wxPuts (result != 0 ? _T("Test failed!") : _T("Test ok."));
1828
wxSprintf(buf, _T("%07") wxLongLongFmtSpec _T("o"), wxLL(040000000000));
1830
// for some reason below line fails under Borland
1831
wxPrintf (_T("sprintf (buf, \"%%07Lo\", 040000000000ll) = %s"), buf);
1834
if (wxStrcmp (buf, _T("40000000000")) != 0)
1837
wxPuts (_T("\tFAILED"));
1839
wxUnusedVar(result);
1840
wxPuts (wxEmptyString);
1842
#endif // wxLongLong_t
1844
wxPrintf (_T("printf (\"%%hhu\", %u) = %hhu\n"), UCHAR_MAX + 2, UCHAR_MAX + 2);
1845
wxPrintf (_T("printf (\"%%hu\", %u) = %hu\n"), USHRT_MAX + 2, USHRT_MAX + 2);
1847
wxPuts (_T("--- Should be no further output. ---"));
1856
memset (bytes, '\xff', sizeof bytes);
1857
wxSprintf (buf, _T("foo%hhn\n"), &bytes[3]);
1858
if (bytes[0] != '\xff' || bytes[1] != '\xff' || bytes[2] != '\xff'
1859
|| bytes[4] != '\xff' || bytes[5] != '\xff' || bytes[6] != '\xff')
1861
wxPuts (_T("%hhn overwrite more bytes"));
1866
wxPuts (_T("%hhn wrote incorrect value"));
1878
wxSprintf (buf, _T("%5.s"), _T("xyz"));
1879
if (wxStrcmp (buf, _T(" ")) != 0)
1880
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" "));
1881
wxSprintf (buf, _T("%5.f"), 33.3);
1882
if (wxStrcmp (buf, _T(" 33")) != 0)
1883
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 33"));
1884
wxSprintf (buf, _T("%8.e"), 33.3e7);
1885
if (wxStrcmp (buf, _T(" 3e+08")) != 0)
1886
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3e+08"));
1887
wxSprintf (buf, _T("%8.E"), 33.3e7);
1888
if (wxStrcmp (buf, _T(" 3E+08")) != 0)
1889
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3E+08"));
1890
wxSprintf (buf, _T("%.g"), 33.3);
1891
if (wxStrcmp (buf, _T("3e+01")) != 0)
1892
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3e+01"));
1893
wxSprintf (buf, _T("%.G"), 33.3);
1894
if (wxStrcmp (buf, _T("3E+01")) != 0)
1895
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3E+01"));
1903
wxString test_format;
1906
wxSprintf (buf, _T("%.*g"), prec, 3.3);
1907
if (wxStrcmp (buf, _T("3")) != 0)
1908
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3"));
1910
wxSprintf (buf, _T("%.*G"), prec, 3.3);
1911
if (wxStrcmp (buf, _T("3")) != 0)
1912
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T("3"));
1914
wxSprintf (buf, _T("%7.*G"), prec, 3.33);
1915
if (wxStrcmp (buf, _T(" 3")) != 0)
1916
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 3"));
1918
test_format = _T("%04.*o");
1919
wxSprintf (buf, test_format.c_str(), prec, 33);
1920
if (wxStrcmp (buf, _T(" 041")) != 0)
1921
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 041"));
1923
test_format = _T("%09.*u");
1924
wxSprintf (buf, test_format.c_str(), prec, 33);
1925
if (wxStrcmp (buf, _T(" 0000033")) != 0)
1926
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 0000033"));
1928
test_format = _T("%04.*x");
1929
wxSprintf (buf, test_format.c_str(), prec, 33);
1930
if (wxStrcmp (buf, _T(" 021")) != 0)
1931
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 021"));
1933
test_format = _T("%04.*X");
1934
wxSprintf (buf, test_format.c_str(), prec, 33);
1935
if (wxStrcmp (buf, _T(" 021")) != 0)
1936
wxPrintf (_T("got: '%s', expected: '%s'\n"), buf, _T(" 021"));
1939
#endif // TEST_PRINTF
1941
// ----------------------------------------------------------------------------
1942
// registry and related stuff
1943
// ----------------------------------------------------------------------------
1945
// this is for MSW only
1948
#undef TEST_REGISTRY
1953
#include "wx/confbase.h"
1954
#include "wx/msw/regconf.h"
1957
static void TestRegConfWrite()
1959
wxConfig *config = new wxConfig(_T("myapp"));
1960
config->SetPath(_T("/group1"));
1961
config->Write(_T("entry1"), _T("foo"));
1962
config->SetPath(_T("/group2"));
1963
config->Write(_T("entry1"), _T("bar"));
1967
static void TestRegConfRead()
1969
wxConfig *config = new wxConfig(_T("myapp"));
1973
config->SetPath(_T("/"));
1974
wxPuts(_T("Enumerating / subgroups:"));
1975
bool bCont = config->GetFirstGroup(str, dummy);
1979
bCont = config->GetNextGroup(str, dummy);
1983
#endif // TEST_REGCONF
1985
#ifdef TEST_REGISTRY
1987
#include "wx/msw/registry.h"
1989
// I chose this one because I liked its name, but it probably only exists under
1991
static const wxChar *TESTKEY =
1992
_T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
1994
static void TestRegistryRead()
1996
wxPuts(_T("*** testing registry reading ***"));
1998
wxRegKey key(TESTKEY);
1999
wxPrintf(_T("The test key name is '%s'.\n"), key.GetName().c_str());
2002
wxPuts(_T("ERROR: test key can't be opened, aborting test."));
2007
size_t nSubKeys, nValues;
2008
if ( key.GetKeyInfo(&nSubKeys, NULL, &nValues, NULL) )
2010
wxPrintf(_T("It has %u subkeys and %u values.\n"), nSubKeys, nValues);
2013
wxPrintf(_T("Enumerating values:\n"));
2017
bool cont = key.GetFirstValue(value, dummy);
2020
wxPrintf(_T("Value '%s': type "), value.c_str());
2021
switch ( key.GetValueType(value) )
2023
case wxRegKey::Type_None: wxPrintf(_T("ERROR (none)")); break;
2024
case wxRegKey::Type_String: wxPrintf(_T("SZ")); break;
2025
case wxRegKey::Type_Expand_String: wxPrintf(_T("EXPAND_SZ")); break;
2026
case wxRegKey::Type_Binary: wxPrintf(_T("BINARY")); break;
2027
case wxRegKey::Type_Dword: wxPrintf(_T("DWORD")); break;
2028
case wxRegKey::Type_Multi_String: wxPrintf(_T("MULTI_SZ")); break;
2029
default: wxPrintf(_T("other (unknown)")); break;
2032
wxPrintf(_T(", value = "));
2033
if ( key.IsNumericValue(value) )
2036
key.QueryValue(value, &val);
2037
wxPrintf(_T("%ld"), val);
2042
key.QueryValue(value, val);
2043
wxPrintf(_T("'%s'"), val.c_str());
2045
key.QueryRawValue(value, val);
2046
wxPrintf(_T(" (raw value '%s')"), val.c_str());
2051
cont = key.GetNextValue(value, dummy);
2055
static void TestRegistryAssociation()
2058
The second call to deleteself genertaes an error message, with a
2059
messagebox saying .flo is crucial to system operation, while the .ddf
2060
call also fails, but with no error message
2065
key.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2067
key = _T("ddxf_auto_file") ;
2068
key.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2070
key = _T("ddxf_auto_file") ;
2071
key.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2073
key = _T("program,0") ;
2074
key.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2076
key = _T("program \"%1\"") ;
2078
key.SetName(_T("HKEY_CLASSES_ROOT\\.ddf") );
2080
key.SetName(_T("HKEY_CLASSES_ROOT\\.flo") );
2082
key.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon"));
2084
key.SetName(_T("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command"));
2088
#endif // TEST_REGISTRY
2090
// ----------------------------------------------------------------------------
2092
// ----------------------------------------------------------------------------
2094
#ifdef TEST_SCOPEGUARD
2096
#include "wx/scopeguard.h"
2098
static void function0() { puts("function0()"); }
2099
static void function1(int n) { printf("function1(%d)\n", n); }
2100
static void function2(double x, char c) { printf("function2(%g, %c)\n", x, c); }
2104
void method0() { printf("method0()\n"); }
2105
void method1(int n) { printf("method1(%d)\n", n); }
2106
void method2(double x, char c) { printf("method2(%g, %c)\n", x, c); }
2109
static void TestScopeGuard()
2111
wxON_BLOCK_EXIT0(function0);
2112
wxON_BLOCK_EXIT1(function1, 17);
2113
wxON_BLOCK_EXIT2(function2, 3.14, 'p');
2116
wxON_BLOCK_EXIT_OBJ0(obj, &Object::method0);
2117
wxON_BLOCK_EXIT_OBJ1(obj, &Object::method1, 7);
2118
wxON_BLOCK_EXIT_OBJ2(obj, &Object::method2, 2.71, 'e');
2120
wxScopeGuard dismissed = wxMakeGuard(function0);
2121
dismissed.Dismiss();
2126
// ----------------------------------------------------------------------------
2128
// ----------------------------------------------------------------------------
2132
#include "wx/socket.h"
2133
#include "wx/protocol/protocol.h"
2134
#include "wx/protocol/http.h"
2136
static void TestSocketServer()
2138
wxPuts(_T("*** Testing wxSocketServer ***\n"));
2140
static const int PORT = 3000;
2145
wxSocketServer *server = new wxSocketServer(addr);
2146
if ( !server->Ok() )
2148
wxPuts(_T("ERROR: failed to bind"));
2156
wxPrintf(_T("Server: waiting for connection on port %d...\n"), PORT);
2158
wxSocketBase *socket = server->Accept();
2161
wxPuts(_T("ERROR: wxSocketServer::Accept() failed."));
2165
wxPuts(_T("Server: got a client."));
2167
server->SetTimeout(60); // 1 min
2170
while ( !close && socket->IsConnected() )
2173
wxChar ch = _T('\0');
2176
if ( socket->Read(&ch, sizeof(ch)).Error() )
2178
// don't log error if the client just close the connection
2179
if ( socket->IsConnected() )
2181
wxPuts(_T("ERROR: in wxSocket::Read."));
2201
wxPrintf(_T("Server: got '%s'.\n"), s.c_str());
2202
if ( s == _T("close") )
2204
wxPuts(_T("Closing connection"));
2208
else if ( s == _T("quit") )
2213
wxPuts(_T("Shutting down the server"));
2215
else // not a special command
2217
socket->Write(s.MakeUpper().c_str(), s.length());
2218
socket->Write("\r\n", 2);
2219
wxPrintf(_T("Server: wrote '%s'.\n"), s.c_str());
2225
wxPuts(_T("Server: lost a client unexpectedly."));
2231
// same as "delete server" but is consistent with GUI programs
2235
static void TestSocketClient()
2237
wxPuts(_T("*** Testing wxSocketClient ***\n"));
2239
static const wxChar *hostname = _T("www.wxwidgets.org");
2242
addr.Hostname(hostname);
2245
wxPrintf(_T("--- Attempting to connect to %s:80...\n"), hostname);
2247
wxSocketClient client;
2248
if ( !client.Connect(addr) )
2250
wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
2254
wxPrintf(_T("--- Connected to %s:%u...\n"),
2255
addr.Hostname().c_str(), addr.Service());
2259
// could use simply "GET" here I suppose
2261
wxString::Format(_T("GET http://%s/\r\n"), hostname);
2262
client.Write(cmdGet, cmdGet.length());
2263
wxPrintf(_T("--- Sent command '%s' to the server\n"),
2264
MakePrintable(cmdGet).c_str());
2265
client.Read(buf, WXSIZEOF(buf));
2266
wxPrintf(_T("--- Server replied:\n%s"), buf);
2270
#endif // TEST_SOCKETS
2272
// ----------------------------------------------------------------------------
2274
// ----------------------------------------------------------------------------
2278
#include "wx/protocol/ftp.h"
2282
#define FTP_ANONYMOUS
2284
#ifdef FTP_ANONYMOUS
2285
static const wxChar *directory = _T("/pub");
2286
static const wxChar *filename = _T("welcome.msg");
2288
static const wxChar *directory = _T("/etc");
2289
static const wxChar *filename = _T("issue");
2292
static bool TestFtpConnect()
2294
wxPuts(_T("*** Testing FTP connect ***"));
2296
#ifdef FTP_ANONYMOUS
2297
static const wxChar *hostname = _T("ftp.wxwidgets.org");
2299
wxPrintf(_T("--- Attempting to connect to %s:21 anonymously...\n"), hostname);
2300
#else // !FTP_ANONYMOUS
2301
static const wxChar *hostname = "localhost";
2304
wxFgets(user, WXSIZEOF(user), stdin);
2305
user[wxStrlen(user) - 1] = '\0'; // chop off '\n'
2308
wxChar password[256];
2309
wxPrintf(_T("Password for %s: "), password);
2310
wxFgets(password, WXSIZEOF(password), stdin);
2311
password[wxStrlen(password) - 1] = '\0'; // chop off '\n'
2312
ftp.SetPassword(password);
2314
wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname, user);
2315
#endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
2317
if ( !ftp.Connect(hostname) )
2319
wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
2325
wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
2326
hostname, ftp.Pwd().c_str());
2333
// test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
2334
static void TestFtpWuFtpd()
2337
static const wxChar *hostname = _T("ftp.eudora.com");
2338
if ( !ftp.Connect(hostname) )
2340
wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
2344
static const wxChar *filename = _T("eudora/pubs/draft-gellens-submit-09.txt");
2345
wxInputStream *in = ftp.GetInputStream(filename);
2348
wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename);
2352
size_t size = in->GetSize();
2353
wxPrintf(_T("Reading file %s (%u bytes)..."), filename, size);
2355
wxChar *data = new wxChar[size];
2356
if ( !in->Read(data, size) )
2358
wxPuts(_T("ERROR: read error"));
2362
wxPrintf(_T("Successfully retrieved the file.\n"));
2371
static void TestFtpList()
2373
wxPuts(_T("*** Testing wxFTP file listing ***\n"));
2376
if ( !ftp.ChDir(directory) )
2378
wxPrintf(_T("ERROR: failed to cd to %s\n"), directory);
2381
wxPrintf(_T("Current directory is '%s'\n"), ftp.Pwd().c_str());
2383
// test NLIST and LIST
2384
wxArrayString files;
2385
if ( !ftp.GetFilesList(files) )
2387
wxPuts(_T("ERROR: failed to get NLIST of files"));
2391
wxPrintf(_T("Brief list of files under '%s':\n"), ftp.Pwd().c_str());
2392
size_t count = files.GetCount();
2393
for ( size_t n = 0; n < count; n++ )
2395
wxPrintf(_T("\t%s\n"), files[n].c_str());
2397
wxPuts(_T("End of the file list"));
2400
if ( !ftp.GetDirList(files) )
2402
wxPuts(_T("ERROR: failed to get LIST of files"));
2406
wxPrintf(_T("Detailed list of files under '%s':\n"), ftp.Pwd().c_str());
2407
size_t count = files.GetCount();
2408
for ( size_t n = 0; n < count; n++ )
2410
wxPrintf(_T("\t%s\n"), files[n].c_str());
2412
wxPuts(_T("End of the file list"));
2415
if ( !ftp.ChDir(_T("..")) )
2417
wxPuts(_T("ERROR: failed to cd to .."));
2420
wxPrintf(_T("Current directory is '%s'\n"), ftp.Pwd().c_str());
2423
static void TestFtpDownload()
2425
wxPuts(_T("*** Testing wxFTP download ***\n"));
2428
wxInputStream *in = ftp.GetInputStream(filename);
2431
wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename);
2435
size_t size = in->GetSize();
2436
wxPrintf(_T("Reading file %s (%u bytes)..."), filename, size);
2439
wxChar *data = new wxChar[size];
2440
if ( !in->Read(data, size) )
2442
wxPuts(_T("ERROR: read error"));
2446
wxPrintf(_T("\nContents of %s:\n%s\n"), filename, data);
2454
static void TestFtpFileSize()
2456
wxPuts(_T("*** Testing FTP SIZE command ***"));
2458
if ( !ftp.ChDir(directory) )
2460
wxPrintf(_T("ERROR: failed to cd to %s\n"), directory);
2463
wxPrintf(_T("Current directory is '%s'\n"), ftp.Pwd().c_str());
2465
if ( ftp.FileExists(filename) )
2467
int size = ftp.GetFileSize(filename);
2469
wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename);
2471
wxPrintf(_T("Size of '%s' is %d bytes.\n"), filename, size);
2475
wxPrintf(_T("ERROR: '%s' doesn't exist\n"), filename);
2479
static void TestFtpMisc()
2481
wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
2483
if ( ftp.SendCommand(_T("STAT")) != '2' )
2485
wxPuts(_T("ERROR: STAT failed"));
2489
wxPrintf(_T("STAT returned:\n\n%s\n"), ftp.GetLastResult().c_str());
2492
if ( ftp.SendCommand(_T("HELP SITE")) != '2' )
2494
wxPuts(_T("ERROR: HELP SITE failed"));
2498
wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
2499
ftp.GetLastResult().c_str());
2503
static void TestFtpInteractive()
2505
wxPuts(_T("\n*** Interactive wxFTP test ***"));
2511
wxPrintf(_T("Enter FTP command: "));
2512
if ( !wxFgets(buf, WXSIZEOF(buf), stdin) )
2515
// kill the last '\n'
2516
buf[wxStrlen(buf) - 1] = 0;
2518
// special handling of LIST and NLST as they require data connection
2519
wxString start(buf, 4);
2521
if ( start == _T("LIST") || start == _T("NLST") )
2524
if ( wxStrlen(buf) > 4 )
2527
wxArrayString files;
2528
if ( !ftp.GetList(files, wildcard, start == _T("LIST")) )
2530
wxPrintf(_T("ERROR: failed to get %s of files\n"), start.c_str());
2534
wxPrintf(_T("--- %s of '%s' under '%s':\n"),
2535
start.c_str(), wildcard.c_str(), ftp.Pwd().c_str());
2536
size_t count = files.GetCount();
2537
for ( size_t n = 0; n < count; n++ )
2539
wxPrintf(_T("\t%s\n"), files[n].c_str());
2541
wxPuts(_T("--- End of the file list"));
2546
wxChar ch = ftp.SendCommand(buf);
2547
wxPrintf(_T("Command %s"), ch ? _T("succeeded") : _T("failed"));
2550
wxPrintf(_T(" (return code %c)"), ch);
2553
wxPrintf(_T(", server reply:\n%s\n\n"), ftp.GetLastResult().c_str());
2557
wxPuts(_T("\n*** done ***"));
2560
static void TestFtpUpload()
2562
wxPuts(_T("*** Testing wxFTP uploading ***\n"));
2565
static const wxChar *file1 = _T("test1");
2566
static const wxChar *file2 = _T("test2");
2567
wxOutputStream *out = ftp.GetOutputStream(file1);
2570
wxPrintf(_T("--- Uploading to %s ---\n"), file1);
2571
out->Write("First hello", 11);
2575
// send a command to check the remote file
2576
if ( ftp.SendCommand(wxString(_T("STAT ")) + file1) != '2' )
2578
wxPrintf(_T("ERROR: STAT %s failed\n"), file1);
2582
wxPrintf(_T("STAT %s returned:\n\n%s\n"),
2583
file1, ftp.GetLastResult().c_str());
2586
out = ftp.GetOutputStream(file2);
2589
wxPrintf(_T("--- Uploading to %s ---\n"), file1);
2590
out->Write("Second hello", 12);
2597
// ----------------------------------------------------------------------------
2599
// ----------------------------------------------------------------------------
2601
#ifdef TEST_STACKWALKER
2603
#if wxUSE_STACKWALKER
2605
#include "wx/stackwalk.h"
2607
class StackDump : public wxStackWalker
2610
StackDump(const char *argv0)
2611
: wxStackWalker(argv0)
2615
virtual void Walk(size_t skip = 1)
2617
wxPuts(_T("Stack dump:"));
2619
wxStackWalker::Walk(skip);
2623
virtual void OnStackFrame(const wxStackFrame& frame)
2625
printf("[%2d] ", frame.GetLevel());
2627
wxString name = frame.GetName();
2628
if ( !name.empty() )
2630
printf("%-20.40s", name.mb_str());
2634
printf("0x%08lx", (unsigned long)frame.GetAddress());
2637
if ( frame.HasSourceLocation() )
2640
frame.GetFileName().mb_str(),
2647
for ( size_t n = 0; frame.GetParam(n, &type, &name, &val); n++ )
2649
printf("\t%s %s = %s\n", type.mb_str(), name.mb_str(), val.mb_str());
2654
static void TestStackWalk(const char *argv0)
2656
wxPuts(_T("*** Testing wxStackWalker ***\n"));
2658
StackDump dump(argv0);
2662
#endif // wxUSE_STACKWALKER
2664
#endif // TEST_STACKWALKER
2666
// ----------------------------------------------------------------------------
2668
// ----------------------------------------------------------------------------
2670
#ifdef TEST_STDPATHS
2672
#include "wx/stdpaths.h"
2674
static void TestStandardPaths()
2676
wxPuts(_T("*** Testing wxStandardPaths ***\n"));
2678
wxTheApp->SetAppName(_T("console"));
2680
wxStandardPathsBase& stdp = wxStandardPaths::Get();
2681
wxPrintf(_T("Config dir (sys):\t%s\n"), stdp.GetConfigDir().c_str());
2682
wxPrintf(_T("Config dir (user):\t%s\n"), stdp.GetUserConfigDir().c_str());
2683
wxPrintf(_T("Data dir (sys):\t\t%s\n"), stdp.GetDataDir().c_str());
2684
wxPrintf(_T("Data dir (sys local):\t%s\n"), stdp.GetLocalDataDir().c_str());
2685
wxPrintf(_T("Data dir (user):\t%s\n"), stdp.GetUserDataDir().c_str());
2686
wxPrintf(_T("Data dir (user local):\t%s\n"), stdp.GetUserLocalDataDir().c_str());
2687
wxPrintf(_T("Plugins dir:\t\t%s\n"), stdp.GetPluginsDir().c_str());
2690
#endif // TEST_STDPATHS
2692
// ----------------------------------------------------------------------------
2694
// ----------------------------------------------------------------------------
2698
#include "wx/wfstream.h"
2699
#include "wx/mstream.h"
2701
static void TestFileStream()
2703
wxPuts(_T("*** Testing wxFileInputStream ***"));
2705
static const wxString filename = _T("testdata.fs");
2707
wxFileOutputStream fsOut(filename);
2708
fsOut.Write("foo", 3);
2711
wxFileInputStream fsIn(filename);
2712
wxPrintf(_T("File stream size: %u\n"), fsIn.GetSize());
2713
while ( !fsIn.Eof() )
2715
wxPutchar(fsIn.GetC());
2718
if ( !wxRemoveFile(filename) )
2720
wxPrintf(_T("ERROR: failed to remove the file '%s'.\n"), filename.c_str());
2723
wxPuts(_T("\n*** wxFileInputStream test done ***"));
2726
static void TestMemoryStream()
2728
wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
2730
wxMemoryOutputStream memOutStream;
2731
wxPrintf(_T("Initially out stream offset: %lu\n"),
2732
(unsigned long)memOutStream.TellO());
2734
for ( const wxChar *p = _T("Hello, stream!"); *p; p++ )
2736
memOutStream.PutC(*p);
2739
wxPrintf(_T("Final out stream offset: %lu\n"),
2740
(unsigned long)memOutStream.TellO());
2742
wxPuts(_T("*** Testing wxMemoryInputStream ***"));
2745
size_t len = memOutStream.CopyTo(buf, WXSIZEOF(buf));
2747
wxMemoryInputStream memInpStream(buf, len);
2748
wxPrintf(_T("Memory stream size: %u\n"), memInpStream.GetSize());
2749
while ( !memInpStream.Eof() )
2751
wxPutchar(memInpStream.GetC());
2754
wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
2757
#endif // TEST_STREAMS
2759
// ----------------------------------------------------------------------------
2761
// ----------------------------------------------------------------------------
2765
#include "wx/stopwatch.h"
2766
#include "wx/utils.h"
2768
static void TestStopWatch()
2770
wxPuts(_T("*** Testing wxStopWatch ***\n"));
2774
wxPrintf(_T("Initially paused, after 2 seconds time is..."));
2777
wxPrintf(_T("\t%ldms\n"), sw.Time());
2779
wxPrintf(_T("Resuming stopwatch and sleeping 3 seconds..."));
2783
wxPrintf(_T("\telapsed time: %ldms\n"), sw.Time());
2786
wxPrintf(_T("Pausing agan and sleeping 2 more seconds..."));
2789
wxPrintf(_T("\telapsed time: %ldms\n"), sw.Time());
2792
wxPrintf(_T("Finally resuming and sleeping 2 more seconds..."));
2795
wxPrintf(_T("\telapsed time: %ldms\n"), sw.Time());
2798
wxPuts(_T("\nChecking for 'backwards clock' bug..."));
2799
for ( size_t n = 0; n < 70; n++ )
2803
for ( size_t m = 0; m < 100000; m++ )
2805
if ( sw.Time() < 0 || sw2.Time() < 0 )
2807
wxPuts(_T("\ntime is negative - ERROR!"));
2815
wxPuts(_T(", ok."));
2818
#endif // TEST_TIMER
2820
// ----------------------------------------------------------------------------
2822
// ----------------------------------------------------------------------------
2826
#include "wx/vcard.h"
2828
static void DumpVObject(size_t level, const wxVCardObject& vcard)
2831
wxVCardObject *vcObj = vcard.GetFirstProp(&cookie);
2834
wxPrintf(_T("%s%s"),
2835
wxString(_T('\t'), level).c_str(),
2836
vcObj->GetName().c_str());
2839
switch ( vcObj->GetType() )
2841
case wxVCardObject::String:
2842
case wxVCardObject::UString:
2845
vcObj->GetValue(&val);
2846
value << _T('"') << val << _T('"');
2850
case wxVCardObject::Int:
2853
vcObj->GetValue(&i);
2854
value.Printf(_T("%u"), i);
2858
case wxVCardObject::Long:
2861
vcObj->GetValue(&l);
2862
value.Printf(_T("%lu"), l);
2866
case wxVCardObject::None:
2869
case wxVCardObject::Object:
2870
value = _T("<node>");
2874
value = _T("<unknown value type>");
2878
wxPrintf(_T(" = %s"), value.c_str());
2881
DumpVObject(level + 1, *vcObj);
2884
vcObj = vcard.GetNextProp(&cookie);
2888
static void DumpVCardAddresses(const wxVCard& vcard)
2890
wxPuts(_T("\nShowing all addresses from vCard:\n"));
2894
wxVCardAddress *addr = vcard.GetFirstAddress(&cookie);
2898
int flags = addr->GetFlags();
2899
if ( flags & wxVCardAddress::Domestic )
2901
flagsStr << _T("domestic ");
2903
if ( flags & wxVCardAddress::Intl )
2905
flagsStr << _T("international ");
2907
if ( flags & wxVCardAddress::Postal )
2909
flagsStr << _T("postal ");
2911
if ( flags & wxVCardAddress::Parcel )
2913
flagsStr << _T("parcel ");
2915
if ( flags & wxVCardAddress::Home )
2917
flagsStr << _T("home ");
2919
if ( flags & wxVCardAddress::Work )
2921
flagsStr << _T("work ");
2924
wxPrintf(_T("Address %u:\n")
2926
"\tvalue = %s;%s;%s;%s;%s;%s;%s\n",
2929
addr->GetPostOffice().c_str(),
2930
addr->GetExtAddress().c_str(),
2931
addr->GetStreet().c_str(),
2932
addr->GetLocality().c_str(),
2933
addr->GetRegion().c_str(),
2934
addr->GetPostalCode().c_str(),
2935
addr->GetCountry().c_str()
2939
addr = vcard.GetNextAddress(&cookie);
2943
static void DumpVCardPhoneNumbers(const wxVCard& vcard)
2945
wxPuts(_T("\nShowing all phone numbers from vCard:\n"));
2949
wxVCardPhoneNumber *phone = vcard.GetFirstPhoneNumber(&cookie);
2953
int flags = phone->GetFlags();
2954
if ( flags & wxVCardPhoneNumber::Voice )
2956
flagsStr << _T("voice ");
2958
if ( flags & wxVCardPhoneNumber::Fax )
2960
flagsStr << _T("fax ");
2962
if ( flags & wxVCardPhoneNumber::Cellular )
2964
flagsStr << _T("cellular ");
2966
if ( flags & wxVCardPhoneNumber::Modem )
2968
flagsStr << _T("modem ");
2970
if ( flags & wxVCardPhoneNumber::Home )
2972
flagsStr << _T("home ");
2974
if ( flags & wxVCardPhoneNumber::Work )
2976
flagsStr << _T("work ");
2979
wxPrintf(_T("Phone number %u:\n")
2984
phone->GetNumber().c_str()
2988
phone = vcard.GetNextPhoneNumber(&cookie);
2992
static void TestVCardRead()
2994
wxPuts(_T("*** Testing wxVCard reading ***\n"));
2996
wxVCard vcard(_T("vcard.vcf"));
2997
if ( !vcard.IsOk() )
2999
wxPuts(_T("ERROR: couldn't load vCard."));
3003
// read individual vCard properties
3004
wxVCardObject *vcObj = vcard.GetProperty("FN");
3008
vcObj->GetValue(&value);
3013
value = _T("<none>");
3016
wxPrintf(_T("Full name retrieved directly: %s\n"), value.c_str());
3019
if ( !vcard.GetFullName(&value) )
3021
value = _T("<none>");
3024
wxPrintf(_T("Full name from wxVCard API: %s\n"), value.c_str());
3026
// now show how to deal with multiply occurring properties
3027
DumpVCardAddresses(vcard);
3028
DumpVCardPhoneNumbers(vcard);
3030
// and finally show all
3031
wxPuts(_T("\nNow dumping the entire vCard:\n")
3032
"-----------------------------\n");
3034
DumpVObject(0, vcard);
3038
static void TestVCardWrite()
3040
wxPuts(_T("*** Testing wxVCard writing ***\n"));
3043
if ( !vcard.IsOk() )
3045
wxPuts(_T("ERROR: couldn't create vCard."));
3050
vcard.SetName("Zeitlin", "Vadim");
3051
vcard.SetFullName("Vadim Zeitlin");
3052
vcard.SetOrganization("wxWidgets", "R&D");
3054
// just dump the vCard back
3055
wxPuts(_T("Entire vCard follows:\n"));
3056
wxPuts(vcard.Write());
3060
#endif // TEST_VCARD
3062
// ----------------------------------------------------------------------------
3064
// ----------------------------------------------------------------------------
3066
#if !defined(__WIN32__) || !wxUSE_FSVOLUME
3072
#include "wx/volume.h"
3074
static const wxChar *volumeKinds[] =
3080
_T("network volume"),
3084
static void TestFSVolume()
3086
wxPuts(_T("*** Testing wxFSVolume class ***"));
3088
wxArrayString volumes = wxFSVolume::GetVolumes();
3089
size_t count = volumes.GetCount();
3093
wxPuts(_T("ERROR: no mounted volumes?"));
3097
wxPrintf(_T("%u mounted volumes found:\n"), count);
3099
for ( size_t n = 0; n < count; n++ )
3101
wxFSVolume vol(volumes[n]);
3104
wxPuts(_T("ERROR: couldn't create volume"));
3108
wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
3110
vol.GetDisplayName().c_str(),
3111
vol.GetName().c_str(),
3112
volumeKinds[vol.GetKind()],
3113
vol.IsWritable() ? _T("rw") : _T("ro"),
3114
vol.GetFlags() & wxFS_VOL_REMOVABLE ? _T("removable")
3119
#endif // TEST_VOLUME
3121
// ----------------------------------------------------------------------------
3122
// wide char and Unicode support
3123
// ----------------------------------------------------------------------------
3127
#include "wx/strconv.h"
3128
#include "wx/fontenc.h"
3129
#include "wx/encconv.h"
3130
#include "wx/buffer.h"
3132
static const unsigned char utf8koi8r[] =
3134
208, 157, 208, 181, 209, 129, 208, 186, 208, 176, 208, 183, 208, 176,
3135
208, 189, 208, 189, 208, 190, 32, 208, 191, 208, 190, 209, 128, 208,
3136
176, 208, 180, 208, 190, 208, 178, 208, 176, 208, 187, 32, 208, 188,
3137
208, 181, 208, 189, 209, 143, 32, 209, 129, 208, 178, 208, 190, 208,
3138
181, 208, 185, 32, 208, 186, 209, 128, 209, 131, 209, 130, 208, 181,
3139
208, 185, 209, 136, 208, 181, 208, 185, 32, 208, 189, 208, 190, 208,
3140
178, 208, 190, 209, 129, 209, 130, 209, 140, 209, 142, 0
3143
static const unsigned char utf8iso8859_1[] =
3145
0x53, 0x79, 0x73, 0x74, 0xc3, 0xa8, 0x6d, 0x65, 0x73, 0x20, 0x49, 0x6e,
3146
0x74, 0xc3, 0xa9, 0x67, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x65,
3147
0x6e, 0x20, 0x4d, 0xc3, 0xa9, 0x63, 0x61, 0x6e, 0x69, 0x71, 0x75, 0x65,
3148
0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x71, 0x75, 0x65, 0x20, 0x65,
3149
0x74, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x71, 0x75, 0x65, 0
3152
static const unsigned char utf8Invalid[] =
3154
0x3c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3e, 0x32, 0x30, 0x30,
3155
0x32, 0xe5, 0xb9, 0xb4, 0x30, 0x39, 0xe6, 0x9c, 0x88, 0x32, 0x35, 0xe6,
3156
0x97, 0xa5, 0x20, 0x30, 0x37, 0xe6, 0x99, 0x82, 0x33, 0x39, 0xe5, 0x88,
3157
0x86, 0x35, 0x37, 0xe7, 0xa7, 0x92, 0x3c, 0x2f, 0x64, 0x69, 0x73, 0x70,
3161
static const struct Utf8Data
3163
const unsigned char *text;
3165
const wxChar *charset;
3166
wxFontEncoding encoding;
3169
{ utf8Invalid, WXSIZEOF(utf8Invalid), _T("iso8859-1"), wxFONTENCODING_ISO8859_1 },
3170
{ utf8koi8r, WXSIZEOF(utf8koi8r), _T("koi8-r"), wxFONTENCODING_KOI8 },
3171
{ utf8iso8859_1, WXSIZEOF(utf8iso8859_1), _T("iso8859-1"), wxFONTENCODING_ISO8859_1 },
3174
static void TestUtf8()
3176
wxPuts(_T("*** Testing UTF8 support ***\n"));
3181
for ( size_t n = 0; n < WXSIZEOF(utf8data); n++ )
3183
const Utf8Data& u8d = utf8data[n];
3184
if ( wxConvUTF8.MB2WC(wbuf, (const char *)u8d.text,
3185
WXSIZEOF(wbuf)) == (size_t)-1 )
3187
wxPuts(_T("ERROR: UTF-8 decoding failed."));
3191
wxCSConv conv(u8d.charset);
3192
if ( conv.WC2MB(buf, wbuf, WXSIZEOF(buf)) == (size_t)-1 )
3194
wxPrintf(_T("ERROR: conversion to %s failed.\n"), u8d.charset);
3198
wxPrintf(_T("String in %s: %s\n"), u8d.charset, buf);
3202
wxString s(wxConvUTF8.cMB2WC((const char *)u8d.text));
3204
s = _T("<< conversion failed >>");
3205
wxPrintf(_T("String in current cset: %s\n"), s.c_str());
3209
wxPuts(wxEmptyString);
3212
static void TestEncodingConverter()
3214
wxPuts(_T("*** Testing wxEncodingConverter ***\n"));
3216
// using wxEncodingConverter should give the same result as above
3219
if ( wxConvUTF8.MB2WC(wbuf, (const char *)utf8koi8r,
3220
WXSIZEOF(utf8koi8r)) == (size_t)-1 )
3222
wxPuts(_T("ERROR: UTF-8 decoding failed."));
3226
wxEncodingConverter ec;
3227
ec.Init(wxFONTENCODING_UNICODE, wxFONTENCODING_KOI8);
3228
ec.Convert(wbuf, buf);
3229
wxPrintf(_T("The same KOI8-R string using wxEC: %s\n"), buf);
3232
wxPuts(wxEmptyString);
3235
#endif // TEST_WCHAR
3237
// ----------------------------------------------------------------------------
3239
// ----------------------------------------------------------------------------
3243
#include "wx/filesys.h"
3244
#include "wx/fs_zip.h"
3245
#include "wx/zipstrm.h"
3247
static const wxChar *TESTFILE_ZIP = _T("testdata.zip");
3249
static void TestZipStreamRead()
3251
wxPuts(_T("*** Testing ZIP reading ***\n"));
3253
static const wxString filename = _T("foo");
3254
wxZipInputStream istr(TESTFILE_ZIP, filename);
3255
wxPrintf(_T("Archive size: %u\n"), istr.GetSize());
3257
wxPrintf(_T("Dumping the file '%s':\n"), filename.c_str());
3258
while ( !istr.Eof() )
3260
wxPutchar(istr.GetC());
3264
wxPuts(_T("\n----- done ------"));
3267
static void DumpZipDirectory(wxFileSystem& fs,
3268
const wxString& dir,
3269
const wxString& indent)
3271
wxString prefix = wxString::Format(_T("%s#zip:%s"),
3272
TESTFILE_ZIP, dir.c_str());
3273
wxString wildcard = prefix + _T("/*");
3275
wxString dirname = fs.FindFirst(wildcard, wxDIR);
3276
while ( !dirname.empty() )
3278
if ( !dirname.StartsWith(prefix + _T('/'), &dirname) )
3280
wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3285
wxPrintf(_T("%s%s\n"), indent.c_str(), dirname.c_str());
3287
DumpZipDirectory(fs, dirname,
3288
indent + wxString(_T(' '), 4));
3290
dirname = fs.FindNext();
3293
wxString filename = fs.FindFirst(wildcard, wxFILE);
3294
while ( !filename.empty() )
3296
if ( !filename.StartsWith(prefix, &filename) )
3298
wxPrintf(_T("ERROR: unexpected wxFileSystem::FindNext result\n"));
3303
wxPrintf(_T("%s%s\n"), indent.c_str(), filename.c_str());
3305
filename = fs.FindNext();
3309
static void TestZipFileSystem()
3311
wxPuts(_T("*** Testing ZIP file system ***\n"));
3313
wxFileSystem::AddHandler(new wxZipFSHandler);
3315
wxPrintf(_T("Dumping all files in the archive %s:\n"), TESTFILE_ZIP);
3317
DumpZipDirectory(fs, _T(""), wxString(_T(' '), 4));
3322
// ----------------------------------------------------------------------------
3324
// ----------------------------------------------------------------------------
3326
#ifdef TEST_DATETIME
3328
#include "wx/math.h"
3329
#include "wx/datetime.h"
3331
// this test miscellaneous static wxDateTime functions
3335
static void TestTimeStatic()
3337
wxPuts(_T("\n*** wxDateTime static methods test ***"));
3339
// some info about the current date
3340
int year = wxDateTime::GetCurrentYear();
3341
wxPrintf(_T("Current year %d is %sa leap one and has %d days.\n"),
3343
wxDateTime::IsLeapYear(year) ? "" : "not ",
3344
wxDateTime::GetNumberOfDays(year));
3346
wxDateTime::Month month = wxDateTime::GetCurrentMonth();
3347
wxPrintf(_T("Current month is '%s' ('%s') and it has %d days\n"),
3348
wxDateTime::GetMonthName(month, wxDateTime::Name_Abbr).c_str(),
3349
wxDateTime::GetMonthName(month).c_str(),
3350
wxDateTime::GetNumberOfDays(month));
3353
// test time zones stuff
3354
static void TestTimeZones()
3356
wxPuts(_T("\n*** wxDateTime timezone test ***"));
3358
wxDateTime now = wxDateTime::Now();
3360
wxPrintf(_T("Current GMT time:\t%s\n"), now.Format(_T("%c"), wxDateTime::GMT0).c_str());
3361
wxPrintf(_T("Unix epoch (GMT):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::GMT0).c_str());
3362
wxPrintf(_T("Unix epoch (EST):\t%s\n"), wxDateTime((time_t)0).Format(_T("%c"), wxDateTime::EST).c_str());
3363
wxPrintf(_T("Current time in Paris:\t%s\n"), now.Format(_T("%c"), wxDateTime::CET).c_str());
3364
wxPrintf(_T(" Moscow:\t%s\n"), now.Format(_T("%c"), wxDateTime::MSK).c_str());
3365
wxPrintf(_T(" New York:\t%s\n"), now.Format(_T("%c"), wxDateTime::EST).c_str());
3367
wxPrintf(_T("%s\n"), wxDateTime::Now().Format(_T("Our timezone is %Z")).c_str());
3369
wxDateTime::Tm tm = now.GetTm();
3370
if ( wxDateTime(tm) != now )
3372
wxPrintf(_T("ERROR: got %s instead of %s\n"),
3373
wxDateTime(tm).Format().c_str(), now.Format().c_str());
3377
// test some minimal support for the dates outside the standard range
3378
static void TestTimeRange()
3380
wxPuts(_T("\n*** wxDateTime out-of-standard-range dates test ***"));
3382
static const wxChar *fmt = _T("%d-%b-%Y %H:%M:%S");
3384
wxPrintf(_T("Unix epoch:\t%s\n"),
3385
wxDateTime(2440587.5).Format(fmt).c_str());
3386
wxPrintf(_T("Feb 29, 0: \t%s\n"),
3387
wxDateTime(29, wxDateTime::Feb, 0).Format(fmt).c_str());
3388
wxPrintf(_T("JDN 0: \t%s\n"),
3389
wxDateTime(0.0).Format(fmt).c_str());
3390
wxPrintf(_T("Jan 1, 1AD:\t%s\n"),
3391
wxDateTime(1, wxDateTime::Jan, 1).Format(fmt).c_str());
3392
wxPrintf(_T("May 29, 2099:\t%s\n"),
3393
wxDateTime(29, wxDateTime::May, 2099).Format(fmt).c_str());
3396
// test DST calculations
3397
static void TestTimeDST()
3399
wxPuts(_T("\n*** wxDateTime DST test ***"));
3401
wxPrintf(_T("DST is%s in effect now.\n\n"),
3402
wxDateTime::Now().IsDST() ? wxEmptyString : _T(" not"));
3404
for ( int year = 1990; year < 2005; year++ )
3406
wxPrintf(_T("DST period in Europe for year %d: from %s to %s\n"),
3408
wxDateTime::GetBeginDST(year, wxDateTime::Country_EEC).Format().c_str(),
3409
wxDateTime::GetEndDST(year, wxDateTime::Country_EEC).Format().c_str());
3415
#if TEST_INTERACTIVE
3417
static void TestDateTimeInteractive()
3419
wxPuts(_T("\n*** interactive wxDateTime tests ***"));
3425
wxPrintf(_T("Enter a date: "));
3426
if ( !wxFgets(buf, WXSIZEOF(buf), stdin) )
3429
// kill the last '\n'
3430
buf[wxStrlen(buf) - 1] = 0;
3433
const wxChar *p = dt.ParseDate(buf);
3436
wxPrintf(_T("ERROR: failed to parse the date '%s'.\n"), buf);
3442
wxPrintf(_T("WARNING: parsed only first %u characters.\n"), p - buf);
3445
wxPrintf(_T("%s: day %u, week of month %u/%u, week of year %u\n"),
3446
dt.Format(_T("%b %d, %Y")).c_str(),
3448
dt.GetWeekOfMonth(wxDateTime::Monday_First),
3449
dt.GetWeekOfMonth(wxDateTime::Sunday_First),
3450
dt.GetWeekOfYear(wxDateTime::Monday_First));
3453
wxPuts(_T("\n*** done ***"));
3456
#endif // TEST_INTERACTIVE
3460
static void TestTimeMS()
3462
wxPuts(_T("*** testing millisecond-resolution support in wxDateTime ***"));
3464
wxDateTime dt1 = wxDateTime::Now(),
3465
dt2 = wxDateTime::UNow();
3467
wxPrintf(_T("Now = %s\n"), dt1.Format(_T("%H:%M:%S:%l")).c_str());
3468
wxPrintf(_T("UNow = %s\n"), dt2.Format(_T("%H:%M:%S:%l")).c_str());
3469
wxPrintf(_T("Dummy loop: "));
3470
for ( int i = 0; i < 6000; i++ )
3472
//for ( int j = 0; j < 10; j++ )
3475
s.Printf(_T("%g"), sqrt((float)i));
3481
wxPuts(_T(", done"));
3484
dt2 = wxDateTime::UNow();
3485
wxPrintf(_T("UNow = %s\n"), dt2.Format(_T("%H:%M:%S:%l")).c_str());
3487
wxPrintf(_T("Loop executed in %s ms\n"), (dt2 - dt1).Format(_T("%l")).c_str());
3489
wxPuts(_T("\n*** done ***"));
3492
static void TestTimeHolidays()
3494
wxPuts(_T("\n*** testing wxDateTimeHolidayAuthority ***\n"));
3496
wxDateTime::Tm tm = wxDateTime(29, wxDateTime::May, 2000).GetTm();
3497
wxDateTime dtStart(1, tm.mon, tm.year),
3498
dtEnd = dtStart.GetLastMonthDay();
3500
wxDateTimeArray hol;
3501
wxDateTimeHolidayAuthority::GetHolidaysInRange(dtStart, dtEnd, hol);
3503
const wxChar *format = _T("%d-%b-%Y (%a)");
3505
wxPrintf(_T("All holidays between %s and %s:\n"),
3506
dtStart.Format(format).c_str(), dtEnd.Format(format).c_str());
3508
size_t count = hol.GetCount();
3509
for ( size_t n = 0; n < count; n++ )
3511
wxPrintf(_T("\t%s\n"), hol[n].Format(format).c_str());
3514
wxPuts(wxEmptyString);
3517
static void TestTimeZoneBug()
3519
wxPuts(_T("\n*** testing for DST/timezone bug ***\n"));
3521
wxDateTime date = wxDateTime(1, wxDateTime::Mar, 2000);
3522
for ( int i = 0; i < 31; i++ )
3524
wxPrintf(_T("Date %s: week day %s.\n"),
3525
date.Format(_T("%d-%m-%Y")).c_str(),
3526
date.GetWeekDayName(date.GetWeekDay()).c_str());
3528
date += wxDateSpan::Day();
3531
wxPuts(wxEmptyString);
3534
static void TestTimeSpanFormat()
3536
wxPuts(_T("\n*** wxTimeSpan tests ***"));
3538
static const wxChar *formats[] =
3540
_T("(default) %H:%M:%S"),
3541
_T("%E weeks and %D days"),
3542
_T("%l milliseconds"),
3543
_T("(with ms) %H:%M:%S:%l"),
3544
_T("100%% of minutes is %M"), // test "%%"
3545
_T("%D days and %H hours"),
3546
_T("or also %S seconds"),
3549
wxTimeSpan ts1(1, 2, 3, 4),
3551
for ( size_t n = 0; n < WXSIZEOF(formats); n++ )
3553
wxPrintf(_T("ts1 = %s\tts2 = %s\n"),
3554
ts1.Format(formats[n]).c_str(),
3555
ts2.Format(formats[n]).c_str());
3558
wxPuts(wxEmptyString);
3563
#endif // TEST_DATETIME
3565
// ----------------------------------------------------------------------------
3566
// wxTextInput/OutputStream
3567
// ----------------------------------------------------------------------------
3569
#ifdef TEST_TEXTSTREAM
3571
#include "wx/txtstrm.h"
3572
#include "wx/wfstream.h"
3574
static void TestTextInputStream()
3576
wxPuts(_T("\n*** wxTextInputStream test ***"));
3578
wxString filename = _T("testdata.fc");
3579
wxFileInputStream fsIn(filename);
3582
wxPuts(_T("ERROR: couldn't open file."));
3586
wxTextInputStream tis(fsIn);
3591
const wxString s = tis.ReadLine();
3593
// line could be non empty if the last line of the file isn't
3594
// terminated with EOL
3595
if ( fsIn.Eof() && s.empty() )
3598
wxPrintf(_T("Line %d: %s\n"), line++, s.c_str());
3603
#endif // TEST_TEXTSTREAM
3605
// ----------------------------------------------------------------------------
3607
// ----------------------------------------------------------------------------
3611
#include "wx/thread.h"
3613
static size_t gs_counter = (size_t)-1;
3614
static wxCriticalSection gs_critsect;
3615
static wxSemaphore gs_cond;
3617
class MyJoinableThread : public wxThread
3620
MyJoinableThread(size_t n) : wxThread(wxTHREAD_JOINABLE)
3621
{ m_n = n; Create(); }
3623
// thread execution starts here
3624
virtual ExitCode Entry();
3630
wxThread::ExitCode MyJoinableThread::Entry()
3632
unsigned long res = 1;
3633
for ( size_t n = 1; n < m_n; n++ )
3637
// it's a loooong calculation :-)
3641
return (ExitCode)res;
3644
class MyDetachedThread : public wxThread
3647
MyDetachedThread(size_t n, wxChar ch)
3651
m_cancelled = false;
3656
// thread execution starts here
3657
virtual ExitCode Entry();
3660
virtual void OnExit();
3663
size_t m_n; // number of characters to write
3664
wxChar m_ch; // character to write
3666
bool m_cancelled; // false if we exit normally
3669
wxThread::ExitCode MyDetachedThread::Entry()
3672
wxCriticalSectionLocker lock(gs_critsect);
3673
if ( gs_counter == (size_t)-1 )
3679
for ( size_t n = 0; n < m_n; n++ )
3681
if ( TestDestroy() )
3691
wxThread::Sleep(100);
3697
void MyDetachedThread::OnExit()
3699
wxLogTrace(_T("thread"), _T("Thread %ld is in OnExit"), GetId());
3701
wxCriticalSectionLocker lock(gs_critsect);
3702
if ( !--gs_counter && !m_cancelled )
3706
static void TestDetachedThreads()
3708
wxPuts(_T("\n*** Testing detached threads ***"));
3710
static const size_t nThreads = 3;
3711
MyDetachedThread *threads[nThreads];
3713
for ( n = 0; n < nThreads; n++ )
3715
threads[n] = new MyDetachedThread(10, 'A' + n);
3718
threads[0]->SetPriority(WXTHREAD_MIN_PRIORITY);
3719
threads[1]->SetPriority(WXTHREAD_MAX_PRIORITY);
3721
for ( n = 0; n < nThreads; n++ )
3726
// wait until all threads terminate
3729
wxPuts(wxEmptyString);
3732
static void TestJoinableThreads()
3734
wxPuts(_T("\n*** Testing a joinable thread (a loooong calculation...) ***"));
3736
// calc 10! in the background
3737
MyJoinableThread thread(10);
3740
wxPrintf(_T("\nThread terminated with exit code %lu.\n"),
3741
(unsigned long)thread.Wait());
3744
static void TestThreadSuspend()
3746
wxPuts(_T("\n*** Testing thread suspend/resume functions ***"));
3748
MyDetachedThread *thread = new MyDetachedThread(15, 'X');
3752
// this is for this demo only, in a real life program we'd use another
3753
// condition variable which would be signaled from wxThread::Entry() to
3754
// tell us that the thread really started running - but here just wait a
3755
// bit and hope that it will be enough (the problem is, of course, that
3756
// the thread might still not run when we call Pause() which will result
3758
wxThread::Sleep(300);
3760
for ( size_t n = 0; n < 3; n++ )
3764
wxPuts(_T("\nThread suspended"));
3767
// don't sleep but resume immediately the first time
3768
wxThread::Sleep(300);
3770
wxPuts(_T("Going to resume the thread"));
3775
wxPuts(_T("Waiting until it terminates now"));
3777
// wait until the thread terminates
3780
wxPuts(wxEmptyString);
3783
static void TestThreadDelete()
3785
// As above, using Sleep() is only for testing here - we must use some
3786
// synchronisation object instead to ensure that the thread is still
3787
// running when we delete it - deleting a detached thread which already
3788
// terminated will lead to a crash!
3790
wxPuts(_T("\n*** Testing thread delete function ***"));
3792
MyDetachedThread *thread0 = new MyDetachedThread(30, 'W');
3796
wxPuts(_T("\nDeleted a thread which didn't start to run yet."));
3798
MyDetachedThread *thread1 = new MyDetachedThread(30, 'Y');
3802
wxThread::Sleep(300);
3806
wxPuts(_T("\nDeleted a running thread."));
3808
MyDetachedThread *thread2 = new MyDetachedThread(30, 'Z');
3812
wxThread::Sleep(300);
3818
wxPuts(_T("\nDeleted a sleeping thread."));
3820
MyJoinableThread thread3(20);
3825
wxPuts(_T("\nDeleted a joinable thread."));
3827
MyJoinableThread thread4(2);
3830
wxThread::Sleep(300);
3834
wxPuts(_T("\nDeleted a joinable thread which already terminated."));
3836
wxPuts(wxEmptyString);
3839
class MyWaitingThread : public wxThread
3842
MyWaitingThread( wxMutex *mutex, wxCondition *condition )
3845
m_condition = condition;
3850
virtual ExitCode Entry()
3852
wxPrintf(_T("Thread %lu has started running.\n"), GetId());
3857
wxPrintf(_T("Thread %lu starts to wait...\n"), GetId());
3861
m_condition->Wait();
3864
wxPrintf(_T("Thread %lu finished to wait, exiting.\n"), GetId());
3872
wxCondition *m_condition;
3875
static void TestThreadConditions()
3878
wxCondition condition(mutex);
3880
// otherwise its difficult to understand which log messages pertain to
3882
//wxLogTrace(_T("thread"), _T("Local condition var is %08x, gs_cond = %08x"),
3883
// condition.GetId(), gs_cond.GetId());
3885
// create and launch threads
3886
MyWaitingThread *threads[10];
3889
for ( n = 0; n < WXSIZEOF(threads); n++ )
3891
threads[n] = new MyWaitingThread( &mutex, &condition );
3894
for ( n = 0; n < WXSIZEOF(threads); n++ )
3899
// wait until all threads run
3900
wxPuts(_T("Main thread is waiting for the other threads to start"));
3903
size_t nRunning = 0;
3904
while ( nRunning < WXSIZEOF(threads) )
3910
wxPrintf(_T("Main thread: %u already running\n"), nRunning);
3914
wxPuts(_T("Main thread: all threads started up."));
3917
wxThread::Sleep(500);
3920
// now wake one of them up
3921
wxPrintf(_T("Main thread: about to signal the condition.\n"));
3926
wxThread::Sleep(200);
3928
// wake all the (remaining) threads up, so that they can exit
3929
wxPrintf(_T("Main thread: about to broadcast the condition.\n"));
3931
condition.Broadcast();
3933
// give them time to terminate (dirty!)
3934
wxThread::Sleep(500);
3937
#include "wx/utils.h"
3939
class MyExecThread : public wxThread
3942
MyExecThread(const wxString& command) : wxThread(wxTHREAD_JOINABLE),
3948
virtual ExitCode Entry()
3950
return (ExitCode)wxExecute(m_command, wxEXEC_SYNC);
3957
static void TestThreadExec()
3959
wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
3961
MyExecThread thread(_T("true"));
3964
wxPrintf(_T("Main program exit code: %ld.\n"),
3965
wxExecute(_T("false"), wxEXEC_SYNC));
3967
wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread.Wait());
3971
#include "wx/datetime.h"
3973
class MySemaphoreThread : public wxThread
3976
MySemaphoreThread(int i, wxSemaphore *sem)
3977
: wxThread(wxTHREAD_JOINABLE),
3984
virtual ExitCode Entry()
3986
wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
3987
wxDateTime::Now().FormatTime().c_str(), m_i, (long)GetId());
3991
wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
3992
wxDateTime::Now().FormatTime().c_str(), m_i, (long)GetId());
3996
wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
3997
wxDateTime::Now().FormatTime().c_str(), m_i, (long)GetId());
4009
WX_DEFINE_ARRAY_PTR(wxThread *, ArrayThreads);
4011
static void TestSemaphore()
4013
wxPuts(_T("*** Testing wxSemaphore class. ***"));
4015
static const int SEM_LIMIT = 3;
4017
wxSemaphore sem(SEM_LIMIT, SEM_LIMIT);
4018
ArrayThreads threads;
4020
for ( int i = 0; i < 3*SEM_LIMIT; i++ )
4022
threads.Add(new MySemaphoreThread(i, &sem));
4023
threads.Last()->Run();
4026
for ( size_t n = 0; n < threads.GetCount(); n++ )
4033
#endif // TEST_THREADS
4035
// ----------------------------------------------------------------------------
4037
// ----------------------------------------------------------------------------
4039
#ifdef TEST_SNGLINST
4040
#include "wx/snglinst.h"
4041
#endif // TEST_SNGLINST
4043
int main(int argc, char **argv)
4046
wxChar **wxArgv = new wxChar *[argc + 1];
4051
for (n = 0; n < argc; n++ )
4053
wxMB2WXbuf warg = wxConvertMB2WX(argv[n]);
4054
wxArgv[n] = wxStrdup(warg);
4059
#else // !wxUSE_UNICODE
4061
#endif // wxUSE_UNICODE/!wxUSE_UNICODE
4063
wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "program");
4065
wxInitializer initializer;
4068
fprintf(stderr, "Failed to initialize the wxWidgets library, aborting.");
4073
#ifdef TEST_SNGLINST
4074
wxSingleInstanceChecker checker;
4075
if ( checker.Create(_T(".wxconsole.lock")) )
4077
if ( checker.IsAnotherRunning() )
4079
wxPrintf(_T("Another instance of the program is running, exiting.\n"));
4084
// wait some time to give time to launch another instance
4085
wxPrintf(_T("Press \"Enter\" to continue..."));
4088
else // failed to create
4090
wxPrintf(_T("Failed to init wxSingleInstanceChecker.\n"));
4092
#endif // TEST_SNGLINST
4095
TestCmdLineConvert();
4097
#if wxUSE_CMDLINE_PARSER
4098
static const wxCmdLineEntryDesc cmdLineDesc[] =
4100
{ wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("show this help message"),
4101
wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
4102
{ wxCMD_LINE_SWITCH, _T("v"), _T("verbose"), _T("be verbose") },
4103
{ wxCMD_LINE_SWITCH, _T("q"), _T("quiet"), _T("be quiet") },
4105
{ wxCMD_LINE_OPTION, _T("o"), _T("output"), _T("output file") },
4106
{ wxCMD_LINE_OPTION, _T("i"), _T("input"), _T("input dir") },
4107
{ wxCMD_LINE_OPTION, _T("s"), _T("size"), _T("output block size"),
4108
wxCMD_LINE_VAL_NUMBER },
4109
{ wxCMD_LINE_OPTION, _T("d"), _T("date"), _T("output file date"),
4110
wxCMD_LINE_VAL_DATE },
4112
{ wxCMD_LINE_PARAM, NULL, NULL, _T("input file"),
4113
wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE },
4118
wxCmdLineParser parser(cmdLineDesc, argc, wxArgv);
4120
parser.AddOption(_T("project_name"), _T(""), _T("full path to project file"),
4121
wxCMD_LINE_VAL_STRING,
4122
wxCMD_LINE_OPTION_MANDATORY | wxCMD_LINE_NEEDS_SEPARATOR);
4124
switch ( parser.Parse() )
4127
wxLogMessage(_T("Help was given, terminating."));
4131
ShowCmdLine(parser);
4135
wxLogMessage(_T("Syntax error detected, aborting."));
4138
#endif // wxUSE_CMDLINE_PARSER
4140
#endif // TEST_CMDLINE
4152
TestDllListLoaded();
4153
#endif // TEST_DYNLIB
4157
#endif // TEST_ENVIRON
4161
#endif // TEST_EXECUTE
4163
#ifdef TEST_FILECONF
4165
#endif // TEST_FILECONF
4169
#endif // TEST_LOCALE
4172
wxPuts(_T("*** Testing wxLog ***"));
4175
for ( size_t n = 0; n < 8000; n++ )
4177
s << (wxChar)(_T('A') + (n % 26));
4180
wxLogWarning(_T("The length of the string is %lu"),
4181
(unsigned long)s.length());
4184
msg.Printf(_T("A very very long message: '%s', the end!\n"), s.c_str());
4186
// this one shouldn't be truncated
4189
// but this one will because log functions use fixed size buffer
4190
// (note that it doesn't need '\n' at the end neither - will be added
4192
wxLogMessage(_T("A very very long message 2: '%s', the end!"), s.c_str());
4201
#ifdef TEST_FILENAME
4204
TestFileNameDirManip();
4205
TestFileNameComparison();
4206
TestFileNameOperations();
4207
#endif // TEST_FILENAME
4209
#ifdef TEST_FILETIME
4214
#endif // TEST_FILETIME
4217
wxLog::AddTraceMask(FTP_TRACE_MASK);
4218
if ( TestFtpConnect() )
4228
#if TEST_INTERACTIVE
4229
TestFtpInteractive();
4232
//else: connecting to the FTP server failed
4240
wxLog::AddTraceMask(_T("mime"));
4244
TestMimeAssociate();
4249
#ifdef TEST_INFO_FUNCTIONS
4254
#if TEST_INTERACTIVE
4258
#endif // TEST_INFO_FUNCTIONS
4260
#ifdef TEST_PATHLIST
4262
#endif // TEST_PATHLIST
4270
#endif // TEST_PRINTF
4277
#endif // TEST_REGCONF
4279
#if defined TEST_REGEX && TEST_INTERACTIVE
4280
TestRegExInteractive();
4281
#endif // defined TEST_REGEX && TEST_INTERACTIVE
4283
#ifdef TEST_REGISTRY
4285
TestRegistryAssociation();
4286
#endif // TEST_REGISTRY
4291
#endif // TEST_SOCKETS
4298
#endif // TEST_STREAMS
4300
#ifdef TEST_TEXTSTREAM
4301
TestTextInputStream();
4302
#endif // TEST_TEXTSTREAM
4305
int nCPUs = wxThread::GetCPUCount();
4306
wxPrintf(_T("This system has %d CPUs\n"), nCPUs);
4308
wxThread::SetConcurrency(nCPUs);
4310
TestJoinableThreads();
4313
TestJoinableThreads();
4314
TestDetachedThreads();
4315
TestThreadSuspend();
4317
TestThreadConditions();
4321
#endif // TEST_THREADS
4325
#endif // TEST_TIMER
4327
#ifdef TEST_DATETIME
4334
TestTimeSpanFormat();
4340
#if TEST_INTERACTIVE
4341
TestDateTimeInteractive();
4343
#endif // TEST_DATETIME
4345
#ifdef TEST_SCOPEGUARD
4349
#ifdef TEST_STACKWALKER
4350
#if wxUSE_STACKWALKER
4351
TestStackWalk(argv[0]);
4353
#endif // TEST_STACKWALKER
4355
#ifdef TEST_STDPATHS
4356
TestStandardPaths();
4360
wxPuts(_T("Sleeping for 3 seconds... z-z-z-z-z..."));
4362
#endif // TEST_USLEEP
4367
#endif // TEST_VCARD
4371
#endif // TEST_VOLUME
4375
TestEncodingConverter();
4376
#endif // TEST_WCHAR
4379
TestZipStreamRead();
4380
TestZipFileSystem();
4385
for ( int n = 0; n < argc; n++ )
4390
#endif // wxUSE_UNICODE