Fix wxFileName::MakeRelativeTo() for directory relatively to itself.

The expected result in this case is ".", but the filename became empty instead
when wxPATH_NATIVE was used.

Fix this by examining GetFormat(format), which takes care of mapping
wxPATH_NATIVE to its real value, instead of wxPATH_NATIVE itself.

Also add a unit test verifying that this works as expected.

Closes #17010.
This commit is contained in:
Vadim Zeitlin 2015-05-29 16:23:17 +02:00
parent e606d83e88
commit fda09f917a
2 changed files with 37 additions and 8 deletions

View File

@ -1784,15 +1784,27 @@ bool wxFileName::MakeRelativeTo(const wxString& pathBase, wxPathFormat format)
m_dirs.Insert(wxT(".."), 0u);
}
if ( format == wxPATH_UNIX || format == wxPATH_DOS )
switch ( GetFormat(format) )
{
// a directory made relative with respect to itself is '.' under Unix
// and DOS, by definition (but we don't have to insert "./" for the
// files)
if ( m_dirs.IsEmpty() && IsDir() )
{
m_dirs.Add(wxT('.'));
}
case wxPATH_NATIVE:
case wxPATH_MAX:
wxFAIL_MSG( wxS("unreachable") );
wxFALLTHROUGH;
case wxPATH_UNIX:
case wxPATH_DOS:
// a directory made relative with respect to itself is '.' under
// Unix and DOS, by definition (but we don't have to insert "./"
// for the files)
if ( m_dirs.IsEmpty() && IsDir() )
{
m_dirs.Add(wxT('.'));
}
break;
case wxPATH_MAC:
case wxPATH_VMS:
break;
}
m_relative = true;

View File

@ -133,6 +133,7 @@ private:
CPPUNIT_TEST( TestSetPath );
CPPUNIT_TEST( TestStrip );
CPPUNIT_TEST( TestNormalize );
CPPUNIT_TEST( TestRelative );
CPPUNIT_TEST( TestReplace );
CPPUNIT_TEST( TestGetHumanReadable );
#ifdef __WINDOWS__
@ -158,6 +159,7 @@ private:
void TestSplit();
void TestSetPath();
void TestStrip();
void TestRelative();
void TestNormalize();
void TestReplace();
void TestGetHumanReadable();
@ -441,6 +443,21 @@ void FileNameTestCase::TestNormalize()
#endif // __WINDOWS__
}
void FileNameTestCase::TestRelative()
{
wxFileName fn("a/b.cpp");
fn.MakeRelativeTo("a");
CPPUNIT_ASSERT_EQUAL( "b.cpp", fn.GetFullPath() );
fn.AssignDir("a/b");
fn.MakeRelativeTo("a");
CPPUNIT_ASSERT_EQUAL( "b/", fn.GetFullPath() );
fn.AssignDir("a");
fn.MakeRelativeTo("a");
CPPUNIT_ASSERT_EQUAL( "./", fn.GetFullPath() );
}
void FileNameTestCase::TestReplace()
{
static const struct FileNameTest