Files
MujicaUI/code/output_panel_test.go

121 lines
3.0 KiB
Go

package code
import (
"fmt"
"testing"
"github.com/egoist/mygo/ui"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/core"
)
type outputProbe struct {
channels []OutputChannel
s OutputPanelState
disabled bool
changed int
cleared []string
}
func (p *outputProbe) view(c *ui.Context) {
core.Use(c, core.Settings{})
r := OutputPanel(c, p.channels, &p.s, OutputPanelOptions{Disabled: p.disabled})
r.Element.Height(300)
if r.Changed {
p.changed++
}
if r.Cleared != "" {
p.cleared = append(p.cleared, r.Cleared)
for i := range p.channels {
if p.channels[i].Name == r.Cleared {
p.channels[i].Lines = nil
}
}
}
}
func newOutputProbe() *outputProbe {
var build []string
for i := range 200 {
build = append(build, fmt.Sprintf("compile unit %d", i))
}
return &outputProbe{channels: []OutputChannel{{"Build", build}, {"Tests", []string{"\x1b[32mPASS\x1b[0m court", "\x1b[31mFAIL\x1b[0m ledger"}}}}
}
func TestOutputPanelFollowsTail(t *testing.T) {
p := newOutputProbe()
tt := ui.NewTester(p.view, 520, 320)
if !tt.HasText("compile unit 199") || tt.HasText("compile unit 0") {
t.Fatal("panel did not start at the tail")
}
p.channels[0].Lines = append(p.channels[0].Lines, "linked")
tt.Frame()
if !tt.HasText("linked") {
t.Fatal("new output not followed")
}
}
func TestOutputPanelSwitchAndClear(t *testing.T) {
p := newOutputProbe()
tt := ui.NewTester(p.view, 520, 320)
if err := tt.Click("Build"); err != nil {
t.Fatal(err)
}
if err := tt.Click("Tests"); err != nil {
t.Fatal(err)
}
if p.s.Channel != 1 || p.changed != 1 || !tt.HasText("PASS court") {
t.Fatalf("channel %d changed %d texts %q", p.s.Channel, p.changed, tt.Texts())
}
if err := tt.Click("Clear output"); err != nil {
t.Fatal(err)
}
if len(p.cleared) != 1 || p.cleared[0] != "Tests" || !tt.HasText("No output") {
t.Fatalf("cleared %v", p.cleared)
}
}
func TestOutputPanelAnsiColors(t *testing.T) {
var spans []ui.Span
var ok ui.Color
ui.NewTester(func(c *ui.Context) {
core.Use(c, core.Settings{Mode: core.Light})
ok = core.Tokens(c).Success
spans = CodeAnsiSpans(c, "\x1b[1;32mPASS\x1b[0m court")
}, 10, 10)
if len(spans) != 2 || spans[0].Color != ok || spans[0].Weight != 700 || spans[1].Color.A != 0 {
t.Fatalf("spans %+v", spans)
}
}
func TestOutputPanelDisabledAndBadChannel(t *testing.T) {
p := newOutputProbe()
p.disabled = true
tt := ui.NewTester(p.view, 520, 320)
_ = tt.Click("Clear output")
if len(p.cleared) != 0 {
t.Fatal("disabled panel cleared")
}
defer func() {
if recover() == nil {
t.Fatal("channel out of range did not panic")
}
}()
p = newOutputProbe()
p.s.Channel = 5
ui.NewTester(p.view, 520, 320)
}
func TestOutputPanelSnapshot(t *testing.T) {
snapshot(t, "output_panel", 520, 200, func(c *ui.Context) {
p := ui.Local(c.Root(), "snap", func() *outputProbe {
p := newOutputProbe()
p.s.Channel = 1
return p
})
ui.Column(c).Padding(12).Children(func() {
OutputPanel(c, (*p).channels, &(*p).s, OutputPanelOptions{}).Element.Height(176)
})
})
}