aisling 0.2.1

Embeddable terminal text effects and loaders for Rust TUI applications.
Documentation
use std::str::FromStr;

use aisling::{Color, Effect, EffectConfig, EffectKind, Frame, Gradient, GradientDirection};

fn final_plain(frame: &Frame) -> String {
    frame.to_plain_string()
}

#[test]
fn exposes_effect_catalog() {
    assert_eq!(EffectKind::all().len(), 37);
    for kind in EffectKind::all() {
        assert_eq!(EffectKind::from_str(kind.name()).unwrap(), *kind);
    }
    assert_eq!(
        EffectKind::from_str("orbiting-volley").unwrap(),
        EffectKind::OrbittingVolley
    );
}

#[test]
fn every_effect_finishes_on_input_text() {
    let config = EffectConfig::default().with_duration(12).with_seed(123);
    for kind in EffectKind::all() {
        let effect = Effect::with_config(*kind, "Hi\nRS", config.clone());
        let frames = effect.frames();
        assert_eq!(frames.len(), config.duration, "{kind}");
        assert_eq!(final_plain(frames.last().unwrap()), "Hi\nRS", "{kind}");
    }
}

#[test]
fn ansi_input_is_parsed_and_final_text_is_plain() {
    let config = EffectConfig::default().with_duration(4).with_seed(1);
    let frame = Effect::with_config(EffectKind::Print, "\x1b[31mRed\x1b[0m", config).final_frame();
    assert_eq!(frame.to_plain_string(), "Red");
    assert!(frame.cell(0, 0).unwrap().colors.fg.is_some());
}

#[test]
fn gradient_maps_coordinates() {
    let gradient = Gradient::new(vec![Color::BLACK, Color::WHITE], 4);
    assert_eq!(
        gradient.coordinate_color(0, 0, 5, 1, GradientDirection::Horizontal),
        Color::BLACK
    );
    assert_eq!(
        gradient.coordinate_color(4, 0, 5, 1, GradientDirection::Horizontal),
        Color::WHITE
    );
}