diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-06 08:02:58 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-06 08:02:58 +0200 |
| commit | c6ec3b3ee34c9e77daa7159e8c164e413c2101b5 (patch) | |
| tree | 0b7bba3228caddbdc24614c1734560a64dcd7770 /internal/tui/flamegraph/model_test.go | |
| parent | 1955effb0daa5269d1b4069f3fb5175dbc29793f (diff) | |
Improve flamegraph selection, filter, and zoom feedback
Diffstat (limited to 'internal/tui/flamegraph/model_test.go')
| -rw-r--r-- | internal/tui/flamegraph/model_test.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/internal/tui/flamegraph/model_test.go b/internal/tui/flamegraph/model_test.go index 8bd1b79..ccb5c94 100644 --- a/internal/tui/flamegraph/model_test.go +++ b/internal/tui/flamegraph/model_test.go @@ -166,6 +166,19 @@ func TestZoomInUndoResetAndNestedZoom(t *testing.T) { } } +func TestZoomInOnCurrentRootSetsStatusMessage(t *testing.T) { + m := newZoomModel() + m.selectedIdx = mustFrameIndex(t, m.frames, "root") + + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: tea.KeyEnter}) + if m.zoomPath != "" { + t.Fatalf("expected zoom path to remain root, got %q", m.zoomPath) + } + if m.statusMessage != "Zoom unchanged: selected frame is current view root" { + t.Fatalf("unexpected status message: %q", m.statusMessage) + } +} + func TestZoomTransitionAnimatesToNewLayout(t *testing.T) { m := newZoomModel() pathA := "root" + pathSeparator + "A" @@ -243,6 +256,35 @@ func TestSearchEscapeClearsState(t *testing.T) { if m.searchQuery != "" || len(m.matchIndices) != 0 { t.Fatalf("expected search state to reset on escape, got query=%q matches=%d", m.searchQuery, len(m.matchIndices)) } + if m.statusMessage != "Filter cleared" { + t.Fatalf("expected filter cleared status message, got %q", m.statusMessage) + } +} + +func TestSearchSubmitSetsFilterStatusMessage(t *testing.T) { + m := NewModel(nil) + m.frames = []tuiFrame{ + {Name: "alpha", Path: "root" + pathSeparator + "alpha"}, + {Name: "beta", Path: "root" + pathSeparator + "beta"}, + } + + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: []rune{'/'}[0], Text: "/"}) + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: []rune{'a'}[0], Text: "a"}) + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: tea.KeyEnter}) + if m.statusMessage != `Filter "a": 2 matches` { + t.Fatalf("unexpected status after applying filter: %q", m.statusMessage) + } + + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: []rune{'/'}[0], Text: "/"}) + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: tea.KeyEsc}) + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: []rune{'/'}[0], Text: "/"}) + for _, r := range []rune{'z', 'z'} { + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: r, Text: string(r)}) + } + m = pressFlameKey(t, m, tea.KeyPressMsg{Code: tea.KeyEnter}) + if m.statusMessage != `Filter "zz": no matches` { + t.Fatalf("unexpected status for unmatched filter: %q", m.statusMessage) + } } func TestControlPauseToggle(t *testing.T) { |
