|
| 1 | +from typing import TypeAlias, cast |
| 2 | + |
1 | 3 | import mobase |
2 | 4 |
|
3 | 5 | import mobase_tests.filetree as m |
@@ -34,3 +36,51 @@ def test_filetype(): |
34 | 36 |
|
35 | 37 | assert m.is_file(FT.FILE_OR_DIRECTORY & ~FT.DIRECTORY) |
36 | 38 | assert not m.is_directory(FT.FILE_OR_DIRECTORY & ~FT.DIRECTORY) |
| 39 | + |
| 40 | + |
| 41 | +_tree_values: TypeAlias = list["str | tuple[str, _tree_values]"] |
| 42 | + |
| 43 | + |
| 44 | +def make_tree( |
| 45 | + values: _tree_values, root: mobase.IFileTree | None = None |
| 46 | +) -> mobase.IFileTree: |
| 47 | + if root is None: |
| 48 | + root = cast(mobase.IFileTree, mobase.private.makeTree()) # type: ignore |
| 49 | + |
| 50 | + for value in values: |
| 51 | + if isinstance(value, str): |
| 52 | + root.addFile(value) |
| 53 | + else: |
| 54 | + sub_tree = root.addDirectory(value[0]) |
| 55 | + make_tree(value[1], sub_tree) |
| 56 | + |
| 57 | + return root |
| 58 | + |
| 59 | + |
| 60 | +def test_walk(): |
| 61 | + tree = make_tree( |
| 62 | + [("a", []), ("b", ["u", "v"]), "c.x", "d.y", ("e", [("q", ["c.t", ("p", [])])])] |
| 63 | + ) |
| 64 | + |
| 65 | + assert {"a", "b", "b/u", "b/v", "c.x", "d.y", "e", "e/q", "e/q/c.t", "e/q/p"} == { |
| 66 | + e.path("/") for e in tree.walk() |
| 67 | + } |
| 68 | + |
| 69 | + entries: list[str] = [] |
| 70 | + for e in tree.walk(): |
| 71 | + if e.name() == "e": |
| 72 | + break |
| 73 | + entries.append(e.path("/")) |
| 74 | + assert {"a", "b", "b/u", "b/v"} == set(entries) |
| 75 | + |
| 76 | + |
| 77 | +def test_glob(): |
| 78 | + tree = make_tree( |
| 79 | + [("a", []), ("b", ["u", "v"]), "c.x", "d.y", ("e", [("q", ["c.t", ("p", [])])])] |
| 80 | + ) |
| 81 | + |
| 82 | + assert {"a", "b", "b/u", "b/v", "c.x", "d.y", "e", "e/q", "e/q/c.t", "e/q/p"} == { |
| 83 | + e.path("/") for e in tree.glob("**/*") |
| 84 | + } |
| 85 | + |
| 86 | + assert {"d.y"} == {e.path("/") for e in tree.glob("**/*.y")} |
0 commit comments