rnk 0.19.3

A React-like declarative terminal UI framework for Rust, inspired by Ink and Bubbletea
Documentation
use super::*;

#[test]
fn test_theme_dark() {
    let theme = Theme::dark();
    assert_eq!(theme.name, "dark");
    assert_eq!(theme.primary, Color::Cyan);
}

#[test]
fn test_theme_light() {
    let theme = Theme::light();
    assert_eq!(theme.name, "light");
    assert_eq!(theme.primary, Color::Blue);
}

#[test]
fn test_theme_monokai() {
    let theme = Theme::monokai();
    assert_eq!(theme.name, "monokai");
}

#[test]
fn test_theme_dracula() {
    let theme = Theme::dracula();
    assert_eq!(theme.name, "dracula");
}

#[test]
fn test_theme_nord() {
    let theme = Theme::nord();
    assert_eq!(theme.name, "nord");
}

#[test]
fn test_theme_solarized() {
    let theme = Theme::solarized_dark();
    assert_eq!(theme.name, "solarized_dark");
}

#[test]
fn test_theme_by_name() {
    assert!(Theme::by_name("dark").is_some());
    assert!(Theme::by_name("light").is_some());
    assert!(Theme::by_name("monokai").is_some());
    assert!(Theme::by_name("dracula").is_some());
    assert!(Theme::by_name("nord").is_some());
    assert!(Theme::by_name("solarized").is_some());
    assert!(Theme::by_name("nonexistent").is_none());
}

#[test]
fn test_available_themes() {
    let themes = Theme::available_themes();
    assert!(themes.contains(&"dark"));
    assert!(themes.contains(&"light"));
    assert!(themes.contains(&"monokai"));
}

#[test]
fn test_theme_builder() {
    let theme = Theme::builder("custom")
        .primary(Color::Red)
        .secondary(Color::Blue)
        .success(Color::Green)
        .build();

    assert_eq!(theme.name, "custom");
    assert_eq!(theme.primary, Color::Red);
    assert_eq!(theme.secondary, Color::Blue);
    assert_eq!(theme.success, Color::Green);
}

#[test]
fn test_set_get_theme() {
    let original = get_theme();

    set_theme(Theme::light());
    assert_eq!(get_theme().name, "light");

    set_theme(Theme::dark());
    assert_eq!(get_theme().name, "dark");

    set_theme(original);
}

#[test]
fn test_with_theme() {
    let result = with_theme(Theme::monokai(), |theme| {
        assert_eq!(theme.name, "monokai");
        42
    });
    assert_eq!(result, 42);
}

#[test]
fn test_with_theme_restores_after_panic() {
    use std::panic::{AssertUnwindSafe, catch_unwind};

    let original = get_theme();
    let result = catch_unwind(AssertUnwindSafe(|| {
        with_theme(Theme::light(), |_| {
            panic!("boom");
        });
    }));

    assert!(result.is_err());
    assert_eq!(get_theme().name, original.name);
}

#[test]
fn test_theme_isolated_per_runtime_context() {
    use crate::runtime::{RuntimeContext, set_current_runtime};
    use std::cell::RefCell;
    use std::rc::Rc;

    set_current_runtime(None);
    set_theme(Theme::dark());
    assert_eq!(get_theme().name, "dark");

    let ctx1 = Rc::new(RefCell::new(RuntimeContext::new()));
    let ctx2 = Rc::new(RefCell::new(RuntimeContext::new()));

    set_current_runtime(Some(ctx1));
    set_theme(Theme::light());
    assert_eq!(get_theme().name, "light");

    set_current_runtime(Some(ctx2));
    assert_eq!(get_theme().name, "dark");

    set_current_runtime(None);
    assert_eq!(get_theme().name, "dark");
}

#[test]
fn test_semantic_color() {
    let theme = Theme::dark();

    assert_eq!(theme.semantic_color(SemanticColor::Primary), theme.primary);
    assert_eq!(
        theme.semantic_color(SemanticColor::Secondary),
        theme.secondary
    );
    assert_eq!(theme.semantic_color(SemanticColor::Success), theme.success);
    assert_eq!(theme.semantic_color(SemanticColor::Warning), theme.warning);
    assert_eq!(theme.semantic_color(SemanticColor::Error), theme.error);
    assert_eq!(theme.semantic_color(SemanticColor::Info), theme.info);
    assert_eq!(
        theme.semantic_color(SemanticColor::TextPrimary),
        theme.text.primary
    );
    assert_eq!(
        theme.semantic_color(SemanticColor::Background),
        theme.background.default
    );
    assert_eq!(
        theme.semantic_color(SemanticColor::Border),
        theme.border.default
    );
}

#[test]
fn test_semantic_fg_bg() {
    let theme = Theme::dark();

    let fg = theme.semantic_fg(SemanticColor::Error);
    assert!(fg.starts_with("\x1b["));

    let bg = theme.semantic_bg(SemanticColor::Error);
    assert!(bg.starts_with("\x1b["));
}