Files
MujicaUI/devtools/log_stream_test.go
T

148 lines
4.5 KiB
Go

package devtools
import (
"fmt"
"testing"
"github.com/egoist/mygo/ui"
"github.com/ZacharyZhang-NY/MujicaUI/code"
"github.com/ZacharyZhang-NY/MujicaUI/core"
)
func logStreamLines(n int) []code.LogLine {
out := make([]code.LogLine, n)
for i := range out {
out[i] = code.LogLine{Level: code.LogLevel(i % 4), Text: fmt.Sprintf("\x1b[1mline\x1b[0m %d", i)}
}
return out
}
func logStreamTester(lines *[]code.LogLine, s *LogStreamState, opts LogStreamOptions, changes *int) *ui.Tester {
return ui.NewTester(func(c *ui.Context) {
core.Use(c, core.Settings{})
if LogStream(c, *lines, s, opts).Changed() {
*changes++
}
}, 700, 400)
}
func TestLogStreamFollowPauseResume(t *testing.T) {
lines := logStreamLines(10)
var s LogStreamState
n := 0
tt := logStreamTester(&lines, &s, LogStreamOptions{}, &n)
if !tt.HasText("line 9") || tt.HasText("\x1b[1mline") {
t.Fatalf("texts %q", tt.Texts())
}
_ = tt.Click("Pause")
lines = append(lines, logStreamLines(13)[10:]...)
tt.Frame()
if !s.Paused || tt.HasText("line 12") || !tt.HasText("3 new lines") {
t.Fatalf("paused: %q", tt.Texts())
}
_ = tt.Click("Resume")
if s.Paused || !tt.HasText("line 12") || n != 2 {
t.Fatalf("resume: %q changes %d", tt.Texts(), n)
}
}
func TestLogStreamLevelFilter(t *testing.T) {
lines := logStreamLines(8)
var s LogStreamState
n := 0
tt := logStreamTester(&lines, &s, LogStreamOptions{}, &n)
_ = tt.Click("WARN")
if s.MinLevel != code.LogWarn || tt.HasText("line 5") || !tt.HasText("line 6") || !tt.HasText("line 7") {
t.Fatalf("filter: %v %q", s.MinLevel, tt.Texts())
}
tt.Key(0, ui.KeyRight)
if s.MinLevel != code.LogError || tt.HasText("line 6") {
t.Fatalf("keyboard filter: %v", s.MinLevel)
}
}
func TestLogStreamDisabledEmptyMany(t *testing.T) {
lines := logStreamLines(4)
var s LogStreamState
n := 0
tt := logStreamTester(&lines, &s, LogStreamOptions{Disabled: true}, &n)
_ = tt.Click("Pause")
_ = tt.Click("WARN")
if n != 0 || s.Paused || s.MinLevel != code.LogDebug {
t.Fatalf("disabled changed: %+v", s)
}
none := []code.LogLine{}
tt = logStreamTester(&none, &LogStreamState{}, LogStreamOptions{}, &n)
if !tt.HasText("No log lines") {
t.Fatal("empty text missing")
}
many := logStreamLines(100000)
var ms LogStreamState
tt = logStreamTester(&many, &ms, LogStreamOptions{}, &n)
if got := len(tt.Texts()); got > 300 || !tt.HasText("line 99999") {
t.Fatalf("%d texts; last line shown %v", got, tt.HasText("line 99999"))
}
}
func TestLogStreamSnapshot(t *testing.T) {
lines := []code.LogLine{
{Level: code.LogInfo, Text: "server listening on :8080"},
{Level: code.LogDebug, Text: "cache warm: 312 keys"},
{Level: code.LogWarn, Text: "slow query \x1b[33m412 ms\x1b[0m on guests"},
{Level: code.LogError, Text: "\x1b[31mpayment provider unreachable\x1b[0m"},
{Level: code.LogInfo, Text: "retry 1 of 3 succeeded"},
}
snapshot(t, "log_stream", 640, 260, func(c *ui.Context) {
var s LogStreamState
ui.Column(c).Padding(16).Children(func() { LogStream(c, lines, &s, LogStreamOptions{Height: 220}) })
})
}
func TestLogStreamAncestorDisabledAndEmptyFilter(t *testing.T) {
lines := []code.LogLine{{Level: code.LogInfo, Text: "ready"}}
var s LogStreamState
disabled := false
tt := ui.NewTester(func(c *ui.Context) {
core.Use(c, core.Settings{})
ui.Column(c).Disabled(disabled).Children(func() { LogStream(c, lines, &s, LogStreamOptions{}) })
}, 700, 400)
_ = tt.Click("WARN")
if !tt.HasText("No log lines") || s.MinLevel != code.LogWarn {
t.Fatal("empty level filter")
}
disabled = true
tt.Key(0, ui.KeyRight)
_ = tt.Click("Pause")
if s.MinLevel != code.LogWarn || s.Paused {
t.Fatal("disabled stream changed")
}
}
func TestLogStreamReplacedLevels(t *testing.T) {
lines := []code.LogLine{{Level: code.LogInfo, Text: "ready"}}
s := LogStreamState{MinLevel: code.LogWarn}
changes := 0
tt := logStreamTester(&lines, &s, LogStreamOptions{}, &changes)
lines = []code.LogLine{{Level: code.LogError, Text: "failed"}}
tt.Frame()
if !tt.HasText("failed") || tt.HasText("No log lines") {
t.Fatal("replaced log levels retained old filter")
}
}
func TestLogStreamInitiallyPausedKeepsCurrentLines(t *testing.T) {
lines := logStreamLines(4)
state := LogStreamState{Paused: true}
changes := 0
tt := logStreamTester(&lines, &state, LogStreamOptions{}, &changes)
if !tt.HasText("line 3") {
t.Fatal("initial pause hid existing lines")
}
lines = append(lines, code.LogLine{Level: code.LogInfo, Text: "later"})
tt.Frame()
if tt.HasText("later") || !tt.HasText("1 new lines") {
t.Fatal("initial pause did not freeze lines")
}
}