]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/file/dir.cpp
Move dir tests from the console sample to DirTestCase
[wxWidgets.git] / tests / file / dir.cpp
diff --git a/tests/file/dir.cpp b/tests/file/dir.cpp
new file mode 100644 (file)
index 0000000..50b5b71
--- /dev/null
@@ -0,0 +1,216 @@
+///////////////////////////////////////////////////////////////////////////////
+// Name:        tests/file/dir.cpp
+// Purpose:     wxDir unit test
+// Author:      Francesco Montorsi (extracted from console sample)
+// Created:     2010-06-19
+// RCS-ID:      $Id$
+// Copyright:   (c) 2010 wxWidgets team
+///////////////////////////////////////////////////////////////////////////////
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
+#include "testprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#include "wx/dir.h"
+#include "wx/filename.h"
+
+#define DIRTEST_FOLDER      wxString("dirTest_folder")
+#define SEP                 wxFileName::GetPathSeparator()
+
+// ----------------------------------------------------------------------------
+// test class
+// ----------------------------------------------------------------------------
+
+class DirTestCase : public CppUnit::TestCase
+{
+public:
+    DirTestCase() { }
+
+    virtual void setUp();
+    virtual void tearDown();
+
+private:
+    CPPUNIT_TEST_SUITE( DirTestCase );
+        CPPUNIT_TEST( DirExists );
+        CPPUNIT_TEST( Traverse );
+        CPPUNIT_TEST( Enum );
+    CPPUNIT_TEST_SUITE_END();
+
+    void DirExists();
+    void Traverse();
+    void Enum();
+
+    void CreateTempFile(const wxString& path);
+    wxArrayString DirEnumHelper(wxDir& dir,
+                               int flags = wxDIR_DEFAULT,
+                               const wxString& filespec = wxEmptyString);
+
+    wxDECLARE_NO_COPY_CLASS(DirTestCase);
+};
+
+// ----------------------------------------------------------------------------
+// CppUnit macros
+// ----------------------------------------------------------------------------
+
+CPPUNIT_TEST_SUITE_REGISTRATION( DirTestCase );
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( DirTestCase, "DirTestCase" );
+
+// ----------------------------------------------------------------------------
+// tests implementation
+// ----------------------------------------------------------------------------
+
+void DirTestCase::CreateTempFile(const wxString& path)
+{
+    wxFile f(path, wxFile::write);
+    f.Write("dummy test file");
+    f.Close();
+}
+
+void DirTestCase::setUp()
+{
+    // create a test directory hierarchy
+    wxDir::Make(DIRTEST_FOLDER + SEP + "folder1" + SEP + "subfolder1", wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
+    wxDir::Make(DIRTEST_FOLDER + SEP + "folder1" + SEP + "subfolder2", wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
+    wxDir::Make(DIRTEST_FOLDER + SEP + "folder2", wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
+    wxDir::Make(DIRTEST_FOLDER + SEP + "folder3" + SEP + "subfolder1", wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
+    
+    CreateTempFile(DIRTEST_FOLDER + SEP + "folder1" + SEP + "subfolder2" + SEP + "dummy");
+    CreateTempFile(DIRTEST_FOLDER + SEP + "dummy");
+}
+
+void DirTestCase::tearDown()
+{
+    wxRemove(DIRTEST_FOLDER + SEP + "folder1" + SEP + "subfolder2" + SEP + "dummy");
+    wxRemove(DIRTEST_FOLDER + SEP + "dummy");
+    wxDir::Remove(DIRTEST_FOLDER, wxPATH_RMDIR_RECURSIVE);
+}
+
+wxArrayString DirTestCase::DirEnumHelper(wxDir& dir,
+                                         int flags,
+                                         const wxString& filespec)
+{
+    wxArrayString ret;
+    CPPUNIT_ASSERT( dir.IsOpened() );
+
+    wxString filename;
+    bool cont = dir.GetFirst(&filename, filespec, flags);
+    while ( cont )
+    {
+        ret.push_back(filename);
+        cont = dir.GetNext(&filename);
+    }
+
+    return ret;
+}
+
+void DirTestCase::Enum()
+{
+    wxDir dir(DIRTEST_FOLDER);
+    CPPUNIT_ASSERT( dir.IsOpened() );
+
+    // enumerating everything in test directory
+    CPPUNIT_ASSERT_EQUAL(4, DirEnumHelper(dir).size());
+
+    // enumerating really everything in test directory recursively
+    CPPUNIT_ASSERT_EQUAL(6, DirEnumHelper(dir, wxDIR_DEFAULT | wxDIR_DOTDOT).size());
+
+    // enumerating object files in test directory
+    CPPUNIT_ASSERT_EQUAL(0, DirEnumHelper(dir, wxDIR_DEFAULT, "*.o*").size());
+
+    // enumerating directories in test directory
+    CPPUNIT_ASSERT_EQUAL(3, DirEnumHelper(dir, wxDIR_DIRS).size());
+
+    // enumerating files in test directory
+    CPPUNIT_ASSERT_EQUAL(1, DirEnumHelper(dir, wxDIR_FILES).size());
+
+    // enumerating files including hidden in test directory
+    CPPUNIT_ASSERT_EQUAL(1, DirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN).size());
+
+    // enumerating files and folders in test directory
+    CPPUNIT_ASSERT_EQUAL(4, DirEnumHelper(dir, wxDIR_FILES | wxDIR_DIRS).size());
+}
+
+class TestDirTraverser : public wxDirTraverser
+{
+public:
+    wxArrayString dirs;
+
+    virtual wxDirTraverseResult OnFile(const wxString& WXUNUSED(filename))
+    {
+        return wxDIR_CONTINUE;
+    }
+
+    virtual wxDirTraverseResult OnDir(const wxString& dirname)
+    {
+        dirs.push_back(dirname);
+        return wxDIR_CONTINUE;
+    }
+};
+
+void DirTestCase::Traverse()
+{
+    // enum all files
+    wxArrayString files;
+    CPPUNIT_ASSERT_EQUAL(2, wxDir::GetAllFiles(DIRTEST_FOLDER, &files));
+
+    // enum again with custom traverser
+    wxDir dir(DIRTEST_FOLDER);
+    TestDirTraverser traverser;
+    dir.Traverse(traverser, wxEmptyString, wxDIR_DIRS | wxDIR_HIDDEN);
+    CPPUNIT_ASSERT_EQUAL(6, traverser.dirs.size());
+}
+
+void DirTestCase::DirExists()
+{
+    struct
+    {
+        const char *dirname;
+        bool shouldExist;
+    } testData[] = 
+    {
+        { ".", true },
+        { "..", true },
+#if defined(__WXMSW__)
+        { "..\\..", true },
+        { "..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..", /*false*/ true },
+                // FIXME: should fail but it doesn't... looks like a bug in GetFileAttributes() win API
+        { "c:", true },
+        { "c:\\", true },
+        { "c:\\\\", true },
+        { "\\\\share\\file", false },
+        { "c:\\a\\directory\\which\\does\\not\\exist", false },
+        { "c:\\a\\directory\\which\\does\\not\\exist\\", false },
+        { "c:\\a\\directory\\which\\does\\not\\exist\\\\", false },
+        { "test.exe", false }       // not a directory!
+#elif defined(__UNIX__)
+        { "../..", true },
+        { "../../../../../../../../../../../../../../../../../../../..", false },
+        { "/", true },
+        { "//", true },
+        { "/usr/bin", true },
+        { "/usr//bin", false },
+        { "/usr///bin", false }
+#endif
+    };
+
+    for ( size_t n = 0; n < WXSIZEOF(testData); n++ )
+    {
+        wxString errDesc = wxString::Format("failed on directory '%s'", testData[n].dirname);
+        CPPUNIT_ASSERT_EQUAL_MESSAGE(errDesc.ToStdString(), testData[n].shouldExist, wxDir::Exists(testData[n].dirname));
+
+        if (!testData[n].shouldExist)
+        {
+            wxDir d(testData[n].dirname);
+            CPPUNIT_ASSERT(!d.IsOpened());
+        }
+    }
+
+    CPPUNIT_ASSERT( wxDir::Exists(wxGetCwd()) );
+}
+