Initial support for application specific overrides.

This commit is contained in:
Storm Dragon committed 2026-10-28 03:31:33 -04:00
1 parent 901fd58ba8
commit b45f800489
37 files changed
+3909 -475

No files matched your search

@@ -0,0 +1,72 @@
// Copyright (c) 2026 Storm Dragon
// SPDX-License-Identifier: GPL-3.0-or-later
//go:build linux && cgo
package terminal
import (
"fmt"
"slices"
"testing"
"git.stormux.org/storm/fenrir/internal/applicationoverrides/ninjam"
"git.stormux.org/storm/fenrir/internal/command"
"git.stormux.org/storm/fenrir/internal/reader"
)
// Exercise actual libvterm attribute decoding, including ncurses' monochrome
// standout path. These are source-derived terminal writes, not a running client.
func TestNinjamOverrideTerminalPresentation(t *testing.T) {
for _, monochrome := range []bool{false, true} {
t.Run(fmt.Sprint(monochrome), func(t *testing.T) {
e, err := new_emulator(24, 100)
if err != nil {
t.Fatal(err)
}
defer e.close()
r, a := reader.New(), &ninjam.Adapter{}
paint := func(selected int, volume, chat string) []string {
e.feed([]byte("\x1b[0m\x1b[2J\x1b[HLOCAL\x1b[2;1H"))
field := 0
for _, char := range " master: [ ]mute [" + volume + "] | metronome: [ ]mute [0.0dB center]" {
if char == ']' {
e.feed([]byte("\x1b[0m"))
}
e.feed([]byte(string(char)))
if char == '[' {
style := "\x1b[1m"
if field == selected {
style = "\x1b[0;30;47m"
if monochrome {
style = "\x1b[0;7m"
}
}
e.feed([]byte(style))
field++
}
}
e.feed([]byte("\x1b[17;1HCHAT\x1b[20;1H<Username> old\x1b[21;1H" + chat + "\x1b[23;1H#####\x1b[24;1H[QUIT NINJAM] : fixture.invalid : 120.0BPM 16BPI\x1b[24;1H"))
s := e.snapshot(true, false)
var result []string
for _, message := range r.Update_application(s, a.Observe(s)) {
if message.Text != "" {
result = append(result, message.Text)
}
}
return result
}
if got := paint(0, "0.0dB center", ""); !slices.Equal(got, []string{"Master unmuted"}) {
t.Fatal(got)
}
r.Command(command.CurrentLine)
r.Note_input(true, false, false)
if got := paint(1, "0.0dB center", "<Username> new"); !slices.Equal(got, []string{"Master Volume and pan 0.0dB center", "<Username> new"}) {
t.Fatal(got)
}
if got := paint(1, "-0.5dB center", "<Username> new"); !slices.Equal(got, []string{"Master Volume and pan -0.5dB center"}) {
t.Fatal(got)
}
})
}
}