Disable wxFont::SetStrikethrough() test under wxOSX.
[wxWidgets.git] / tests / file / dir.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/file/dir.cpp
3 // Purpose: wxDir unit test
4 // Author: Francesco Montorsi (extracted from console sample)
5 // Created: 2010-06-19
6 // RCS-ID: $Id$
7 // Copyright: (c) 2010 wxWidgets team
8 ///////////////////////////////////////////////////////////////////////////////
9
10 // ----------------------------------------------------------------------------
11 // headers
12 // ----------------------------------------------------------------------------
13
14 #include "testprec.h"
15
16 #ifdef __BORLANDC__
17 #pragma hdrstop
18 #endif
19
20 #include "wx/dir.h"
21 #include "wx/filename.h"
22 #include "wx/stdpaths.h"
23
24 #define DIRTEST_FOLDER wxString("dirTest_folder")
25 #define SEP wxFileName::GetPathSeparator()
26
27 // ----------------------------------------------------------------------------
28 // test class
29 // ----------------------------------------------------------------------------
30
31 class DirTestCase : public CppUnit::TestCase
32 {
33 public:
34 DirTestCase() { }
35
36 virtual void setUp();
37 virtual void tearDown();
38
39 private:
40 CPPUNIT_TEST_SUITE( DirTestCase );
41 CPPUNIT_TEST( DirExists );
42 CPPUNIT_TEST( Traverse );
43 CPPUNIT_TEST( Enum );
44 CPPUNIT_TEST( GetName );
45 CPPUNIT_TEST_SUITE_END();
46
47 void DirExists();
48 void Traverse();
49 void Enum();
50 void GetName();
51
52 void CreateTempFile(const wxString& path);
53 wxArrayString DirEnumHelper(wxDir& dir,
54 int flags = wxDIR_DEFAULT,
55 const wxString& filespec = wxEmptyString);
56
57 wxDECLARE_NO_COPY_CLASS(DirTestCase);
58 };
59
60 // ----------------------------------------------------------------------------
61 // CppUnit macros
62 // ----------------------------------------------------------------------------
63
64 CPPUNIT_TEST_SUITE_REGISTRATION( DirTestCase );
65 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( DirTestCase, "DirTestCase" );
66
67 // ----------------------------------------------------------------------------
68 // tests implementation
69 // ----------------------------------------------------------------------------
70
71 void DirTestCase::CreateTempFile(const wxString& path)
72 {
73 wxFile f(path, wxFile::write);
74 f.Write("dummy test file");
75 f.Close();
76 }
77
78 void DirTestCase::setUp()
79 {
80 // create a test directory hierarchy
81 wxDir::Make(DIRTEST_FOLDER + SEP + "folder1" + SEP + "subfolder1", wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
82 wxDir::Make(DIRTEST_FOLDER + SEP + "folder1" + SEP + "subfolder2", wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
83 wxDir::Make(DIRTEST_FOLDER + SEP + "folder2", wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
84 wxDir::Make(DIRTEST_FOLDER + SEP + "folder3" + SEP + "subfolder1", wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL);
85
86 CreateTempFile(DIRTEST_FOLDER + SEP + "folder1" + SEP + "subfolder2" + SEP + "dummy");
87 CreateTempFile(DIRTEST_FOLDER + SEP + "dummy");
88 CreateTempFile(DIRTEST_FOLDER + SEP + "folder3" + SEP + "subfolder1" + SEP + "dummy.foo");
89 CreateTempFile(DIRTEST_FOLDER + SEP + "folder3" + SEP + "subfolder1" + SEP + "dummy.foo.bar");
90 }
91
92 void DirTestCase::tearDown()
93 {
94 wxRemove(DIRTEST_FOLDER + SEP + "folder1" + SEP + "subfolder2" + SEP + "dummy");
95 wxRemove(DIRTEST_FOLDER + SEP + "dummy");
96 wxRemove(DIRTEST_FOLDER + SEP + "folder3" + SEP + "subfolder1" + SEP + "dummy.foo");
97 wxRemove(DIRTEST_FOLDER + SEP + "folder3" + SEP + "subfolder1" + SEP + "dummy.foo.bar");
98 wxDir::Remove(DIRTEST_FOLDER, wxPATH_RMDIR_RECURSIVE);
99 }
100
101 wxArrayString DirTestCase::DirEnumHelper(wxDir& dir,
102 int flags,
103 const wxString& filespec)
104 {
105 wxArrayString ret;
106 CPPUNIT_ASSERT( dir.IsOpened() );
107
108 wxString filename;
109 bool cont = dir.GetFirst(&filename, filespec, flags);
110 while ( cont )
111 {
112 ret.push_back(filename);
113 cont = dir.GetNext(&filename);
114 }
115
116 return ret;
117 }
118
119 void DirTestCase::Enum()
120 {
121 wxDir dir(DIRTEST_FOLDER);
122 CPPUNIT_ASSERT( dir.IsOpened() );
123
124 // enumerating everything in test directory
125 CPPUNIT_ASSERT_EQUAL(4, DirEnumHelper(dir).size());
126
127 // enumerating really everything in test directory recursively
128 CPPUNIT_ASSERT_EQUAL(6, DirEnumHelper(dir, wxDIR_DEFAULT | wxDIR_DOTDOT).size());
129
130 // enumerating object files in test directory
131 CPPUNIT_ASSERT_EQUAL(0, DirEnumHelper(dir, wxDIR_DEFAULT, "*.o*").size());
132
133 // enumerating directories in test directory
134 CPPUNIT_ASSERT_EQUAL(3, DirEnumHelper(dir, wxDIR_DIRS).size());
135
136 // enumerating files in test directory
137 CPPUNIT_ASSERT_EQUAL(1, DirEnumHelper(dir, wxDIR_FILES).size());
138
139 // enumerating files including hidden in test directory
140 CPPUNIT_ASSERT_EQUAL(1, DirEnumHelper(dir, wxDIR_FILES | wxDIR_HIDDEN).size());
141
142 // enumerating files and folders in test directory
143 CPPUNIT_ASSERT_EQUAL(4, DirEnumHelper(dir, wxDIR_FILES | wxDIR_DIRS).size());
144 }
145
146 class TestDirTraverser : public wxDirTraverser
147 {
148 public:
149 wxArrayString dirs;
150
151 virtual wxDirTraverseResult OnFile(const wxString& WXUNUSED(filename))
152 {
153 return wxDIR_CONTINUE;
154 }
155
156 virtual wxDirTraverseResult OnDir(const wxString& dirname)
157 {
158 dirs.push_back(dirname);
159 return wxDIR_CONTINUE;
160 }
161 };
162
163 void DirTestCase::Traverse()
164 {
165 // enum all files
166 wxArrayString files;
167 CPPUNIT_ASSERT_EQUAL(4, wxDir::GetAllFiles(DIRTEST_FOLDER, &files));
168
169 // enum all files according to the filter
170 CPPUNIT_ASSERT_EQUAL(1, wxDir::GetAllFiles(DIRTEST_FOLDER, &files, "*.foo"));
171
172 // enum again with custom traverser
173 wxDir dir(DIRTEST_FOLDER);
174 TestDirTraverser traverser;
175 dir.Traverse(traverser, wxEmptyString, wxDIR_DIRS | wxDIR_HIDDEN);
176 CPPUNIT_ASSERT_EQUAL(6, traverser.dirs.size());
177 }
178
179 void DirTestCase::DirExists()
180 {
181 struct
182 {
183 const char *dirname;
184 bool shouldExist;
185 } testData[] =
186 {
187 { ".", true },
188 { "..", true },
189 { "$USER_DOCS_DIR", true },
190 #if defined(__WINDOWS__)
191 { "$USER_DOCS_DIR\\", true },
192 { "$USER_DOCS_DIR\\\\", true },
193 { "..\\..", true },
194 { "$MSW_DRIVE", true },
195 { "$MSW_DRIVE\\", true },
196 { "$MSW_DRIVE\\\\", true },
197 { "\\\\non_existent_share\\file", false },
198 { "$MSW_DRIVE\\a\\directory\\which\\does\\not\\exist", false },
199 { "$MSW_DRIVE\\a\\directory\\which\\does\\not\\exist\\", false },
200 { "$MSW_DRIVE\\a\\directory\\which\\does\\not\\exist\\\\", false },
201 { "test.exe", false } // not a directory!
202 #elif defined(__UNIX__)
203 { "../..", true },
204 { "/", true },
205 { "//", true },
206 { "/usr/bin", true },
207 { "/usr//bin", true },
208 { "/usr///bin", true },
209 { "/tmp/a/directory/which/does/not/exist", false },
210 { "/bin/ls", false } // not a directory!
211 #endif
212 };
213
214 #ifdef __WINDOWS__
215 wxString homedrive = wxGetenv("HOMEDRIVE");
216 if ( homedrive.empty() )
217 homedrive = "c:";
218 #endif // __WINDOWS__
219
220 for ( size_t n = 0; n < WXSIZEOF(testData); n++ )
221 {
222 wxString dirname = testData[n].dirname;
223 dirname.Replace("$USER_DOCS_DIR", wxStandardPaths::Get().GetDocumentsDir());
224
225 #ifdef __WINDOWS__
226 dirname.Replace("$MSW_DRIVE", homedrive);
227 #endif // __WINDOWS__
228
229 std::string errDesc = wxString::Format("failed on directory '%s'", dirname).ToStdString();
230 CPPUNIT_ASSERT_EQUAL_MESSAGE(errDesc, testData[n].shouldExist, wxDir::Exists(dirname));
231
232 wxDir d(dirname);
233 CPPUNIT_ASSERT_EQUAL(testData[n].shouldExist, d.IsOpened());
234 }
235
236 CPPUNIT_ASSERT( wxDir::Exists(wxGetCwd()) );
237 }
238
239 void DirTestCase::GetName()
240 {
241 wxDir d;
242
243 CPPUNIT_ASSERT( d.Open(".") );
244 CPPUNIT_ASSERT( d.GetName().Last() != wxFILE_SEP_PATH );
245 CPPUNIT_ASSERT( d.GetNameWithSep().Last() == wxFILE_SEP_PATH );
246 CPPUNIT_ASSERT_EQUAL( d.GetName() + wxFILE_SEP_PATH,
247 d.GetNameWithSep() );
248
249 #ifdef __UNIX__
250 CPPUNIT_ASSERT( d.Open("/") );
251 CPPUNIT_ASSERT_EQUAL( "/", d.GetName() );
252 CPPUNIT_ASSERT_EQUAL( "/", d.GetNameWithSep() );
253 #endif
254 }