plow_package_management 0.3.1

Plow: A package manager for ontologies.
Documentation
#![allow(clippy::all, clippy::restriction)]

use plow_package_management::resolve::dependency::Dependency;
use plow_package_management::version::{
    semver_completeness, SemanticVersion, SemanticVersionCompleteness,
};
use pubgrub::range::Range;
use std::str::FromStr;

macro_rules! range {
    ($version:literal) => {
        Dependency::<SemanticVersion>::derive_range_for_single_version_request($version).unwrap()
    };
}
macro_rules! semver {
    ($version:literal) => {
        SemanticVersion::from_str($version).expect("Not a valid semantic version string.")
    };
}

#[test]
fn version_to_range_exact() {
    assert_eq!(range!("=1"), Range::between(semver!("1"), semver!("2")));
    assert_eq!(
        range!("=1.1"),
        Range::between(semver!("1.1"), semver!("1.2"))
    );
    assert_eq!(range!("=1.1.1"), Range::exact(semver!("1.1.1")));
}
#[test]
fn version_to_range_greater() {
    assert_eq!(range!(">1"), Range::higher_than(semver!("2")));
    assert_eq!(range!(">1.1"), Range::higher_than(semver!("1.2")));
    assert_eq!(range!(">1.1.1"), Range::higher_than(semver!("1.1.2")));
}
#[test]
fn version_to_range_greater_eq() {
    assert_eq!(range!(">=1"), Range::higher_than(semver!("1")));
    assert_eq!(range!(">=1.1"), Range::higher_than(semver!("1.1")));
    assert_eq!(range!(">=1.1.1"), Range::higher_than(semver!("1.1.1")));
}
#[test]
fn version_to_range_less() {
    assert_eq!(range!("<1"), Range::strictly_lower_than(semver!("1")));
    assert_eq!(range!("<1.1"), Range::strictly_lower_than(semver!("1.1")));
    assert_eq!(
        range!("<1.1.1"),
        Range::strictly_lower_than(semver!("1.1.1"))
    );
}
#[test]
fn version_to_range_less_eq() {
    assert_eq!(range!("<=1"), Range::strictly_lower_than(semver!("2")));
    assert_eq!(range!("<=1.1"), Range::strictly_lower_than(semver!("1.2")));
    assert_eq!(
        range!("<=1.1.1"),
        Range::strictly_lower_than(semver!("1.1.2"))
    );
}

#[test]
fn version_to_range_caret() {
    assert_eq!(range!("^1"), Range::between(semver!("1"), semver!("2")));
    assert_eq!(
        range!("^1.1"),
        Range::between(semver!("1.1"), semver!("2.0"))
    );
    assert_eq!(
        range!("^0.0"),
        Range::between(semver!("0.0"), semver!("0.1"))
    );
    assert_eq!(
        range!("^1.1.1"),
        Range::between(semver!("1.1.1"), semver!("2.0.0"))
    );
    assert_eq!(range!("^0.0.1"), Range::exact(semver!("0.0.1")));
    assert_eq!(
        range!("^0.1.1"),
        Range::between(semver!("0.1.1"), semver!("0.2.0"))
    );
    assert_eq!(
        range!("^0.2.0"),
        Range::between(semver!("0.2.0"), semver!("0.3.0"))
    );
}

#[test]
fn version_to_range_tilde() {
    assert_eq!(range!("~1"), Range::between(semver!("1"), semver!("2")));
    assert_eq!(
        range!("~1.1"),
        Range::between(semver!("1.1"), semver!("1.2"))
    );
    assert_eq!(
        range!("~1.1.1"),
        Range::between(semver!("1.1.1"), semver!("1.2.0"))
    );
}
#[test]
fn version_to_range_wildcard() {
    assert_eq!(range!("*"), Range::any());
    assert_eq!(
        range!("1.1.*"),
        Range::between(semver!("1.1"), semver!("1.2"))
    );
    assert_eq!(range!("1.*"), Range::between(semver!("1"), semver!("2")));
    assert_eq!(range!("1.*.*"), Range::between(semver!("1"), semver!("2")));
    assert_eq!(
        range!("1.1.x"),
        Range::between(semver!("1.1"), semver!("1.2"))
    );
    assert_eq!(range!("1.x"), Range::between(semver!("1"), semver!("2")));
    assert_eq!(range!("1.x.x"), Range::between(semver!("1"), semver!("2")));
}

#[test]
fn test_semver_completeness() {
    let v1 = semver_completeness(&semver::VersionReq::parse("=1").unwrap().comparators[0]);
    let v2 = semver_completeness(&semver::VersionReq::parse("=1.1").unwrap().comparators[0]);
    let v3 = semver_completeness(&semver::VersionReq::parse("=1.1.1").unwrap().comparators[0]);
    assert_eq!(SemanticVersionCompleteness::OnlyMajor, v1);
    assert_eq!(SemanticVersionCompleteness::OnlyMinorAndMajor, v2);
    assert_eq!(SemanticVersionCompleteness::Complete, v3);
}