aboutsummaryrefslogtreecommitdiff
path: root/libs/plugin_python/tests/python/test_filetree.py
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
commit7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch)
tree27fb39be241fdb5ac2734c574de678977d1856d0 /libs/plugin_python/tests/python/test_filetree.py
Fluorine Manager: full Linux port of Mod Organizer 2
Complete native Linux port with FUSE-based virtual filesystem, Proton/umu-run integration, and Flatpak packaging. Key features: - FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak) - Proton/GE-Proton/umu-run launcher with env var forwarding - Flatpak support (sandbox-aware VFS, NXM handler, umu-run) - Wine prefix management UI - Case-insensitive path resolution for Linux filesystems - QSettings-safe INI handling (avoids Bethesda INI corruption) - Portable instance support with auto-generated launcher scripts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'libs/plugin_python/tests/python/test_filetree.py')
-rw-r--r--libs/plugin_python/tests/python/test_filetree.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/libs/plugin_python/tests/python/test_filetree.py b/libs/plugin_python/tests/python/test_filetree.py
new file mode 100644
index 0000000..0322faa
--- /dev/null
+++ b/libs/plugin_python/tests/python/test_filetree.py
@@ -0,0 +1,86 @@
+from typing import TypeAlias, cast
+
+import mobase
+
+import mobase_tests.filetree as m
+
+
+def test_filetype():
+ FT = mobase.FileTreeEntry.FileTypes
+
+ assert mobase.FileTreeEntry.FILE == FT.FILE
+ assert m.is_file(FT.FILE)
+ assert not m.is_directory(FT.FILE)
+ assert m.value(FT.FILE) == FT.FILE.value
+
+ assert mobase.FileTreeEntry.DIRECTORY == FT.DIRECTORY
+ assert not m.is_file(FT.DIRECTORY)
+ assert m.is_directory(FT.DIRECTORY)
+ assert m.value(FT.DIRECTORY) == FT.DIRECTORY.value
+
+ assert mobase.FileTreeEntry.FILE_OR_DIRECTORY == FT.FILE_OR_DIRECTORY
+ assert m.is_file(FT.FILE_OR_DIRECTORY)
+ assert m.is_directory(FT.FILE_OR_DIRECTORY)
+ assert m.value(FT.FILE_OR_DIRECTORY) == FT.FILE_OR_DIRECTORY.value
+
+ assert FT.FILE_OR_DIRECTORY == FT.FILE | FT.DIRECTORY
+ assert m.is_file(FT.FILE | FT.DIRECTORY)
+ assert m.is_directory(FT.FILE | FT.DIRECTORY)
+ assert m.value(FT.FILE | FT.DIRECTORY) == (FT.FILE.value | FT.DIRECTORY.value)
+
+ assert m.is_file(FT.FILE_OR_DIRECTORY & FT.FILE)
+ assert not m.is_directory(FT.FILE_OR_DIRECTORY & FT.FILE)
+
+ assert not m.is_file(FT.FILE_OR_DIRECTORY & FT.DIRECTORY)
+ assert m.is_directory(FT.FILE_OR_DIRECTORY & FT.DIRECTORY)
+
+ assert m.is_file(FT.FILE_OR_DIRECTORY & ~FT.DIRECTORY)
+ assert not m.is_directory(FT.FILE_OR_DIRECTORY & ~FT.DIRECTORY)
+
+
+_tree_values: TypeAlias = list["str | tuple[str, _tree_values]"]
+
+
+def make_tree(
+ values: _tree_values, root: mobase.IFileTree | None = None
+) -> mobase.IFileTree:
+ if root is None:
+ root = cast(mobase.IFileTree, mobase.private.makeTree()) # type: ignore
+
+ for value in values:
+ if isinstance(value, str):
+ root.addFile(value)
+ else:
+ sub_tree = root.addDirectory(value[0])
+ make_tree(value[1], sub_tree)
+
+ return root
+
+
+def test_walk():
+ tree = make_tree(
+ [("a", []), ("b", ["u", "v"]), "c.x", "d.y", ("e", [("q", ["c.t", ("p", [])])])]
+ )
+
+ assert {"a", "b", "b/u", "b/v", "c.x", "d.y", "e", "e/q", "e/q/c.t", "e/q/p"} == {
+ e.path("/") for e in tree.walk()
+ }
+
+ entries: list[str] = []
+ for e in tree.walk():
+ if e.name() == "e":
+ break
+ entries.append(e.path("/"))
+ assert {"a", "b", "b/u", "b/v"} == set(entries)
+
+
+def test_glob():
+ tree = make_tree(
+ [("a", []), ("b", ["u", "v"]), "c.x", "d.y", ("e", [("q", ["c.t", ("p", [])])])]
+ )
+
+ assert {"a", "b", "b/u", "b/v", "c.x", "d.y", "e", "e/q", "e/q/c.t", "e/q/p"} == {
+ e.path("/") for e in tree.glob("**/*")
+ }
+
+ assert {"d.y"} == {e.path("/") for e in tree.glob("**/*.y")}