#define TEST_THREADS
#define TEST_TIMER
// #define TEST_VCARD -- don't enable this (VZ)
+ #define TEST_VOLUME
#define TEST_WCHAR
#define TEST_ZIP
#define TEST_ZLIB
#undef TEST_ALL
static const bool TEST_ALL = TRUE;
#else
- #define TEST_WCHAR
+ #define TEST_STREAMS
static const bool TEST_ALL = FALSE;
#endif
{
public:
Bar(const wxString& name) : m_name(name) { ms_bars++; }
+ Bar(const Bar& bar) : m_name(bar.m_name) { ms_bars++; }
~Bar() { ms_bars--; }
static size_t GetNumber() { return ms_bars; }
for ( size_t n = 0; n < WXSIZEOF(charsets); n++ )
{
- wxFontEncoding enc = wxTheFontMapper->CharsetToEncoding(charsets[n]);
+ wxFontEncoding enc = wxFontMapper::Get()->CharsetToEncoding(charsets[n]);
wxPrintf(_T("Charset: %s\tEncoding: %s (%s)\n"),
charsets[n],
- wxTheFontMapper->GetEncodingName(enc).c_str(),
- wxTheFontMapper->GetEncodingDescription(enc).c_str());
+ wxFontMapper::Get()->GetEncodingName(enc).c_str(),
+ wxFontMapper::Get()->GetEncodingDescription(enc).c_str());
}
}
{
puts("*** Testing wxDir::GetFirst/GetNext ***");
- wxDir dir(wxGetCwd());
+ wxString cwd = wxGetCwd();
+ if ( !wxDir::Exists(cwd) )
+ {
+ printf("ERROR: current directory '%s' doesn't exist?\n", cwd.c_str());
+ return;
+ }
+
+ wxDir dir("s:/tmp/foo");
+ if ( !dir.IsOpened() )
+ {
+ printf("ERROR: failed to open current directory '%s'.\n", cwd.c_str());
+ return;
+ }
puts("Enumerating everything in current directory:");
TestDirEnumHelper(dir);
dir.Traverse(traverser, _T(""), wxDIR_DIRS | wxDIR_HIDDEN);
}
+static void TestDirExists()
+{
+ wxPuts(_T("*** Testing wxDir::Exists() ***"));
+
+ static const char *dirnames[] =
+ {
+ _T("."),
+#if defined(__WXMSW__)
+ _T("c:"),
+ _T("c:\\"),
+ _T("\\\\share\\file"),
+ _T("c:\\dos"),
+ _T("c:\\dos\\"),
+ _T("c:\\dos\\\\"),
+ _T("c:\\autoexec.bat"),
+#elif defined(__UNIX__)
+ _T("/"),
+ _T("//"),
+ _T("/usr/bin"),
+ _T("/usr//bin"),
+ _T("/usr///bin"),
+#endif
+ };
+
+ for ( size_t n = 0; n < WXSIZEOF(dirnames); n++ )
+ {
+ printf(_T("%-40s: %s\n"),
+ dirnames[n],
+ wxDir::Exists(dirnames[n]) ? _T("exists") : _T("doesn't exist"));
+ }
+}
+
#endif // TEST_DIR
// ----------------------------------------------------------------------------
wxString vol, path, name, ext;
wxFileName::SplitPath(full, &vol, &path, &name, &ext);
- wxPrintf(_T("Filename '%s' -> vol '%s', path '%s', name '%s', ext '%s'\n"),
+ wxPrintf(_T("'%s'-> vol '%s', path '%s', name '%s', ext '%s'\n"),
full.c_str(), vol.c_str(), path.c_str(), name.c_str(), ext.c_str());
+
+ wxFileName::SplitPath(full, &path, &name, &ext);
+ wxPrintf(_T("or\t\t-> path '%s', name '%s', ext '%s'\n"),
+ path.c_str(), name.c_str(), ext.c_str());
+
+ wxPrintf(_T("path is also:\t'%s'\n"), fn.GetPath().c_str());
+ wxPrintf(_T("with volume: \t'%s'\n"),
+ fn.GetPath(wxPATH_GET_VOLUME).c_str());
+ wxPrintf(_T("with separator:\t'%s'\n"),
+ fn.GetPath(wxPATH_GET_SEPARATOR).c_str());
+ wxPrintf(_T("with both: \t'%s'\n"),
+ fn.GetPath(wxPATH_GET_SEPARATOR | wxPATH_GET_VOLUME).c_str());
+
+ wxPuts(_T("The directories in the path are:"));
+ wxArrayString dirs = fn.GetDirs();
+ size_t count = dirs.GetCount();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxPrintf(_T("\t%u: %s\n"), n, dirs[n].c_str());
+ }
}
static struct FileNameInfo
{ _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS },
{ _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), TRUE, wxPATH_DOS },
{ _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS },
+ { _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), TRUE, wxPATH_DOS },
+ // wxFileName support for Mac file names is broken currently
+#if 0
// Mac file names
{ _T("Volume:Dir:File"), _T("Volume"), _T("Dir"), _T("File"), _T(""), TRUE, wxPATH_MAC },
{ _T("Volume:Dir:Subdir:File"), _T("Volume"), _T("Dir:Subdir"), _T("File"), _T(""), TRUE, wxPATH_MAC },
{ _T(":Dir:File"), _T(""), _T("Dir"), _T("File"), _T(""), FALSE, wxPATH_MAC },
{ _T(":File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC },
{ _T("File.Ext"), _T(""), _T(""), _T("File"), _T(".Ext"), FALSE, wxPATH_MAC },
+#endif // 0
// VMS file names
{ _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), TRUE, wxPATH_VMS },
printf("ERROR: fullname should be '%s'\n", fni.fullname);
}
- bool isAbsolute = fn.IsAbsolute();
+ bool isAbsolute = fn.IsAbsolute(fni.format);
printf("'%s' is %s (%s)\n\t",
fullname.c_str(),
isAbsolute ? "absolute" : "relative",
static const char *tmpprefixes[] =
{
+ "",
"foo",
- "/tmp/foo",
"..",
"../bar",
+#ifdef __UNIX__
+ "/tmp/foo",
"/tmp/foo/bar", // this one must be an error
+#endif // __UNIX__
};
for ( size_t n = 0; n < WXSIZEOF(tmpprefixes); n++ )
{
wxString path = wxFileName::CreateTempFileName(tmpprefixes[n]);
- if ( !path.empty() )
+ if ( path.empty() )
+ {
+ // "error" is not in upper case because it may be ok
+ printf("Prefix '%s'\t-> error\n", tmpprefixes[n]);
+ }
+ else
{
printf("Prefix '%s'\t-> temp file '%s'\n",
tmpprefixes[n], path.c_str());
{
wxFileName fn(_T("testdata.fc"));
- wxDateTime dtAccess, dtMod, dtChange;
- if ( !fn.GetTimes(&dtAccess, &dtMod, &dtChange) )
+ wxDateTime dtAccess, dtMod, dtCreate;
+ if ( !fn.GetTimes(&dtAccess, &dtMod, &dtCreate) )
{
wxPrintf(_T("ERROR: GetTimes() failed.\n"));
}
static const wxChar *fmt = _T("%Y-%b-%d %H:%M:%S");
wxPrintf(_T("File times for '%s':\n"), fn.GetFullPath().c_str());
- wxPrintf(_T("Access: \t%s\n"), dtAccess.Format(fmt).c_str());
- wxPrintf(_T("Mod/creation:\t%s\n"), dtMod.Format(fmt).c_str());
- wxPrintf(_T("Change: \t%s\n"), dtChange.Format(fmt).c_str());
+ wxPrintf(_T("Creation: \t%s\n"), dtCreate.Format(fmt).c_str());
+ wxPrintf(_T("Last read: \t%s\n"), dtAccess.Format(fmt).c_str());
+ wxPrintf(_T("Last write: \t%s\n"), dtMod.Format(fmt).c_str());
}
}
_T("readme.txt"),
_T("document.pdf"),
_T("image.gif"),
+ _T("picture.jpeg"),
};
for ( size_t n = 0; n < WXSIZEOF(filenames); n++ )
// database
// ----------------------------------------------------------------------------
+#if !wxUSE_ODBC
+ #undef TEST_ODBC
+#endif
+
#ifdef TEST_ODBC
#include <wx/db.h>
static void TestMemoryStream()
{
- puts("*** Testing wxMemoryInputStream ***");
+ wxPuts(_T("*** Testing wxMemoryOutputStream ***"));
+
+ wxMemoryOutputStream memOutStream;
+ wxPrintf(_T("Initially out stream offset: %lu\n"),
+ (unsigned long)memOutStream.TellO());
+
+ for ( const wxChar *p = _T("Hello, stream!"); *p; p++ )
+ {
+ memOutStream.PutC(*p);
+ }
+
+ wxPrintf(_T("Final out stream offset: %lu\n"),
+ (unsigned long)memOutStream.TellO());
+
+ wxPuts(_T("*** Testing wxMemoryInputStream ***"));
wxChar buf[1024];
- wxStrncpy(buf, _T("Hello, stream!"), WXSIZEOF(buf));
+ size_t len = memOutStream.CopyTo(buf, WXSIZEOF(buf));
- wxMemoryInputStream memInpStream(buf, wxStrlen(buf));
- printf(_T("Memory stream size: %u\n"), memInpStream.GetSize());
+ wxMemoryInputStream memInpStream(buf, len);
+ wxPrintf(_T("Memory stream size: %u\n"), memInpStream.GetSize());
while ( !memInpStream.Eof() )
{
putchar(memInpStream.GetC());
puts("*** Testing wxStopWatch ***\n");
wxStopWatch sw;
- printf("Sleeping 3 seconds...");
+ sw.Pause();
+ printf("Initially paused, after 2 seconds time is...");
+ fflush(stdout);
+ wxSleep(2);
+ printf("\t%ldms\n", sw.Time());
+
+ printf("Resuming stopwatch and sleeping 3 seconds...");
+ fflush(stdout);
+ sw.Resume();
wxSleep(3);
printf("\telapsed time: %ldms\n", sw.Time());
sw.Pause();
- printf("Sleeping 2 more seconds...");
+ printf("Pausing agan and sleeping 2 more seconds...");
+ fflush(stdout);
wxSleep(2);
printf("\telapsed time: %ldms\n", sw.Time());
sw.Resume();
- printf("And 3 more seconds...");
- wxSleep(3);
+ printf("Finally resuming and sleeping 2 more seconds...");
+ fflush(stdout);
+ wxSleep(2);
printf("\telapsed time: %ldms\n", sw.Time());
wxStopWatch sw2;
}
putchar('.');
+ fflush(stdout);
}
puts(", ok.");
#endif // TEST_VCARD
+// ----------------------------------------------------------------------------
+// wxVolume tests
+// ----------------------------------------------------------------------------
+
+#if !defined(__WIN32__) || !wxUSE_FSVOLUME
+ #undef TEST_VOLUME
+#endif
+
+#ifdef TEST_VOLUME
+
+#include "wx/volume.h"
+
+static const wxChar *volumeKinds[] =
+{
+ _T("floppy"),
+ _T("hard disk"),
+ _T("CD-ROM"),
+ _T("DVD-ROM"),
+ _T("network volume"),
+ _T("other volume"),
+};
+
+static void TestFSVolume()
+{
+ wxPuts(_T("*** Testing wxFSVolume class ***"));
+
+ wxArrayString volumes = wxFSVolume::GetVolumes();
+ size_t count = volumes.GetCount();
+
+ if ( !count )
+ {
+ wxPuts(_T("ERROR: no mounted volumes?"));
+ return;
+ }
+
+ wxPrintf(_T("%u mounted volumes found:\n"), count);
+
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxFSVolume vol(volumes[n]);
+ if ( !vol.IsOk() )
+ {
+ wxPuts(_T("ERROR: couldn't create volume"));
+ continue;
+ }
+
+ wxPrintf(_T("%u: %s (%s), %s, %s, %s\n"),
+ n + 1,
+ vol.GetDisplayName().c_str(),
+ vol.GetName().c_str(),
+ volumeKinds[vol.GetKind()],
+ vol.IsWritable() ? _T("rw") : _T("ro"),
+ vol.GetFlags() & wxFS_VOL_REMOVABLE ? _T("removable")
+ : _T("fixed"));
+ }
+}
+
+#endif // TEST_VOLUME
+
// ----------------------------------------------------------------------------
// wide char (Unicode) support
// ----------------------------------------------------------------------------
#include "wx/wfstream.h"
static const wxChar *FILENAME_GZ = _T("test.gz");
-static const char *TEST_DATA = "hello and hello again";
+static const char *TEST_DATA = "hello and hello and hello and hello and hello";
static void TestZlibStreamWrite()
{
puts("*** Testing Zlib stream reading ***\n");
wxFileOutputStream fileOutStream(FILENAME_GZ);
- wxZlibOutputStream ostr(fileOutStream, 0);
+ wxZlibOutputStream ostr(fileOutStream);
printf("Compressing the test string... ");
- ostr.Write(TEST_DATA, sizeof(TEST_DATA));
+ ostr.Write(TEST_DATA, strlen(TEST_DATA) + 1);
if ( !ostr )
{
puts("(ERROR: failed)");
else
{
printf(" (ERROR: should be %ld, delta = %ld)\n",
- d.ticks, ticks - d.ticks);
+ (long)d.ticks, (long)(ticks - d.ticks));
}
dt = d.DT().ToTimezone(wxDateTime::GMT0);
else
{
printf(" (ERROR: should be %ld, delta = %ld)\n",
- d.gmticks, ticks - d.gmticks);
+ (long)d.gmticks, (long)(ticks - d.gmticks));
}
}
static size_t gs_counter = (size_t)-1;
static wxCriticalSection gs_critsect;
-static wxCondition gs_cond;
+static wxSemaphore gs_cond;
class MyJoinableThread : public wxThread
{
wxCriticalSectionLocker lock(gs_critsect);
if ( !--gs_counter && !m_cancelled )
- gs_cond.Signal();
+ gs_cond.Post();
}
static void TestDetachedThreads()
class MyWaitingThread : public wxThread
{
public:
- MyWaitingThread(wxCondition *condition)
+ MyWaitingThread( wxMutex *mutex, wxCondition *condition )
{
+ m_mutex = mutex;
m_condition = condition;
Create();
printf("Thread %lu has started running.\n", GetId());
fflush(stdout);
- gs_cond.Signal();
+ gs_cond.Post();
printf("Thread %lu starts to wait...\n", GetId());
fflush(stdout);
+ m_mutex->Lock();
m_condition->Wait();
+ m_mutex->Unlock();
printf("Thread %lu finished to wait, exiting.\n", GetId());
fflush(stdout);
}
private:
+ wxMutex *m_mutex;
wxCondition *m_condition;
};
static void TestThreadConditions()
{
- wxCondition condition;
+ wxMutex mutex;
+ wxCondition condition(mutex);
// otherwise its difficult to understand which log messages pertain to
// which condition
- wxLogTrace("thread", "Local condition var is %08x, gs_cond = %08x",
- condition.GetId(), gs_cond.GetId());
+ //wxLogTrace("thread", "Local condition var is %08x, gs_cond = %08x",
+ // condition.GetId(), gs_cond.GetId());
// create and launch threads
MyWaitingThread *threads[10];
size_t n;
for ( n = 0; n < WXSIZEOF(threads); n++ )
{
- threads[n] = new MyWaitingThread(&condition);
+ threads[n] = new MyWaitingThread( &mutex, &condition );
}
for ( n = 0; n < WXSIZEOF(threads); n++ )
wxThread::Sleep(500);
}
+#include "wx/utils.h"
+
+class MyExecThread : public wxThread
+{
+public:
+ MyExecThread(const wxString& command) : wxThread(wxTHREAD_JOINABLE),
+ m_command(command)
+ {
+ Create();
+ }
+
+ virtual ExitCode Entry()
+ {
+ return (ExitCode)wxExecute(m_command, wxEXEC_SYNC);
+ }
+
+private:
+ wxString m_command;
+};
+
+static void TestThreadExec()
+{
+ wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
+
+ MyExecThread thread(_T("true"));
+ thread.Run();
+
+ wxPrintf(_T("Main program exit code: %ld.\n"),
+ wxExecute(_T("false"), wxEXEC_SYNC));
+
+ wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread.Wait());
+}
+
+// semaphore tests
+#include "wx/datetime.h"
+
+class MySemaphoreThread : public wxThread
+{
+public:
+ MySemaphoreThread(int i, wxSemaphore *sem)
+ : wxThread(wxTHREAD_JOINABLE),
+ m_sem(sem),
+ m_i(i)
+ {
+ Create();
+ }
+
+ virtual ExitCode Entry()
+ {
+ wxPrintf(_T("%s: Thread #%d (%ld) starting to wait for semaphore...\n"),
+ wxDateTime::Now().FormatTime().c_str(), m_i, (long)GetId());
+
+ m_sem->Wait();
+
+ wxPrintf(_T("%s: Thread #%d (%ld) acquired the semaphore.\n"),
+ wxDateTime::Now().FormatTime().c_str(), m_i, (long)GetId());
+
+ Sleep(1000);
+
+ wxPrintf(_T("%s: Thread #%d (%ld) releasing the semaphore.\n"),
+ wxDateTime::Now().FormatTime().c_str(), m_i, (long)GetId());
+
+ m_sem->Post();
+
+ return 0;
+ }
+
+private:
+ wxSemaphore *m_sem;
+ int m_i;
+};
+
+WX_DEFINE_ARRAY(wxThread *, ArrayThreads);
+
+static void TestSemaphore()
+{
+ wxPuts(_T("*** Testing wxSemaphore class. ***"));
+
+ static const int SEM_LIMIT = 3;
+
+ wxSemaphore sem(SEM_LIMIT, SEM_LIMIT);
+ ArrayThreads threads;
+
+ for ( int i = 0; i < 3*SEM_LIMIT; i++ )
+ {
+ threads.Add(new MySemaphoreThread(i, &sem));
+ threads.Last()->Run();
+ }
+
+ for ( size_t n = 0; n < threads.GetCount(); n++ )
+ {
+ threads[n]->Wait();
+ delete threads[n];
+ }
+}
+
#endif // TEST_THREADS
// ----------------------------------------------------------------------------
#include "wx/dynarray.h"
+typedef unsigned short ushort;
+
#define DefineCompare(name, T) \
\
int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \
return *second - *first; \
} \
-DefineCompare(Short, short);
+DefineCompare(UShort, ushort);
DefineCompare(Int, int);
// test compilation of all macros
-WX_DEFINE_ARRAY(short, wxArrayShort);
-WX_DEFINE_SORTED_ARRAY(short, wxSortedArrayShortNoCmp);
-WX_DEFINE_SORTED_ARRAY_CMP(short, ShortCompareValues, wxSortedArrayShort);
-WX_DEFINE_SORTED_ARRAY_CMP(int, IntCompareValues, wxSortedArrayInt);
+WX_DEFINE_ARRAY_SHORT(ushort, wxArrayUShort);
+WX_DEFINE_SORTED_ARRAY_SHORT(ushort, wxSortedArrayUShortNoCmp);
+WX_DEFINE_SORTED_ARRAY_CMP_SHORT(ushort, UShortCompareValues, wxSortedArrayUShort);
+WX_DEFINE_SORTED_ARRAY_CMP_INT(int, IntCompareValues, wxSortedArrayInt);
WX_DECLARE_OBJARRAY(Bar, ArrayBars);
#include "wx/arrimpl.cpp"
\
wxArray##name a; \
a.Add(1); \
- a.Add(17); \
- a.Add(5); \
- a.Add(3); \
+ a.Add(17,2); \
+ a.Add(5,3); \
+ a.Add(3,4); \
\
puts("Initially:"); \
PrintArray("a", a); \
PrintArray("b", b); \
}
-TestArrayOf(Short);
+TestArrayOf(UShort);
TestArrayOf(Int);
static void TestArrayOfObjects()
{
ArrayBars bars;
- Bar bar("second bar");
+ Bar bar("second bar (two copies!)");
printf("Initially: %u objects in the array, %u objects total.\n",
bars.GetCount(), Bar::GetNumber());
bars.Add(new Bar("first bar"));
- bars.Add(bar);
+ bars.Add(bar,2);
printf("Now: %u objects in the array, %u objects total.\n",
bars.GetCount(), Bar::GetNumber());
+ bars.RemoveAt(1, bars.GetCount() - 1);
+
+ printf("After removing all but first element: %u objects in the "
+ "array, %u objects total.\n",
+ bars.GetCount(), Bar::GetNumber());
+
bars.Empty();
printf("After Empty(): %u objects in the array, %u objects total.\n",
int main(int argc, char **argv)
{
+ wxApp::CheckBuildOptions(wxBuildOptions());
+
wxInitializer initializer;
if ( !initializer )
{
wxArrayString a1;
a1.Add("tiger");
a1.Add("cat");
- a1.Add("lion");
+ a1.Add("lion", 3);
a1.Add("dog");
a1.Add("human");
a1.Add("ape");
wxSortedArrayString a3(a1);
PrintArray("a3", a3);
- puts("*** After deleting a string from a1");
- a1.Remove(2);
+ puts("*** After deleting three strings from a1");
+ a1.Remove(2,3);
PrintArray("a1", a1);
PrintArray("a2", a2);
PrintArray("a1", a1);
TestArrayOfObjects();
- TestArrayOfShorts();
+ TestArrayOfUShorts();
}
TestArrayOfInts();
#ifdef TEST_DIR
if ( TEST_ALL )
{
- TestDirEnum();
+ TestDirExists();
TestDirTraverse();
}
+ TestDirEnum();
#endif // TEST_DIR
#ifdef TEST_DLLLOADER
#endif // TEST_FILE
#ifdef TEST_FILENAME
- if ( 1 )
+ if ( 0 )
{
wxFileName fn;
fn.Assign("c:\\foo", "bar.baz");
+ fn.Assign("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc");
DumpFileName(fn);
}
+ TestFileNameConstruction();
if ( TEST_ALL )
{
TestFileNameConstruction();
#ifdef TEST_FILETIME
TestFileGetTimes();
+ if ( 0 )
TestFileSetTimes();
#endif // TEST_FILETIME
{
TestMimeEnum();
TestMimeOverride();
- TestMimeFilename();
+ TestMimeAssociate();
}
-
- TestMimeAssociate();
+ TestMimeFilename();
#endif // TEST_MIME
#ifdef TEST_INFO_FUNCTIONS
#endif // TEST_SOCKETS
#ifdef TEST_STREAMS
- TestFileStream();
- TestMemoryStream();
+ if ( TEST_ALL )
+ {
+ TestFileStream();
+ }
+ TestMemoryStream();
#endif // TEST_STREAMS
#ifdef TEST_THREADS
TestJoinableThreads();
TestThreadSuspend();
TestThreadDelete();
+ TestThreadConditions();
+ TestThreadExec();
}
- TestThreadConditions();
+ TestSemaphore();
#endif // TEST_THREADS
#ifdef TEST_TIMER
TestVCardWrite();
#endif // TEST_VCARD
+#ifdef TEST_VOLUME
+ TestFSVolume();
+#endif // TEST_VOLUME
+
#ifdef TEST_WCHAR
TestUtf8();
TestEncodingConverter();