+ wxListBars list1;
+ list1.Append(new Bar(_T("first")));
+ list1.Append(new Bar(_T("second")));
+
+ wxPrintf(_T("After 1st list creation: %u objects in the list, %u objects total.\n"),
+ list1.GetCount(), Bar::GetNumber());
+
+ wxListBars list2;
+ list2 = list1;
+
+ wxPrintf(_T("After 2nd list creation: %u and %u objects in the lists, %u objects total.\n"),
+ list1.GetCount(), list2.GetCount(), Bar::GetNumber());
+
+#if !wxUSE_STL
+ list1.DeleteContents(true);
+#else
+ WX_CLEAR_LIST(wxListBars, list1);
+#endif
+ }
+
+ wxPrintf(_T("After list destruction: %u objects left.\n"), Bar::GetNumber());
+}
+
+#endif // TEST_LIST
+
+// ----------------------------------------------------------------------------
+// wxLocale
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_LOCALE
+
+#include "wx/intl.h"
+#include "wx/utils.h" // for wxSetEnv
+
+static wxLocale gs_localeDefault(wxLANGUAGE_ENGLISH);
+
+// find the name of the language from its value
+static const wxChar *GetLangName(int lang)
+{
+ static const wxChar *languageNames[] =
+ {
+ _T("DEFAULT"),
+ _T("UNKNOWN"),
+ _T("ABKHAZIAN"),
+ _T("AFAR"),
+ _T("AFRIKAANS"),
+ _T("ALBANIAN"),
+ _T("AMHARIC"),
+ _T("ARABIC"),
+ _T("ARABIC_ALGERIA"),
+ _T("ARABIC_BAHRAIN"),
+ _T("ARABIC_EGYPT"),
+ _T("ARABIC_IRAQ"),
+ _T("ARABIC_JORDAN"),
+ _T("ARABIC_KUWAIT"),
+ _T("ARABIC_LEBANON"),
+ _T("ARABIC_LIBYA"),
+ _T("ARABIC_MOROCCO"),
+ _T("ARABIC_OMAN"),
+ _T("ARABIC_QATAR"),
+ _T("ARABIC_SAUDI_ARABIA"),
+ _T("ARABIC_SUDAN"),
+ _T("ARABIC_SYRIA"),
+ _T("ARABIC_TUNISIA"),
+ _T("ARABIC_UAE"),
+ _T("ARABIC_YEMEN"),
+ _T("ARMENIAN"),
+ _T("ASSAMESE"),
+ _T("AYMARA"),
+ _T("AZERI"),
+ _T("AZERI_CYRILLIC"),
+ _T("AZERI_LATIN"),
+ _T("BASHKIR"),
+ _T("BASQUE"),
+ _T("BELARUSIAN"),
+ _T("BENGALI"),
+ _T("BHUTANI"),
+ _T("BIHARI"),
+ _T("BISLAMA"),
+ _T("BRETON"),
+ _T("BULGARIAN"),
+ _T("BURMESE"),
+ _T("CAMBODIAN"),
+ _T("CATALAN"),
+ _T("CHINESE"),
+ _T("CHINESE_SIMPLIFIED"),
+ _T("CHINESE_TRADITIONAL"),
+ _T("CHINESE_HONGKONG"),
+ _T("CHINESE_MACAU"),
+ _T("CHINESE_SINGAPORE"),
+ _T("CHINESE_TAIWAN"),
+ _T("CORSICAN"),
+ _T("CROATIAN"),
+ _T("CZECH"),
+ _T("DANISH"),
+ _T("DUTCH"),
+ _T("DUTCH_BELGIAN"),
+ _T("ENGLISH"),
+ _T("ENGLISH_UK"),
+ _T("ENGLISH_US"),
+ _T("ENGLISH_AUSTRALIA"),
+ _T("ENGLISH_BELIZE"),
+ _T("ENGLISH_BOTSWANA"),
+ _T("ENGLISH_CANADA"),
+ _T("ENGLISH_CARIBBEAN"),
+ _T("ENGLISH_DENMARK"),
+ _T("ENGLISH_EIRE"),
+ _T("ENGLISH_JAMAICA"),
+ _T("ENGLISH_NEW_ZEALAND"),
+ _T("ENGLISH_PHILIPPINES"),
+ _T("ENGLISH_SOUTH_AFRICA"),
+ _T("ENGLISH_TRINIDAD"),
+ _T("ENGLISH_ZIMBABWE"),
+ _T("ESPERANTO"),
+ _T("ESTONIAN"),
+ _T("FAEROESE"),
+ _T("FARSI"),
+ _T("FIJI"),
+ _T("FINNISH"),
+ _T("FRENCH"),
+ _T("FRENCH_BELGIAN"),
+ _T("FRENCH_CANADIAN"),
+ _T("FRENCH_LUXEMBOURG"),
+ _T("FRENCH_MONACO"),
+ _T("FRENCH_SWISS"),
+ _T("FRISIAN"),
+ _T("GALICIAN"),
+ _T("GEORGIAN"),
+ _T("GERMAN"),
+ _T("GERMAN_AUSTRIAN"),
+ _T("GERMAN_BELGIUM"),
+ _T("GERMAN_LIECHTENSTEIN"),
+ _T("GERMAN_LUXEMBOURG"),
+ _T("GERMAN_SWISS"),
+ _T("GREEK"),
+ _T("GREENLANDIC"),
+ _T("GUARANI"),
+ _T("GUJARATI"),
+ _T("HAUSA"),
+ _T("HEBREW"),
+ _T("HINDI"),
+ _T("HUNGARIAN"),
+ _T("ICELANDIC"),
+ _T("INDONESIAN"),
+ _T("INTERLINGUA"),
+ _T("INTERLINGUE"),
+ _T("INUKTITUT"),
+ _T("INUPIAK"),
+ _T("IRISH"),
+ _T("ITALIAN"),
+ _T("ITALIAN_SWISS"),
+ _T("JAPANESE"),
+ _T("JAVANESE"),
+ _T("KANNADA"),
+ _T("KASHMIRI"),
+ _T("KASHMIRI_INDIA"),
+ _T("KAZAKH"),
+ _T("KERNEWEK"),
+ _T("KINYARWANDA"),
+ _T("KIRGHIZ"),
+ _T("KIRUNDI"),
+ _T("KONKANI"),
+ _T("KOREAN"),
+ _T("KURDISH"),
+ _T("LAOTHIAN"),
+ _T("LATIN"),
+ _T("LATVIAN"),
+ _T("LINGALA"),
+ _T("LITHUANIAN"),
+ _T("MACEDONIAN"),
+ _T("MALAGASY"),
+ _T("MALAY"),
+ _T("MALAYALAM"),
+ _T("MALAY_BRUNEI_DARUSSALAM"),
+ _T("MALAY_MALAYSIA"),
+ _T("MALTESE"),
+ _T("MANIPURI"),
+ _T("MAORI"),
+ _T("MARATHI"),
+ _T("MOLDAVIAN"),
+ _T("MONGOLIAN"),
+ _T("NAURU"),
+ _T("NEPALI"),
+ _T("NEPALI_INDIA"),
+ _T("NORWEGIAN_BOKMAL"),
+ _T("NORWEGIAN_NYNORSK"),
+ _T("OCCITAN"),
+ _T("ORIYA"),
+ _T("OROMO"),
+ _T("PASHTO"),
+ _T("POLISH"),
+ _T("PORTUGUESE"),
+ _T("PORTUGUESE_BRAZILIAN"),
+ _T("PUNJABI"),
+ _T("QUECHUA"),
+ _T("RHAETO_ROMANCE"),
+ _T("ROMANIAN"),
+ _T("RUSSIAN"),
+ _T("RUSSIAN_UKRAINE"),
+ _T("SAMOAN"),
+ _T("SANGHO"),
+ _T("SANSKRIT"),
+ _T("SCOTS_GAELIC"),
+ _T("SERBIAN"),
+ _T("SERBIAN_CYRILLIC"),
+ _T("SERBIAN_LATIN"),
+ _T("SERBO_CROATIAN"),
+ _T("SESOTHO"),
+ _T("SETSWANA"),
+ _T("SHONA"),
+ _T("SINDHI"),
+ _T("SINHALESE"),
+ _T("SISWATI"),
+ _T("SLOVAK"),
+ _T("SLOVENIAN"),
+ _T("SOMALI"),
+ _T("SPANISH"),
+ _T("SPANISH_ARGENTINA"),
+ _T("SPANISH_BOLIVIA"),
+ _T("SPANISH_CHILE"),
+ _T("SPANISH_COLOMBIA"),
+ _T("SPANISH_COSTA_RICA"),
+ _T("SPANISH_DOMINICAN_REPUBLIC"),
+ _T("SPANISH_ECUADOR"),
+ _T("SPANISH_EL_SALVADOR"),
+ _T("SPANISH_GUATEMALA"),
+ _T("SPANISH_HONDURAS"),
+ _T("SPANISH_MEXICAN"),
+ _T("SPANISH_MODERN"),
+ _T("SPANISH_NICARAGUA"),
+ _T("SPANISH_PANAMA"),
+ _T("SPANISH_PARAGUAY"),
+ _T("SPANISH_PERU"),
+ _T("SPANISH_PUERTO_RICO"),
+ _T("SPANISH_URUGUAY"),
+ _T("SPANISH_US"),
+ _T("SPANISH_VENEZUELA"),
+ _T("SUNDANESE"),
+ _T("SWAHILI"),
+ _T("SWEDISH"),
+ _T("SWEDISH_FINLAND"),
+ _T("TAGALOG"),
+ _T("TAJIK"),
+ _T("TAMIL"),
+ _T("TATAR"),
+ _T("TELUGU"),
+ _T("THAI"),
+ _T("TIBETAN"),
+ _T("TIGRINYA"),
+ _T("TONGA"),
+ _T("TSONGA"),
+ _T("TURKISH"),
+ _T("TURKMEN"),
+ _T("TWI"),
+ _T("UIGHUR"),
+ _T("UKRAINIAN"),
+ _T("URDU"),
+ _T("URDU_INDIA"),
+ _T("URDU_PAKISTAN"),
+ _T("UZBEK"),
+ _T("UZBEK_CYRILLIC"),
+ _T("UZBEK_LATIN"),
+ _T("VIETNAMESE"),
+ _T("VOLAPUK"),
+ _T("WELSH"),
+ _T("WOLOF"),
+ _T("XHOSA"),
+ _T("YIDDISH"),
+ _T("YORUBA"),
+ _T("ZHUANG"),
+ _T("ZULU"),
+ };
+
+ if ( (size_t)lang < WXSIZEOF(languageNames) )
+ return languageNames[lang];
+ else
+ return _T("INVALID");
+}
+
+static void TestDefaultLang()
+{
+ wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
+
+ static const wxChar *langStrings[] =
+ {
+ NULL, // system default
+ _T("C"),
+ _T("fr"),
+ _T("fr_FR"),
+ _T("en"),
+ _T("en_GB"),
+ _T("en_US"),
+ _T("de_DE.iso88591"),
+ _T("german"),
+ _T("?"), // invalid lang spec
+ _T("klingonese"), // I bet on some systems it does exist...
+ };
+
+ wxPrintf(_T("The default system encoding is %s (%d)\n"),
+ wxLocale::GetSystemEncodingName().c_str(),
+ wxLocale::GetSystemEncoding());
+
+ for ( size_t n = 0; n < WXSIZEOF(langStrings); n++ )
+ {
+ const wxChar *langStr = langStrings[n];
+ if ( langStr )
+ {
+ // FIXME: this doesn't do anything at all under Windows, we need
+ // to create a new wxLocale!
+ wxSetEnv(_T("LC_ALL"), langStr);
+ }
+
+ int lang = gs_localeDefault.GetSystemLanguage();
+ wxPrintf(_T("Locale for '%s' is %s.\n"),
+ langStr ? langStr : _T("system default"), GetLangName(lang));
+ }
+}
+
+#endif // TEST_LOCALE
+
+// ----------------------------------------------------------------------------
+// MIME types
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_MIME
+
+#include "wx/mimetype.h"
+
+static void TestMimeEnum()
+{
+ wxPuts(_T("*** Testing wxMimeTypesManager::EnumAllFileTypes() ***\n"));
+
+ wxArrayString mimetypes;
+
+ size_t count = wxTheMimeTypesManager->EnumAllFileTypes(mimetypes);
+
+ wxPrintf(_T("*** All %u known filetypes: ***\n"), count);
+
+ wxArrayString exts;
+ wxString desc;
+
+ for ( size_t n = 0; n < count; n++ )
+ {
+ wxFileType *filetype =
+ wxTheMimeTypesManager->GetFileTypeFromMimeType(mimetypes[n]);
+ if ( !filetype )
+ {
+ wxPrintf(_T("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];
+ }
+
+ wxPrintf(_T("\t%s: %s (%s)\n"),
+ mimetypes[n].c_str(), desc.c_str(), extsAll.c_str());
+ }
+
+ wxPuts(_T(""));
+}
+
+static void TestMimeOverride()
+{
+ wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
+
+ static const wxChar *mailcap = _T("/tmp/mailcap");
+ static const wxChar *mimetypes = _T("/tmp/mime.types");
+
+ if ( wxFile::Exists(mailcap) )
+ wxPrintf(_T("Loading mailcap from '%s': %s\n"),
+ mailcap,
+ wxTheMimeTypesManager->ReadMailcap(mailcap) ? _T("ok") : _T("ERROR"));
+ else
+ wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
+ mailcap);
+
+ if ( wxFile::Exists(mimetypes) )
+ wxPrintf(_T("Loading mime.types from '%s': %s\n"),
+ mimetypes,
+ wxTheMimeTypesManager->ReadMimeTypes(mimetypes) ? _T("ok") : _T("ERROR"));
+ else
+ wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
+ mimetypes);
+
+ wxPuts(_T(""));
+}
+
+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"),
+ _T("picture.jpeg"),
+ };
+
+ for ( size_t n = 0; n < WXSIZEOF(filenames); n++ )
+ {
+ const wxString fname = filenames[n];
+ wxString ext = fname.AfterLast(_T('.'));
+ wxFileType *ft = wxTheMimeTypesManager->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>");
+ else
+ cmd = wxString(_T('"')) + cmd + _T('"');
+
+ wxPrintf(_T("To open %s (%s) do %s.\n"),
+ fname.c_str(), desc.c_str(), cmd.c_str());
+
+ delete ft;
+ }
+ }
+
+ wxPuts(_T(""));
+}
+
+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 = wxTheMimeTypesManager->Associate(ftInfo);
+ if ( !ft )
+ {
+ wxPuts(_T("ERROR: failed to create association!"));
+ }
+ else
+ {
+ // TODO: read it back
+ delete ft;
+ }
+
+ wxPuts(_T(""));
+}
+
+#endif // TEST_MIME
+
+// ----------------------------------------------------------------------------
+// misc information functions
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_INFO_FUNCTIONS
+
+#include "wx/utils.h"
+
+static void TestDiskInfo()
+{
+ wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
+
+ for ( ;; )
+ {
+ wxChar pathname[128];
+ wxPrintf(_T("\nEnter a directory name: "));
+ if ( !wxFgets(pathname, WXSIZEOF(pathname), stdin) )
+ break;
+
+ // kill the last '\n'
+ pathname[wxStrlen(pathname) - 1] = 0;
+
+ wxLongLong total, free;
+ if ( !wxGetDiskSpace(pathname, &total, &free) )
+ {
+ wxPuts(_T("ERROR: wxGetDiskSpace failed."));
+ }
+ else
+ {
+ wxPrintf(_T("%sKb total, %sKb free on '%s'.\n"),
+ (total / 1024).ToString().c_str(),
+ (free / 1024).ToString().c_str(),
+ pathname);
+ }
+ }
+}
+
+static void TestOsInfo()
+{
+ wxPuts(_T("*** Testing OS info functions ***\n"));
+
+ int major, minor;
+ wxGetOsVersion(&major, &minor);
+ wxPrintf(_T("Running under: %s, version %d.%d\n"),
+ wxGetOsDescription().c_str(), major, minor);
+
+ wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
+
+ wxPrintf(_T("Host name is %s (%s).\n"),
+ wxGetHostName().c_str(), wxGetFullHostName().c_str());
+
+ wxPuts(_T(""));
+}
+
+static void TestUserInfo()
+{
+ wxPuts(_T("*** Testing user info functions ***\n"));
+
+ wxPrintf(_T("User id is:\t%s\n"), wxGetUserId().c_str());
+ wxPrintf(_T("User name is:\t%s\n"), wxGetUserName().c_str());
+ wxPrintf(_T("Home dir is:\t%s\n"), wxGetHomeDir().c_str());
+ wxPrintf(_T("Email address:\t%s\n"), wxGetEmailAddress().c_str());
+
+ wxPuts(_T(""));
+}
+
+#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())
+
+static const long testLongs[] =
+{
+ 0,
+ 1,
+ -1,
+ LONG_MAX,
+ LONG_MIN,
+ 0x1234,
+ -0x1234
+};
+
+#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;
+ }
+
+ wxPrintf(_T("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;
+ }
+
+ wxPrintf(_T("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;
+ }
+
+ wxPrintf(_T("Summing wxLongLongs took %ld milliseconds.\n"), sw.Time());
+ }
+}
+
+static void TestLongLongConversion()
+{
+ wxPuts(_T("*** 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
+ wxPuts(_T("Can't do it without native long long type, test skipped."));
+
+ return;
+#endif // wxUSE_LONGLONG_NATIVE
+
+ if ( !(nTested % 1000) )
+ {
+ putchar('.');
+ fflush(stdout);
+ }
+
+ nTested++;
+ }
+
+ wxPuts(_T(" done!"));
+}
+
+static void TestMultiplication()
+{
+ wxPuts(_T("*** 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
+ wxPuts(_T("Can't do it without native long long type, test skipped."));
+
+ return;
+#endif // wxUSE_LONGLONG_NATIVE
+
+ if ( !(nTested % 1000) )
+ {
+ putchar('.');
+ fflush(stdout);
+ }
+
+ nTested++;
+ }
+
+ wxPuts(_T(" done!"));
+}
+
+static void TestDivision()
+{
+ wxPuts(_T("*** 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 (but non null) long (not wxLongLong for now) to divide
+ // it with
+ long l;
+ do
+ {
+ l = rand();
+ }
+ while ( !l );
+