#![cfg(feature = "tui")]
use periplon_sdk::tui::state::WorkflowEntry;
use periplon_sdk::tui::theme::Theme;
use periplon_sdk::tui::ui::workflow_list::WorkflowListView;
use ratatui::backend::{Backend, TestBackend};
use ratatui::Terminal;
use std::path::PathBuf;
fn create_terminal(width: u16, height: u16) -> Terminal<TestBackend> {
let backend = TestBackend::new(width, height);
Terminal::new(backend).unwrap()
}
fn render_workflow_list(
workflows: &[WorkflowEntry],
selected: usize,
theme: &Theme,
width: u16,
height: u16,
) -> Terminal<TestBackend> {
let mut terminal = create_terminal(width, height);
terminal
.draw(|f| {
WorkflowListView::render(f, f.area(), workflows, selected, theme);
})
.unwrap();
terminal
}
fn buffer_contains(terminal: &Terminal<TestBackend>, text: &str) -> bool {
let buffer = terminal.backend().buffer();
let content: String = buffer
.content()
.iter()
.map(|cell| cell.symbol())
.collect::<Vec<_>>()
.join("");
content.contains(text)
}
fn create_workflow_entry(name: &str) -> WorkflowEntry {
WorkflowEntry {
name: name.to_string(),
path: PathBuf::from(format!("/workflows/{}.yaml", name)),
description: Some(format!("Description for {}", name)),
version: Some("1.0.0".to_string()),
valid: true,
errors: Vec::new(),
}
}
#[test]
fn test_basic_rendering() {
let workflows = vec![
create_workflow_entry("workflow1"),
create_workflow_entry("workflow2"),
];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "DSL Workflow Manager"));
assert!(buffer_contains(&terminal, "Workflows"));
}
#[test]
fn test_layout_structure() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "DSL Workflow Manager"));
assert!(buffer_contains(&terminal, "Workflows"));
assert!(buffer_contains(&terminal, "Select"));
assert!(buffer_contains(&terminal, "Quit"));
}
#[test]
fn test_minimum_terminal_size() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 80, 24);
assert_eq!(terminal.backend().size().unwrap().width, 80);
assert_eq!(terminal.backend().size().unwrap().height, 24);
}
#[test]
fn test_single_workflow() {
let workflows = vec![create_workflow_entry("my-workflow")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "my-workflow"));
}
#[test]
fn test_multiple_workflows() {
let workflows = vec![
create_workflow_entry("workflow-alpha"),
create_workflow_entry("workflow-beta"),
create_workflow_entry("workflow-gamma"),
];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "workflow-alpha"));
assert!(buffer_contains(&terminal, "workflow-beta"));
assert!(buffer_contains(&terminal, "workflow-gamma"));
}
#[test]
fn test_workflow_with_long_name() {
let workflows = vec![create_workflow_entry(
"very-long-workflow-name-that-exceeds-normal-limits",
)];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "very-long-workflow-name"));
}
#[test]
fn test_empty_workflow_list() {
let workflows = vec![];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "No workflows found"));
assert!(buffer_contains(&terminal, "create a new workflow"));
}
#[test]
fn test_empty_state_keybinding_hints() {
let workflows = vec![];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "Press"));
assert!(buffer_contains(&terminal, "quit"));
}
#[test]
fn test_first_item_selected() {
let workflows = vec![
create_workflow_entry("first"),
create_workflow_entry("second"),
create_workflow_entry("third"),
];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "first"));
}
#[test]
fn test_second_item_selected() {
let workflows = vec![
create_workflow_entry("first"),
create_workflow_entry("second"),
create_workflow_entry("third"),
];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 1, &theme, 120, 40);
assert!(buffer_contains(&terminal, "first"));
assert!(buffer_contains(&terminal, "second"));
assert!(buffer_contains(&terminal, "third"));
}
#[test]
fn test_last_item_selected() {
let workflows = vec![
create_workflow_entry("first"),
create_workflow_entry("second"),
create_workflow_entry("third"),
];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 2, &theme, 120, 40);
assert!(buffer_contains(&terminal, "third"));
}
#[test]
fn test_selection_bounds() {
let workflows = vec![
create_workflow_entry("workflow1"),
create_workflow_entry("workflow2"),
];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 10, &theme, 120, 40);
assert!(buffer_contains(&terminal, "workflow1"));
}
#[test]
fn test_footer_keybindings() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "Select"));
assert!(buffer_contains(&terminal, "View"));
assert!(buffer_contains(&terminal, "Edit"));
assert!(buffer_contains(&terminal, "Generate"));
assert!(buffer_contains(&terminal, "New"));
assert!(buffer_contains(&terminal, "States"));
assert!(buffer_contains(&terminal, "Help"));
assert!(buffer_contains(&terminal, "Quit"));
}
#[test]
fn test_footer_navigation_keys() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "Enter"));
}
#[test]
fn test_all_themes_render() {
let workflows = vec![create_workflow_entry("test")];
let themes = vec![
Theme::default(),
Theme::light(),
Theme::monokai(),
Theme::solarized(),
];
for theme in themes {
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "DSL Workflow Manager"));
assert!(buffer_contains(&terminal, "test"));
}
}
#[test]
fn test_many_workflows() {
let mut workflows = Vec::new();
for i in 0..50 {
workflows.push(create_workflow_entry(&format!("workflow-{}", i)));
}
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "workflow-0"));
}
#[test]
fn test_large_terminal() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 200, 100);
assert_eq!(terminal.backend().size().unwrap().width, 200);
assert!(buffer_contains(&terminal, "DSL Workflow Manager"));
}
#[test]
fn test_workflow_with_special_characters() {
let workflows = vec![create_workflow_entry("test-workflow_v2.0")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "test-workflow_v2.0"));
}
#[test]
fn test_single_line_terminal() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let _terminal = render_workflow_list(&workflows, 0, &theme, 80, 10);
}
#[test]
fn test_narrow_terminal() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 40, 24);
assert!(terminal.backend().size().unwrap().width == 40);
}
#[test]
fn test_header_centered() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "DSL Workflow Manager"));
}
#[test]
fn test_borders_present() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
let buffer = terminal.backend().buffer();
let content: String = buffer
.content()
.iter()
.map(|cell| cell.symbol())
.collect::<Vec<_>>()
.join("");
assert!(content.contains('│') || content.contains('─') || content.contains('┌'));
}
#[test]
fn test_workflow_list_title() {
let workflows = vec![create_workflow_entry("test")];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
assert!(buffer_contains(&terminal, "Workflows"));
}
#[test]
fn test_selection_marker_present() {
let workflows = vec![
create_workflow_entry("workflow1"),
create_workflow_entry("workflow2"),
];
let theme = Theme::default();
let _terminal = render_workflow_list(&workflows, 0, &theme, 120, 40);
}
#[test]
fn test_unselected_items_no_marker() {
let workflows = vec![
create_workflow_entry("workflow1"),
create_workflow_entry("workflow2"),
create_workflow_entry("workflow3"),
];
let theme = Theme::default();
let terminal = render_workflow_list(&workflows, 1, &theme, 120, 40);
assert!(buffer_contains(&terminal, "workflow1"));
assert!(buffer_contains(&terminal, "workflow2"));
assert!(buffer_contains(&terminal, "workflow3"));
}