package main import ( "strings" "testing" ctui "git.unkin.net/unkin/benvin-utils/common/tui" ) func TestComputeDirections(t *testing.T) { m := &model{prev: map[string]row{}, dirCPU: map[string]int{}, dirMem: map[string]int{}} // First snapshot: no prior data, so no direction is recorded yet. m.computeDirections([]row{{Namespace: "ns", Pod: "p", CPUUseM: 100, MemUseB: 1000}}) if got := m.dirCPU["ns/p"]; got != 0 { t.Fatalf("first snapshot cpu dir = %d, want 0 (unset)", got) } // CPU rose, memory fell. m.computeDirections([]row{{Namespace: "ns", Pod: "p", CPUUseM: 150, MemUseB: 800}}) if got := m.dirCPU["ns/p"]; got != 1 { t.Errorf("cpu dir after rise = %d, want 1 (▲)", got) } if got := m.dirMem["ns/p"]; got != -1 { t.Errorf("mem dir after drop = %d, want -1 (▼)", got) } // No change → flat. m.computeDirections([]row{{Namespace: "ns", Pod: "p", CPUUseM: 150, MemUseB: 800}}) if got := m.dirCPU["ns/p"]; got != 0 { t.Errorf("cpu dir after no change = %d, want 0 (·)", got) } } func TestArrowGlyphs(t *testing.T) { // The shared marker path renders the expected glyph per direction. cases := []struct { dir int want string }{ {1, ctui.GlyphUp}, {-1, ctui.GlyphDown}, {0, ctui.GlyphFlat}, } for _, c := range cases { if got := ctui.Arrow(c.dir); !strings.Contains(got, c.want) { t.Errorf("Arrow(%d) = %q, want it to contain %q", c.dir, got, c.want) } } } func TestUnitFormatting(t *testing.T) { if got := cpu(250); got != "250m" { t.Errorf("cpu(250) = %q, want 250m", got) } if got := cpu(1500); got != "1.50" { t.Errorf("cpu(1500) = %q, want 1.50", got) } if got := cpu(-130); got != "-130m" { t.Errorf("cpu(-130) = %q, want -130m", got) } if got := mem(-134217728); got != "-128Mi" { t.Errorf("mem(-134217728) = %q, want -128Mi", got) } }