地圖 (Jido) is a lightweight Unix TUI file explorer designed for speed and simplicity.
at main 114 lines 3.6 kB view raw
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}