rusty-pv 0.1.0

Pipe viewer — a Rust port of Andrew Wood's `pv(1)` with progress bar, ETA, rate display, token-bucket rate limiting, IEC/SI unit math, SIGWINCH-aware terminal redraw, SIGUSR1 size refresh, multi-instance cursor coordination, and a typed library API.
Documentation
//! US1 (Default progress display) integration tests.

mod common;

use std::fs;
use tempfile::TempDir;

#[test]
fn version_flag_prints_version() {
    let assert = common::rusty_pv_cmd().arg("--version").assert().success();
    let stdout = String::from_utf8_lossy(&assert.get_output().stdout).into_owned();
    assert!(stdout.contains("rusty-pv"));
}

#[test]
fn pipe_passthrough_quiet_mode() {
    let assert = common::rusty_pv_cmd()
        .arg("-q")
        .write_stdin("hello world")
        .assert()
        .success();
    let stdout = String::from_utf8_lossy(&assert.get_output().stdout).into_owned();
    assert_eq!(stdout, "hello world");
}

#[test]
fn file_input_streams_to_stdout() {
    let dir = TempDir::new().unwrap();
    let src = dir.path().join("input.bin");
    fs::write(&src, b"abc123").unwrap();

    let assert = common::rusty_pv_cmd()
        .arg("-q")
        .arg(&src)
        .assert()
        .success();
    let stdout = assert.get_output().stdout.clone();
    assert_eq!(stdout, b"abc123");
}

#[test]
fn unknown_flag_rejected_in_default_mode() {
    common::rusty_pv_cmd().arg("-Z").assert().failure();
}

#[test]
fn quiet_suppresses_display_even_with_force() {
    // -q wins over -f per Edge Cases.
    let assert = common::rusty_pv_cmd()
        .arg("-q")
        .arg("-f")
        .write_stdin("data")
        .assert()
        .success();
    let stderr = assert.get_output().stderr.clone();
    assert!(stderr.is_empty(), "quiet mode should emit no stderr");
}

#[test]
fn name_flag_appears_in_stderr_when_forced() {
    let assert = common::rusty_pv_cmd()
        .arg("-N")
        .arg("downloading")
        .arg("-f")
        .arg("-i")
        .arg("0.1")
        .arg("-s")
        .arg("100")
        .write_stdin("x".repeat(100))
        .assert()
        .success();
    let stderr = String::from_utf8_lossy(&assert.get_output().stderr).into_owned();
    assert!(
        stderr.contains("downloading:"),
        "name prefix should appear in display; stderr was: {stderr:?}"
    );
}