use ratatui::layout::{Constraint, Rect};
fn verify_layout_positions(inner_area: Rect, constraints: &[Constraint]) -> (bool, String) {
if constraints.len() != 6 {
return (false, format!("Expected 6 constraints, got {}", constraints.len()));
}
let chunks = ratatui::layout::Layout::default()
.constraints(constraints)
.split(inner_area);
let mut last_end = inner_area.y;
for (i, chunk) in chunks.iter().enumerate() {
if chunk.y != last_end {
return (false, format!("Gap detected at chunk {}: expected y={}, got y={}", i, last_end, chunk.y));
}
last_end = chunk.y + chunk.height;
}
if last_end != inner_area.y + inner_area.height {
return (false, format!("Extra space after actions: last_end={}, inner_area.bottom={} ({} lines of extra space)",
last_end, inner_area.y + inner_area.height,
(inner_area.y + inner_area.height) - last_end));
}
if !matches!(constraints[0], Constraint::Length(1)) {
return (false, format!("Constraint 0 (first blank) should be Length(1), got {:?}", constraints[0]));
}
if !matches!(constraints[1], Constraint::Length(1)) {
return (false, format!("Constraint 1 (note) should be Length(1), got {:?}", constraints[1]));
}
if !matches!(constraints[2], Constraint::Length(1)) {
return (false, format!("Constraint 2 (second blank) should be Length(1), got {:?}", constraints[2]));
}
match constraints[3] {
Constraint::Length(_) | Constraint::Fill(_) | Constraint::Min(_) => {},
_ => return (false, format!("Constraint 3 (list) should be Length, Fill, or Min, got {:?}", constraints[3])),
}
if !matches!(constraints[4], Constraint::Length(1)) {
return (false, format!("Constraint 4 (blank between list and actions) should be Length(1), got {:?}", constraints[4]));
}
if !matches!(constraints[5], Constraint::Length(1)) {
return (false, format!("Constraint 5 (actions) should be Length(1), got {:?}", constraints[5]));
}
(true, String::new())
}
#[test]
fn test_working_directory_layout_constraints_empty() {
let area = Rect::new(0, 0, 50, 20);
let inner_area = Rect {
x: area.x + 1,
y: area.y + 1,
width: area.width.saturating_sub(2),
height: area.height.saturating_sub(2),
};
let expected_constraints = vec![
Constraint::Length(1), Constraint::Length(1), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), Constraint::Length(1), ];
let (valid, msg) = verify_layout_positions(inner_area, &expected_constraints);
assert!(valid, "{}", msg);
}
#[test]
fn test_working_directory_layout_constraints_single() {
let area = Rect::new(0, 0, 50, 20);
let inner_area = Rect {
x: area.x + 1,
y: area.y + 1,
width: area.width.saturating_sub(2),
height: area.height.saturating_sub(2),
};
let expected_constraints = vec![
Constraint::Length(1), Constraint::Length(1), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), Constraint::Length(1), ];
let (valid, msg) = verify_layout_positions(inner_area, &expected_constraints);
assert!(valid, "{}", msg);
}
#[test]
fn test_working_directory_layout_constraints_multiple() {
let area = Rect::new(0, 0, 50, 20);
let inner_area = Rect {
x: area.x + 1,
y: area.y + 1,
width: area.width.saturating_sub(2),
height: area.height.saturating_sub(2),
};
let expected_constraints = vec![
Constraint::Length(1), Constraint::Length(1), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), Constraint::Length(1), ];
let (valid, msg) = verify_layout_positions(inner_area, &expected_constraints);
assert!(valid, "{}", msg);
}
#[test]
fn test_match_files_layout_constraints_empty() {
let area = Rect::new(0, 0, 50, 20);
let inner_area = Rect {
x: area.x + 1,
y: area.y + 1,
width: area.width.saturating_sub(2),
height: area.height.saturating_sub(2),
};
let expected_constraints = vec![
Constraint::Length(1), Constraint::Length(1), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), Constraint::Length(1), ];
let (valid, msg) = verify_layout_positions(inner_area, &expected_constraints);
assert!(valid, "{}", msg);
}
#[test]
fn test_match_files_layout_constraints_pattern_only() {
let area = Rect::new(0, 0, 50, 20);
let inner_area = Rect {
x: area.x + 1,
y: area.y + 1,
width: area.width.saturating_sub(2),
height: area.height.saturating_sub(2),
};
let expected_constraints = vec![
Constraint::Length(1), Constraint::Length(1), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), Constraint::Length(1), ];
let (valid, msg) = verify_layout_positions(inner_area, &expected_constraints);
assert!(valid, "{}", msg);
}
#[test]
fn test_match_files_layout_constraints_files_only_single() {
let area = Rect::new(0, 0, 50, 20);
let inner_area = Rect {
x: area.x + 1,
y: area.y + 1,
width: area.width.saturating_sub(2),
height: area.height.saturating_sub(2),
};
let expected_constraints = vec![
Constraint::Length(1), Constraint::Length(1), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), Constraint::Length(1), ];
let (valid, msg) = verify_layout_positions(inner_area, &expected_constraints);
assert!(valid, "{}", msg);
}
#[test]
fn test_match_files_layout_constraints_files_only_multiple() {
let area = Rect::new(0, 0, 50, 20);
let inner_area = Rect {
x: area.x + 1,
y: area.y + 1,
width: area.width.saturating_sub(2),
height: area.height.saturating_sub(2),
};
let expected_constraints = vec![
Constraint::Length(1), Constraint::Length(1), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), Constraint::Length(1), ];
let (valid, msg) = verify_layout_positions(inner_area, &expected_constraints);
assert!(valid, "{}", msg);
}
#[test]
fn test_match_files_layout_constraints_both() {
let area = Rect::new(0, 0, 50, 20);
let inner_area = Rect {
x: area.x + 1,
y: area.y + 1,
width: area.width.saturating_sub(2),
height: area.height.saturating_sub(2),
};
let expected_constraints = vec![
Constraint::Length(1), Constraint::Length(1), Constraint::Length(1), Constraint::Fill(1), Constraint::Length(1), Constraint::Length(1), ];
let (valid, msg) = verify_layout_positions(inner_area, &expected_constraints);
assert!(valid, "{}", msg);
}