use crate::lookout::app::App;
use super::palette::plain;
use super::render::rendered;
#[track_caller]
pub fn config_pane_field_rows_for_tests(app: &App) -> Vec<String> {
let pane = app.config_pane().expect("the pane is open");
pane.rows()
.into_iter()
.filter_map(|row| match row {
crate::lookout::pane::PaneRow::Field(index) => {
Some(pane.fields().fields()[index].key.clone())
}
crate::lookout::pane::PaneRow::Table(_)
| crate::lookout::pane::PaneRow::Entry(_)
| crate::lookout::pane::PaneRow::Choice { .. }
| crate::lookout::pane::PaneRow::Arm { .. }
| crate::lookout::pane::PaneRow::Env(_)
| crate::lookout::pane::PaneRow::AddEnv => None,
})
.collect()
}
#[track_caller]
pub fn config_pane_env_rows_for_tests(pane: &crate::lookout::pane::ConfigPane) -> Vec<String> {
let lines = crate::lookout::view::pane::pane_lines(pane, plain(), 160, 0);
let rendered_lines: Vec<String> = lines.iter().map(rendered).collect();
let header = rendered_lines
.iter()
.position(|line| {
line.strip_prefix(" env")
.is_some_and(|rest| rest.is_empty() || rest.starts_with(' '))
})
.expect("the pane draws an env section header");
let env_rows = &rendered_lines[header + 1..];
let mut rows: Vec<String> = pane
.env_key_names()
.iter()
.map(|name| {
env_rows
.iter()
.find(|line| {
line.trim_start_matches(['>', ' '])
.starts_with(name.as_str())
})
.unwrap_or_else(|| panic!("no row for env key {name}"))
.clone()
})
.collect();
rows.push(
env_rows
.iter()
.find(|line| line.contains("add a key"))
.expect("the pane draws a + add a key row")
.clone(),
);
rows
}
#[track_caller]
pub fn config_pane_pending_rows_for_tests(app: &App) -> Vec<String> {
let pane = app.config_pane().expect("the pane is open");
pane.edits()
.iter()
.map(|(key, _)| match key {
crate::lookout::edits::EditKey::Field(name) => name.clone(),
crate::lookout::edits::EditKey::Env(name) => format!("env.{name}"),
})
.collect()
}
#[track_caller]
pub fn config_pane_row_for_tests(app: &App, key: &str) -> String {
let pane = app.config_pane().expect("the pane is open");
let lines = crate::lookout::view::pane::pane_lines(pane, plain(), 160, 0);
lines
.iter()
.map(rendered)
.find(|line| {
line.trim_start_matches(['>', ' ', '=', '~', '!', '*'])
.starts_with(key)
})
.unwrap_or_else(|| panic!("no row for {key}"))
}
#[track_caller]
pub fn config_pane_title_band_for_tests(app: &App, width: u16) -> String {
let pane = app.config_pane().expect("the pane is open");
let lines = crate::lookout::view::pane::pane_lines(pane, plain(), width, 0);
rendered(&lines[0])
}
#[track_caller]
pub fn config_pane_tab_row_for_tests(app: &App, width: u16) -> String {
let pane = app.config_pane().expect("the pane is open");
let lines = crate::lookout::view::pane::pane_lines(pane, plain(), width, 0);
lines
.iter()
.map(rendered)
.find(|line| line.contains("next / prev group"))
.expect("the pane draws a tab row at this width")
}
pub fn config_pane_draws_a_tab_row(app: &App, width: u16) -> bool {
let pane = app.config_pane().expect("the pane is open");
let lines = crate::lookout::view::pane::pane_lines(pane, plain(), width, 0);
lines
.iter()
.map(rendered)
.any(|line| line.contains("next / prev group"))
}
pub fn config_pane_draws_a_panel(app: &App, width: u16) -> bool {
let pane = app.config_pane().expect("the pane is open");
let lines = crate::lookout::view::pane::pane_lines(pane, plain(), width, 0);
lines
.iter()
.map(rendered)
.any(|line| line.contains("FOCUSED"))
}
#[track_caller]
pub fn config_pane_panel_for_tests(app: &App, width: u16) -> Vec<String> {
let pane = app.config_pane().expect("the pane is open");
crate::lookout::view::pane::panel_lines(pane, app.palette(), width)
.iter()
.map(rendered)
.collect()
}
#[track_caller]
pub fn config_pane_panel_focused_on(app: &App, key: &str, width: u16) -> Vec<String> {
let pane = app.config_pane().expect("the pane is open");
let field = pane
.fields()
.by_key(key)
.unwrap_or_else(|| panic!("no field named {key}"));
crate::lookout::view::pane::panel_for_field(field, pane, app.palette(), width)
.iter()
.map(rendered)
.collect()
}