Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 99 additions & 7 deletions src/semver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,26 @@ mod tests {
use semver::Version;

#[test]
fn test_version_map() {
fn test_version_map_basic_operations() {
let mut map = VersionMap::new();

let version0 = Version::new(0, 4, 2);
let version1 = Version::new(1, 0, 0);
let version2 = Version::new(1, 0, 1);
let version3 = Version::new(2, 0, 0);

// Test insertions
assert!(map.try_insert(version0.clone(), "value0").is_ok());
assert!(map.try_insert(version1.clone(), "value1").is_ok());
assert!(map.try_insert(version2.clone(), "value2").is_ok());
assert!(map.try_insert(version3.clone(), "value3").is_ok());

// Test duplicate insertion
assert!(map.try_insert(version1.clone(), "duplicate").is_err());
}

#[test]
fn test_version_map_alternate_lookups() {
let mut map = VersionMap::new();

let version0 = Version::new(0, 4, 2);
Expand All @@ -220,20 +239,93 @@ mod tests {
map.try_insert(version2.clone(), "value2").unwrap();
map.try_insert(version3.clone(), "value3").unwrap();

// Test exact matches
assert_eq!(map.get(&version0), Some(&"value0"));
assert_eq!(map.get(&version1), Some(&"value2"));
assert_eq!(map.get(&version2), Some(&"value2"));
assert_eq!(map.get(&version3), Some(&"value3"));

// Test alternate matches (should get latest in group)
assert_eq!(map.get(&version1), Some(&"value2")); // 1.0.0 -> latest in 1.x.x group
assert_eq!(map.get(&Version::new(0, 4, 1)), Some(&"value0")); // 0.4.1 -> latest in 0.4.x group
assert_eq!(map.get(&Version::new(1, 1, 0)), Some(&"value2")); // 1.1.0 -> latest in 1.x.x group
assert_eq!(map.get(&Version::new(2, 0, 4)), Some(&"value3")); // 2.0.4 -> latest in 2.x.x group

// Test non-existent versions
assert_eq!(map.get(&Version::new(0, 1, 0)), None);
assert_eq!(map.get(&Version::new(0, 4, 1)), Some(&"value0"));
assert_eq!(map.get(&Version::new(1, 1, 0)), Some(&"value2"));
assert_eq!(map.get(&Version::new(2, 0, 4)), Some(&"value3"));
assert_eq!(map.get(&Version::new(3, 0, 0)), None);

// Test exact lookups
assert_eq!(map.get_exact(&version1), Some(&"value1"));
assert_eq!(map.get_exact(&Version::new(1, 1, 0)), None); // No exact match
}

#[test]
fn test_version_map_latest_operations() {
let mut map = VersionMap::new();

assert_eq!(map.get_latest(), None);
assert_eq!(map.get_or_latest(None), None);

map.insert(Version::new(1, 0, 0), "v1.0.0");
map.insert(Version::new(2, 0, 0), "v2.0.0");
map.insert(Version::new(0, 1, 0), "v0.1.0");
Comment on lines +269 to +271
Copy link

Copilot AI Jun 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] Tests mix the infallible insert API with the fallible try_insert. For consistency and clearer error handling, consider using try_insert in all test cases.

Suggested change
map.insert(Version::new(1, 0, 0), "v1.0.0");
map.insert(Version::new(2, 0, 0), "v2.0.0");
map.insert(Version::new(0, 1, 0), "v0.1.0");
assert!(map.try_insert(Version::new(1, 0, 0), "v1.0.0").is_ok());
assert!(map.try_insert(Version::new(2, 0, 0), "v2.0.0").is_ok());
assert!(map.try_insert(Version::new(0, 1, 0), "v0.1.0").is_ok());

Copilot uses AI. Check for mistakes.

assert_eq!(map.get_latest(), Some((&Version::new(2, 0, 0), &"v2.0.0")));
assert_eq!(map.get_or_latest(None), Some(&"v2.0.0"));
assert_eq!(
map.get_or_latest(Some(&Version::new(1, 0, 0))),
Some(&"v1.0.0")
);
}

#[test]
fn test_version_map_insert_and_removal() {
let mut map = VersionMap::new();

let v1 = Version::new(1, 0, 0);
let v2 = Version::new(1, 0, 1);

map.insert(v1.clone(), "v1");
map.insert(v2.clone(), "v2");

assert_eq!(map.remove(&v1), Some("v1"));
assert_eq!(map.remove(&v1), None); // Already removed
}

#[test]
fn test_version_alternate_function() {
// Pre-release versions have no alternates
let pre = Version::parse("1.0.0-alpha").unwrap();
assert_eq!(version_alternate(&pre), None);

// Major versions > 0
assert_eq!(
version_alternate(&Version::new(1, 2, 3)),
Some(Version::new(1, 0, 0))
);
assert_eq!(
version_alternate(&Version::new(2, 5, 1)),
Some(Version::new(2, 0, 0))
);

// Minor versions > 0 (when major is 0)
assert_eq!(
version_alternate(&Version::new(0, 1, 5)),
Some(Version::new(0, 1, 0))
);
assert_eq!(
version_alternate(&Version::new(0, 3, 2)),
Some(Version::new(0, 3, 0))
);

assert_eq!(map.get_or_latest(None), Some(&"value3"));
assert_eq!(map.get_or_latest(Some(&version1)), Some(&"value2"));
// Patch versions (when major and minor are 0)
assert_eq!(
version_alternate(&Version::new(0, 0, 1)),
Some(Version::new(0, 0, 1))
);
assert_eq!(
version_alternate(&Version::new(0, 0, 5)),
Some(Version::new(0, 0, 5))
);
}
}
Loading