elio 1.5.1

Snappy, batteries-included terminal file manager with rich previews, inline images, bulk actions, and trash support.
Documentation
use super::*;

#[test]
fn refresh_preview_uses_blank_static_image_surface_preview_when_backend_enabled() {
    for (file_name, detail) in [
        ("demo.png", "PNG image"),
        ("demo.ico", "ICO image"),
        ("demo.jpg", "JPEG image"),
        ("demo.jpeg", "JPEG image"),
        ("demo.gif", "GIF image"),
        ("demo.webp", "WebP image"),
        ("demo.svg", "SVG image"),
    ] {
        let (app, root) = build_selected_static_image_app("image-placeholder", file_name);

        assert_eq!(app.preview.state.content.kind, PreviewKind::Image);
        assert_eq!(app.preview.state.content.detail.as_deref(), Some(detail));
        assert!(app.preview.state.content.lines.is_empty());

        fs::remove_dir_all(root).expect("failed to remove temp root");
    }
}

#[test]
fn preview_prefers_image_surface_for_supported_static_images_when_backend_enabled() {
    for file_name in [
        "demo.png",
        "demo.ico",
        "demo.jpg",
        "demo.jpeg",
        "demo.gif",
        "demo.webp",
        "demo.svg",
    ] {
        let (app, root) = build_selected_static_image_app("image-surface", file_name);

        assert!(app.preview_prefers_image_surface());
        assert_eq!(app.preview_overlay_placeholder_message(), None);

        fs::remove_dir_all(root).expect("failed to remove temp root");
    }
}

#[test]
fn preview_prefers_image_surface_for_extensionless_png_when_backend_enabled() {
    let (app, root) = build_selected_extensionless_png_app("image-surface-noext", "background");

    assert_eq!(app.preview.state.content.kind, PreviewKind::Image);
    assert_eq!(
        app.preview.state.content.detail.as_deref(),
        Some("PNG image")
    );
    assert!(app.preview_prefers_static_image_surface());
    assert!(app.preview_prefers_image_surface());
    assert_eq!(app.preview_overlay_placeholder_message(), None);

    fs::remove_dir_all(root).expect("failed to remove temp root");
}

#[test]
fn immediate_selection_changes_do_not_delay_static_image_activation() {
    let (mut app, root) = build_selected_static_image_app("image-activation", "demo.png");

    app.select_index(0);

    assert!(app.image_selection_activation_ready());
    assert!(app.pending_image_preview_timer().is_none());

    fs::remove_dir_all(root).expect("failed to remove temp root");
}

#[test]
fn static_image_surface_remains_available_without_pdf_tooling() {
    let (mut app, root) = build_selected_static_image_app("image-no-pdf-tools", "demo.png");
    app.preview.pdf.pdf_tools_available = false;
    app.refresh_preview();

    assert!(app.preview_prefers_static_image_surface());
    assert!(app.preview_prefers_image_surface());
    assert_eq!(app.preview_overlay_placeholder_message(), None);

    fs::remove_dir_all(root).expect("failed to remove temp root");
}

#[test]
fn refresh_preview_preloads_current_and_visible_nearby_static_images() {
    let (mut app, root) = build_multi_static_image_app(
        "image-preload-window",
        &["a.jpg", "b.txt", "c.png", "d.webp", "e.svg"],
    );
    app.set_selected(2);

    let current_request = app
        .active_static_image_overlay_request()
        .expect("current image request should be available");
    let target_width_px = current_request.target_width_px;
    let target_height_px = current_request.target_height_px;

    let expected = app
        .visible_entry_indices()
        .into_iter()
        .filter_map(|index| app.navigation.entries.get(index))
        .filter(|entry| crate::app::overlays::images::static_image_detail_label(entry).is_some())
        .filter(|entry| {
            crate::file_info::inspect_path_cached(
                &entry.path,
                entry.kind,
                entry.size,
                entry.modified,
            )
            .specific_type_label
                != Some("PNG image")
        })
        .map(|entry| {
            StaticImageKey::from_parts(
                entry.path.clone(),
                entry.size,
                entry.modified,
                target_width_px,
                target_height_px,
                false,
                false,
            )
        })
        .collect::<Vec<_>>();

    for key in expected {
        assert!(
            app.preview.image.pending_prepares.contains(&key)
                || app.preview.image.dimensions.contains_key(&key),
            "expected image preload for {:?}",
            key
        );
    }

    fs::remove_dir_all(root).expect("failed to remove temp root");
}