// what to test?
//#define TEST_ARRAYS
+#define TEST_DIR
//#define TEST_LOG
+//#define TEST_MIME
//#define TEST_STRINGS
//#define TEST_THREADS
-#define TEST_TIME
+//#define TEST_TIME
//#define TEST_LONGLONG
// ============================================================================
// implementation
// ============================================================================
+// ----------------------------------------------------------------------------
+// wxDir
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_DIR
+
+#include <wx/dir.h>
+
+static void TestDirEnumHelper(wxDir& dir,
+ int flags = wxDIR_DEFAULT,
+ const wxString& filespec = wxEmptyString)
+{
+ wxString filename;
+
+ if ( !dir.IsOpened() )
+ return;
+
+ bool cont = dir.GetFirst(&filename, filespec, flags);
+ while ( cont )
+ {
+ printf("\t%s\n", filename.c_str());
+
+ cont = dir.GetNext(&filename);
+ }
+
+ puts("");
+}
+
+static void TestDirEnum()
+{
+ wxDir dir(wxGetCwd());
+
+ puts("Enumerating everything in current directory:");
+ TestDirEnumHelper(dir);
+
+ puts("Enumerating really everything in current directory:");
+ TestDirEnumHelper(dir, wxDIR_DEFAULT | wxDIR_DOTDOT);
+
+ puts("Enumerating object files in current directory:");
+ TestDirEnumHelper(dir, wxDIR_DEFAULT, "*.o");
+
+ puts("Enumerating directories in current directory:");
+ TestDirEnumHelper(dir, wxDIR_DIRS);
+
+ puts("Enumerating files in current directory:");
+ TestDirEnumHelper(dir, wxDIR_FILES);
+
+ puts("Enumerating files including hidden in current directory:");
+ TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN);
+
+#ifdef __UNIX__
+ dir.Open("/");
+#elif defined(__WXMSW__)
+ dir.Open("c:\\");
+#else
+ #error "don't know where the root directory is"
+#endif
+
+ puts("Enumerating everything in root directory:");
+ TestDirEnumHelper(dir, wxDIR_DEFAULT);
+
+ puts("Enumerating directories in root directory:");
+ TestDirEnumHelper(dir, wxDIR_DIRS);
+
+ puts("Enumerating files in root directory:");
+ TestDirEnumHelper(dir, wxDIR_FILES);
+
+ puts("Enumerating files including hidden in root directory:");
+ TestDirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN);
+
+ puts("Enumerating files in non existing directory:");
+ wxDir dirNo("nosuchdir");
+ TestDirEnumHelper(dirNo);
+}
+
+#endif // TEST_DIR
+
+// ----------------------------------------------------------------------------
+// MIME types
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_MIME
+
+#include <wx/mimetype.h>
+
+static void TestMimeEnum()
+{
+ wxMimeTypesManager mimeTM;
+ wxArrayString mimetypes;
+
+ size_t count = mimeTM.EnumAllFileTypes(mimetypes);
+
+ printf("*** All %u known filetypes: ***\n", count);
+
+ wxArrayString exts;
+ wxString desc;
+
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxFileType *filetype = mimeTM.GetFileTypeFromMimeType(mimetypes[n]);
+ if ( !filetype )
+ {
+ printf("nothing known about the filetype '%s'!\n",
+ mimetypes[n].c_str());
+ continue;
+ }
+
+ filetype->GetDescription(&desc);
+ filetype->GetExtensions(exts);
+
+ filetype->GetIcon(NULL);
+
+ wxString extsAll;
+ for ( size_t e = 0; e < exts.GetCount(); e++ )
+ {
+ if ( e > 0 )
+ extsAll << _T(", ");
+ extsAll += exts[e];
+ }
+
+ printf("\t%s: %s (%s)\n",
+ mimetypes[n].c_str(), desc.c_str(), extsAll.c_str());
+ }
+}
+
+#endif // TEST_MIME
+
// ----------------------------------------------------------------------------
// long long
// ----------------------------------------------------------------------------
#include <wx/datetime.h>
+// the test data
+struct Date
+{
+ wxDateTime::wxDateTime_t day;
+ wxDateTime::Month month;
+ int year;
+ wxDateTime::wxDateTime_t hour, min, sec;
+ double jdn;
+ time_t gmticks, ticks;
+
+ void Init(const wxDateTime::Tm& tm)
+ {
+ day = tm.mday;
+ month = tm.mon;
+ year = tm.year;
+ hour = tm.hour;
+ min = tm.min;
+ sec = tm.sec;
+ jdn = 0.0;
+ gmticks = ticks = -1;
+ }
+
+ wxDateTime DT() const
+ { return wxDateTime(day, month, year, hour, min, sec); }
+
+ wxString Format() const
+ {
+ wxString s;
+ s.Printf("%02d:%02d:%02d %10s %02d, %4d%s",
+ hour, min, sec,
+ wxDateTime::GetMonthName(month).c_str(),
+ day,
+ abs(wxDateTime::ConvertYearToBC(year)),
+ year > 0 ? "AD" : "BC");
+ return s;
+ }
+};
+
+static const Date testDates[] =
+{
+ { 1, wxDateTime::Jan, 1970, 00, 00, 00, 2440587.5, 0, -3600 },
+ { 21, wxDateTime::Jan, 2222, 00, 00, 00, 2532648.5, -1, -1 },
+ { 29, wxDateTime::May, 1976, 12, 00, 00, 2442928.0, 202219200, 202212000 },
+ { 29, wxDateTime::Feb, 1976, 00, 00, 00, 2442837.5, 194400000, 194396400 },
+ { 1, wxDateTime::Jan, 1900, 12, 00, 00, 2415021.0, -1, -1 },
+ { 1, wxDateTime::Jan, 1900, 00, 00, 00, 2415020.5, -1, -1 },
+ { 15, wxDateTime::Oct, 1582, 00, 00, 00, 2299160.5, -1, -1 },
+ { 4, wxDateTime::Oct, 1582, 00, 00, 00, 2299149.5, -1, -1 },
+ { 1, wxDateTime::Mar, 1, 00, 00, 00, 1721484.5, -1, -1 },
+ { 1, wxDateTime::Jan, 1, 00, 00, 00, 1721425.5, -1, -1 },
+ { 31, wxDateTime::Dec, 0, 00, 00, 00, 1721424.5, -1, -1 },
+ { 1, wxDateTime::Jan, 0, 00, 00, 00, 1721059.5, -1, -1 },
+ { 12, wxDateTime::Aug, -1234, 00, 00, 00, 1270573.5, -1, -1 },
+ { 12, wxDateTime::Aug, -4000, 00, 00, 00, 260313.5, -1, -1 },
+ { 24, wxDateTime::Nov, -4713, 00, 00, 00, -0.5, -1, -1 },
+};
+
// this test miscellaneous static wxDateTime functions
static void TestTimeStatic()
{
{
puts("\n*** wxDateTime construction test ***");
- printf("Current time:\t%s\n", wxDateTime::Now().Format().c_str());
- printf("Unix epoch:\t%s\n", wxDateTime((time_t)0).Format().c_str());
- printf("Today noon:\t%s\n", wxDateTime(12, 0).Format().c_str());
- printf("May 29, 1976:\t%s\n", wxDateTime(29, wxDateTime::May, 1976).Format().c_str());
+ for ( size_t n = 0; n < WXSIZEOF(testDates); n++ )
+ {
+ const Date& d1 = testDates[n];
+ wxDateTime dt = d1.DT();
+
+ Date d2;
+ d2.Init(dt.GetTm());
+
+ wxString s1 = d1.Format(),
+ s2 = d2.Format();
+
+ printf("Date: %s == %s (%s)\n",
+ s1.c_str(), s2.c_str(),
+ s1 == s2 ? "ok" : "ERROR");
+ }
}
// test time zones stuff
wxDateTime now = wxDateTime::Now();
- printf("Current GMT time:\t%s\n", now.ToGMT().Format().c_str());
- //TODO printf("Unix epoch (GMT):\t%s\n", wxDateTime((time_t)0).MakeGMT().Format().c_str());
- printf("Current time in Paris:\t%s\n", now.ToTimezone(wxDateTime::CET).Format().c_str());
- printf(" Moscow:\t%s\n", now.ToTimezone(wxDateTime::MSK).Format().c_str());
- printf(" New York:\t%s\n", now.ToTimezone(wxDateTime::EST).Format().c_str());
+ printf("Current GMT time:\t%s\n", now.Format("%c", wxDateTime::GMT0).c_str());
+ printf("Unix epoch (GMT):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::GMT0).c_str());
+ printf("Unix epoch (EST):\t%s\n", wxDateTime((time_t)0).Format("%c", wxDateTime::EST).c_str());
+ printf("Current time in Paris:\t%s\n", now.Format("%c", wxDateTime::CET).c_str());
+ printf(" Moscow:\t%s\n", now.Format("%c", wxDateTime::MSK).c_str());
+ printf(" New York:\t%s\n", now.Format("%c", wxDateTime::EST).c_str());
}
// test some minimal support for the dates outside the standard range
{
puts("\n*** wxDateTime out-of-standard-range dates test ***");
+ printf("Unix epoch:\t%s\n",
+ wxDateTime(2440587.5).Format().c_str());
+ printf("Feb 29, 0: \t%s\n",
+ wxDateTime(29, wxDateTime::Feb, 0).Format().c_str());
printf("JDN 0: \t%s\n",
wxDateTime(0.0).Format().c_str());
printf("Jan 1, 1AD:\t%s\n",
wxDateTime(29, wxDateTime::May, 2099).Format().c_str());
}
+static void TestTimeTicks()
+{
+ puts("\n*** wxDateTime ticks test ***");
+
+ for ( size_t n = 0; n < WXSIZEOF(testDates); n++ )
+ {
+ const Date& d = testDates[n];
+ if ( d.ticks == -1 )
+ continue;
+
+ wxDateTime dt = d.DT();
+ long ticks = (dt.GetValue() / 1000).ToLong();
+ printf("Ticks of %s:\t% 10ld", d.Format().c_str(), ticks);
+ if ( ticks == d.ticks )
+ {
+ puts(" (ok)");
+ }
+ else
+ {
+ printf(" (ERROR: should be %ld, delta = %ld)\n",
+ d.ticks, ticks - d.ticks);
+ }
+
+ dt = d.DT().ToTimezone(wxDateTime::GMT0);
+ ticks = (dt.GetValue() / 1000).ToLong();
+ printf("GMtks of %s:\t% 10ld", d.Format().c_str(), ticks);
+ if ( ticks == d.gmticks )
+ {
+ puts(" (ok)");
+ }
+ else
+ {
+ printf(" (ERROR: should be %ld, delta = %ld)\n",
+ d.gmticks, ticks - d.gmticks);
+ }
+ }
+
+ puts("");
+}
+
// test conversions to JDN &c
-static void TestTimeJulian()
+static void TestTimeJDN()
{
puts("\n*** wxDateTime to JDN test ***");
- printf("JDN of current time:\t%f\n", wxDateTime::Now().GetJulianDayNumber());
- printf("JDN of Jan 1, 1900: \t%f\n",
- wxDateTime(1, wxDateTime::Jan, 1900).GetJulianDayNumber());
- printf("JDN of Jan 1, 1BC: \t%f\n",
- wxDateTime(1, wxDateTime::Jan, 0).GetJulianDayNumber());
- printf("JDN 0: \t%f\n",
- wxDateTime(24, wxDateTime::Nov, -4713, 12, 0, 0).GetJulianDayNumber());
+ for ( size_t n = 0; n < WXSIZEOF(testDates); n++ )
+ {
+ const Date& d = testDates[n];
+ wxDateTime dt(d.day, d.month, d.year, d.hour, d.min, d.sec);
+ double jdn = dt.GetJulianDayNumber();
+
+ printf("JDN of %s is:\t% 15.6f", d.Format().c_str(), jdn);
+ if ( jdn == d.jdn )
+ {
+ puts(" (ok)");
+ }
+ else
+ {
+ printf(" (ERROR: should be %f, delta = %f)\n",
+ d.jdn, jdn - d.jdn);
+ }
+ }
}
#endif // TEST_TIME
thread->Resume();
}
+ puts("Waiting until it terminates now");
+
// wait until the thread terminates
gs_cond.Wait();
puts("\n*** Testing thread delete function ***");
+ MyDetachedThread *thread0 = new MyDetachedThread(30, 'W');
+
+ thread0->Delete();
+
+ puts("\nDeleted a thread which didn't start to run yet.");
+
MyDetachedThread *thread1 = new MyDetachedThread(30, 'Y');
thread1->Run();
puts("\nDeleted a sleeping thread.");
- MyJoinableThread *thread3 = new MyJoinableThread(20);
- thread3->Run();
+ MyJoinableThread thread3(20);
+ thread3.Run();
- thread3->Delete();
+ thread3.Delete();
puts("\nDeleted a joinable thread.");
- MyJoinableThread *thread4 = new MyJoinableThread(2);
- thread4->Run();
+ MyJoinableThread thread4(2);
+ thread4.Run();
wxThread::Sleep(300);
- thread4->Delete();
+ thread4.Delete();
puts("\nDeleted a joinable thread which already terminated.");
#include "wx/timer.h"
-void TestString()
+static void TestString()
{
wxStopWatch sw;
printf ("TestString elapsed time: %ld\n", sw.Time());
}
-void TestPChar()
+static void TestPChar()
{
wxStopWatch sw;
printf ("TestPChar elapsed time: %ld\n", sw.Time());
}
+static void TestStringSub()
+{
+ wxString s("Hello, world!");
+
+ puts("*** Testing wxString substring extraction ***");
+
+ printf("String = '%s'\n", s.c_str());
+ printf("Left(5) = '%s'\n", s.Left(5).c_str());
+ printf("Right(6) = '%s'\n", s.Right(6).c_str());
+ printf("Mid(3, 5) = '%s'\n", s(3, 5).c_str());
+ printf("Mid(3) = '%s'\n", s.Mid(3).c_str());
+ printf("substr(3, 5) = '%s'\n", s.substr(3, 5).c_str());
+ printf("substr(3) = '%s'\n", s.substr(3).c_str());
+
+ puts("");
+}
+
#endif // TEST_STRINGS
// ----------------------------------------------------------------------------
}
#ifdef TEST_STRINGS
- TestPChar();
- TestString();
+ if ( 0 )
+ {
+ TestPChar();
+ TestString();
+ }
+ TestStringSub();
#endif // TEST_STRINGS
#ifdef TEST_ARRAYS
PrintArray("a3", a3);
#endif // TEST_ARRAYS
+#ifdef TEST_DIR
+ TestDirEnum();
+#endif // TEST_DIR
+
#ifdef TEST_LOG
wxString s;
for ( size_t n = 0; n < 8000; n++ )
#endif // TEST_LOG
#ifdef TEST_THREADS
+ int nCPUs = wxThread::GetCPUCount();
+ printf("This system has %d CPUs\n", nCPUs);
+ if ( nCPUs != -1 )
+ wxThread::SetConcurrency(nCPUs);
+
if ( argc > 1 && argv[1][0] == 't' )
wxLog::AddTraceMask("thread");
- if ( 0 )
+ if ( 1 )
TestDetachedThreads();
- if ( 0 )
+ if ( 1 )
TestJoinableThreads();
- if ( 0 )
+ if ( 1 )
TestThreadSuspend();
if ( 1 )
TestThreadDelete();
TestDivision();
#endif // TEST_LONGLONG
+#ifdef TEST_MIME
+ TestMimeEnum();
+#endif // TEST_MIME
+
#ifdef TEST_TIME
- TestTimeStatic();
TestTimeSet();
+ if ( 0 )
+ {
+ TestTimeStatic();
TestTimeZones();
TestTimeRange();
- TestTimeJulian();
+ TestTimeTicks();
+ }
+ TestTimeJDN();
#endif // TEST_TIME
wxUninitialize();