]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/console/console.cpp
Changed stopat to stopafter in CountColours
[wxWidgets.git] / samples / console / console.cpp
index 126aa1a66abc5efe2707b7318d59da987af8f3a6..a60440aae9e5b07d83aa09e5df5729b5e1932da2 100644 (file)
 // 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
 // ----------------------------------------------------------------------------
@@ -125,6 +254,63 @@ static void TestDivision()
 
 #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()
 {
@@ -173,10 +359,21 @@ static void TestTimeSet()
 {
     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
@@ -186,11 +383,12 @@ static void TestTimeZones()
 
     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
@@ -198,6 +396,10 @@ static void TestTimeRange()
 {
     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",
@@ -206,18 +408,68 @@ static void TestTimeRange()
             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
@@ -392,6 +644,8 @@ void TestThreadSuspend()
         thread->Resume();
     }
 
+    puts("Waiting until it terminates now");
+
     // wait until the thread terminates
     gs_cond.Wait();
 
@@ -407,6 +661,12 @@ void TestThreadDelete()
 
     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();
@@ -429,19 +689,19 @@ void TestThreadDelete()
 
     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.");
 
@@ -477,7 +737,7 @@ void PrintArray(const char* name, const wxArrayString& array)
 
 #include "wx/timer.h"
 
-void TestString()
+static void TestString()
 {
     wxStopWatch sw;
 
@@ -502,7 +762,7 @@ void TestString()
     printf ("TestString elapsed time: %ld\n", sw.Time());
 }
 
-void TestPChar()
+static void TestPChar()
 {
     wxStopWatch sw;
 
@@ -525,6 +785,23 @@ void TestPChar()
     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
 
 // ----------------------------------------------------------------------------
@@ -539,8 +816,12 @@ int main(int argc, char **argv)
     }
 
 #ifdef TEST_STRINGS
-    TestPChar();
-    TestString();
+    if ( 0 )
+    {
+        TestPChar();
+        TestString();
+    }
+    TestStringSub();
 #endif // TEST_STRINGS
 
 #ifdef TEST_ARRAYS
@@ -575,6 +856,10 @@ int main(int argc, char **argv)
     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++ )
@@ -595,14 +880,19 @@ int main(int argc, char **argv)
 #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();
@@ -616,12 +906,20 @@ int main(int argc, char **argv)
         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();