use crate::parsehelp::parseversion;
use crate::version::dpkg_version_compare;
use crate::{DebVersion, Error};
use std::cmp::Ordering;
macro_rules! dpkg_version_object {
($epoch: literal, $version: literal) => {
DebVersion {
epoch: $epoch,
version: $version.parse().unwrap(),
revision: None,
}
};
($epoch: literal, $version: literal, $revision: literal) => {
DebVersion {
epoch: $epoch,
version: $version.parse().unwrap(),
revision: Some($revision.parse().unwrap()),
}
};
}
#[test]
fn test_version_compare() {
assert_eq!(
dpkg_version_compare(&dpkg_version_object!(0, ""), &dpkg_version_object!(0, "")),
Ordering::Equal
);
assert_eq!(
dpkg_version_compare(&dpkg_version_object!(1, ""), &dpkg_version_object!(2, "")),
Ordering::Less
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "1", "1"),
&dpkg_version_object!(0, "2", "1")
),
Ordering::Less
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "1", "1"),
&dpkg_version_object!(0, "1", "2")
),
Ordering::Less
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "0", "0"),
&dpkg_version_object!(0, "0", "0")
),
Ordering::Equal
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "0", "00"),
&dpkg_version_object!(0, "00", "0")
),
Ordering::Equal
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(1, "2", "3"),
&dpkg_version_object!(1, "2", "3")
),
Ordering::Equal
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "0", "0"),
&dpkg_version_object!(1, "0", "0")
),
Ordering::Less
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(1, "0", "0"),
&dpkg_version_object!(0, "0", "0")
),
Ordering::Greater
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "a", "0"),
&dpkg_version_object!(0, "b", "0")
),
Ordering::Less
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "b", "0"),
&dpkg_version_object!(0, "a", "0")
),
Ordering::Greater
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "0", "a"),
&dpkg_version_object!(0, "0", "b")
),
Ordering::Less
);
assert_eq!(
dpkg_version_compare(
&dpkg_version_object!(0, "0", "b"),
&dpkg_version_object!(0, "0", "a")
),
Ordering::Greater
);
}
#[test]
fn test_version_parse() {
assert_eq!(parseversion("0").unwrap(), dpkg_version_object!(0, "0"));
assert_eq!(parseversion("0:0").unwrap(), dpkg_version_object!(0, "0"));
assert_eq!(
parseversion("0:0-0").unwrap(),
dpkg_version_object!(0, "0", "0")
);
assert_eq!(
parseversion("0:0.0-0.0").unwrap(),
dpkg_version_object!(0, "0.0", "0.0")
);
assert_eq!(parseversion("1:0").unwrap(), dpkg_version_object!(1, "0"));
assert_eq!(parseversion("5:1").unwrap(), dpkg_version_object!(5, "1"));
assert_eq!(
parseversion("0:0-0-0").unwrap(),
dpkg_version_object!(0, "0-0", "0")
);
assert_eq!(
parseversion("0:0-0-0-0").unwrap(),
dpkg_version_object!(0, "0-0-0", "0")
);
assert_eq!(
parseversion("0:0:0-0").unwrap(),
dpkg_version_object!(0, "0:0", "0")
);
assert_eq!(
parseversion("0:0:0:0-0").unwrap(),
dpkg_version_object!(0, "0:0:0", "0")
);
assert_eq!(
parseversion("0:0:0-0-0").unwrap(),
dpkg_version_object!(0, "0:0-0", "0")
);
assert_eq!(
parseversion("0:0-0:0-0").unwrap(),
dpkg_version_object!(0, "0-0:0", "0")
);
assert_eq!(
parseversion("0:09azAZ.-+~:-0").unwrap(),
dpkg_version_object!(0, "09azAZ.-+~:", "0")
);
assert_eq!(
parseversion("0:0-azAZ09.+~").unwrap(),
dpkg_version_object!(0, "0", "azAZ09.+~")
);
assert_eq!(
parseversion(" 0:0-1").unwrap(),
dpkg_version_object!(0, "0", "1")
);
assert_eq!(
parseversion("0:0-1 ").unwrap(),
dpkg_version_object!(0, "0", "1")
);
assert_eq!(
parseversion(" 0:0-1 ").unwrap(),
dpkg_version_object!(0, "0", "1")
);
assert_eq!(parseversion("").unwrap_err(), Error::EmptyVersion);
assert_eq!(parseversion(" ").unwrap_err(), Error::EmptyVersion);
assert_eq!(parseversion("0:").unwrap_err(), Error::NothingAfterColon);
assert_eq!(
parseversion(":1.0").unwrap_err(),
Error::InvalidEpoch("".to_string())
);
assert_eq!(parseversion("1.0-").unwrap_err(), Error::EmptyRevision);
assert_eq!(parseversion("0:0 0-1").unwrap_err(), Error::EmbeddedSpaces);
assert_eq!(
parseversion("-1:0-1").unwrap_err(),
Error::InvalidEpoch("-1".to_string())
);
assert_eq!(
parseversion("999999999999999999999999:0-1").unwrap_err(),
Error::InvalidEpoch("999999999999999999999999".to_string())
);
assert_eq!(
parseversion("a:0-0").unwrap_err(),
Error::InvalidEpoch("a".to_string())
);
assert_eq!(
parseversion("A:0-0").unwrap_err(),
Error::InvalidEpoch("A".to_string())
);
assert_eq!(parseversion("-0").unwrap_err(), Error::EmptyVersionNumber);
assert_eq!(parseversion("0:-0").unwrap_err(), Error::EmptyVersionNumber);
assert_eq!(
parseversion("0:abc3-0").unwrap_err(),
Error::NonDigitVersion
);
let invalid_chars = "!#@$%&/|\\<>()[]{};,_=*^'";
for c in invalid_chars.chars() {
assert_eq!(
parseversion(&format!("0:0{c}-0")).unwrap_err(),
Error::InvalidCharacterInVersion
);
}
assert_eq!(
parseversion("0:0-0:0").unwrap_err(),
Error::InvalidCharacterInRevision
);
let invalid_chars = "!#@$%&/|\\<>()[]{}:;,_=*^'";
for c in invalid_chars.chars() {
assert_eq!(
parseversion(&format!("0:0-{c}")).unwrap_err(),
Error::InvalidCharacterInRevision
);
}
}
#[test]
fn test_version_display() {
assert_eq!(parseversion("1.0.0").unwrap().to_string(), "1.0.0",);
assert_eq!(parseversion("1.0.0-1").unwrap().to_string(), "1.0.0-1",);
assert_eq!(parseversion("1:1.0.0-1").unwrap().to_string(), "1:1.0.0-1",);
assert_eq!(parseversion("0:1.0.0-1").unwrap().to_string(), "1.0.0-1",);
}