Skip to content

Commit 994aec8

Browse files
authored
FileManager: unmanage a file now also unmanages its children
2 parents 0b9fb75 + 9ca34e3 commit 994aec8

File tree

4 files changed

+72
-3
lines changed

4 files changed

+72
-3
lines changed

src/file/filemanager.cpp

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ limitations under the License.
1919
#include "utils.h"
2020

2121
#include <algorithm>
22+
#include <stack>
2223

2324
namespace libOpenCOR {
2425

@@ -36,10 +37,33 @@ void FileManager::Impl::manage(File *pFile)
3637

3738
void FileManager::Impl::unmanage(File *pFile)
3839
{
39-
auto iter = std::ranges::find(mFiles, pFile);
40+
// Iteratively unmanage the file and all its child files.
41+
// Note: it would be much simpler to use recursion, but Clang-Tidy does not like it.
4042

41-
if (iter != mFiles.cend()) {
42-
mFiles.erase(iter);
43+
std::stack<File *> files;
44+
45+
files.push(pFile);
46+
47+
while (!files.empty()) {
48+
// Retrieve the file at the top of the stack.
49+
50+
File *file = files.top();
51+
52+
files.pop();
53+
54+
// Add the child files to the stack.
55+
56+
for (const auto &childFile : file->childFiles()) {
57+
files.push(childFile.get());
58+
}
59+
60+
// Unmanage the current file.
61+
62+
auto iter = std::ranges::find(mFiles, file);
63+
64+
if (iter != mFiles.cend()) {
65+
mFiles.erase(iter);
66+
}
4367
}
4468
}
4569

tests/api/file/coveragetests.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,15 @@ TEST(CoverageFileTest, doNotRetrieveContents)
7171
EXPECT_EQ(file->type(), libOpenCOR::File::Type::UNKNOWN_FILE);
7272
EXPECT_EQ(file->contents(), libOpenCOR::UnsignedChars());
7373
}
74+
75+
TEST(CoverageFileTest, unmanageFileWithChildren)
76+
{
77+
auto file = libOpenCOR::File::create(libOpenCOR::resourcePath(libOpenCOR::COMBINE_2_ARCHIVE));
78+
auto fileManager = libOpenCOR::FileManager::instance();
79+
80+
EXPECT_EQ(fileManager.fileCount(), 3);
81+
82+
fileManager.unmanage(file);
83+
84+
EXPECT_EQ(fileManager.fileCount(), 0);
85+
}

tests/bindings/javascript/file.coverage.test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,22 @@ const libopencor = await libOpenCOR();
2121

2222
describe("File coverage tests", () => {
2323
let someNullCharacterContentsPtr;
24+
let someCombineArchiveContentsPtr;
2425

2526
beforeAll(() => {
2627
someNullCharacterContentsPtr = utils.allocateMemory(
2728
libopencor,
2829
utils.SOME_NULL_CHARACTER_CONTENTS,
2930
);
31+
someCombineArchiveContentsPtr = utils.allocateMemory(
32+
libopencor,
33+
utils.SOME_COMBINE_ARCHIVE_CONTENTS,
34+
);
3035
});
3136

3237
afterAll(() => {
3338
utils.freeMemory(libopencor, someNullCharacterContentsPtr);
39+
utils.freeMemory(libopencor, someCombineArchiveContentsPtr);
3440
});
3541

3642
test("Empty file", () => {
@@ -84,4 +90,20 @@ describe("File coverage tests", () => {
8490
file1.delete();
8591
file2.delete();
8692
});
93+
94+
test("Unmanage file with children", () => {
95+
const file = new libopencor.File(utils.resourcePath(utils.COMBINE_ARCHIVE));
96+
const fileManager = libopencor.FileManager.instance();
97+
98+
file.setContents(
99+
someCombineArchiveContentsPtr,
100+
utils.SOME_COMBINE_ARCHIVE_CONTENTS.length,
101+
);
102+
103+
expect(fileManager.fileCount()).toBe(4);
104+
105+
fileManager.unmanage(file);
106+
107+
expect(fileManager.fileCount()).toBe(1);
108+
});
87109
});

tests/bindings/python/test_file_coverage.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,14 @@ def test_do_not_retrieve_contents():
6262

6363
assert file.type == oc.File.Type.UnknownFile
6464
assert file.contents == []
65+
66+
67+
def test_unmanage_file_with_children():
68+
file = oc.File(utils.resource_path(utils.Combine2Archive))
69+
file_manager = oc.FileManager.instance()
70+
71+
assert file_manager.file_count == 3
72+
73+
file_manager.unmanage(file)
74+
75+
assert file_manager.file_count == 0

0 commit comments

Comments
 (0)