[ 1585253 ] Various important bugfixes to wxFileName::Normalize

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42471 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2006-10-26 21:08:21 +00:00
parent 30be036c6d
commit bf7f7793e9
5 changed files with 143 additions and 32 deletions

View File

@@ -55,9 +55,14 @@ static struct FileNameInfo
{ _T("c:foo.bar"), _T("c"), _T(""), _T("foo"), _T("bar"), false, wxPATH_DOS },
{ _T("c:\\foo.bar"), _T("c"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS },
{ _T("c:\\Windows\\command.com"), _T("c"), _T("\\Windows"), _T("command"), _T("com"), true, wxPATH_DOS },
// NB: when using the wxFileName::GetLongPath() function on these two strings,
// the program will hang various seconds. All those time is taken by the
// call to the win32 API GetLongPathName()...
{ _T("\\\\server\\foo.bar"), _T("server"), _T("\\"), _T("foo"), _T("bar"), true, wxPATH_DOS },
{ _T("\\\\server\\dir\\foo.bar"), _T("server"), _T("\\dir"), _T("foo"), _T("bar"), true, wxPATH_DOS },
// wxFileName support for Mac file names is broken currently
#if 0
// Mac file names
@@ -70,6 +75,8 @@ static struct FileNameInfo
#endif // 0
// VMS file names
// NB: on Windows they have the same effect of the \\server\\ strings
// (see the note above)
{ _T("device:[dir1.dir2.dir3]file.txt"), _T("device"), _T("dir1.dir2.dir3"), _T("file"), _T("txt"), true, wxPATH_VMS },
{ _T("file.txt"), _T(""), _T(""), _T("file"), _T("txt"), false, wxPATH_VMS },
};
@@ -90,6 +97,7 @@ private:
CPPUNIT_TEST( TestSplit );
CPPUNIT_TEST( TestSetPath );
CPPUNIT_TEST( TestStrip );
CPPUNIT_TEST( TestNormalize );
#ifdef __WINDOWS__
CPPUNIT_TEST( TestShortLongPath );
#endif // __WINDOWS__
@@ -100,6 +108,7 @@ private:
void TestSplit();
void TestSetPath();
void TestStrip();
void TestNormalize();
#ifdef __WINDOWS__
void TestShortLongPath();
#endif // __WINDOWS__
@@ -149,7 +158,6 @@ void FileNameTestCase::TestComparison()
fn1.Normalize();
fn2.Normalize();
CPPUNIT_ASSERT(fn1.GetPath() == fn2.GetPath());
}
void FileNameTestCase::TestSplit()
@@ -183,6 +191,76 @@ void FileNameTestCase::TestSetPath()
CPPUNIT_ASSERT( fn.SameAs(wxFileName(_T("/usr/local/bin/ls"), wxPATH_UNIX)) );
}
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 struct FileNameTest
{
wxString original;
int flags;
wxString expected;
} tests[] =
{
// test wxPATH_NORM_ENV_VARS
#ifdef __WXMSW__
{ wxT("%ABCDEF%/g/h/i"), wxPATH_NORM_ENV_VARS, wxT("abcdef/g/h/i") },
#else
{ wxT("$(ABCDEF)/g/h/i"), wxPATH_NORM_ENV_VARS, wxT("abcdef/g/h/i") },
#endif
// test wxPATH_NORM_DOTS
{ wxT("a/.././b/c/../../"), wxPATH_NORM_DOTS, wxT("") },
// test wxPATH_NORM_TILDE
// NB: do the tilde expansion also under Windows to test if it works there too
{ wxT("/a/b/~"), wxPATH_NORM_TILDE, wxT("/a/b/~") },
{ wxT("/~/a/b"), wxPATH_NORM_TILDE, home + wxT("a/b") },
{ wxT("~/a/b"), wxPATH_NORM_TILDE, home + wxT("a/b") },
// test wxPATH_NORM_ABSOLUTE
{ wxT("a/b/"), wxPATH_NORM_ABSOLUTE, cwd + wxT("a/b/") },
{ wxT("a/b/c.ext"), wxPATH_NORM_ABSOLUTE, cwd + wxT("a/b/c.ext") },
{ wxT("/a"), wxPATH_NORM_ABSOLUTE, wxT("/a") },
// test giving no flags at all to Normalize()
{ wxT("a/b/"), 0, wxT("a/b/") },
{ wxT("a/b/c.ext"), 0, wxT("a/b/c.ext") },
{ wxT("/a"), 0, wxT("/a") }
};
// set the env var ABCDEF
wxSetEnv(_T("ABCDEF"), _T("abcdef"));
for (size_t i=0; i < WXSIZEOF(tests); i++)
{
wxFileName fn(tests[i].original, wxPATH_UNIX);
// be sure this normalization does not fail
CPPUNIT_ASSERT( fn.Normalize(tests[i].flags, cwd, wxPATH_UNIX) );
// compare result with expected string
CPPUNIT_ASSERT_EQUAL( tests[i].expected, fn.GetFullPath(wxPATH_UNIX) );
}
}
wxString wxTestStripExtension(wxString szFile)
{
wxStripExtension(szFile);