地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.
1const std = @import("std");
2const testing = std.testing;
3const TestEnv = @import("test_helpers.zig").TestEnv;
4const Directories = @import("directories.zig");
5const events = @import("events.zig");
6const App = @import("app.zig");
7
8test "Navigation: traverse left to parent directory" {
9 var env = try TestEnv.init(testing.allocator);
10 defer env.deinit();
11
12 try env.createDirStructure(&.{
13 .{ .name = "parent", .children = &.{
14 .{ .name = "child", .children = &.{} },
15 .{ .name = "sibling.txt", .children = null },
16 } },
17 });
18
19 const child_path = try env.path("parent/child");
20 defer testing.allocator.free(child_path);
21
22 var dirs = try Directories.init(testing.allocator, child_path);
23 defer dirs.deinit();
24
25 const before_path = try dirs.fullPath(".");
26 try testing.expect(std.mem.endsWith(u8, before_path, "child"));
27
28 const parent_dir = try dirs.dir.openDir("../", .{ .iterate = true });
29 dirs.dir.close();
30 dirs.dir = parent_dir;
31
32 const after_path = try dirs.fullPath(".");
33 try testing.expect(std.mem.endsWith(u8, after_path, "parent"));
34
35 try dirs.populateEntries("");
36 var found_child = false;
37 for (dirs.entries.all()) |entry| {
38 if (std.mem.eql(u8, entry.name, "child")) {
39 found_child = true;
40 try testing.expectEqual(std.fs.Dir.Entry.Kind.directory, entry.kind);
41 }
42 }
43 try testing.expect(found_child);
44}
45
46test "Navigation: traverse right into directory" {
47 var env = try TestEnv.init(testing.allocator);
48 defer env.deinit();
49
50 try env.createDirStructure(&.{
51 .{ .name = "subdir", .children = &.{
52 .{ .name = "inner.txt", .children = null },
53 } },
54 .{ .name = "file.txt", .children = null },
55 });
56
57 var dirs = try Directories.init(testing.allocator, env.tmp_path);
58 defer dirs.deinit();
59
60 try dirs.populateEntries("");
61
62 for (dirs.entries.all(), 0..) |entry, i| {
63 if (std.mem.eql(u8, entry.name, "subdir")) {
64 dirs.entries.selected = i;
65 break;
66 }
67 }
68
69 const selected = try dirs.getSelected();
70 try testing.expect(selected != null);
71 try testing.expectEqualStrings("subdir", selected.?.name);
72
73 const subdir = try dirs.dir.openDir("subdir", .{ .iterate = true });
74 dirs.dir.close();
75 dirs.dir = subdir;
76
77 const current_path = try dirs.fullPath(".");
78 try testing.expect(std.mem.endsWith(u8, current_path, "subdir"));
79
80 dirs.clearEntries();
81 try dirs.populateEntries("");
82 try testing.expectEqual(@as(usize, 1), dirs.entries.len());
83
84 const inner = try dirs.entries.get(0);
85 try testing.expectEqualStrings("inner.txt", inner.name);
86}
87
88test "Navigation: move selection with next and previous" {
89 var env = try TestEnv.init(testing.allocator);
90 defer env.deinit();
91
92 try env.createFiles(&.{ "file1.txt", "file2.txt", "file3.txt", "file4.txt", "file5.txt" });
93
94 var dirs = try Directories.init(testing.allocator, env.tmp_path);
95 defer dirs.deinit();
96
97 try dirs.populateEntries("");
98 try testing.expectEqual(@as(usize, 5), dirs.entries.len());
99 try testing.expectEqual(@as(usize, 0), dirs.entries.selected);
100
101 dirs.entries.next();
102 dirs.entries.next();
103 dirs.entries.next();
104 try testing.expectEqual(@as(usize, 3), dirs.entries.selected);
105
106 dirs.entries.previous();
107 try testing.expectEqual(@as(usize, 2), dirs.entries.selected);
108
109 dirs.entries.selectLast();
110 try testing.expectEqual(@as(usize, 4), dirs.entries.selected);
111
112 dirs.entries.selectFirst();
113 try testing.expectEqual(@as(usize, 0), dirs.entries.selected);
114}