#include "wx/filename.h"
#include "wx/filefn.h"
#include "wx/stdpaths.h"
+#include "wx/scopeguard.h"
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
#include "wx/msw/registry.h"
-#endif // __WXMSW__
+#endif // __WINDOWS__
+
+#ifdef __UNIX__
+ #include <unistd.h>
+#endif // __UNIX__
#include "testfile.h"
CPPUNIT_TEST( TestVolumeUniqueName );
CPPUNIT_TEST( TestCreateTempFileName );
CPPUNIT_TEST( TestGetTimes );
+ CPPUNIT_TEST( TestExists );
+ CPPUNIT_TEST( TestIsSame );
CPPUNIT_TEST_SUITE_END();
void TestConstruction();
void TestVolumeUniqueName();
void TestCreateTempFileName();
void TestGetTimes();
+ void TestExists();
+ void TestIsSame();
DECLARE_NO_COPY_CLASS(FileNameTestCase)
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( FileNameTestCase );
-// also include in it's own registry so that these tests can be run alone
+// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( FileNameTestCase, "FileNameTestCase" );
void FileNameTestCase::TestConstruction()
} tests[] =
{
// test wxPATH_NORM_ENV_VARS
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
{ "%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 },
// 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__
+#ifdef __WINDOWS__
long shortNamesDisabled;
if ( wxRegKey
(
CPPUNIT_ASSERT_EQUAL( "..\\mkinstalldirs", fn.GetFullPath() );
}
//else: when in doubt, don't run the test
-#endif // __WXMSW__
+#endif // __WINDOWS__
}
void FileNameTestCase::TestReplace()
{ "foo", "$SYSTEM_TEMP", true },
{ "..", "$SYSTEM_TEMP", true },
{ "../bar", "..", true },
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
{ "$USER_DOCS_DIR\\", "$USER_DOCS_DIR", true },
{ "c:\\a\\directory\\which\\does\\not\\exist", "", false },
#elif defined( __UNIX__ )
{
wxFileName fn(wxFileName::CreateTempFileName("filenametest"));
CPPUNIT_ASSERT( fn.IsOk() );
+ wxON_BLOCK_EXIT1( wxRemoveFile, fn.GetFullPath() );
wxDateTime dtAccess, dtMod, dtCreate;
CPPUNIT_ASSERT( fn.GetTimes(&dtAccess, &dtMod, &dtCreate) );
CPPUNIT_ASSERT(dtMod.IsEqualUpTo(wxDateTime::Now(), wxTimeSpan(0,1)));
CPPUNIT_ASSERT(dtAccess.IsEqualUpTo(wxDateTime::Now(), wxTimeSpan(0,1)));
}
+
+void FileNameTestCase::TestExists()
+{
+ wxFileName fn(wxFileName::CreateTempFileName("filenametest"));
+ CPPUNIT_ASSERT( fn.IsOk() );
+ wxON_BLOCK_EXIT1( wxRemoveFile, fn.GetFullPath() );
+
+ CPPUNIT_ASSERT( fn.FileExists() );
+ CPPUNIT_ASSERT( !wxFileName::DirExists(fn.GetFullPath()) );
+ CPPUNIT_ASSERT( fn.Exists() );
+
+ wxFileName dirTemp(wxFileName::DirName(wxFileName::GetTempDir()));
+ CPPUNIT_ASSERT( !dirTemp.FileExists() );
+ CPPUNIT_ASSERT( dirTemp.DirExists() );
+ CPPUNIT_ASSERT( dirTemp.Exists() );
+
+#ifdef __UNIX__
+ CPPUNIT_ASSERT( !wxFileName::FileExists("/dev/null") );
+ CPPUNIT_ASSERT( !wxFileName::DirExists("/dev/null") );
+ CPPUNIT_ASSERT( wxFileName::Exists("/dev/null") );
+#endif // __UNIX__
+}
+
+void FileNameTestCase::TestIsSame()
+{
+ wxFileName fn1( wxFileName::CreateTempFileName( "filenametest1" ) );
+ CPPUNIT_ASSERT( fn1.IsOk() );
+ wxON_BLOCK_EXIT1( wxRemoveFile, fn1.GetFullPath() );
+
+ wxFileName fn2( wxFileName::CreateTempFileName( "filenametest2" ) );
+ CPPUNIT_ASSERT( fn2.IsOk() );
+ wxON_BLOCK_EXIT1( wxRemoveFile, fn2.GetFullPath() );
+
+ CPPUNIT_ASSERT( fn1.SameAs( fn1 ) );
+ CPPUNIT_ASSERT( !fn1.SameAs( fn2 ) );
+
+#if defined(__UNIX__)
+ // We need to create a temporary directory and a temporary link.
+ // Unfortunately we can't use wxFileName::CreateTempFileName() for neither
+ // as it creates plain files, so use tempnam() explicitly instead.
+ char* tn = tempnam(NULL, "wxfn1");
+ const wxString tempdir1 = wxString::From8BitData(tn);
+ free(tn);
+
+ CPPUNIT_ASSERT( wxFileName::Mkdir(tempdir1) );
+ // Unfortunately the casts are needed to select the overload we need here.
+ wxON_BLOCK_EXIT2( static_cast<bool (*)(const wxString&, int)>(wxFileName::Rmdir),
+ tempdir1, static_cast<int>(wxPATH_RMDIR_RECURSIVE) );
+
+ tn = tempnam(NULL, "wxfn2");
+ const wxString tempdir2 = wxString::From8BitData(tn);
+ free(tn);
+ CPPUNIT_ASSERT_EQUAL( 0, symlink(tempdir1.c_str(), tempdir2.c_str()) );
+ wxON_BLOCK_EXIT1( wxRemoveFile, tempdir2 );
+
+
+ wxFileName fn3(tempdir1, "foo");
+ wxFileName fn4(tempdir2, "foo");
+
+ // These files have different paths, hence are different.
+ CPPUNIT_ASSERT( !fn3.SameAs(fn4) );
+
+ // Create and close a file to trigger creating it.
+ wxFile(fn3.GetFullPath(), wxFile::write);
+
+ // Now that both files do exist we should be able to detect that they are
+ // actually the same file.
+ CPPUNIT_ASSERT( fn3.SameAs(fn4) );
+#endif // __UNIX__
+}