internal: ANSI SGR parser and line syntax tokenizer for 101-500

This commit is contained in:
ZacharyZhang-NY committed 2026-10-05 13:57:22 -04:00
1 parent 5c596337fb
commit 656d53d7f7
4 files changed
+429

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
package internal
import "testing"
func TestParseAnsi(t *testing.T) {
spans, end := ParseAnsi("ok \x1b[1;31mfail\x1b[0m \x1b[38;2;10;20;30mrgb\x1b[38;5;200mix", AnsiStyle{})
want := []AnsiSpan{
{"ok ", AnsiStyle{}},
{"fail", AnsiStyle{Bold: true, FG: AnsiColor{Kind: AnsiIndexed, Index: 1}}},
{" ", AnsiStyle{}},
{"rgb", AnsiStyle{FG: AnsiColor{Kind: AnsiRGB, R: 10, G: 20, B: 30}}},
{"ix", AnsiStyle{FG: AnsiColor{Kind: AnsiIndexed, Index: 200}}},
}
if len(spans) != len(want) {
t.Fatalf("spans %+v", spans)
}
for i := range want {
if spans[i] != want[i] {
t.Errorf("span %d = %+v, want %+v", i, spans[i], want[i])
}
}
if end.FG.Index != 200 {
t.Errorf("end style %+v", end)
}
}
func TestParseAnsiCarriesStyleAcrossLines(t *testing.T) {
_, st := ParseAnsi("\x1b[92mgreen", AnsiStyle{})
spans, _ := ParseAnsi("still", st)
if spans[0].Style.FG != (AnsiColor{Kind: AnsiIndexed, Index: 10}) {
t.Fatalf("style lost: %+v", spans[0].Style)
}
}
func TestParseAnsiKeepsUnknownSequences(t *testing.T) {
spans, _ := ParseAnsi("a\x1b[2Kb", AnsiStyle{})
if len(spans) != 1 || spans[0].Text != "a\x1b[2Kb" {
t.Fatalf("spans %+v", spans)
}
}