envision 0.16.0

A ratatui framework for collaborative TUI development with headless testing support
Documentation
use super::*;
use crate::component::test_utils;

#[test]
fn test_with_bounds() {
    let s = DataSeries::new("p50", vec![10.0, 20.0]).with_bounds(vec![5.0, 15.0], vec![15.0, 25.0]);
    assert_eq!(s.lower_bound(), Some([5.0, 15.0].as_slice()));
    assert_eq!(s.upper_bound(), Some([15.0, 25.0].as_slice()));
}

#[test]
fn test_bounds_none_by_default() {
    let s = DataSeries::new("Test", vec![1.0]);
    assert_eq!(s.upper_bound(), None);
    assert_eq!(s.lower_bound(), None);
}

#[test]
fn test_upper_bound_affects_effective_max() {
    let s = DataSeries::new("p50", vec![10.0, 20.0]).with_upper_bound(vec![50.0, 60.0]);
    let state = ChartState::line(vec![s]);
    assert_eq!(state.effective_max(), 60.0);
}

#[test]
fn test_lower_bound_affects_effective_min() {
    let s = DataSeries::new("p50", vec![10.0, 20.0]).with_lower_bound(vec![-5.0, 5.0]);
    let state = ChartState::line(vec![s]);
    assert_eq!(state.effective_min(), -5.0);
}

#[test]
fn test_manual_y_range_overrides_bounds() {
    let s = DataSeries::new("p50", vec![50.0]).with_bounds(vec![0.0], vec![100.0]);
    let state = ChartState::line(vec![s]).with_y_range(25.0, 75.0);
    assert_eq!(state.effective_min(), 25.0);
    assert_eq!(state.effective_max(), 75.0);
}

#[test]
fn test_render_with_bounds_shows_shading() {
    let s = DataSeries::new("p50", vec![50.0, 60.0, 55.0, 70.0, 65.0]).with_bounds(
        vec![30.0, 40.0, 35.0, 50.0, 45.0],
        vec![70.0, 80.0, 75.0, 90.0, 85.0],
    );
    let state = ChartState::line(vec![s]);
    let (mut terminal, theme) = test_utils::setup_render(60, 20);
    terminal
        .draw(|frame| {
            Chart::view(&state, &mut RenderContext::new(frame, frame.area(), &theme));
        })
        .unwrap();
    let output = terminal.backend().to_string();
    assert!(
        output.contains('\u{2591}'),
        "Chart with error bands should contain shade fill"
    );
}

#[test]
fn test_render_without_bounds_no_shading() {
    let s = DataSeries::new("plain", vec![50.0, 60.0, 55.0, 70.0, 65.0]);
    let state = ChartState::line(vec![s]);
    let (mut terminal, theme) = test_utils::setup_render(60, 20);
    terminal
        .draw(|frame| {
            Chart::view(&state, &mut RenderContext::new(frame, frame.area(), &theme));
        })
        .unwrap();
    let output = terminal.backend().to_string();
    assert!(
        !output.contains('\u{2591}'),
        "Line chart without bounds should not contain shade fill"
    );
}

#[test]
fn test_render_with_only_upper_bound() {
    let s = DataSeries::new("p50", vec![50.0, 60.0, 55.0, 70.0, 65.0])
        .with_upper_bound(vec![60.0, 70.0, 65.0, 80.0, 75.0]);
    let state = ChartState::line(vec![s]);
    let (mut terminal, theme) = test_utils::setup_render(60, 20);
    terminal
        .draw(|frame| {
            Chart::view(&state, &mut RenderContext::new(frame, frame.area(), &theme));
        })
        .unwrap();
    let output = terminal.backend().to_string();
    assert!(
        output.contains('\u{2591}'),
        "Chart with only upper bound should contain shade fill"
    );
}

#[test]
fn test_render_bounds_disabled() {
    let s = DataSeries::new("p50", vec![50.0, 60.0, 55.0])
        .with_bounds(vec![40.0, 50.0, 45.0], vec![60.0, 70.0, 65.0]);
    let state = ChartState::line(vec![s]);
    let (mut terminal, theme) = test_utils::setup_render(60, 20);
    terminal
        .draw(|frame| {
            Chart::view(
                &state,
                &mut RenderContext::new(frame, frame.area(), &theme).disabled(true),
            );
        })
        .unwrap();
}

#[test]
fn test_bounds_clone_and_eq() {
    let a = DataSeries::new("p50", vec![10.0]).with_bounds(vec![5.0], vec![15.0]);
    let b = a.clone();
    assert_eq!(a, b);
    let c = DataSeries::new("p50", vec![10.0]);
    assert_ne!(a, c);
}