X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a2fa5040877d70eb01a023db317dda875633aca4..f9b24f070c67c61d11a0032054e0a229d876f38d:/samples/console/console.cpp diff --git a/samples/console/console.cpp b/samples/console/console.cpp index f155e4b050..bc6de72314 100644 --- a/samples/console/console.cpp +++ b/samples/console/console.cpp @@ -91,7 +91,7 @@ #undef TEST_ALL static const bool TEST_ALL = TRUE; #else - #define TEST_FILENAME + #define TEST_STREAMS static const bool TEST_ALL = FALSE; #endif @@ -115,6 +115,7 @@ class Bar // Foo is already taken in the hash test { 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; } @@ -184,11 +185,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()); } } @@ -306,7 +307,19 @@ static void TestDirEnum() { 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); @@ -394,6 +407,38 @@ static void TestDirTraverse() 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 // ---------------------------------------------------------------------------- @@ -768,8 +813,28 @@ static void DumpFileName(const wxFileName& fn) 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 @@ -801,8 +866,9 @@ 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 crurently + // 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 }, @@ -900,7 +966,12 @@ static void TestFileNameTemp() 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()); @@ -1669,6 +1740,7 @@ static void TestMimeFilename() _T("readme.txt"), _T("document.pdf"), _T("image.gif"), + _T("picture.jpeg"), }; for ( size_t n = 0; n < WXSIZEOF(filenames); n++ ) @@ -2364,6 +2436,10 @@ static void TestRegExInteractive() // database // ---------------------------------------------------------------------------- +#if !wxUSE_ODBC + #undef TEST_ODBC +#endif + #ifdef TEST_ODBC #include @@ -2996,13 +3072,27 @@ static void TestFileStream() 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()); @@ -3027,18 +3117,28 @@ static void TestStopWatch() 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; @@ -3056,6 +3156,7 @@ static void TestStopWatch() } putchar('.'); + fflush(stdout); } puts(", ok."); @@ -3309,7 +3410,7 @@ static void TestVCardWrite() // wxVolume tests // ---------------------------------------------------------------------------- -#if !wxUSE_FSVOLUME +#if !defined(__WIN32__) || !wxUSE_FSVOLUME #undef TEST_VOLUME #endif @@ -3540,16 +3641,16 @@ static void TestZipFileSystem() #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)"); @@ -3794,7 +3895,7 @@ static void TestTimeTicks() 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); @@ -3807,7 +3908,7 @@ static void TestTimeTicks() else { printf(" (ERROR: should be %ld, delta = %ld)\n", - d.gmticks, ticks - d.gmticks); + (long)d.gmticks, (long)(ticks - d.gmticks)); } } @@ -4627,7 +4728,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 { @@ -4715,7 +4816,7 @@ void MyDetachedThread::OnExit() wxCriticalSectionLocker lock(gs_critsect); if ( !--gs_counter && !m_cancelled ) - gs_cond.Signal(); + gs_cond.Post(); } static void TestDetachedThreads() @@ -4854,8 +4955,9 @@ static void TestThreadDelete() class MyWaitingThread : public wxThread { public: - MyWaitingThread(wxCondition *condition) + MyWaitingThread( wxMutex *mutex, wxCondition *condition ) { + m_mutex = mutex; m_condition = condition; Create(); @@ -4866,12 +4968,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); @@ -4880,17 +4984,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]; @@ -4898,7 +5004,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++ ) @@ -4944,6 +5050,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 (%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 // ---------------------------------------------------------------------------- @@ -4954,6 +5156,8 @@ static void TestThreadConditions() #include "wx/dynarray.h" +typedef unsigned short ushort; + #define DefineCompare(name, T) \ \ int wxCMPFUNC_CONV name ## CompareValues(T first, T second) \ @@ -4971,14 +5175,14 @@ int wxCMPFUNC_CONV name ## RevCompare(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" @@ -5031,9 +5235,9 @@ static void TestArrayOf ## name ## s() \ \ 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); \ @@ -5056,7 +5260,7 @@ static void TestArrayOf ## name ## s() \ PrintArray("b", b); \ } -TestArrayOf(Short); +TestArrayOf(UShort); TestArrayOf(Int); static void TestArrayOfObjects() @@ -5065,17 +5269,23 @@ 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", @@ -5487,6 +5697,8 @@ static void TestStringMatch() int main(int argc, char **argv) { + wxApp::CheckBuildOptions(wxBuildOptions()); + wxInitializer initializer; if ( !initializer ) { @@ -5592,7 +5804,7 @@ int main(int argc, char **argv) wxArrayString a1; a1.Add("tiger"); a1.Add("cat"); - a1.Add("lion"); + a1.Add("lion", 3); a1.Add("dog"); a1.Add("human"); a1.Add("ape"); @@ -5607,8 +5819,8 @@ int main(int argc, char **argv) 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); @@ -5632,7 +5844,7 @@ int main(int argc, char **argv) PrintArray("a1", a1); TestArrayOfObjects(); - TestArrayOfShorts(); + TestArrayOfUShorts(); } TestArrayOfInts(); @@ -5641,9 +5853,10 @@ int main(int argc, char **argv) #ifdef TEST_DIR if ( TEST_ALL ) { - TestDirEnum(); + TestDirExists(); TestDirTraverse(); } + TestDirEnum(); #endif // TEST_DIR #ifdef TEST_DLLLOADER @@ -5703,11 +5916,13 @@ int main(int argc, char **argv) { wxFileName fn; fn.Assign("c:\\foo", "bar.baz"); + fn.Assign("/u/os9-port/Viewer/tvision/WEI2HZ-3B3-14_05-04-00MSC1.asc"); DumpFileName(fn); } - if ( 1 ) + TestFileNameConstruction(); + if ( TEST_ALL ) { TestFileNameConstruction(); TestFileNameMakeRelative(); @@ -5721,6 +5936,7 @@ int main(int argc, char **argv) #ifdef TEST_FILETIME TestFileGetTimes(); + if ( 0 ) TestFileSetTimes(); #endif // TEST_FILETIME @@ -5781,10 +5997,9 @@ int main(int argc, char **argv) { TestMimeEnum(); TestMimeOverride(); - TestMimeFilename(); + TestMimeAssociate(); } - - TestMimeAssociate(); + TestMimeFilename(); #endif // TEST_MIME #ifdef TEST_INFO_FUNCTIONS @@ -5835,8 +6050,11 @@ int main(int argc, char **argv) #endif // TEST_SOCKETS #ifdef TEST_STREAMS - TestFileStream(); - TestMemoryStream(); + if ( TEST_ALL ) + { + TestFileStream(); + } + TestMemoryStream(); #endif // TEST_STREAMS #ifdef TEST_THREADS @@ -5851,9 +6069,11 @@ int main(int argc, char **argv) TestJoinableThreads(); TestThreadSuspend(); TestThreadDelete(); + TestThreadConditions(); + TestThreadExec(); } - TestThreadConditions(); + TestSemaphore(); #endif // TEST_THREADS #ifdef TEST_TIMER