214 lines
6 KiB
Rust
214 lines
6 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
|
|
use firefox_versioning::error::VersionParsingError;
|
|
use firefox_versioning::version::{Version, VersionPart};
|
|
|
|
pub type Result<T, E = VersionParsingError> = std::result::Result<T, E>;
|
|
|
|
#[test]
|
|
fn test_wild_card_to_version_part() -> Result<()> {
|
|
let s = "*";
|
|
let version_part = VersionPart::try_from(s)?;
|
|
assert_eq!(version_part.num_a, i32::MAX);
|
|
assert_eq!(version_part.str_b, "");
|
|
assert_eq!(version_part.num_c, 0);
|
|
assert_eq!(version_part.extra_d, "");
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_empty_string_to_version_part() -> Result<()> {
|
|
let s = "";
|
|
let version_part = VersionPart::try_from(s)?;
|
|
assert_eq!(version_part.num_a, 0);
|
|
assert_eq!(version_part.str_b, "");
|
|
assert_eq!(version_part.num_c, 0);
|
|
assert_eq!(version_part.extra_d, "");
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_only_num_a_to_version_part() -> Result<()> {
|
|
let s = "98382";
|
|
let version_part = VersionPart::try_from(s)?;
|
|
assert_eq!(version_part.num_a, 98382);
|
|
assert_eq!(version_part.str_b, "");
|
|
assert_eq!(version_part.num_c, 0);
|
|
assert_eq!(version_part.extra_d, "");
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_num_a_and_plus_str_b() -> Result<()> {
|
|
let s = "92+";
|
|
let version_part = VersionPart::try_from(s)?;
|
|
assert_eq!(version_part.num_a, 93);
|
|
assert_eq!(version_part.str_b, "pre");
|
|
assert_eq!(version_part.num_c, 0);
|
|
assert_eq!(version_part.extra_d, "");
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_num_a_and_str_b() -> Result<()> {
|
|
let s = "92beta";
|
|
let version_part = VersionPart::try_from(s)?;
|
|
assert_eq!(version_part.num_a, 92);
|
|
assert_eq!(version_part.str_b, "beta");
|
|
assert_eq!(version_part.num_c, 0);
|
|
assert_eq!(version_part.extra_d, "");
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_num_a_str_b_and_num_c() -> Result<()> {
|
|
let s = "92beta72";
|
|
let version_part = VersionPart::try_from(s)?;
|
|
assert_eq!(version_part.num_a, 92);
|
|
assert_eq!(version_part.str_b, "beta");
|
|
assert_eq!(version_part.num_c, 72);
|
|
assert_eq!(version_part.extra_d, "");
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_full_valid_string_to_version_part() -> Result<()> {
|
|
let s = "1pre3extrabithere";
|
|
let version_part = VersionPart::try_from(s)?;
|
|
assert_eq!(version_part.num_a, 1);
|
|
assert_eq!(version_part.str_b, "pre");
|
|
assert_eq!(version_part.num_c, 3);
|
|
assert_eq!(version_part.extra_d, "extrabithere");
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn test_parse_full_version() -> Result<()> {
|
|
let s = "92+.10.1.beta";
|
|
let versions = Version::try_from(s.to_string())?;
|
|
// assert!(versions.ok(), true);
|
|
assert_eq!(
|
|
vec![
|
|
VersionPart {
|
|
num_a: 93,
|
|
str_b: "pre".into(),
|
|
..Default::default()
|
|
},
|
|
VersionPart {
|
|
num_a: 10,
|
|
..Default::default()
|
|
},
|
|
VersionPart {
|
|
num_a: 1,
|
|
..Default::default()
|
|
},
|
|
VersionPart {
|
|
num_a: 0,
|
|
str_b: "beta".into(),
|
|
..Default::default()
|
|
}
|
|
],
|
|
versions.0
|
|
);
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_compare_two_versions() -> Result<()> {
|
|
let v1 = Version::try_from("92beta.1.2".to_string())?;
|
|
let v2 = Version::try_from("92beta.1.2pre".to_string())?;
|
|
assert!(v1 > v2);
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn smoke_test_version_compare() -> Result<()> {
|
|
// Test values from https://searchfox.org/mozilla-central/rev/5909d5b7f3e247dddff8229e9499db017eb438e2/xpcom/base/nsIVersionComparator.idl#24-31
|
|
let v1 = Version::try_from("1.0pre1")?;
|
|
let v2 = Version::try_from("1.0pre2")?;
|
|
let v3 = Version::try_from("1.0")?;
|
|
let v4 = Version::try_from("1.0.0")?;
|
|
let v5 = Version::try_from("1.0.0.0")?;
|
|
let v6 = Version::try_from("1.1pre")?;
|
|
let v7 = Version::try_from("1.1pre0")?;
|
|
let v8 = Version::try_from("1.0+")?;
|
|
let v9 = Version::try_from("1.1pre1a")?;
|
|
let v10 = Version::try_from("1.1pre1")?;
|
|
let v11 = Version::try_from("1.1pre10a")?;
|
|
let v12 = Version::try_from("1.1pre10")?;
|
|
assert!(v1 < v2);
|
|
assert!(v2 < v3);
|
|
assert!(v3 == v4);
|
|
assert!(v4 == v5);
|
|
assert!(v5 < v6);
|
|
assert!(v6 == v7);
|
|
assert!(v7 == v8);
|
|
assert!(v8 < v9);
|
|
assert!(v9 < v10);
|
|
assert!(v10 < v11);
|
|
assert!(v11 < v12);
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_compare_wild_card() -> Result<()> {
|
|
let v1 = Version::try_from("*")?;
|
|
let v2 = Version::try_from("95.2pre")?;
|
|
assert!(v1 > v2);
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_non_ascii_throws_error() -> Result<()> {
|
|
let err = Version::try_from("92🥲.1.2pre").expect_err("Should have thrown error");
|
|
if let VersionParsingError::ParseError(_) = err {
|
|
// Good!
|
|
} else {
|
|
panic!("Expected VersionParsingError, got {:?}", err)
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_version_number_parsing_overflows() -> Result<()> {
|
|
// This i32::MAX, should parse OK
|
|
let v1 = VersionPart::try_from("2147483647")?;
|
|
assert_eq!(v1.num_a, i32::MAX);
|
|
// this is greater than i32::MAX, should return an error
|
|
let err =
|
|
VersionPart::try_from("2147483648").expect_err("Should throw error, it overflows an i32");
|
|
if let VersionParsingError::Overflow(_) = err {
|
|
// OK
|
|
} else {
|
|
panic!("Expected a VersionParsingError, got {:?}", err)
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_version_part_with_dashes() -> Result<()> {
|
|
let v1 = VersionPart::try_from("0-beta")?;
|
|
assert_eq!(
|
|
VersionPart {
|
|
num_a: 0,
|
|
str_b: "".into(),
|
|
num_c: 0,
|
|
extra_d: "-beta".into(),
|
|
},
|
|
v1
|
|
);
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn test_exclamation_mark() -> Result<()> {
|
|
let v1 = Version::try_from("93.!")?;
|
|
let v2 = Version::try_from("93.1")?;
|
|
let v3 = Version::try_from("93.0-beta")?;
|
|
let v4 = Version::try_from("93.alpha")?;
|
|
assert!(v1 < v2 && v1 < v3 && v1 < v4);
|
|
Ok(())
|
|
}
|