+// ----------------------------------------------------------------------------
+// wxFileConfig
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_FILECONF
+
+#include <wx/confbase.h>
+#include <wx/fileconf.h>
+
+static const struct FileConfTestData
+{
+ const wxChar *name; // value name
+ const wxChar *value; // the value from the file
+} fcTestData[] =
+{
+ { _T("value1"), _T("one") },
+ { _T("value2"), _T("two") },
+ { _T("novalue"), _T("default") },
+};
+
+static void TestFileConfRead()
+{
+ puts("*** testing wxFileConfig loading/reading ***");
+
+ wxFileConfig fileconf(_T("test"), wxEmptyString,
+ _T("testdata.fc"), wxEmptyString,
+ wxCONFIG_USE_RELATIVE_PATH);
+
+ // test simple reading
+ puts("\nReading config file:");
+ wxString defValue(_T("default")), value;
+ for ( size_t n = 0; n < WXSIZEOF(fcTestData); n++ )
+ {
+ const FileConfTestData& data = fcTestData[n];
+ value = fileconf.Read(data.name, defValue);
+ printf("\t%s = %s ", data.name, value.c_str());
+ if ( value == data.value )
+ {
+ puts("(ok)");
+ }
+ else
+ {
+ printf("(ERROR: should be %s)\n", data.value);
+ }
+ }
+
+ // test enumerating the entries
+ puts("\nEnumerating all root entries:");
+ long dummy;
+ wxString name;
+ bool cont = fileconf.GetFirstEntry(name, dummy);
+ while ( cont )
+ {
+ printf("\t%s = %s\n",
+ name.c_str(),
+ fileconf.Read(name.c_str(), _T("ERROR")).c_str());
+
+ cont = fileconf.GetNextEntry(name, dummy);
+ }
+}
+
+#endif // TEST_FILECONF
+
+// ----------------------------------------------------------------------------
+// wxFileName
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_FILENAME
+
+#include <wx/filename.h>
+
+static struct FileNameInfo
+{
+ const wxChar *fullname;
+ const wxChar *path;
+ const wxChar *name;
+ const wxChar *ext;
+} filenames[] =
+{
+ { _T("/usr/bin/ls"), _T("/usr/bin"), _T("ls"), _T("") },
+ { _T("/usr/bin/"), _T("/usr/bin"), _T(""), _T("") },
+ { _T("~/.zshrc"), _T("~"), _T(".zshrc"), _T("") },
+ { _T("../../foo"), _T("../.."), _T("foo"), _T("") },
+ { _T("foo.bar"), _T(""), _T("foo"), _T("bar") },
+ { _T("~/foo.bar"), _T("~"), _T("foo"), _T("bar") },
+ { _T("Mahogany-0.60/foo.bar"), _T("Mahogany-0.60"), _T("foo"), _T("bar") },
+ { _T("/tmp/wxwin.tar.bz"), _T("/tmp"), _T("wxwin.tar"), _T("bz") },
+};
+
+static void TestFileNameConstruction()
+{
+ puts("*** testing wxFileName construction ***");
+
+ for ( size_t n = 0; n < WXSIZEOF(filenames); n++ )
+ {
+ wxFileName fn(filenames[n].fullname, wxPATH_UNIX);
+
+ printf("Filename: '%s'\t", fn.GetFullPath().c_str());
+ if ( !fn.Normalize(wxPATH_NORM_ALL, _T(""), wxPATH_UNIX) )
+ {
+ puts("ERROR (couldn't be normalized)");
+ }
+ else
+ {
+ printf("normalized: '%s'\n", fn.GetFullPath().c_str());
+ }
+ }
+
+ puts("");
+}
+
+static void TestFileNameSplit()
+{
+ puts("*** testing wxFileName splitting ***");
+
+ for ( size_t n = 0; n < WXSIZEOF(filenames); n++ )
+ {
+ const FileNameInfo &fni = filenames[n];
+ wxString path, name, ext;
+ wxFileName::SplitPath(fni.fullname, &path, &name, &ext);
+
+ printf("%s -> path = '%s', name = '%s', ext = '%s'",
+ fni.fullname, path.c_str(), name.c_str(), ext.c_str());
+ if ( path != fni.path )
+ printf(" (ERROR: path = '%s')", fni.path);
+ if ( name != fni.name )
+ printf(" (ERROR: name = '%s')", fni.name);
+ if ( ext != fni.ext )
+ printf(" (ERROR: ext = '%s')", fni.ext);
+ puts("");
+ }
+
+ puts("");
+}
+
+static void TestFileNameComparison()
+{
+ // TODO!
+}
+
+static void TestFileNameOperations()
+{
+ // TODO!
+}
+
+static void TestFileNameCwd()
+{
+ // TODO!
+}
+
+#endif // TEST_FILENAME
+
+// ----------------------------------------------------------------------------
+// wxHashTable
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_HASH
+
+#include <wx/hash.h>
+
+struct Foo
+{
+ Foo(int n_) { n = n_; count++; }
+ ~Foo() { count--; }
+
+ int n;
+
+ static size_t count;
+};
+
+size_t Foo::count = 0;
+
+WX_DECLARE_LIST(Foo, wxListFoos);
+WX_DECLARE_HASH(Foo, wxListFoos, wxHashFoos);
+
+#include <wx/listimpl.cpp>
+
+WX_DEFINE_LIST(wxListFoos);
+
+static void TestHash()
+{
+ puts("*** Testing wxHashTable ***\n");
+
+ {
+ wxHashFoos hash;
+ hash.DeleteContents(TRUE);
+
+ printf("Hash created: %u foos in hash, %u foos totally\n",
+ hash.GetCount(), Foo::count);
+
+ static const int hashTestData[] =
+ {
+ 0, 1, 17, -2, 2, 4, -4, 345, 3, 3, 2, 1,
+ };
+
+ size_t n;
+ for ( n = 0; n < WXSIZEOF(hashTestData); n++ )
+ {
+ hash.Put(hashTestData[n], n, new Foo(n));
+ }
+
+ printf("Hash filled: %u foos in hash, %u foos totally\n",
+ hash.GetCount(), Foo::count);
+
+ puts("Hash access test:");
+ for ( n = 0; n < WXSIZEOF(hashTestData); n++ )
+ {
+ printf("\tGetting element with key %d, value %d: ",
+ hashTestData[n], n);
+ Foo *foo = hash.Get(hashTestData[n], n);
+ if ( !foo )
+ {
+ printf("ERROR, not found.\n");
+ }
+ else
+ {
+ printf("%d (%s)\n", foo->n,
+ (size_t)foo->n == n ? "ok" : "ERROR");
+ }
+ }
+
+ printf("\nTrying to get an element not in hash: ");
+
+ if ( hash.Get(1234) || hash.Get(1, 0) )
+ {
+ puts("ERROR: found!");
+ }
+ else
+ {
+ puts("ok (not found)");
+ }
+ }
+
+ printf("Hash destroyed: %u foos left\n", Foo::count);
+}
+
+#endif // TEST_HASH
+
+// ----------------------------------------------------------------------------
+// wxList
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_LIST
+
+#include <wx/list.h>
+
+WX_DECLARE_LIST(Bar, wxListBars);
+#include <wx/listimpl.cpp>
+WX_DEFINE_LIST(wxListBars);
+
+static void TestListCtor()
+{
+ puts("*** Testing wxList construction ***\n");
+
+ {
+ wxListBars list1;
+ list1.Append(new Bar(_T("first")));
+ list1.Append(new Bar(_T("second")));
+
+ printf("After 1st list creation: %u objects in the list, %u objects total.\n",
+ list1.GetCount(), Bar::GetNumber());
+
+ wxListBars list2;
+ list2 = list1;
+
+ printf("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n",
+ list1.GetCount(), list2.GetCount(), Bar::GetNumber());
+
+ list1.DeleteContents(TRUE);
+ }
+
+ printf("After list destruction: %u objects left.\n", Bar::GetNumber());
+}
+
+#endif // TEST_LIST
+
+// ----------------------------------------------------------------------------
+// MIME types
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_MIME
+
+#include <wx/mimetype.h>
+
+static wxMimeTypesManager g_mimeManager;
+
+static void TestMimeEnum()
+{
+ wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
+
+ wxArrayString mimetypes;
+
+ size_t count = g_mimeManager.EnumAllFileTypes(mimetypes);
+
+ printf("*** All %u known filetypes: ***\n", count);
+
+ wxArrayString exts;
+ wxString desc;
+
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxFileType *filetype = g_mimeManager.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());
+ }
+}
+
+static void TestMimeOverride()
+{
+ wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
+
+ wxString mailcap = _T("/tmp/mailcap"),
+ mimetypes = _T("/tmp/mime.types");
+
+ wxPrintf(_T("Loading mailcap from '%s': %s\n"),
+ mailcap.c_str(),
+ g_mimeManager.ReadMailcap(mailcap) ? _T("ok") : _T("ERROR"));
+ wxPrintf(_T("Loading mime.types from '%s': %s\n"),
+ mimetypes.c_str(),
+ g_mimeManager.ReadMimeTypes(mimetypes) ? _T("ok") : _T("ERROR"));
+}
+
+static void TestMimeFilename()
+{
+ wxPuts(_T("*** Testing MIME type from filename query ***\n"));
+
+ static const wxChar *filenames[] =
+ {
+ _T("readme.txt"),
+ _T("document.pdf"),
+ _T("image.gif"),
+ };
+
+ for ( size_t n = 0; n < WXSIZEOF(filenames); n++ )
+ {
+ const wxString fname = filenames[n];
+ wxString ext = fname.AfterLast(_T('.'));
+ wxFileType *ft = g_mimeManager.GetFileTypeFromExtension(ext);
+ if ( !ft )
+ {
+ wxPrintf(_T("WARNING: extension '%s' is unknown.\n"), ext.c_str());
+ }
+ else
+ {
+ wxString desc;
+ if ( !ft->GetDescription(&desc) )
+ desc = _T("<no description>");
+
+ wxString cmd;
+ if ( !ft->GetOpenCommand(&cmd,
+ wxFileType::MessageParameters(fname, _T(""))) )
+ cmd = _T("<no command available>");
+
+ wxPrintf(_T("To open %s (%s) do '%s'.\n"),
+ fname.c_str(), desc.c_str(), cmd.c_str());
+
+ delete ft;
+ }
+ }
+}
+
+static void TestMimeAssociate()
+{
+ wxPuts(_T("*** Testing creation of filetype association ***\n"));
+
+ wxFileTypeInfo ftInfo(
+ _T("application/x-xyz"),
+ _T("xyzview '%s'"), // open cmd
+ _T(""), // print cmd
+ _T("XYZ File") // description
+ _T(".xyz"), // extensions
+ NULL // end of extensions
+ );
+ ftInfo.SetShortDesc(_T("XYZFile")); // used under Win32 only
+
+ wxFileType *ft = g_mimeManager.Associate(ftInfo);
+ if ( !ft )
+ {
+ wxPuts(_T("ERROR: failed to create association!"));
+ }
+ else
+ {
+ // TODO: read it back
+ delete ft;
+ }
+}
+
+#endif // TEST_MIME
+
+// ----------------------------------------------------------------------------
+// misc information functions
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_INFO_FUNCTIONS
+
+#include <wx/utils.h>
+
+static void TestOsInfo()
+{
+ puts("*** Testing OS info functions ***\n");
+
+ int major, minor;
+ wxGetOsVersion(&major, &minor);
+ printf("Running under: %s, version %d.%d\n",
+ wxGetOsDescription().c_str(), major, minor);
+
+ printf("%ld free bytes of memory left.\n", wxGetFreeMemory());
+
+ printf("Host name is %s (%s).\n",
+ wxGetHostName().c_str(), wxGetFullHostName().c_str());
+
+ puts("");
+}
+
+static void TestUserInfo()
+{
+ puts("*** Testing user info functions ***\n");
+
+ printf("User id is:\t%s\n", wxGetUserId().c_str());
+ printf("User name is:\t%s\n", wxGetUserName().c_str());
+ printf("Home dir is:\t%s\n", wxGetHomeDir().c_str());
+ printf("Email address:\t%s\n", wxGetEmailAddress().c_str());
+
+ puts("");
+}
+
+#endif // TEST_INFO_FUNCTIONS
+
+// ----------------------------------------------------------------------------
+// long long
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_LONGLONG
+
+#include <wx/longlong.h>
+#include <wx/timer.h>
+
+// make a 64 bit number from 4 16 bit ones
+#define MAKE_LL(x1, x2, x3, x4) wxLongLong((x1 << 16) | x2, (x3 << 16) | x3)
+
+// get a random 64 bit number
+#define RAND_LL() MAKE_LL(rand(), rand(), rand(), rand())
+
+#if wxUSE_LONGLONG_WX
+inline bool operator==(const wxLongLongWx& a, const wxLongLongNative& b)
+ { return a.GetHi() == b.GetHi() && a.GetLo() == b.GetLo(); }
+inline bool operator==(const wxLongLongNative& a, const wxLongLongWx& b)
+ { return a.GetHi() == b.GetHi() && a.GetLo() == b.GetLo(); }
+#endif // wxUSE_LONGLONG_WX
+
+static void TestSpeed()
+{
+ static const long max = 100000000;
+ long n;
+
+ {
+ wxStopWatch sw;
+
+ long l = 0;
+ for ( n = 0; n < max; n++ )
+ {
+ l += n;
+ }
+
+ printf("Summing longs took %ld milliseconds.\n", sw.Time());
+ }
+
+#if wxUSE_LONGLONG_NATIVE
+ {
+ wxStopWatch sw;
+
+ wxLongLong_t l = 0;
+ for ( n = 0; n < max; n++ )
+ {
+ l += n;
+ }
+
+ printf("Summing wxLongLong_t took %ld milliseconds.\n", sw.Time());
+ }
+#endif // wxUSE_LONGLONG_NATIVE
+
+ {
+ wxStopWatch sw;
+
+ wxLongLong l;
+ for ( n = 0; n < max; n++ )
+ {
+ l += n;
+ }
+
+ printf("Summing wxLongLongs took %ld milliseconds.\n", sw.Time());
+ }
+}
+
+static void TestLongLongConversion()
+{
+ puts("*** Testing wxLongLong conversions ***\n");
+
+ wxLongLong a;
+ size_t nTested = 0;
+ for ( size_t n = 0; n < 100000; n++ )
+ {
+ a = RAND_LL();
+
+#if wxUSE_LONGLONG_NATIVE
+ wxLongLongNative b(a.GetHi(), a.GetLo());
+
+ wxASSERT_MSG( a == b, "conversions failure" );
+#else
+ puts("Can't do it without native long long type, test skipped.");
+
+ return;
+#endif // wxUSE_LONGLONG_NATIVE
+
+ if ( !(nTested % 1000) )
+ {
+ putchar('.');
+ fflush(stdout);
+ }
+
+ nTested++;
+ }
+
+ puts(" done!");
+}
+
+static void TestMultiplication()
+{
+ puts("*** Testing wxLongLong multiplication ***\n");
+
+ wxLongLong a, b;
+ size_t nTested = 0;
+ for ( size_t n = 0; n < 100000; n++ )
+ {
+ a = RAND_LL();
+ b = RAND_LL();
+
+#if wxUSE_LONGLONG_NATIVE
+ wxLongLongNative aa(a.GetHi(), a.GetLo());
+ wxLongLongNative bb(b.GetHi(), b.GetLo());
+
+ wxASSERT_MSG( a*b == aa*bb, "multiplication failure" );
+#else // !wxUSE_LONGLONG_NATIVE
+ puts("Can't do it without native long long type, test skipped.");
+
+ return;
+#endif // wxUSE_LONGLONG_NATIVE
+
+ if ( !(nTested % 1000) )
+ {
+ putchar('.');
+ fflush(stdout);
+ }
+
+ nTested++;
+ }
+
+ puts(" done!");
+}
+
+static void TestDivision()
+{
+ puts("*** Testing wxLongLong division ***\n");
+
+ wxLongLong q, r;
+ size_t nTested = 0;
+ for ( size_t n = 0; n < 100000; n++ )
+ {
+ // get a random wxLongLong (shifting by 12 the MSB ensures that the
+ // multiplication will not overflow)
+ wxLongLong ll = MAKE_LL((rand() >> 12), rand(), rand(), rand());
+
+ // get a random long (not wxLongLong for now) to divide it with
+ long l = rand();
+ q = ll / l;
+ r = ll % l;
+
+#if wxUSE_LONGLONG_NATIVE
+ wxLongLongNative m(ll.GetHi(), ll.GetLo());
+
+ wxLongLongNative p = m / l, s = m % l;
+ wxASSERT_MSG( q == p && r == s, "division failure" );
+#else // !wxUSE_LONGLONG_NATIVE
+ // verify the result
+ wxASSERT_MSG( ll == q*l + r, "division failure" );
+#endif // wxUSE_LONGLONG_NATIVE
+
+ if ( !(nTested % 1000) )
+ {
+ putchar('.');
+ fflush(stdout);
+ }
+
+ nTested++;
+ }
+
+ puts(" done!");
+}
+
+static void TestAddition()
+{
+ puts("*** Testing wxLongLong addition ***\n");
+
+ wxLongLong a, b, c;
+ size_t nTested = 0;
+ for ( size_t n = 0; n < 100000; n++ )
+ {
+ a = RAND_LL();
+ b = RAND_LL();
+ c = a + b;
+
+#if wxUSE_LONGLONG_NATIVE
+ wxASSERT_MSG( c == wxLongLongNative(a.GetHi(), a.GetLo()) +
+ wxLongLongNative(b.GetHi(), b.GetLo()),
+ "addition failure" );
+#else // !wxUSE_LONGLONG_NATIVE
+ wxASSERT_MSG( c - b == a, "addition failure" );
+#endif // wxUSE_LONGLONG_NATIVE
+
+ if ( !(nTested % 1000) )
+ {
+ putchar('.');
+ fflush(stdout);
+ }
+
+ nTested++;
+ }
+
+ puts(" done!");
+}
+
+static void TestBitOperations()
+{
+ puts("*** Testing wxLongLong bit operation ***\n");
+
+ wxLongLong ll;
+ size_t nTested = 0;