1 /** @file gsFileManager_test.cpp
2 
3     @brief Tests for gsFileManager
4 
5     This file is part of the G+Smo library.
6 
7     This Source Code Form is subject to the terms of the Mozilla Public
8     License, v. 2.0. If a copy of the MPL was not distributed with this
9     file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11     Author(s): S. Takacs, J. Vogl
12 */
13 
14 #include "gismo_unittest.h"
15 
16 #if defined _WIN32 || defined __CYGWIN__
17 #define own_fn "unittests.exe"
18 #else
19 #define own_fn "unittests"
20 #endif
21 
SUITE(gsFileManager_test)22 SUITE(gsFileManager_test)
23 {
24 TEST(PathSeperators)
25 {
26     CHECK_EQUAL(gsFileManager::getNativePathSeparator(), gsFileManager::getValidPathSeparators()[0]);
27 
28 #if defined _WIN32
29     CHECK_EQUAL('\\', gsFileManager::getValidPathSeparators()[0]);
30     CHECK_EQUAL('/', gsFileManager::getValidPathSeparators()[1]);
31 #else
32     CHECK_EQUAL('/', gsFileManager::getValidPathSeparators()[0]);
33 #endif
34 }
35 
36 TEST(Paths_absolut_relative)
37 {
38     // for any OS
39     std::string s00("/");
40     std::string s01("/foo");
41     std::string s02("/Foo/Bar");
42     std::string s03("/foo bar/bar foo");
43     std::string s04("");
44     std::string s05("foo");
45     std::string s06("foo\\bar");
46     std::string s07("\"" + s02 + "\"");
47     std::string s08("./");
48     std::string s09("./foo");
49     std::string s10("../");
50     std::string s11("../foo");
51 
52     // isFullyQualified verum
53     CHECK(gsFileManager::isFullyQualified(s00));
54     CHECK(gsFileManager::isFullyQualified(s01));
55     CHECK(gsFileManager::isFullyQualified(s02));
56     CHECK(gsFileManager::isFullyQualified(s03));
57     // isFullyQualified falsum
58     CHECK(!gsFileManager::isFullyQualified(s04));
59     CHECK(!gsFileManager::isFullyQualified(s05));
60     CHECK(!gsFileManager::isFullyQualified(s06));
61     CHECK(!gsFileManager::isFullyQualified(s07));
62     CHECK(!gsFileManager::isFullyQualified(s08));
63     CHECK(!gsFileManager::isFullyQualified(s09));
64     CHECK(!gsFileManager::isFullyQualified(s10));
65     CHECK(!gsFileManager::isFullyQualified(s11));
66 
67     // isExplicitlyRelative verum
68     CHECK(gsFileManager::isExplicitlyRelative(s08));
69     CHECK(gsFileManager::isExplicitlyRelative(s09));
70     CHECK(gsFileManager::isExplicitlyRelative(s10));
71     CHECK(gsFileManager::isExplicitlyRelative(s11));
72     // isExplicitlyRelative falsum
73     CHECK(!gsFileManager::isExplicitlyRelative(s00));
74     CHECK(!gsFileManager::isExplicitlyRelative(s01));
75     CHECK(!gsFileManager::isExplicitlyRelative(s02));
76     CHECK(!gsFileManager::isExplicitlyRelative(s03));
77     CHECK(!gsFileManager::isExplicitlyRelative(s04));
78     CHECK(!gsFileManager::isExplicitlyRelative(s05));
79     CHECK(!gsFileManager::isExplicitlyRelative(s06));
80     CHECK(!gsFileManager::isExplicitlyRelative(s07));
81 
82     // OS specific
83     std::string c00("\\");
84     std::string c01("E:\\Foo\\Bar");
85     std::string c02("\\foo bar\\bar foo");
86     std::string c03("f:/foo bar/bar foo");
87     std::string c04("\\c:\\Foo\\Bar");
88     std::string c05("/c:/Foo/Bar");
89     std::string c06(".\\");
90     std::string c07(".\\foo");
91     std::string c08("..\\");
92     std::string c09("..\\foo");
93 
94 #if defined _WIN32
95     // isFullyQualified verum
96     CHECK(gsFileManager::isFullyQualified(c00));
97     CHECK(gsFileManager::isFullyQualified(c01));
98     CHECK(gsFileManager::isFullyQualified(c02));
99     CHECK(gsFileManager::isFullyQualified(c03));
100     // isFullyQualified falsum
101     CHECK(!gsFileManager::isFullyQualified(c04));
102     CHECK(!gsFileManager::isFullyQualified(c05));
103     CHECK(!gsFileManager::isFullyQualified(c06));
104     CHECK(!gsFileManager::isFullyQualified(c07));
105     CHECK(!gsFileManager::isFullyQualified(c08));
106     CHECK(!gsFileManager::isFullyQualified(c09));
107 
108     // isExplicitlyRelative verum
109     CHECK(gsFileManager::isExplicitlyRelative(c06));
110     CHECK(gsFileManager::isExplicitlyRelative(c07));
111     CHECK(gsFileManager::isExplicitlyRelative(c08));
112     CHECK(gsFileManager::isExplicitlyRelative(c09));
113     // isExplicitlyRelative falsum
114     CHECK(!gsFileManager::isExplicitlyRelative(c00));
115     CHECK(!gsFileManager::isExplicitlyRelative(c01));
116     CHECK(!gsFileManager::isExplicitlyRelative(c02));
117     CHECK(!gsFileManager::isExplicitlyRelative(c03));
118     CHECK(!gsFileManager::isExplicitlyRelative(c04));
119     CHECK(!gsFileManager::isExplicitlyRelative(c05));
120 #else
121 
122     // isFullyQualified verum
123     CHECK(gsFileManager::isFullyQualified(c05));
124     // isFullyQualified falsum
125     CHECK(!gsFileManager::isFullyQualified(c00));
126     CHECK(!gsFileManager::isFullyQualified(c01));
127     CHECK(!gsFileManager::isFullyQualified(c02));
128     CHECK(!gsFileManager::isFullyQualified(c03));
129     CHECK(!gsFileManager::isFullyQualified(c04));
130     CHECK(!gsFileManager::isFullyQualified(c06));
131     CHECK(!gsFileManager::isFullyQualified(c07));
132     CHECK(!gsFileManager::isFullyQualified(c08));
133     CHECK(!gsFileManager::isFullyQualified(c09));
134 
135     // isExplicitlyRelative verum
136     // isExplicitlyRelative falsum
137     CHECK(!gsFileManager::isExplicitlyRelative(c00));
138     CHECK(!gsFileManager::isExplicitlyRelative(c01));
139     CHECK(!gsFileManager::isExplicitlyRelative(c02));
140     CHECK(!gsFileManager::isExplicitlyRelative(c03));
141     CHECK(!gsFileManager::isExplicitlyRelative(c04));
142     CHECK(!gsFileManager::isExplicitlyRelative(c05));
143     CHECK(!gsFileManager::isExplicitlyRelative(c06));
144     CHECK(!gsFileManager::isExplicitlyRelative(c07));
145     CHECK(!gsFileManager::isExplicitlyRelative(c08));
146     CHECK(!gsFileManager::isExplicitlyRelative(c09));
147 #endif
148 }
149 
150 TEST(SearchPaths)
151 {
152     std::string defaultPath = gsFileManager::getSearchPaths();
153     gsFileManager::setSearchPaths("");
154     GISMO_ASSERT(gsFileManager::getSearchPaths() == "", "gsFileManager::getSearchPaths() not empty");
155 
156     std::string verum0 = gsFileManager::getExePath();
157     std::string verum1 = gsFileManager::getTempPath();
158     GISMO_ASSERT(verum0 != verum1, "gsFileManager::getExePath == gsFileManager::getTempPath()");
159     std::string falsum = gsFileManager::getCanonicRepresentation("/fuubar");
160 
161     std::string result;
162 
163     CHECK(!gsFileManager::setSearchPaths(falsum));
164     CHECK_EQUAL("", gsFileManager::getSearchPaths());
165 
166     CHECK(gsFileManager::setSearchPaths(verum0));
167     result = gsFileManager::getSearchPaths();
168     CHECK_EQUAL(verum0 + ";", result);
169     CHECK_EQUAL(gsFileManager::getNativePathSeparator(), result[result.length() - 2]);
170 
171     CHECK(gsFileManager::addSearchPaths(verum1));
172     result = gsFileManager::getSearchPaths();
173     CHECK_EQUAL(verum0 + ";" + verum1 + ";", result);
174     CHECK_EQUAL(gsFileManager::getNativePathSeparator(), result[result.length() - 2]);
175 
176     // clear SearchPaths
177     CHECK(gsFileManager::setSearchPaths(""));
178     CHECK_EQUAL("", gsFileManager::getSearchPaths());
179 
180     // set more values at once
181     CHECK(gsFileManager::setSearchPaths(verum0 + ";" + verum1));
182     result = gsFileManager::getSearchPaths();
183     CHECK_EQUAL(verum0 + ";" + verum1 + ";", result);
184     CHECK_EQUAL(gsFileManager::getNativePathSeparator(), result[result.length() - 2]);
185 
186     gsFileManager::setSearchPaths(defaultPath);
187     GISMO_ASSERT(gsFileManager::getSearchPaths() == defaultPath, "Can't set back to default getSearchPaths!");
188 }
189 
190 TEST(find)
191 {
192     std::string defaultPath = gsFileManager::getSearchPaths();
193     gsFileManager::setSearchPaths("");
194     GISMO_ASSERT(gsFileManager::getSearchPaths() == "", "gsFileManager::getSearchPaths() not empty");
195 
196     // calculate relative path
197     std::string absolute = gsFileManager::getCanonicRepresentation(GISMO_DATA_DIR);              // absolute
198     std::string current = gsFileManager::getCurrentPath();
199     std::string relative = gsFileManager::makeRelative(current, absolute);
200     GISMO_ASSERT(gsFileManager::isExplicitlyRelative(relative),
201         "variable relative isn't gsFilemanager::isExplicitlyRealtive");
202 
203     std::string verum = gsFileManager::getCanonicRepresentation("options/assembler_options.xml"); // success, if path known
204     std::string falsum("fuubar");                       // fails
205 
206     // check without SearchPaths
207     CHECK_EQUAL(relative + verum, gsFileManager::find(relative + verum));
208     CHECK_EQUAL(absolute + verum, gsFileManager::find(absolute + verum));
209     CHECK_EQUAL("", gsFileManager::find(verum));
210     CHECK_EQUAL("", gsFileManager::find(falsum));
211 
212     // check with SearchPath set to relative
213     gsFileManager::setSearchPaths(relative);
214     CHECK_EQUAL(relative + verum, gsFileManager::find(relative + verum));
215     CHECK_EQUAL(absolute + verum, gsFileManager::find(absolute + verum));
216     CHECK_EQUAL(absolute + verum, gsFileManager::find(verum));
217     CHECK_EQUAL("", gsFileManager::find(falsum));
218 
219     // clear SearchPaths
220     gsFileManager::setSearchPaths("");
221     GISMO_ASSERT(gsFileManager::getSearchPaths() == "", "gsFileManager::getSearchPaths() not empty");
222 
223     // check with SearchPath set to absolute
224     gsFileManager::setSearchPaths(absolute);
225     CHECK_EQUAL(relative + verum, gsFileManager::find(relative + verum));
226     CHECK_EQUAL(absolute + verum, gsFileManager::find(absolute + verum));
227     CHECK_EQUAL(absolute + verum, gsFileManager::find(verum));
228     CHECK_EQUAL("", gsFileManager::find(falsum));
229 
230     gsFileManager::setSearchPaths(defaultPath);
231     GISMO_ASSERT(gsFileManager::getSearchPaths() == defaultPath, "Can't set back to default getSearchPaths!");
232 }
233 
234 TEST(fileExists)
235 {
236     // FILE
237     std::string defaultPath = gsFileManager::getSearchPaths();
238     gsFileManager::setSearchPaths("");
239     GISMO_ASSERT(gsFileManager::getSearchPaths() == "", "gsFileManager::getSearchPaths() not empty");
240 
241     std::string absolute = gsFileManager::getExePath(); // absolute
242     std::string relative = gsFileManager::makeRelative(
243         gsFileManager::getCurrentPath(), absolute);     // relative
244     CHECK(gsFileManager::isExplicitlyRelative(relative));
245     std::string falsum("fuubar");                       // fails
246 
247     CHECK(gsFileManager::fileExists(relative + own_fn));
248     CHECK(gsFileManager::fileExists(absolute + own_fn));
249 
250     CHECK(!gsFileManager::fileExists(falsum));
251 
252     gsFileManager::setSearchPaths(relative);
253     CHECK(gsFileManager::fileExists(own_fn));
254     CHECK(!gsFileManager::fileExists(falsum));
255 
256     gsFileManager::setSearchPaths("");
257     GISMO_ASSERT(gsFileManager::getSearchPaths() == "", "gsFileManager::getSearchPaths() not empty");
258 
259     gsFileManager::setSearchPaths(absolute);
260     CHECK(gsFileManager::fileExists(own_fn));
261     CHECK(!gsFileManager::fileExists(falsum));
262 
263     gsFileManager::setSearchPaths(defaultPath);
264     GISMO_ASSERT(gsFileManager::getSearchPaths() == defaultPath, "Can't set back to default getSearchPaths!");
265 }
266 
267 TEST(findInDataDir)
268 {
269     std::string verum = gsFileManager::getCanonicRepresentation("options/assembler_options.xml");
270     std::string falsum = gsFileManager::getCanonicRepresentation("fuu/bar");
271 
272     CHECK_EQUAL(GISMO_DATA_DIR + verum, gsFileManager::findInDataDir(verum));
273     CHECK(gsFileManager::isFullyQualified(gsFileManager::findInDataDir(verum)));
274     CHECK(!gsFileManager::isExplicitlyRelative(gsFileManager::findInDataDir(verum)));
275 
276     CHECK_EQUAL("", gsFileManager::findInDataDir(falsum));
277 }
278 
279 TEST(fileExistsInDataDir)
280 {
281     std::string verum = gsFileManager::getCanonicRepresentation("options/assembler_options.xml");
282     std::string falsum = gsFileManager::getCanonicRepresentation("fuu/bar");
283 
284     CHECK(gsFileManager::fileExistsInDataDir(verum));
285 
286     CHECK(!gsFileManager::fileExistsInDataDir(falsum));
287 }
288 
289 TEST(getTempPath)
290 {
291     std::string testString = gsFileManager::getTempPath();
292     CHECK(testString != "");
293     CHECK(gsFileManager::isFullyQualified(testString));
294     CHECK_EQUAL(gsFileManager::getNativePathSeparator(), testString[testString.length() - 1]);
295 }
296 
297 TEST(getCurrentPath)
298 {
299     std::string testString = gsFileManager::getCurrentPath();
300     CHECK(testString != "");
301     CHECK(gsFileManager::isFullyQualified(testString));
302     CHECK_EQUAL(gsFileManager::getNativePathSeparator(), testString[testString.length() - 1]);
303 }
304 
305 TEST(getExePath)
306 {
307     std::string testString = gsFileManager::getExePath();
308     CHECK(testString != "");
309     CHECK(gsFileManager::isFullyQualified(testString));
310     CHECK_EQUAL(gsFileManager::getNativePathSeparator(), testString[testString.length() - 1]);
311     CHECK(gsFileManager::fileExists(testString + own_fn));
312 }
313 
314 TEST(getHomePath)
315 {
316     std::string testString = gsFileManager::getHomePath();
317     CHECK(testString != "");
318     CHECK(gsFileManager::isFullyQualified(testString));
319     CHECK_EQUAL(gsFileManager::getNativePathSeparator(), testString[testString.length() - 1]);
320 }
321 
322 TEST(makeRelative)
323 {
324 #if defined _WIN32 || defined __CYGWIN__
325     CHECK_EQUAL(".\\", gsFileManager::makeRelative("/a/b/c/", "/a/b/c/"));
326     CHECK_EQUAL(".\\d", gsFileManager::makeRelative("/a/b/c/", "/a/b/c/d"));
327     CHECK_EQUAL("..\\c\\d", gsFileManager::makeRelative("/a/b/cd/", "/a/b/c/d"));
328     CHECK_EQUAL(".\\d", gsFileManager::makeRelative("\\a\\b\\c\\", "\\a\\b\\c\\d"));
329     CHECK_EQUAL("..\\c\\d", gsFileManager::makeRelative("\\a\\b\\cd\\", "\\a\\b\\c\\d"));
330 
331     // with drive letter
332 	CHECK_EQUAL(".\\", gsFileManager::makeRelative("c:\\a\\b\\c\\", "c:\\a\\b\\c\\"));
333     CHECK_EQUAL(".\\d", gsFileManager::makeRelative("c:\\a\\b\\c\\", "c:\\a\\b\\c\\d"));
334     CHECK_EQUAL("..\\c\\d", gsFileManager::makeRelative("c:\\a\\b\\cd\\", "c:\\a\\b\\c\\d"));
335 
336     // no relative possible
337     CHECK_EQUAL("d:\\a\\b\\c\\d", gsFileManager::makeRelative("c:\\a\\b\\c\\", "d:\\a\\b\\c\\d"));
338     CHECK_EQUAL("d:\\a\\b\\c\\d", gsFileManager::makeRelative("c:\\a\\b\\cd\\", "d:\\a\\b\\c\\d"));
339 #else
340     CHECK_EQUAL("./", gsFileManager::makeRelative("/a/b/c/", "/a/b/c/"));
341     CHECK_EQUAL("./d", gsFileManager::makeRelative("/a/b/c/", "/a/b/c/d"));
342     CHECK_EQUAL("../c/d", gsFileManager::makeRelative("/a/b/cd/", "/a/b/c/d"));
343 #endif
344 }
345 
346 TEST(mkdir)
347 {
348     std::string temp = gsFileManager::getTempPath();
349     if (temp != "")
350     {
351         std::stringstream stream;
352         for (int i = 0; i < 0xFFFF; ++i)
353         {
354             stream << temp << "gsMkDir" << std::hex << i << gsFileManager::getNativePathSeparator();
355             if (!gsFileManager::fileExists(stream.str() + gsFileManager::getNativePathSeparator() + "test.xml"))
356             {
357                 CHECK(gsFileManager::mkdir(stream.str()));  // create new directory
358                 CHECK(gsFileManager::mkdir(stream.str()));  // already existing directory
359                 stream << "test";
360                 {
361                     gsBSplineBasis<> geo;
362                     gsWrite(geo, stream.str());
363                 }
364                 stream << ".xml";
365                 CHECK(gsFileManager::fileExists(stream.str()));
366                 CHECK(!gsFileManager::mkdir(stream.str())); // failing create of directory
367                 break;
368             }
369             stream.str("");
370         }
371     }
372     else
373         CHECK(false);
374 }
375 
376 TEST(pathEqual)
377 {
378     // absolute
379     CHECK(gsFileManager::pathEqual("/", "/"));
380     CHECK(gsFileManager::pathEqual("/foo", "/foo"));
381     CHECK(gsFileManager::pathEqual("/foo/bar", "/foo/bar"));
382     CHECK(!gsFileManager::pathEqual("/foo", "/bar"));
383     CHECK(!gsFileManager::pathEqual("/foo/bar", "/bar/foo"));
384     // canonical
385     CHECK(gsFileManager::pathEqual("/foo/./bar", "/foo/bar"));
386     CHECK(gsFileManager::pathEqual("/foo/baz/../bar", "/foo/bar"));
387     // path separator - 2nd param
388     CHECK(gsFileManager::pathEqual("/foo", "/foo/"));
389     CHECK(gsFileManager::pathEqual("/foo/bar", "/foo/bar/"));
390     CHECK(!gsFileManager::pathEqual("/foo", "/bar/"));
391     CHECK(!gsFileManager::pathEqual("/foo/bar", "/bar/foo/"));
392     CHECK(gsFileManager::pathEqual("/foo/./bar", "/foo/bar/"));
393     CHECK(gsFileManager::pathEqual("/foo/baz/../bar", "/foo/bar/"));
394     // path separator - 1st param
395     CHECK(gsFileManager::pathEqual("/foo/", "/foo"));
396     CHECK(gsFileManager::pathEqual("/foo/bar/", "/foo/bar"));
397     CHECK(!gsFileManager::pathEqual("/foo/", "/bar"));
398     CHECK(!gsFileManager::pathEqual("/foo/bar/", "/bar/foo"));
399     CHECK(gsFileManager::pathEqual("/foo/./bar/", "/foo/bar"));
400     CHECK(gsFileManager::pathEqual("/foo/baz/../bar/", "/foo/bar"));
401 
402     // relative
403     CHECK(gsFileManager::pathEqual("", ""));
404     CHECK(gsFileManager::pathEqual("", "./"));
405     CHECK(gsFileManager::pathEqual("", gsFileManager::getCurrentPath()));
406     CHECK(gsFileManager::pathEqual("foo", "foo"));
407     CHECK(gsFileManager::pathEqual("foo/bar", "foo/bar"));
408     CHECK(!gsFileManager::pathEqual("foo", "bar"));
409     CHECK(!gsFileManager::pathEqual("foo/bar", "bar/foo"));
410     // canonical
411     CHECK(gsFileManager::pathEqual("foo/./bar", "foo/bar"));
412     CHECK(gsFileManager::pathEqual("foo/baz/../bar", "foo/bar"));
413     CHECK(gsFileManager::pathEqual("../bar", "./buz/../../bar"));
414     // path separator - 2nd param
415     CHECK(gsFileManager::pathEqual("foo", "foo/"));
416     CHECK(gsFileManager::pathEqual("foo/bar", "foo/bar/"));
417     CHECK(!gsFileManager::pathEqual("foo", "bar/"));
418     CHECK(!gsFileManager::pathEqual("foo/bar", "bar/foo/"));
419     CHECK(gsFileManager::pathEqual("foo/./bar", "foo/bar/"));
420     CHECK(gsFileManager::pathEqual("foo/baz/../bar", "foo/bar/"));
421     // path separator - 1st param
422     CHECK(gsFileManager::pathEqual("foo/", "foo"));
423     CHECK(gsFileManager::pathEqual("foo/bar/", "foo/bar"));
424     CHECK(!gsFileManager::pathEqual("foo/", "bar"));
425     CHECK(!gsFileManager::pathEqual("foo/bar/", "bar/foo"));
426     CHECK(gsFileManager::pathEqual("foo/./bar/", "foo/bar"));
427     CHECK(gsFileManager::pathEqual("foo/baz/../bar/", "foo/bar"));
428 
429 #if defined _WIN32
430     CHECK(gsFileManager::pathEqual("/foo/bar", "\\foo\\bar"));
431     CHECK(gsFileManager::pathEqual("foo/bar", "foo\\bar"));
432     CHECK(gsFileManager::pathEqual("../bar", ".\\buz\\..\\..\\bar"));
433 
434     CHECK(gsFileManager::pathEqual("e:/foo/bar", "e:\\foo\\bar"));
435 #endif
436 }
437 
438 TEST(getExtension)
439 {
440     // any OS
441     CHECK_EQUAL("bar", gsFileManager::getExtension("foo.bar"));
442     CHECK_EQUAL("bar", gsFileManager::getExtension("/foo.bar"));
443     CHECK_EQUAL("bar", gsFileManager::getExtension("./foo.bar"));
444     CHECK_EQUAL("bar", gsFileManager::getExtension("../foo.bar"));
445 
446     CHECK_EQUAL("bar", gsFileManager::getExtension("foo.baz.bar"));
447     CHECK_EQUAL("bar", gsFileManager::getExtension("/foo.baz.bar"));
448     CHECK_EQUAL("bar", gsFileManager::getExtension("./foo.baz.bar"));
449     CHECK_EQUAL("bar", gsFileManager::getExtension("../foo.baz.bar"));
450 
451     CHECK_EQUAL("bar", gsFileManager::getExtension("/some/../baz/other/../foo.baz.bar"));
452 
453     CHECK_EQUAL("foo", gsFileManager::getExtension("bar.foo"));
454 
455 #if defined _WIN32
456     CHECK_EQUAL("bar", gsFileManager::getExtension("foo.bar"));
457     CHECK_EQUAL("bar", gsFileManager::getExtension("\\foo.bar"));
458     CHECK_EQUAL("bar", gsFileManager::getExtension(".\\foo.bar"));
459     CHECK_EQUAL("bar", gsFileManager::getExtension("..\\foo.bar"));
460 
461     CHECK_EQUAL("bar", gsFileManager::getExtension("foo.baz.bar"));
462     CHECK_EQUAL("bar", gsFileManager::getExtension("\\foo.baz.bar"));
463     CHECK_EQUAL("bar", gsFileManager::getExtension(".\\foo.baz.bar"));
464     CHECK_EQUAL("bar", gsFileManager::getExtension("..\\foo.baz.bar"));
465 
466     CHECK_EQUAL("bar", gsFileManager::getExtension("\\some\\..\\baz\\other\\..\\foo.baz.bar"));
467 
468     CHECK_EQUAL("foo", gsFileManager::getExtension("bar.foo"));
469 
470     CHECK_EQUAL("bar", gsFileManager::getExtension("e:\\foo.bar"));
471 #endif
472 }
473 
474 TEST(getBasename)
475 {
476     // any OS
477     CHECK_EQUAL("foo", gsFileManager::getBasename("foo.bar"));
478     CHECK_EQUAL("foo", gsFileManager::getBasename("/foo.bar"));
479     CHECK_EQUAL("foo", gsFileManager::getBasename("./foo.bar"));
480     CHECK_EQUAL("foo", gsFileManager::getBasename("../foo.bar"));
481 
482     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("foo.baz.bar"));
483     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("/foo.baz.bar"));
484     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("./foo.baz.bar"));
485     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("../foo.baz.bar"));
486 
487     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("/some/../bax/other/../foo.baz.bar"));
488 
489     CHECK_EQUAL("bar", gsFileManager::getBasename("bar.foo"));
490 
491 #if defined _WIN32
492     CHECK_EQUAL("foo", gsFileManager::getBasename("foo.bar"));
493     CHECK_EQUAL("foo", gsFileManager::getBasename("\\foo.bar"));
494     CHECK_EQUAL("foo", gsFileManager::getBasename(".\\foo.bar"));
495     CHECK_EQUAL("foo", gsFileManager::getBasename("..\\foo.bar"));
496 
497     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("foo.baz.bar"));
498     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("\\foo.baz.bar"));
499     CHECK_EQUAL("foo.baz", gsFileManager::getBasename(".\\foo.baz.bar"));
500     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("..\\foo.baz.bar"));
501 
502     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("\\some\\..\\bax\\other\\..\\foo.baz.bar"));
503 
504     CHECK_EQUAL("bar", gsFileManager::getBasename("bar.foo"));
505 
506     CHECK_EQUAL("foo.baz", gsFileManager::getBasename("e:\\foo.baz.bar"));
507 #endif
508 }
509 
510 TEST(getFilename)
511 {
512     // any OS
513     CHECK_EQUAL("foo", gsFileManager::getFilename("/foo"));
514     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("/foo.bar"));
515     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("/foo.baz.bar"));
516     CHECK_EQUAL("foo", gsFileManager::getFilename("../foo"));
517     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("../foo.bar"));
518     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("../foo.baz.bar"));
519     CHECK_EQUAL("foo", gsFileManager::getFilename("some/other/foo"));
520     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("some/other/foo.bar"));
521     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("some/other/foo.baz.bar"));
522     CHECK_EQUAL("foo", gsFileManager::getFilename("/some/other/foo"));
523     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("/some/other/foo.bar"));
524     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("/some/other/foo.baz.bar"));
525     CHECK_EQUAL("foo", gsFileManager::getFilename("./some/other/foo"));
526     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("./some/other/foo.bar"));
527     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("./some/other/foo.baz.bar"));
528 
529 #if defined _WIN32
530     CHECK_EQUAL("foo", gsFileManager::getFilename("\\foo"));
531     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("\\foo.bar"));
532     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("\\foo.baz.bar"));
533     CHECK_EQUAL("foo", gsFileManager::getFilename("..\\foo"));
534     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("..\\foo.bar"));
535     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("..\\foo.baz.bar"));
536     CHECK_EQUAL("foo", gsFileManager::getFilename("some\\other\\foo"));
537     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("some\\other\\foo.bar"));
538     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("some\\other\\foo.baz.bar"));
539     CHECK_EQUAL("foo", gsFileManager::getFilename("\\some\\other\\foo"));
540     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("\\some\\other\\foo.bar"));
541     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("\\some\\other\\foo.baz.bar"));
542     CHECK_EQUAL("foo", gsFileManager::getFilename(".\\some\\other\\foo"));
543     CHECK_EQUAL("foo.bar", gsFileManager::getFilename(".\\some\\other\\foo.bar"));
544     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename(".\\some\\other\\foo.baz.bar"));
545 
546     // drive letter
547     CHECK_EQUAL("foo", gsFileManager::getFilename("e:\\some\\other\\foo"));
548     CHECK_EQUAL("foo.bar", gsFileManager::getFilename("e:\\some\\other\\foo.bar"));
549     CHECK_EQUAL("foo.baz.bar", gsFileManager::getFilename("e:\\some\\other\\foo.baz.bar"));
550 #endif
551 }
552 
553 TEST(getPath)
554 {
555 #if defined _WIN32
556     CHECK_EQUAL("", gsFileManager::getPath("foo"));
557     CHECK_EQUAL("", gsFileManager::getPath("foo.bar"));
558     CHECK_EQUAL("", gsFileManager::getPath("foo.baz.bar"));
559     CHECK_EQUAL("\\", gsFileManager::getPath("\\foo"));
560     CHECK_EQUAL("\\", gsFileManager::getPath("\\foo.bar"));
561     CHECK_EQUAL("\\", gsFileManager::getPath("\\foo.baz.bar"));
562     CHECK_EQUAL(".\\", gsFileManager::getPath(".\\foo"));
563     CHECK_EQUAL(".\\", gsFileManager::getPath(".\\foo.bar"));
564     CHECK_EQUAL(".\\", gsFileManager::getPath(".\\foo.baz.bar"));
565     CHECK_EQUAL("..\\", gsFileManager::getPath("..\\foo"));
566     CHECK_EQUAL("..\\", gsFileManager::getPath("..\\foo.bar"));
567     CHECK_EQUAL("..\\", gsFileManager::getPath("..\\foo.baz.bar"));
568     CHECK_EQUAL("some\\other\\", gsFileManager::getPath("some\\other\\foo"));
569     CHECK_EQUAL("some\\other\\", gsFileManager::getPath("some\\other\\foo.bar"));
570     CHECK_EQUAL("some\\other\\", gsFileManager::getPath("some\\other\\foo.baz.bar"));
571     CHECK_EQUAL("\\some\\other\\", gsFileManager::getPath("\\some\\other\\foo"));
572     CHECK_EQUAL("\\some\\other\\", gsFileManager::getPath("\\some\\other\\foo.bar"));
573     CHECK_EQUAL("\\some\\other\\", gsFileManager::getPath("\\some\\other\\foo.baz.bar"));
574     CHECK_EQUAL(".\\some\\other\\", gsFileManager::getPath(".\\some\\other\\foo"));
575     CHECK_EQUAL(".\\some\\other\\", gsFileManager::getPath(".\\some\\other\\foo.bar"));
576     CHECK_EQUAL(".\\some\\other\\", gsFileManager::getPath(".\\some\\other\\foo.baz.bar"));
577     CHECK_EQUAL("..\\some\\other\\", gsFileManager::getPath("..\\some\\other\\foo"));
578     CHECK_EQUAL("..\\some\\other\\", gsFileManager::getPath("..\\some\\other\\foo.bar"));
579     CHECK_EQUAL("..\\some\\other\\", gsFileManager::getPath("..\\some\\other\\foo.baz.bar"));
580     // some canonical check
581     CHECK_EQUAL("..\\some\\other\\", gsFileManager::getPath("..\\some\\buz\\..\\other\\foo"));
582     CHECK_EQUAL("..\\some\\other\\", gsFileManager::getPath("..\\some\\buz\\..\\other\\foo.bar"));
583     CHECK_EQUAL("..\\some\\other\\", gsFileManager::getPath("..\\some\\buz\\..\\other\\foo.baz.bar"));
584 
585     // driver letter
586     CHECK_EQUAL("e:\\some\\other\\", gsFileManager::getPath("e:\\some\\other\\foo"));
587     CHECK_EQUAL("e:\\some\\other\\", gsFileManager::getPath("e:\\some\\other\\foo.bar"));
588     CHECK_EQUAL("e:\\some\\other\\", gsFileManager::getPath("e:\\some\\other\\foo.baz.bar"));
589 #else
590     CHECK_EQUAL("", gsFileManager::getPath("foo"));
591     CHECK_EQUAL("", gsFileManager::getPath("foo.bar"));
592     CHECK_EQUAL("", gsFileManager::getPath("foo.baz.bar"));
593     CHECK_EQUAL("/", gsFileManager::getPath("/foo"));
594     CHECK_EQUAL("/", gsFileManager::getPath("/foo.bar"));
595     CHECK_EQUAL("/", gsFileManager::getPath("/foo.baz.bar"));
596     CHECK_EQUAL("./", gsFileManager::getPath("./foo"));
597     CHECK_EQUAL("./", gsFileManager::getPath("./foo.bar"));
598     CHECK_EQUAL("./", gsFileManager::getPath("./foo.baz.bar"));
599     CHECK_EQUAL("../", gsFileManager::getPath("../foo"));
600     CHECK_EQUAL("../", gsFileManager::getPath("../foo.bar"));
601     CHECK_EQUAL("../", gsFileManager::getPath("../foo.baz.bar"));
602     CHECK_EQUAL("some/other/", gsFileManager::getPath("some/other/foo"));
603     CHECK_EQUAL("some/other/", gsFileManager::getPath("some/other/foo.bar"));
604     CHECK_EQUAL("some/other/", gsFileManager::getPath("some/other/foo.baz.bar"));
605     CHECK_EQUAL("/some/other/", gsFileManager::getPath("/some/other/foo"));
606     CHECK_EQUAL("/some/other/", gsFileManager::getPath("/some/other/foo.bar"));
607     CHECK_EQUAL("/some/other/", gsFileManager::getPath("/some/other/foo.baz.bar"));
608     CHECK_EQUAL("./some/other/", gsFileManager::getPath("./some/other/foo"));
609     CHECK_EQUAL("./some/other/", gsFileManager::getPath("./some/other/foo.bar"));
610     CHECK_EQUAL("./some/other/", gsFileManager::getPath("./some/other/foo.baz.bar"));
611     CHECK_EQUAL("../some/other/", gsFileManager::getPath("../some/other/foo"));
612     CHECK_EQUAL("../some/other/", gsFileManager::getPath("../some/other/foo.bar"));
613     CHECK_EQUAL("../some/other/", gsFileManager::getPath("../some/other/foo.baz.bar"));
614     // some canonical check
615     CHECK_EQUAL("../some/other/", gsFileManager::getPath("../some/buz/../other/foo"));
616     CHECK_EQUAL("../some/other/", gsFileManager::getPath("../some/buz/../other/foo.bar"));
617     CHECK_EQUAL("../some/other/", gsFileManager::getPath("../some/buz/../other/foo.baz.bar"));
618 #endif
619 }
620 
621 TEST(getCanonicRepresentation)
622 {
623 #if defined _WIN32
624     CHECK_EQUAL("foo\\bar", gsFileManager::getCanonicRepresentation("foo\\.\\bar"));
625     CHECK_EQUAL("foo\\bar", gsFileManager::getCanonicRepresentation("foo\\baz\\..\\bar"));
626     CHECK_EQUAL("foo\\bar", gsFileManager::getCanonicRepresentation("foo\\baz\\baz\\..\\..\\bar"));
627     CHECK_EQUAL("foo\\bar", gsFileManager::getCanonicRepresentation("foo\\baz\\..\\baz\\..\\bar"));
628     CHECK_EQUAL("foo\\bar", gsFileManager::getCanonicRepresentation("foo\\baz\\baz\\..\\.\\.\\.\\..\\bar"));
629     CHECK_EQUAL("foo\\bar", gsFileManager::getCanonicRepresentation("foo\\baz\\.\\..\\.\\baz\\.\\..\\.\\bar"));
630     CHECK_EQUAL("foo\\bar", gsFileManager::getCanonicRepresentation("baz\\baz\\..\\..\\foo\\bar"));
631 
632     CHECK_EQUAL("e:\\foo\\bar", gsFileManager::getCanonicRepresentation("e:\\foo\\.\\bar"));
633     CHECK_EQUAL("e:\\foo\\bar", gsFileManager::getCanonicRepresentation("e:\\foo\\baz\\..\\bar"));
634     CHECK_EQUAL("e:\\foo\\bar", gsFileManager::getCanonicRepresentation("e:\\foo\\baz\\baz\\..\\..\\bar"));
635     CHECK_EQUAL("e:\\foo\\bar", gsFileManager::getCanonicRepresentation("e:\\foo\\baz\\..\\baz\\..\\bar"));
636     CHECK_EQUAL("e:\\foo\\bar", gsFileManager::getCanonicRepresentation("e:\\foo\\baz\\baz\\..\\.\\.\\.\\..\\bar"));
637     CHECK_EQUAL("e:\\foo\\bar", gsFileManager::getCanonicRepresentation("e:\\foo\\baz\\.\\..\\.\\baz\\.\\..\\.\\bar"));
638     CHECK_EQUAL("e:\\foo\\bar", gsFileManager::getCanonicRepresentation("e:\\baz\\baz\\..\\..\\foo\\bar"));
639 
640     CHECK_EQUAL(".\\foo", gsFileManager::getCanonicRepresentation(".\\.\\.\\foo"));
641     CHECK_EQUAL("..\\foo", gsFileManager::getCanonicRepresentation(".\\..\\.\\foo"));
642 
643     CHECK_EQUAL("", gsFileManager::getCanonicRepresentation(""));
644     CHECK_EQUAL(".\\", gsFileManager::getCanonicRepresentation("", true));
645     CHECK_EQUAL(".\\foo\\", gsFileManager::getCanonicRepresentation(".\\.\\.\\foo", true));
646     CHECK_EQUAL("..\\foo\\", gsFileManager::getCanonicRepresentation(".\\..\\.\\foo", true));
647 
648     CHECK_EQUAL(".\\foo\\", gsFileManager::getCanonicRepresentation(".\\.\\.\\foo\\"));
649     CHECK_EQUAL("..\\foo\\", gsFileManager::getCanonicRepresentation(".\\..\\.\\foo\\"));
650 #else
651     CHECK_EQUAL("foo/bar", gsFileManager::getCanonicRepresentation("foo/./bar"));
652     CHECK_EQUAL("foo/bar", gsFileManager::getCanonicRepresentation("foo/baz/../bar"));
653     CHECK_EQUAL("foo/bar", gsFileManager::getCanonicRepresentation("foo/baz/baz/../../bar"));
654     CHECK_EQUAL("foo/bar", gsFileManager::getCanonicRepresentation("foo/baz/../baz/../bar"));
655     CHECK_EQUAL("foo/bar", gsFileManager::getCanonicRepresentation("foo/baz/baz/.././././../bar"));
656     CHECK_EQUAL("foo/bar", gsFileManager::getCanonicRepresentation("foo/baz/./.././baz/./.././bar"));
657     CHECK_EQUAL("foo/bar", gsFileManager::getCanonicRepresentation("baz/baz/../../foo/bar"));
658 
659     CHECK_EQUAL("./foo", gsFileManager::getCanonicRepresentation("./././foo"));
660     CHECK_EQUAL("../foo", gsFileManager::getCanonicRepresentation("./.././foo"));
661 
662     CHECK_EQUAL("", gsFileManager::getCanonicRepresentation(""));
663     CHECK_EQUAL("./", gsFileManager::getCanonicRepresentation("", true));
664     CHECK_EQUAL("./foo/", gsFileManager::getCanonicRepresentation("./././foo", true));
665     CHECK_EQUAL("../foo/", gsFileManager::getCanonicRepresentation("./.././foo", true));
666 
667     CHECK_EQUAL("./foo/", gsFileManager::getCanonicRepresentation("./././foo/"));
668     CHECK_EQUAL("../foo/", gsFileManager::getCanonicRepresentation("./.././foo/"));
669 #endif
670 }
671 
672 // gsFileManager::open will not be tested here.
673 }
674