use super::*;
use crate::output::{ActivityEvent, ActivityId, ActivityKind, ActivityMetadata, ActivityStatus};
#[test]
fn layout_mode_defaults_and_switches_without_touching_display_state() {
let mut state = MissionControlState {
input: "draft".to_string(),
focus_pane: crate::tui::state::TuiFocusPane::ActivityTree,
prompt_cursor: 3,
show_help: true,
..Default::default()
};
assert_eq!(state.layout_mode, TuiLayoutMode::TranscriptFocused);
state.focus_activity_layout();
state.focus_activity_layout();
assert_eq!(state.layout_mode, TuiLayoutMode::ActivityFocused);
assert_eq!(state.input, "draft");
assert!(state.is_activity_tree_focused());
assert_eq!(state.prompt_cursor, 3);
assert_eq!(state.transcript_scroll_offset(), 0);
assert_eq!(state.activity_scroll_offset(), 0);
assert_eq!(state.detail_offset(), 0);
assert!(state.show_help);
state.focus_transcript_layout();
state.focus_transcript_layout();
assert_eq!(state.layout_mode, TuiLayoutMode::TranscriptFocused);
assert_eq!(state.input, "draft");
assert!(state.is_activity_tree_focused());
assert_eq!(state.prompt_cursor, 3);
assert_eq!(state.transcript_scroll_offset(), 0);
assert_eq!(state.activity_scroll_offset(), 0);
assert_eq!(state.detail_offset(), 0);
assert!(state.show_help);
}
#[test]
fn pane_focus_defaults_and_switches_without_touching_display_state() {
let mut state = MissionControlState {
input: "draft".to_string(),
prompt_cursor: 3,
prompt_cursor_visible: false,
..Default::default()
};
assert!(state.is_prompt_focused());
state.focus_pane = TuiFocusPane::Transcript;
state.prompt_cursor_visible = false;
assert!(state.is_transcript_focused());
state.focus_activity_tree();
assert!(state.is_activity_tree_focused());
state.focus_activity_detail();
assert!(state.is_activity_detail_focused());
state.focus_prompt();
assert!(state.is_prompt_focused());
assert!(state.prompt_cursor_visible);
assert_eq!(state.input, "draft");
assert_eq!(state.prompt_cursor, 3);
assert_eq!(state.transcript_scroll_offset(), 0);
assert_eq!(state.activity_scroll_offset(), 0);
assert_eq!(state.detail_offset(), 0);
}
#[test]
fn detail_first_scroll_and_window_do_not_build_full_wrap_cache() {
let mut state = MissionControlState::default();
let id = ActivityId::new("tool-large-detail");
state.apply_activity_event(ActivityEvent::Started {
id: id.clone(),
parent_id: None,
kind: ActivityKind::Tool,
status: ActivityStatus::Running,
metadata: ActivityMetadata::new("large detail"),
});
state.apply_activity_event(ActivityEvent::Delta {
id,
preview: (0..200)
.map(|index| format!("detail line {index}"))
.collect::<Vec<_>>()
.join("\n"),
});
assert!(state.scroll_detail_down_by(3, 6, 80));
assert!(state.detail_body_visual_rows(80) > 0);
let cache = state.activity_render_cache.borrow();
let detail = cache.selected_detail.as_ref().expect("detail cache");
assert!(detail.body_wrap_cache.contains_key(&80));
}