use jbuild::common::{compare_versions, version_key, is_snapshot, base_version};
#[test]
fn test_version_comparison() {
assert_eq!(compare_versions("1.0.0", "1.0.0"), 0);
assert!(compare_versions("1.0.0", "1.0.1") < 0);
assert!(compare_versions("1.0.1", "1.0.0") > 0);
assert!(compare_versions("1.1.0", "1.0.9") > 0);
assert_eq!(compare_versions("1.0", "1.0.0"), 0);
assert_eq!(compare_versions("1.0.0", "1.0"), 0);
assert!(compare_versions("1.0", "1.0.1") < 0);
assert_eq!(compare_versions("1.0.0-alpha", "1.0.0"), 0);
assert_eq!(compare_versions("1.0.0-SNAPSHOT", "1.0.0"), 0);
}
#[test]
fn test_version_key_generation() {
assert_eq!(version_key("1.0.0"), (1, 0, 0, String::new()));
assert_eq!(version_key("2.1.3"), (2, 1, 3, String::new()));
assert_eq!(version_key("1.0"), (1, 0, 0, String::new()));
assert_eq!(version_key("1.0.0.1"), (1, 0, 0, "1".to_string()));
assert_eq!(version_key("1.0.0-alpha"), (1, 0, 0, String::new()));
assert_eq!(version_key("1.0.0-SNAPSHOT"), (1, 0, 0, String::new()));
}
#[test]
fn test_snapshot_version_detection() {
assert!(is_snapshot("1.0.0-SNAPSHOT"));
assert!(is_snapshot("2.1.3-SNAPSHOT"));
assert!(is_snapshot("1.0-SNAPSHOT"));
assert!(is_snapshot("1.0.0.1-SNAPSHOT"));
assert!(!is_snapshot("1.0.0"));
assert!(!is_snapshot("2.1.3"));
assert!(!is_snapshot("1.0.0-alpha"));
assert!(!is_snapshot("1.0.0-beta.1"));
assert!(!is_snapshot("1.0.0-rc.1"));
assert!(is_snapshot("snapshot")); assert!(is_snapshot("SNAPSHOT")); assert!(!is_snapshot("snap")); }
#[test]
fn test_base_version_extraction() {
assert_eq!(base_version("1.0.0-SNAPSHOT"), "1.0.0");
assert_eq!(base_version("2.1.3-SNAPSHOT"), "2.1.3");
assert_eq!(base_version("1.0-SNAPSHOT"), "1.0");
assert_eq!(base_version("1.0.0.1-SNAPSHOT"), "1.0.0.1");
assert_eq!(base_version("1.0.0"), "1.0.0");
assert_eq!(base_version("2.1.3"), "2.1.3");
assert_eq!(base_version("1.0.0-alpha"), "1.0.0-alpha");
assert_eq!(base_version("1.0.0-beta.1"), "1.0.0-beta.1");
}
#[test]
fn test_version_sorting() {
let mut versions = ["1.0.0",
"1.0.1",
"1.0.0-SNAPSHOT",
"1.0.0-alpha",
"1.0.0-beta",
"2.0.0",
"1.1.0"];
versions.sort_by(|a, b| compare_versions(a, b).cmp(&0));
assert!(versions.iter().position(|&v| v == "2.0.0").unwrap() >
versions.iter().position(|&v| v == "1.1.0").unwrap());
assert!(versions.iter().position(|&v| v == "1.1.0").unwrap() >
versions.iter().position(|&v| v == "1.0.1").unwrap());
}
#[test]
fn test_version_comparison_complex_qualifiers() {
assert_eq!(compare_versions("1.0-alpha", "1.0-beta"), 0);
assert_eq!(compare_versions("1.0-beta", "1.0-rc"), 0);
assert_eq!(compare_versions("1.0-rc", "1.0"), 0);
}
#[test]
fn test_version_key_numeric_qualifiers() {
assert_eq!(version_key("1.0.0"), (1, 0, 0, String::new()));
assert_eq!(version_key("2.1.3"), (2, 1, 3, String::new()));
assert_eq!(version_key("1.0.0-alpha"), (1, 0, 0, String::new()));
assert_eq!(version_key("1.0.0-SNAPSHOT"), (1, 0, 0, String::new()));
}
#[test]
fn test_version_comparison_edge_cases() {
assert_eq!(compare_versions("", ""), 0);
assert!(compare_versions("", "1.0.0") < 0);
assert!(compare_versions("1.0.0", "") > 0);
assert_eq!(compare_versions("1", "1.0.0"), 0);
assert!(compare_versions("2", "1.0.0") > 0);
assert!(compare_versions("999999", "1000000") < 0);
assert_eq!(compare_versions("1.01", "1.1"), 0);
assert_eq!(compare_versions("1.001", "1.1"), 0);
}
#[test]
fn test_snapshot_detection_various_formats() {
assert!(is_snapshot("1.0.0-SNAPSHOT"));
assert!(is_snapshot("1.0.0-snapshot"));
assert!(is_snapshot("1.0.0-Snapshot"));
assert!(is_snapshot("1.0.0-alpha-SNAPSHOT"));
assert!(is_snapshot("1.0.0-SNAPSHOT-beta"));
assert!(!is_snapshot("1.0.0"));
assert!(!is_snapshot("1.0.0-alpha"));
assert!(!is_snapshot("1.0.0-beta"));
assert!(!is_snapshot("1.0.0-rc"));
assert!(is_snapshot("snapshot"));
assert!(is_snapshot("SNAPSHOT"));
}
#[test]
fn test_base_version_various_formats() {
assert_eq!(base_version("1.0.0-SNAPSHOT"), "1.0.0");
assert_eq!(base_version("2.1.3-SNAPSHOT"), "2.1.3");
assert_eq!(base_version("1.0.0-alpha-SNAPSHOT"), "1.0.0-alpha");
assert_eq!(base_version("1.0.0-SNAPSHOT-beta"), "1.0.0-beta");
assert_eq!(base_version("1.0.0"), "1.0.0");
assert_eq!(base_version("1.0.0-alpha"), "1.0.0-alpha");
assert_eq!(base_version("1.0.0-beta.1"), "1.0.0-beta.1");
assert_eq!(base_version("SNAPSHOT"), "SNAPSHOT"); assert_eq!(base_version("-SNAPSHOT"), "");
assert_eq!(base_version("1.0-SNAPSHOT"), "1.0");
}
#[test]
fn test_maven_style_version_comparison() {
assert_eq!(compare_versions("1.0", "1.0.0"), 0);
assert_eq!(compare_versions("1.0.0", "1.0.0.0"), 0);
assert_eq!(compare_versions("1.0-alpha", "1.0-beta"), 0);
assert_eq!(compare_versions("1.0-rc", "1.0"), 0);
}
#[test]
fn test_version_key_consistency() {
let test_versions = vec![
"1.0.0-SNAPSHOT",
"1.0.0-alpha",
"1.0.0-beta",
"1.0.0-rc.1",
"1.0.0",
"1.0.1",
"1.1.0",
"2.0.0",
];
let mut sorted_by_key = test_versions.clone();
sorted_by_key.sort_by_key(|v| version_key(v));
let mut sorted_by_compare = test_versions.clone();
sorted_by_compare.sort_by(|a, b| compare_versions(a, b).cmp(&0));
assert_eq!(sorted_by_key, sorted_by_compare);
}
#[test]
fn test_version_key_edge_cases() {
assert_eq!(version_key(""), (0, 0, 0, String::new()));
assert_eq!(version_key("1"), (1, 0, 0, String::new()));
assert_eq!(version_key("abc"), (0, 0, 0, String::new()));
assert_eq!(version_key("1.abc.2"), (1, 0, 2, String::new()));
let long_version = "1.2.3.4.5.6.7.8.9.10-alpha-beta-gamma";
let (major, minor, patch, suffix) = version_key(long_version);
assert_eq!((major, minor, patch), (1, 2, 3));
assert_eq!(suffix, "4");
}
#[test]
fn test_version_comparison_performance() {
assert!(compare_versions("1.0.0", "1.0.1") < 0);
assert!(compare_versions("1.0.1", "1.0.0") > 0);
assert!(compare_versions("1.1.0", "1.0.9") > 0);
assert!(compare_versions("2.0.0", "1.9.9") > 0);
assert_eq!(compare_versions("1.0.0", "1.0.0"), 0);
assert_eq!(compare_versions("1.0", "1.0.0"), 0);
assert_eq!(compare_versions("1.0.0-alpha", "1.0.0"), 0);
assert_eq!(compare_versions("1.0.0", "1.0.0-SNAPSHOT"), 0);
}