+void FileNameTestCase::TestNormalize()
+{
+ // prepare some data to be used later
+ wxString sep = wxFileName::GetPathSeparator();
+ wxString cwd = wxGetCwd();
+ wxString home = wxGetUserHome();
+
+ cwd.Replace(sep, wxT("/"));
+ if (cwd.Last() != wxT('/'))
+ cwd += wxT('/');
+ home.Replace(sep, wxT("/"));
+ if (home.Last() != wxT('/'))
+ home += wxT('/');
+
+ // since we will always be testing paths using the wxPATH_UNIX
+ // format, we need to remove the volume, if present
+ if (home.Contains(wxT(':')))
+ home = home.AfterFirst(wxT(':'));
+ if (cwd.Contains(wxT(':')))
+ cwd = cwd.AfterFirst(wxT(':'));
+
+ static const struct FileNameTest
+ {
+ const char *original;
+ int flags;
+ const char *expected;
+ wxPathFormat fmt;
+ } tests[] =
+ {
+ // test wxPATH_NORM_ENV_VARS
+#ifdef __WXMSW__
+ { "%ABCDEF%/g/h/i", wxPATH_NORM_ENV_VARS, "abcdef/g/h/i", wxPATH_UNIX },
+#else
+ { "$(ABCDEF)/g/h/i", wxPATH_NORM_ENV_VARS, "abcdef/g/h/i", wxPATH_UNIX },
+#endif
+
+ // test wxPATH_NORM_DOTS
+ { "a/.././b/c/../../", wxPATH_NORM_DOTS, "", wxPATH_UNIX },
+
+ // test wxPATH_NORM_TILDE
+ // NB: do the tilde expansion also under Windows to test if it works there too
+ { "/a/b/~", wxPATH_NORM_TILDE, "/a/b/~", wxPATH_UNIX },
+ { "/~/a/b", wxPATH_NORM_TILDE, "HOME/a/b", wxPATH_UNIX },
+ { "~/a/b", wxPATH_NORM_TILDE, "HOME/a/b", wxPATH_UNIX },
+
+ // test wxPATH_NORM_CASE
+ { "Foo", wxPATH_NORM_CASE, "Foo", wxPATH_UNIX },
+ { "Foo", wxPATH_NORM_CASE, "foo", wxPATH_DOS },
+ { "C:\\Program Files\\wx", wxPATH_NORM_CASE,
+ "c:\\program files\\wx", wxPATH_DOS },
+ { "C:/Program Files/wx", wxPATH_NORM_ALL | wxPATH_NORM_CASE,
+ "c:\\program files\\wx", wxPATH_DOS },
+ { "C:\\Users\\zeitlin", wxPATH_NORM_ALL | wxPATH_NORM_CASE,
+ "c:\\users\\zeitlin", wxPATH_DOS },
+
+ // test wxPATH_NORM_ABSOLUTE
+ { "a/b/", wxPATH_NORM_ABSOLUTE, "CWD/a/b/", wxPATH_UNIX },
+ { "a/b/c.ext", wxPATH_NORM_ABSOLUTE, "CWD/a/b/c.ext", wxPATH_UNIX },
+ { "/a", wxPATH_NORM_ABSOLUTE, "/a", wxPATH_UNIX },
+
+ // test giving no flags at all to Normalize()
+ { "a/b/", 0, "a/b/", wxPATH_UNIX },
+ { "a/b/c.ext", 0, "a/b/c.ext", wxPATH_UNIX },
+ { "/a", 0, "/a", wxPATH_UNIX },
+
+ // test handling dots without wxPATH_NORM_DOTS and wxPATH_NORM_ABSOLUTE
+ // for both existing and non-existent files (this is important under
+ // MSW where GetLongPathName() works only for the former)
+ { "./foo", wxPATH_NORM_LONG, "./foo", wxPATH_UNIX },
+ { "../foo", wxPATH_NORM_LONG, "../foo", wxPATH_UNIX },
+ { ".\\test.bkl", wxPATH_NORM_LONG, ".\\test.bkl", wxPATH_DOS },
+ { ".\\foo", wxPATH_NORM_LONG, ".\\foo", wxPATH_DOS },
+ { "..\\Makefile.in", wxPATH_NORM_LONG, "..\\Makefile.in", wxPATH_DOS },
+ { "..\\foo", wxPATH_NORM_LONG, "..\\foo", wxPATH_DOS },
+ };
+
+ // set the env var ABCDEF
+ wxSetEnv(_T("ABCDEF"), _T("abcdef"));
+
+ for ( size_t i = 0; i < WXSIZEOF(tests); i++ )
+ {
+ const FileNameTest& fnt = tests[i];
+ wxFileName fn(fnt.original, fnt.fmt);
+
+ // be sure this normalization does not fail
+ WX_ASSERT_MESSAGE
+ (
+ ("#%d: Normalize(%s) failed", (int)i, fnt.original),
+ fn.Normalize(fnt.flags, cwd, fnt.fmt)
+ );
+
+ // compare result with expected string
+ wxString expected(tests[i].expected);
+ expected.Replace(_T("HOME/"), home);
+ expected.Replace(_T("CWD/"), cwd);
+ WX_ASSERT_EQUAL_MESSAGE
+ (
+ ("array element #%d", (int)i),
+ expected, fn.GetFullPath(fnt.fmt)
+ );
+ }
+
+ // MSW-only test for wxPATH_NORM_LONG: notice that we only run it if short
+ // names generation is not disabled for this system as otherwise the file
+ // MKINST~1 doesn't exist at all and normalizing it fails (it's possible
+ // that we're on a FAT partition in which case the test would still succeed
+ // and also that the registry key was changed recently and didn't take
+ // effect yet but these are marginal cases which we consciously choose to
+ // ignore for now)
+#ifdef __WXMSW__
+ long shortNamesDisabled;
+ if ( wxRegKey
+ (
+ wxRegKey::HKLM,
+ "SYSTEM\\CurrentControlSet\\Control\\FileSystem"
+ ).QueryValue("NtfsDisable8dot3NameCreation", &shortNamesDisabled) &&
+ !shortNamesDisabled )
+ {
+ wxFileName fn("..\\MKINST~1");
+ CPPUNIT_ASSERT( fn.Normalize(wxPATH_NORM_LONG, cwd) );
+ CPPUNIT_ASSERT_EQUAL( "..\\mkinstalldirs", fn.GetFullPath() );
+ }
+ //else: when in doubt, don't run the test
+#endif // __WXMSW__
+}
+
+void FileNameTestCase::TestReplace()