yuru-tui 0.1.8

Terminal user interface for Yuru
Documentation
use crate::api::PreviewCommand;
#[cfg(unix)]
use crate::preview::PreviewGeometry;
use crate::preview::{run_preview_command, PreviewCache, PreviewPayload};

use super::helpers::{preview_key, test_geometry};

#[test]
fn preview_scroll_clamps_to_visible_lines() {
    let mut cache = PreviewCache::default();
    cache.replace(
        preview_key("cat {}", 0, "alpha"),
        PreviewPayload::Text("one\ntwo\nthree".to_string()),
    );

    cache.scroll_down(10, 2);
    assert_eq!(cache.scroll, 1);

    cache.scroll_up(10, 2);
    assert_eq!(cache.scroll, 0);
}

#[test]
fn preview_scroll_resets_when_preview_key_changes() {
    let mut cache = PreviewCache::default();
    cache.replace(
        preview_key("cat {}", 0, "alpha"),
        PreviewPayload::Text("one\ntwo\nthree".to_string()),
    );
    cache.scroll_down(1, 2);

    cache.replace(
        preview_key("cat {}", 1, "beta"),
        PreviewPayload::Text("four\nfive\nsix".to_string()),
    );

    assert_eq!(cache.scroll, 0);
}
#[cfg(unix)]
#[test]
fn preview_command_returns_stderr_when_stdout_is_empty() {
    let preview = run_preview_command(
        &PreviewCommand::Shell("printf preview-error >&2".to_string()),
        None,
        "alpha",
        test_geometry(),
    );

    assert!(matches!(preview, PreviewPayload::Text(text) if text == "preview-error"));
}

#[cfg(unix)]
#[test]
fn preview_command_gets_fzf_preview_geometry_env() {
    let preview = run_preview_command(
        &PreviewCommand::Shell("printf '%s,%s,%s,%s' \"$FZF_PREVIEW_COLUMNS\" \"$FZF_PREVIEW_LINES\" \"$FZF_PREVIEW_LEFT\" \"$FZF_PREVIEW_TOP\"".to_string()),
        None,
        "alpha",
        PreviewGeometry {
            columns: 40,
            lines: 12,
            left: 41,
            top: 1,
        },
    );

    assert!(matches!(preview, PreviewPayload::Text(text) if text == "40,12,41,1"));
}

#[test]
fn builtin_preview_reads_configured_text_extension() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("note.md");
    std::fs::write(&path, "alpha\nbeta\n").unwrap();

    let preview = run_preview_command(
        &PreviewCommand::Builtin {
            text_extensions: vec!["md".to_string()],
        },
        None,
        path.to_str().unwrap(),
        test_geometry(),
    );

    assert!(matches!(preview, PreviewPayload::Text(text) if text.contains("alpha")));
}

#[test]
fn builtin_preview_reads_ascii_text_without_configured_extension() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("notes.unknown");
    std::fs::write(&path, "ascii alpha\nascii beta\n").unwrap();

    let preview = run_preview_command(
        &PreviewCommand::Builtin {
            text_extensions: Vec::new(),
        },
        None,
        path.to_str().unwrap(),
        test_geometry(),
    );

    assert!(matches!(preview, PreviewPayload::Text(text) if text.contains("ascii alpha")));
}

#[test]
fn builtin_preview_does_not_read_binary_unknown_extension_as_text() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("blob.unknown");
    std::fs::write(&path, [0, 159, 146, 150]).unwrap();

    let preview = run_preview_command(
        &PreviewCommand::Builtin {
            text_extensions: Vec::new(),
        },
        None,
        path.to_str().unwrap(),
        test_geometry(),
    );

    assert!(matches!(preview, PreviewPayload::Text(text) if text.contains("no text preview")));
}

#[test]
fn builtin_preview_reports_empty_files() {
    let dir = tempfile::tempdir().unwrap();
    let path = dir.path().join("empty.txt");
    std::fs::write(&path, "").unwrap();

    let preview = run_preview_command(
        &PreviewCommand::Builtin {
            text_extensions: vec!["txt".to_string()],
        },
        None,
        path.to_str().unwrap(),
        test_geometry(),
    );

    assert!(matches!(preview, PreviewPayload::Text(text) if text.contains("empty file")));
}