#![cfg(feature = "dap")]
use pmat::services::dap::timeline_tui::StackFrameNavigator;
#[test]
fn test_stack_frame_navigator_creation() {
let navigator = StackFrameNavigator::new();
assert_eq!(navigator.frame_count(), 0);
assert_eq!(navigator.selected_index(), 0);
}
#[test]
fn test_stack_frame_navigator_with_frames() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
("helper".to_string(), "utils.rs".to_string(), 100),
];
let navigator = StackFrameNavigator::from_frames(frames);
assert_eq!(navigator.frame_count(), 3);
}
#[test]
fn test_set_selected_index() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(1);
assert_eq!(navigator.selected_index(), 1);
}
#[test]
fn test_selection_bounds_enforcement() {
let frames = vec![("main".to_string(), "main.rs".to_string(), 10)];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(10);
assert_eq!(navigator.selected_index(), 0);
}
#[test]
fn test_select_next_frame() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
("helper".to_string(), "utils.rs".to_string(), 100),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.select_next();
assert_eq!(navigator.selected_index(), 1);
navigator.select_next();
assert_eq!(navigator.selected_index(), 2);
}
#[test]
fn test_select_previous_frame() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
("helper".to_string(), "utils.rs".to_string(), 100),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(2);
navigator.select_previous();
assert_eq!(navigator.selected_index(), 1);
}
#[test]
fn test_select_next_at_bottom() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(1);
navigator.select_next();
assert_eq!(navigator.selected_index(), 1);
}
#[test]
fn test_select_previous_at_top() {
let frames = vec![("main".to_string(), "main.rs".to_string(), 10)];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.select_previous();
assert_eq!(navigator.selected_index(), 0);
}
#[test]
fn test_get_frame_at_index() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
];
let navigator = StackFrameNavigator::from_frames(frames);
let frame = navigator.get_frame(1);
assert!(frame.is_some());
let (func, file, line) = frame.unwrap();
assert_eq!(func, "process");
assert_eq!(file, "lib.rs");
assert_eq!(line, 42);
}
#[test]
fn test_get_frame_out_of_bounds() {
let frames = vec![("main".to_string(), "main.rs".to_string(), 10)];
let navigator = StackFrameNavigator::from_frames(frames);
let frame = navigator.get_frame(10);
assert_eq!(frame, None);
}
#[test]
fn test_get_selected_frame() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(1);
let frame = navigator.get_selected_frame();
assert!(frame.is_some());
let (func, file, line) = frame.unwrap();
assert_eq!(func, "process");
assert_eq!(file, "lib.rs");
assert_eq!(line, 42);
}
#[test]
fn test_format_frame_line() {
let frames = vec![("main".to_string(), "main.rs".to_string(), 10)];
let navigator = StackFrameNavigator::from_frames(frames);
let line = navigator.format_frame_line(0);
assert_eq!(line, Some("main @ main.rs:10".to_string()));
}
#[test]
fn test_format_frame_line_out_of_bounds() {
let frames = vec![("main".to_string(), "main.rs".to_string(), 10)];
let navigator = StackFrameNavigator::from_frames(frames);
let line = navigator.format_frame_line(10);
assert_eq!(line, None);
}
#[test]
fn test_format_frame_with_selection_marker() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(1);
let line = navigator.format_frame_with_marker(1);
assert_eq!(line, Some("▶ process @ lib.rs:42".to_string()));
}
#[test]
fn test_format_frame_without_selection_marker() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(1);
let line = navigator.format_frame_with_marker(0);
assert_eq!(line, Some(" main @ main.rs:10".to_string()));
}
#[test]
fn test_render_all_frames() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
("helper".to_string(), "utils.rs".to_string(), 100),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(1);
let rendered = navigator.render_all_frames();
assert_eq!(rendered.len(), 3);
assert_eq!(rendered[0], " main @ main.rs:10");
assert_eq!(rendered[1], "▶ process @ lib.rs:42");
assert_eq!(rendered[2], " helper @ utils.rs:100");
}
#[test]
fn test_add_frame() {
let mut navigator = StackFrameNavigator::new();
navigator.add_frame("main".to_string(), "main.rs".to_string(), 10);
assert_eq!(navigator.frame_count(), 1);
}
#[test]
fn test_add_multiple_frames() {
let mut navigator = StackFrameNavigator::new();
navigator.add_frame("main".to_string(), "main.rs".to_string(), 10);
navigator.add_frame("process".to_string(), "lib.rs".to_string(), 42);
assert_eq!(navigator.frame_count(), 2);
let frame = navigator.get_frame(1);
assert!(frame.is_some());
let (func, _, _) = frame.unwrap();
assert_eq!(func, "process");
}
#[test]
fn test_empty_navigator_selection() {
let mut navigator = StackFrameNavigator::new();
navigator.select_next();
navigator.select_previous();
assert_eq!(navigator.selected_index(), 0);
}
#[test]
fn test_empty_navigator_get_selected_frame() {
let navigator = StackFrameNavigator::new();
let frame = navigator.get_selected_frame();
assert_eq!(frame, None);
}
#[test]
fn test_is_frame_selected() {
let frames = vec![
("main".to_string(), "main.rs".to_string(), 10),
("process".to_string(), "lib.rs".to_string(), 42),
];
let mut navigator = StackFrameNavigator::from_frames(frames);
navigator.set_selected_index(1);
assert!(!navigator.is_frame_selected(0));
assert!(navigator.is_frame_selected(1));
}