diff options
| author | Gabriel Schneider <[email protected]> | 2026-09-30 19:23:38 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-10-01 00:12:17 -0300 |
| commit | 109a558a0488f3269f1864985e9b3db5f58b9552 (patch) | |
| tree | 8a363ab1ceeabf5479683f9b7313c127b6bdb5ed /src/ninep/ctl.zig | |
| parent | 045e9e748d02c0417263655999b459ad351916d7 (diff) | |
| download | pardes-109a558a0488f3269f1864985e9b3db5f58b9552.tar.gz pardes-109a558a0488f3269f1864985e9b3db5f58b9552.zip | |
A builtin for one kind of pane is refused on another with why: Petscii, Palette, Ascii, Filter, Togglettymode, the Pdf words, Mode and TreeContext
Each of these did nothing, silently, on the wrong kind of pane, so a
ctl or exec write of Palette to a text file answered ok as if it had
acted. A builtin now declares the one kind it is for (needs), the
registry reads it, and runBuiltinFrom refuses the rest before dispatch,
as Repl and Edit already refused theirs. Mode and TreeContext, which
take more than one kind, say their own refusal.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src/ninep/ctl.zig')
| -rw-r--r-- | src/ninep/ctl.zig | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/ninep/ctl.zig b/src/ninep/ctl.zig index a0a363b5..902a9647 100644 --- a/src/ninep/ctl.zig +++ b/src/ninep/ctl.zig @@ -1671,6 +1671,36 @@ test "Save and Save path on an image pane are refused with why, never a silent s } } +test "a builtin for one kind of pane is refused on another, and still acts on its own kind" { + const gpa = testing.allocator; + const p = try withFile(gpa, "text\n"); + defer p.deinit(); + const serial = serialOf(p); + const cases = [_]struct { []const u8, []const u8 }{ + .{ "Petscii\n", "Petscii: only an image pane takes it" }, + .{ "Palette\n", "Palette: only an image pane takes it" }, + .{ "Ascii\n", "Ascii: only an image pane takes it" }, + .{ "Filter\n", "Filter: only a terminal pane takes it" }, + .{ "Togglettymode\n", "Togglettymode: only a terminal pane takes it" }, + }; + for (cases) |case| { + const r = wr(p, Node.of(serial, .ctl), case[0]); + try testing.expectEqual(Status.err, r.reply.status); + try testing.expectEqualStrings(case[1], r.reply.ename); + } + if (pardes.pdf_enabled) for ([_][]const u8{ "PdfFit\n", "PdfTint\n", "PdfSections\n" }) |line| { + try testing.expectEqual(Status.err, wr(p, Node.of(serial, .ctl), line).reply.status); + }; + const id = p.freeSlot().?; + const doc = try p.newDocPane(id); + doc.image = .{ .path = try p.gpa.dupe(u8, "/tmp/pardes-pic.ppm") }; + const r = wr(p, Node.of(doc.serial, .ctl), "Mode\n"); + try testing.expectEqualStrings("Mode: only a text or terminal pane has modes", r.reply.ename); + const glyphs = doc.image.?.glyph_art; + try testing.expectEqual(Status.ok, wr(p, Node.of(doc.serial, .ctl), "Petscii\n").reply.status); + try testing.expect(doc.image.?.glyph_art != glyphs); +} + test "exec Save writes the named file through the host" { const gpa = testing.allocator; const p = try withFile(gpa, "one\ntwo\n"); |
