X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ac511156eac3466de72adf385c3081f31c906e9a..c3016fd626994c6f9f555e03076a497eb1f5797c:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index 47c1c3f8ab..7a9e0bb1af 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -83,6 +83,7 @@ #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 @@ -90,7 +91,7 @@ #undef TEST_ALL static const bool TEST_ALL = TRUE; #else - #define TEST_WCHAR + #define TEST_FILENAME static const bool TEST_ALL = FALSE; #endif @@ -183,11 +184,11 @@ static void TestCharset() 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()); } } @@ -801,6 +802,8 @@ static struct FileNameInfo { _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 }, + // 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 }, @@ -808,6 +811,7 @@ static struct FileNameInfo { _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 }, @@ -830,7 +834,7 @@ static void TestFileNameConstruction() 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", @@ -883,17 +887,25 @@ static void TestFileNameTemp() 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()); @@ -982,8 +994,8 @@ static void TestFileGetTimes() { 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")); } @@ -992,9 +1004,9 @@ static void TestFileGetTimes() 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()); } } @@ -3298,6 +3310,65 @@ static void TestVCardWrite() #endif // TEST_VCARD +// ---------------------------------------------------------------------------- +// wxVolume tests +// ---------------------------------------------------------------------------- + +#if !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 // ---------------------------------------------------------------------------- @@ -4561,7 +4632,7 @@ static void TestTimeCompatibility() static size_t gs_counter = (size_t)-1; static wxCriticalSection gs_critsect; -static wxCondition gs_cond; +static wxSemaphore gs_cond; class MyJoinableThread : public wxThread { @@ -4649,7 +4720,7 @@ void MyDetachedThread::OnExit() wxCriticalSectionLocker lock(gs_critsect); if ( !--gs_counter && !m_cancelled ) - gs_cond.Signal(); + gs_cond.Post(); } static void TestDetachedThreads() @@ -4788,8 +4859,9 @@ static void TestThreadDelete() class MyWaitingThread : public wxThread { public: - MyWaitingThread(wxCondition *condition) + MyWaitingThread( wxMutex *mutex, wxCondition *condition ) { + m_mutex = mutex; m_condition = condition; Create(); @@ -4800,12 +4872,14 @@ public: 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); @@ -4814,17 +4888,19 @@ public: } 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]; @@ -4832,7 +4908,7 @@ static void TestThreadConditions() 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++ ) @@ -4878,6 +4954,102 @@ static void TestThreadConditions() 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 starting to wait for semaphore...\n"), + wxDateTime::Now().FormatTime().c_str(), m_i); + + m_sem->Wait(); + + wxPrintf(_T("%s: Thread %d acquired the semaphore.\n"), + wxDateTime::Now().FormatTime().c_str(), m_i); + + Sleep(1000); + + wxPrintf(_T("%s: Thread %d releasing the semaphore.\n"), + wxDateTime::Now().FormatTime().c_str(), m_i); + + 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 // ---------------------------------------------------------------------------- @@ -5633,7 +5805,7 @@ int main(int argc, char **argv) #endif // TEST_FILE #ifdef TEST_FILENAME - if ( 1 ) + if ( 0 ) { wxFileName fn; fn.Assign("c:\\foo", "bar.baz"); @@ -5641,7 +5813,7 @@ int main(int argc, char **argv) DumpFileName(fn); } - if ( TEST_ALL ) + if ( 1 ) { TestFileNameConstruction(); TestFileNameMakeRelative(); @@ -5785,9 +5957,11 @@ int main(int argc, char **argv) TestJoinableThreads(); TestThreadSuspend(); TestThreadDelete(); + TestThreadConditions(); + TestThreadExec(); } - TestThreadConditions(); + TestSemaphore(); #endif // TEST_THREADS #ifdef TEST_TIMER @@ -5830,6 +6004,10 @@ int main(int argc, char **argv) TestVCardWrite(); #endif // TEST_VCARD +#ifdef TEST_VOLUME + TestFSVolume(); +#endif // TEST_VOLUME + #ifdef TEST_WCHAR TestUtf8(); TestEncodingConverter();