cargo-binlist 0.4.0

List all installed binaries with cargo and their versions
#![expect(clippy::unwrap_used, reason = "unwrap is used for testing purposes")]
use log::LevelFilter;
use semver::Version;

use crate::{
    cli::Cli,
    data::{PackageInfo, VersionCheck},
    utils,
};

#[test]
fn test_get_package_infos() {
    let output = r"
cargo-binstall v1.10.18:
    cargo-binstall
cargo-bloat v0.12.1:
    cargo-bloat
cargo-deny v0.16.1:
    cargo-deny
cargo-edit v0.13.0:
    cargo-add
    cargo-rm
    cargo-set-version
    cargo-upgrade
";

    let mut parsed = utils::get_package_infos(output);
    parsed.sort_by(|a, b| a.name.cmp(&b.name));
    assert_eq!(parsed.len(), 4);
    assert_eq!(parsed[0].name, "cargo-binstall");
    assert_eq!(parsed[0].version.to_string(), "1.10.18");
    assert_eq!(parsed[1].name, "cargo-bloat");
    assert_eq!(parsed[1].version.to_string(), "0.12.1");
    assert_eq!(parsed[2].name, "cargo-deny");
    assert_eq!(parsed[2].version.to_string(), "0.16.1");
    assert_eq!(parsed[3].name, "cargo-edit");
    assert_eq!(parsed[3].version.to_string(), "0.13.0");
}

#[test]
fn test_parse_package_line() {
    let line = "tester v1.10.18:";
    let parsed = utils::parse_package_line(line).unwrap();
    assert_eq!(parsed.name, "tester");
    assert_eq!(parsed.version.to_string(), "1.10.18");
}

#[test]
fn test_packageinfo() {
    let mut pkg = PackageInfo::new("serde".to_owned(), Version::new(0, 0, 1));
    let latest = pkg.latest_version().unwrap();
    assert!(latest > pkg.version);
    pkg.set_info(&latest);
    assert_eq!(pkg.info, VersionCheck::NewerAvailable(latest));
}

#[test]
fn test_get_installed_bins() {
    utils::get_installed_bins().unwrap();
}

#[test]
fn test_cli_list() {
    Cli {
        list: true,
        update: false,
        list_updates: false,
        filter: LevelFilter::Trace,
        init: false,
    }
    .run()
    .unwrap();
}

#[test]
fn test_cli_update() {
    utils::update(&[]).unwrap();
}

#[test]
fn test_version_occurrences() {
    let pkgs = vec![
        PackageInfo::new("cargo-binstall".to_owned(), Version::new(1, 10, 18)),
        PackageInfo::new("cargo-bloat".to_owned(), Version::new(0, 12, 1)),
        PackageInfo::new("cargo-deny".to_owned(), Version::new(0, 16, 1)),
        PackageInfo::new("cargo-edit".to_owned(), Version::new(0, 13, 0)),
    ];

    utils::version_occurrences(&pkgs);
}