1 /*
2  * LibrePCB - Professional EDA for everyone!
3  * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4  * https://librepcb.org/
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 /*******************************************************************************
21  *  Includes
22  ******************************************************************************/
23 
24 #include <gtest/gtest.h>
25 #include <librepcb/common/fileio/transactionaldirectory.h>
26 #include <librepcb/common/fileio/transactionalfilesystem.h>
27 
28 /*******************************************************************************
29  *  Namespace
30  ******************************************************************************/
31 namespace librepcb {
32 namespace tests {
33 
34 /*******************************************************************************
35  *  Test Class
36  ******************************************************************************/
37 
38 class TransactionalDirectoryTest : public ::testing::Test {
39 protected:
40   std::shared_ptr<TransactionalFileSystem> mFileSystem;
41   std::shared_ptr<TransactionalFileSystem> mEmptyFileSystem;
42 
TransactionalDirectoryTest()43   TransactionalDirectoryTest() {
44     // Open in read-only mode to avoid creating a ".lock" file which would
45     // influence the tests.
46     mFileSystem =
47         TransactionalFileSystem::openRO(FilePath::getRandomTempPath());
48     mFileSystem->write("a.txt", "a");
49     mFileSystem->write("a/b.txt", "b");
50     mFileSystem->write("a/b/c.txt", "c");
51     mFileSystem->write("a/b/c/d.txt", "d");
52 
53     mEmptyFileSystem =
54         TransactionalFileSystem::openRO(FilePath::getRandomTempPath());
55   }
56 
~TransactionalDirectoryTest()57   virtual ~TransactionalDirectoryTest() {}
58 };
59 
60 /*******************************************************************************
61  *  Test Constructors
62  ******************************************************************************/
63 
TEST_F(TransactionalDirectoryTest,testDefaultConstructorCreatesTempFs)64 TEST_F(TransactionalDirectoryTest, testDefaultConstructorCreatesTempFs) {
65   TransactionalDirectory dir;
66   ASSERT_TRUE(dir.getFileSystem());
67   EXPECT_TRUE(dir.getFileSystem()->getAbsPath().isLocatedInDir(
68       FilePath::getApplicationTempPath()));
69 }
70 
TEST_F(TransactionalDirectoryTest,testDefaultConstructorCreatesEmptyFs)71 TEST_F(TransactionalDirectoryTest, testDefaultConstructorCreatesEmptyFs) {
72   TransactionalDirectory dir;
73   EXPECT_EQ(QStringList{}, dir.getDirs());
74   EXPECT_EQ(QStringList{}, dir.getFiles());
75 }
76 
TEST_F(TransactionalDirectoryTest,testCopyConstructorWithDefaultPath)77 TEST_F(TransactionalDirectoryTest, testCopyConstructorWithDefaultPath) {
78   TransactionalDirectory dir(mFileSystem, "foo");
79   TransactionalDirectory copy(dir);
80   EXPECT_EQ(mFileSystem, copy.getFileSystem());
81   EXPECT_EQ("foo", copy.getPath());
82 }
83 
TEST_F(TransactionalDirectoryTest,testCopyConstructorWithPath)84 TEST_F(TransactionalDirectoryTest, testCopyConstructorWithPath) {
85   TransactionalDirectory dir(mFileSystem, "foo");
86   TransactionalDirectory copy(dir, "bar");
87   EXPECT_EQ(mFileSystem, copy.getFileSystem());
88   EXPECT_EQ("foo/bar", copy.getPath());
89 }
90 
TEST_F(TransactionalDirectoryTest,testConstructorWithDefaultPath)91 TEST_F(TransactionalDirectoryTest, testConstructorWithDefaultPath) {
92   TransactionalDirectory dir(mFileSystem);
93   EXPECT_EQ(mFileSystem, dir.getFileSystem());
94   EXPECT_EQ("", dir.getPath());
95 }
96 
TEST_F(TransactionalDirectoryTest,testConstructorWithPath)97 TEST_F(TransactionalDirectoryTest, testConstructorWithPath) {
98   TransactionalDirectory dir(mFileSystem, "foo");
99   EXPECT_EQ(mFileSystem, dir.getFileSystem());
100   EXPECT_EQ("foo", dir.getPath());
101 }
102 
TEST_F(TransactionalDirectoryTest,testConstructorRemovesTrailingSlashes)103 TEST_F(TransactionalDirectoryTest, testConstructorRemovesTrailingSlashes) {
104   TransactionalDirectory dir(mFileSystem, "foo///");
105   EXPECT_EQ(mFileSystem, dir.getFileSystem());
106   EXPECT_EQ("foo", dir.getPath());
107 }
108 
109 /*******************************************************************************
110  *  Test getAbsPath()
111  ******************************************************************************/
112 
TEST_F(TransactionalDirectoryTest,testGetAbsPathInRoot)113 TEST_F(TransactionalDirectoryTest, testGetAbsPathInRoot) {
114   TransactionalDirectory dir(mFileSystem, "");
115   EXPECT_EQ(mFileSystem->getAbsPath(), dir.getAbsPath());
116 }
117 
TEST_F(TransactionalDirectoryTest,testGetAbsPathInRootPath)118 TEST_F(TransactionalDirectoryTest, testGetAbsPathInRootPath) {
119   TransactionalDirectory dir(mFileSystem, "");
120   EXPECT_EQ(mFileSystem->getAbsPath("hello"), dir.getAbsPath("hello"));
121 }
122 
TEST_F(TransactionalDirectoryTest,testGetAbsPathInSubdir)123 TEST_F(TransactionalDirectoryTest, testGetAbsPathInSubdir) {
124   TransactionalDirectory dir(mFileSystem, "foo bar");
125   EXPECT_EQ(mFileSystem->getAbsPath("foo bar"), dir.getAbsPath());
126 }
127 
TEST_F(TransactionalDirectoryTest,testGetAbsPathInSubdirPath)128 TEST_F(TransactionalDirectoryTest, testGetAbsPathInSubdirPath) {
129   TransactionalDirectory dir(mFileSystem, "foo bar");
130   EXPECT_EQ(mFileSystem->getAbsPath("foo bar/hello"), dir.getAbsPath("hello"));
131 }
132 
133 /*******************************************************************************
134  *  Test getDirs()
135  ******************************************************************************/
136 
TEST_F(TransactionalDirectoryTest,testGetDirsInRoot)137 TEST_F(TransactionalDirectoryTest, testGetDirsInRoot) {
138   TransactionalDirectory dir(mFileSystem, "");
139   EXPECT_EQ(QStringList{"a"}, dir.getDirs());
140 }
141 
TEST_F(TransactionalDirectoryTest,testGetDirsInRootPath)142 TEST_F(TransactionalDirectoryTest, testGetDirsInRootPath) {
143   TransactionalDirectory dir(mFileSystem, "");
144   EXPECT_EQ(QStringList{"b"}, dir.getDirs("a"));
145 }
146 
TEST_F(TransactionalDirectoryTest,testGetDirsInSubdir)147 TEST_F(TransactionalDirectoryTest, testGetDirsInSubdir) {
148   TransactionalDirectory dir(mFileSystem, "a");
149   EXPECT_EQ(QStringList{"b"}, dir.getDirs());
150 }
151 
TEST_F(TransactionalDirectoryTest,testGetDirsInSubdirPath)152 TEST_F(TransactionalDirectoryTest, testGetDirsInSubdirPath) {
153   TransactionalDirectory dir(mFileSystem, "a");
154   EXPECT_EQ(QStringList{"c"}, dir.getDirs("b"));
155 }
156 
157 /*******************************************************************************
158  *  Test getFiles()
159  ******************************************************************************/
160 
TEST_F(TransactionalDirectoryTest,testGetFilesInRoot)161 TEST_F(TransactionalDirectoryTest, testGetFilesInRoot) {
162   TransactionalDirectory dir(mFileSystem, "");
163   EXPECT_EQ(QStringList{"a.txt"}, dir.getFiles());
164 }
165 
TEST_F(TransactionalDirectoryTest,testGetFilesInRootPath)166 TEST_F(TransactionalDirectoryTest, testGetFilesInRootPath) {
167   TransactionalDirectory dir(mFileSystem, "");
168   EXPECT_EQ(QStringList{"b.txt"}, dir.getFiles("a"));
169 }
170 
TEST_F(TransactionalDirectoryTest,testGetFilesInSubdir)171 TEST_F(TransactionalDirectoryTest, testGetFilesInSubdir) {
172   TransactionalDirectory dir(mFileSystem, "a");
173   EXPECT_EQ(QStringList{"b.txt"}, dir.getFiles());
174 }
175 
TEST_F(TransactionalDirectoryTest,testGetFilesInSubdirPath)176 TEST_F(TransactionalDirectoryTest, testGetFilesInSubdirPath) {
177   TransactionalDirectory dir(mFileSystem, "a");
178   EXPECT_EQ(QStringList{"c.txt"}, dir.getFiles("b"));
179 }
180 
181 /*******************************************************************************
182  *  Test fileExists()
183  ******************************************************************************/
184 
TEST_F(TransactionalDirectoryTest,testFileExistsInRoot)185 TEST_F(TransactionalDirectoryTest, testFileExistsInRoot) {
186   TransactionalDirectory dir(mFileSystem, "");
187   EXPECT_TRUE(dir.fileExists("a.txt"));
188   EXPECT_FALSE(dir.fileExists("b.txt"));
189 }
190 
TEST_F(TransactionalDirectoryTest,testFileExistsInRootPath)191 TEST_F(TransactionalDirectoryTest, testFileExistsInRootPath) {
192   TransactionalDirectory dir(mFileSystem, "");
193   EXPECT_TRUE(dir.fileExists("a/b.txt"));
194   EXPECT_FALSE(dir.fileExists("a/c.txt"));
195 }
196 
TEST_F(TransactionalDirectoryTest,testFileExistsInSubdir)197 TEST_F(TransactionalDirectoryTest, testFileExistsInSubdir) {
198   TransactionalDirectory dir(mFileSystem, "a");
199   EXPECT_TRUE(dir.fileExists("b.txt"));
200   EXPECT_FALSE(dir.fileExists("c.txt"));
201 }
202 
TEST_F(TransactionalDirectoryTest,testFileExistsInSubdirPath)203 TEST_F(TransactionalDirectoryTest, testFileExistsInSubdirPath) {
204   TransactionalDirectory dir(mFileSystem, "a");
205   EXPECT_TRUE(dir.fileExists("b/c.txt"));
206   EXPECT_FALSE(dir.fileExists("b/d.txt"));
207 }
208 
209 /*******************************************************************************
210  *  Test read()
211  ******************************************************************************/
212 
TEST_F(TransactionalDirectoryTest,testReadInRoot)213 TEST_F(TransactionalDirectoryTest, testReadInRoot) {
214   TransactionalDirectory dir(mFileSystem, "");
215   EXPECT_EQ("a", dir.read("a.txt"));
216   EXPECT_THROW(dir.read("b.txt"), Exception);
217 }
218 
TEST_F(TransactionalDirectoryTest,testReadInRootPath)219 TEST_F(TransactionalDirectoryTest, testReadInRootPath) {
220   TransactionalDirectory dir(mFileSystem, "");
221   EXPECT_EQ("b", dir.read("a/b.txt"));
222   EXPECT_THROW(dir.read("a/c.txt"), Exception);
223 }
224 
TEST_F(TransactionalDirectoryTest,testReadInSubdir)225 TEST_F(TransactionalDirectoryTest, testReadInSubdir) {
226   TransactionalDirectory dir(mFileSystem, "a");
227   EXPECT_EQ("b", dir.read("b.txt"));
228   EXPECT_THROW(dir.read("c.txt"), Exception);
229 }
230 
TEST_F(TransactionalDirectoryTest,testReadInSubdirPath)231 TEST_F(TransactionalDirectoryTest, testReadInSubdirPath) {
232   TransactionalDirectory dir(mFileSystem, "a");
233   EXPECT_EQ("c", dir.read("b/c.txt"));
234   EXPECT_THROW(dir.read("b/d.txt"), Exception);
235 }
236 
237 /*******************************************************************************
238  *  Test write()
239  ******************************************************************************/
240 
TEST_F(TransactionalDirectoryTest,testWriteInRoot)241 TEST_F(TransactionalDirectoryTest, testWriteInRoot) {
242   TransactionalDirectory dir(mFileSystem, "");
243   dir.write("a.txt", "foo1");
244   EXPECT_EQ("foo1", mFileSystem->read("a.txt"));
245 }
246 
TEST_F(TransactionalDirectoryTest,testWriteInRootPath)247 TEST_F(TransactionalDirectoryTest, testWriteInRootPath) {
248   TransactionalDirectory dir(mFileSystem, "");
249   dir.write("a/b.txt", "foo2");
250   EXPECT_EQ("foo2", mFileSystem->read("a/b.txt"));
251 }
252 
TEST_F(TransactionalDirectoryTest,testWriteInSubdir)253 TEST_F(TransactionalDirectoryTest, testWriteInSubdir) {
254   TransactionalDirectory dir(mFileSystem, "a");
255   dir.write("b.txt", "foo3");
256   EXPECT_EQ("foo3", mFileSystem->read("a/b.txt"));
257 }
258 
TEST_F(TransactionalDirectoryTest,testWriteInSubdirPath)259 TEST_F(TransactionalDirectoryTest, testWriteInSubdirPath) {
260   TransactionalDirectory dir(mFileSystem, "a");
261   dir.write("b/c.txt", "foo4");
262   EXPECT_EQ("foo4", mFileSystem->read("a/b/c.txt"));
263 }
264 
265 /*******************************************************************************
266  *  Test removeFile()
267  ******************************************************************************/
268 
TEST_F(TransactionalDirectoryTest,testRemoveFileInRoot)269 TEST_F(TransactionalDirectoryTest, testRemoveFileInRoot) {
270   TransactionalDirectory dir(mFileSystem, "");
271   ASSERT_TRUE(dir.fileExists("a.txt"));
272   ASSERT_TRUE(mFileSystem->fileExists("a.txt"));
273   dir.removeFile("a.txt");
274   EXPECT_FALSE(dir.fileExists("a.txt"));
275   EXPECT_FALSE(mFileSystem->fileExists("a.txt"));
276 }
277 
TEST_F(TransactionalDirectoryTest,testRemoveFileInRootPath)278 TEST_F(TransactionalDirectoryTest, testRemoveFileInRootPath) {
279   TransactionalDirectory dir(mFileSystem, "");
280   ASSERT_TRUE(dir.fileExists("a/b.txt"));
281   ASSERT_TRUE(mFileSystem->fileExists("a/b.txt"));
282   dir.removeFile("a/b.txt");
283   EXPECT_FALSE(dir.fileExists("a/b.txt"));
284   EXPECT_FALSE(mFileSystem->fileExists("a/b.txt"));
285 }
286 
TEST_F(TransactionalDirectoryTest,testRemoveFileInSubdir)287 TEST_F(TransactionalDirectoryTest, testRemoveFileInSubdir) {
288   TransactionalDirectory dir(mFileSystem, "a");
289   ASSERT_TRUE(dir.fileExists("b.txt"));
290   ASSERT_TRUE(mFileSystem->fileExists("a/b.txt"));
291   dir.removeFile("b.txt");
292   EXPECT_FALSE(dir.fileExists("b.txt"));
293   EXPECT_FALSE(mFileSystem->fileExists("a/b.txt"));
294 }
295 
TEST_F(TransactionalDirectoryTest,testRemoveFileInSubdirPath)296 TEST_F(TransactionalDirectoryTest, testRemoveFileInSubdirPath) {
297   TransactionalDirectory dir(mFileSystem, "a");
298   ASSERT_TRUE(dir.fileExists("b/c.txt"));
299   ASSERT_TRUE(mFileSystem->fileExists("a/b/c.txt"));
300   dir.removeFile("b/c.txt");
301   EXPECT_FALSE(dir.fileExists("b/c.txt"));
302   EXPECT_FALSE(mFileSystem->fileExists("a/b/c.txt"));
303 }
304 
305 /*******************************************************************************
306  *  Test removeDirRecursively()
307  ******************************************************************************/
308 
TEST_F(TransactionalDirectoryTest,testRemoveDirRecursivelyInRoot)309 TEST_F(TransactionalDirectoryTest, testRemoveDirRecursivelyInRoot) {
310   TransactionalDirectory dir(mFileSystem, "");
311   ASSERT_EQ(QStringList{"a"}, dir.getDirs());
312   ASSERT_EQ(QStringList{"a"}, mFileSystem->getDirs());
313   dir.removeDirRecursively();
314   EXPECT_EQ(QStringList{}, dir.getDirs());
315   EXPECT_EQ(QStringList{}, dir.getFiles());
316   EXPECT_EQ(QStringList{}, mFileSystem->getDirs());
317   EXPECT_EQ(QStringList{}, mFileSystem->getFiles());
318 }
319 
TEST_F(TransactionalDirectoryTest,testRemoveDirRecursivelyInRootPath)320 TEST_F(TransactionalDirectoryTest, testRemoveDirRecursivelyInRootPath) {
321   TransactionalDirectory dir(mFileSystem, "");
322   ASSERT_EQ(QStringList{"a"}, dir.getDirs());
323   ASSERT_EQ(QStringList{"a"}, mFileSystem->getDirs());
324   dir.removeDirRecursively("a");
325   EXPECT_EQ(QStringList{}, dir.getDirs());
326   EXPECT_EQ(QStringList{}, mFileSystem->getDirs());
327   EXPECT_EQ(QStringList{"a.txt"}, dir.getFiles());
328   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
329 }
330 
TEST_F(TransactionalDirectoryTest,testRemoveDirRecursivelyInSubdir)331 TEST_F(TransactionalDirectoryTest, testRemoveDirRecursivelyInSubdir) {
332   TransactionalDirectory dir(mFileSystem, "a");
333   ASSERT_EQ(QStringList{"b"}, dir.getDirs());
334   ASSERT_EQ(QStringList{"a"}, mFileSystem->getDirs());
335   dir.removeDirRecursively();
336   EXPECT_EQ(QStringList{}, dir.getDirs());
337   EXPECT_EQ(QStringList{}, mFileSystem->getDirs());
338   EXPECT_EQ(QStringList{}, dir.getFiles());
339   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
340 }
341 
TEST_F(TransactionalDirectoryTest,testRemoveDirRecursivelyInSubdirPath)342 TEST_F(TransactionalDirectoryTest, testRemoveDirRecursivelyInSubdirPath) {
343   TransactionalDirectory dir(mFileSystem, "a");
344   ASSERT_EQ(QStringList{"b"}, dir.getDirs());
345   ASSERT_EQ(QStringList{"a"}, mFileSystem->getDirs());
346   ASSERT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
347   dir.removeDirRecursively("b");
348   EXPECT_EQ(QStringList{}, dir.getDirs());
349   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
350   EXPECT_EQ(QStringList{}, mFileSystem->getDirs("a"));
351   EXPECT_EQ(QStringList{"b.txt"}, dir.getFiles());
352   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
353   EXPECT_EQ(QStringList{}, dir.getFiles("b"));
354   EXPECT_EQ(QStringList{}, mFileSystem->getFiles("a/b"));
355   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
356 }
357 
358 /*******************************************************************************
359  *  Test copyTo()
360  ******************************************************************************/
361 
TEST_F(TransactionalDirectoryTest,testCopyToFromRootToRoot)362 TEST_F(TransactionalDirectoryTest, testCopyToFromRootToRoot) {
363   TransactionalDirectory src(mFileSystem, "");
364   TransactionalDirectory dst(mEmptyFileSystem, "");
365   src.copyTo(dst);
366   EXPECT_EQ(mFileSystem, src.getFileSystem());
367   EXPECT_EQ("", src.getPath());
368   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
369   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
370   EXPECT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
371   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
372   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
373   EXPECT_EQ(QStringList{"a.txt"}, mEmptyFileSystem->getFiles());
374   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a"));
375 }
376 
TEST_F(TransactionalDirectoryTest,testCopyToFromRootToSubdir)377 TEST_F(TransactionalDirectoryTest, testCopyToFromRootToSubdir) {
378   TransactionalDirectory src(mFileSystem, "");
379   TransactionalDirectory dst(mEmptyFileSystem, "a");
380   src.copyTo(dst);
381   EXPECT_EQ(mFileSystem, src.getFileSystem());
382   EXPECT_EQ("", src.getPath());
383   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
384   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
385   EXPECT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
386   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
387   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
388   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs("a"));
389   EXPECT_EQ(QStringList{}, mEmptyFileSystem->getFiles());
390   EXPECT_EQ(QStringList{"a.txt"}, mEmptyFileSystem->getFiles("a"));
391   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a/a"));
392 }
393 
TEST_F(TransactionalDirectoryTest,testCopyToFromSubdirToRoot)394 TEST_F(TransactionalDirectoryTest, testCopyToFromSubdirToRoot) {
395   TransactionalDirectory src(mFileSystem, "a");
396   TransactionalDirectory dst(mEmptyFileSystem, "");
397   src.copyTo(dst);
398   EXPECT_EQ(mFileSystem, src.getFileSystem());
399   EXPECT_EQ("a", src.getPath());
400   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
401   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
402   EXPECT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
403   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
404   EXPECT_EQ(QStringList{"b"}, mEmptyFileSystem->getDirs());
405   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles());
406   EXPECT_EQ(QStringList{"c.txt"}, mEmptyFileSystem->getFiles("b"));
407 }
408 
TEST_F(TransactionalDirectoryTest,testCopyToFromSubdirToSubdir)409 TEST_F(TransactionalDirectoryTest, testCopyToFromSubdirToSubdir) {
410   TransactionalDirectory src(mFileSystem, "a");
411   TransactionalDirectory dst(mEmptyFileSystem, "a");
412   src.copyTo(dst);
413   EXPECT_EQ(mFileSystem, src.getFileSystem());
414   EXPECT_EQ("a", src.getPath());
415   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
416   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
417   EXPECT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
418   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
419   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
420   EXPECT_EQ(QStringList{}, mEmptyFileSystem->getFiles());
421   EXPECT_EQ(QStringList{"b"}, mEmptyFileSystem->getDirs("a"));
422   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a"));
423   EXPECT_EQ(QStringList{"c"}, mEmptyFileSystem->getDirs("a/b"));
424   EXPECT_EQ(QStringList{"c.txt"}, mEmptyFileSystem->getFiles("a/b"));
425 }
426 
427 /*******************************************************************************
428  *  Test saveTo()
429  ******************************************************************************/
430 
TEST_F(TransactionalDirectoryTest,testSaveToFromRootToRoot)431 TEST_F(TransactionalDirectoryTest, testSaveToFromRootToRoot) {
432   TransactionalDirectory src(mFileSystem, "");
433   TransactionalDirectory dst(mEmptyFileSystem, "");
434   src.saveTo(dst);
435   EXPECT_EQ(mEmptyFileSystem, src.getFileSystem());
436   EXPECT_EQ("", src.getPath());
437   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
438   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
439   EXPECT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
440   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
441   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
442   EXPECT_EQ(QStringList{"a.txt"}, mEmptyFileSystem->getFiles());
443   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a"));
444 }
445 
TEST_F(TransactionalDirectoryTest,testSaveToFromRootToSubdir)446 TEST_F(TransactionalDirectoryTest, testSaveToFromRootToSubdir) {
447   TransactionalDirectory src(mFileSystem, "");
448   TransactionalDirectory dst(mEmptyFileSystem, "a");
449   src.saveTo(dst);
450   EXPECT_EQ(mEmptyFileSystem, src.getFileSystem());
451   EXPECT_EQ("a", src.getPath());
452   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
453   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
454   EXPECT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
455   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
456   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
457   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs("a"));
458   EXPECT_EQ(QStringList{}, mEmptyFileSystem->getFiles());
459   EXPECT_EQ(QStringList{"a.txt"}, mEmptyFileSystem->getFiles("a"));
460   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a/a"));
461 }
462 
TEST_F(TransactionalDirectoryTest,testSaveToFromSubdirToRoot)463 TEST_F(TransactionalDirectoryTest, testSaveToFromSubdirToRoot) {
464   TransactionalDirectory src(mFileSystem, "a");
465   TransactionalDirectory dst(mEmptyFileSystem, "");
466   src.saveTo(dst);
467   EXPECT_EQ(mEmptyFileSystem, src.getFileSystem());
468   EXPECT_EQ("", src.getPath());
469   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
470   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
471   EXPECT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
472   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
473   EXPECT_EQ(QStringList{"b"}, mEmptyFileSystem->getDirs());
474   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles());
475   EXPECT_EQ(QStringList{"c.txt"}, mEmptyFileSystem->getFiles("b"));
476 }
477 
TEST_F(TransactionalDirectoryTest,testSaveToFromSubdirToSubdir)478 TEST_F(TransactionalDirectoryTest, testSaveToFromSubdirToSubdir) {
479   TransactionalDirectory src(mFileSystem, "a");
480   TransactionalDirectory dst(mEmptyFileSystem, "a");
481   src.saveTo(dst);
482   EXPECT_EQ(mEmptyFileSystem, src.getFileSystem());
483   EXPECT_EQ("a", src.getPath());
484   EXPECT_EQ(QStringList{"a"}, mFileSystem->getDirs());
485   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
486   EXPECT_EQ(QStringList{"b"}, mFileSystem->getDirs("a"));
487   EXPECT_EQ(QStringList{"b.txt"}, mFileSystem->getFiles("a"));
488   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
489   EXPECT_EQ(QStringList{}, mEmptyFileSystem->getFiles());
490   EXPECT_EQ(QStringList{"b"}, mEmptyFileSystem->getDirs("a"));
491   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a"));
492   EXPECT_EQ(QStringList{"c"}, mEmptyFileSystem->getDirs("a/b"));
493   EXPECT_EQ(QStringList{"c.txt"}, mEmptyFileSystem->getFiles("a/b"));
494 }
495 
496 /*******************************************************************************
497  *  Test moveTo()
498  ******************************************************************************/
499 
TEST_F(TransactionalDirectoryTest,testMoveToFromRootToRoot)500 TEST_F(TransactionalDirectoryTest, testMoveToFromRootToRoot) {
501   TransactionalDirectory src(mFileSystem, "");
502   TransactionalDirectory dst(mEmptyFileSystem, "");
503   src.moveTo(dst);
504   EXPECT_EQ(mEmptyFileSystem, src.getFileSystem());
505   EXPECT_EQ("", src.getPath());
506   EXPECT_EQ(QStringList{}, mFileSystem->getDirs());
507   EXPECT_EQ(QStringList{}, mFileSystem->getFiles());
508   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
509   EXPECT_EQ(QStringList{"a.txt"}, mEmptyFileSystem->getFiles());
510   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a"));
511 }
512 
TEST_F(TransactionalDirectoryTest,testMoveToFromRootToSubdir)513 TEST_F(TransactionalDirectoryTest, testMoveToFromRootToSubdir) {
514   TransactionalDirectory src(mFileSystem, "");
515   TransactionalDirectory dst(mEmptyFileSystem, "a");
516   src.moveTo(dst);
517   EXPECT_EQ(mEmptyFileSystem, src.getFileSystem());
518   EXPECT_EQ("a", src.getPath());
519   EXPECT_EQ(QStringList{}, mFileSystem->getDirs());
520   EXPECT_EQ(QStringList{}, mFileSystem->getFiles());
521   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
522   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs("a"));
523   EXPECT_EQ(QStringList{}, mEmptyFileSystem->getFiles());
524   EXPECT_EQ(QStringList{"a.txt"}, mEmptyFileSystem->getFiles("a"));
525   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a/a"));
526 }
527 
TEST_F(TransactionalDirectoryTest,testMoveToFromSubdirToRoot)528 TEST_F(TransactionalDirectoryTest, testMoveToFromSubdirToRoot) {
529   TransactionalDirectory src(mFileSystem, "a");
530   TransactionalDirectory dst(mEmptyFileSystem, "");
531   src.moveTo(dst);
532   EXPECT_EQ(mEmptyFileSystem, src.getFileSystem());
533   EXPECT_EQ("", src.getPath());
534   EXPECT_EQ(QStringList{}, mFileSystem->getDirs());
535   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
536   EXPECT_EQ(QStringList{"b"}, mEmptyFileSystem->getDirs());
537   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles());
538   EXPECT_EQ(QStringList{"c.txt"}, mEmptyFileSystem->getFiles("b"));
539 }
540 
TEST_F(TransactionalDirectoryTest,testMoveToFromSubdirToSubdir)541 TEST_F(TransactionalDirectoryTest, testMoveToFromSubdirToSubdir) {
542   TransactionalDirectory src(mFileSystem, "a");
543   TransactionalDirectory dst(mEmptyFileSystem, "a");
544   src.moveTo(dst);
545   EXPECT_EQ(mEmptyFileSystem, src.getFileSystem());
546   EXPECT_EQ("a", src.getPath());
547   EXPECT_EQ(QStringList{}, mFileSystem->getDirs());
548   EXPECT_EQ(QStringList{"a.txt"}, mFileSystem->getFiles());
549   EXPECT_EQ(QStringList{"a"}, mEmptyFileSystem->getDirs());
550   EXPECT_EQ(QStringList{}, mEmptyFileSystem->getFiles());
551   EXPECT_EQ(QStringList{"b"}, mEmptyFileSystem->getDirs("a"));
552   EXPECT_EQ(QStringList{"b.txt"}, mEmptyFileSystem->getFiles("a"));
553   EXPECT_EQ(QStringList{"c"}, mEmptyFileSystem->getDirs("a/b"));
554   EXPECT_EQ(QStringList{"c.txt"}, mEmptyFileSystem->getFiles("a/b"));
555 }
556 
557 /*******************************************************************************
558  *  End of File
559  ******************************************************************************/
560 
561 }  // namespace tests
562 }  // namespace librepcb
563