Skip to content

Commit 3809588

Browse files
authored
Improve VersionMap documentation and add comprehensive tests (#3)
2 parents 9f34132 + 84e2f75 commit 3809588

File tree

1 file changed

+99
-7
lines changed

1 file changed

+99
-7
lines changed

src/semver.rs

Lines changed: 99 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,26 @@ mod tests {
207207
use semver::Version;
208208

209209
#[test]
210-
fn test_version_map() {
210+
fn test_version_map_basic_operations() {
211+
let mut map = VersionMap::new();
212+
213+
let version0 = Version::new(0, 4, 2);
214+
let version1 = Version::new(1, 0, 0);
215+
let version2 = Version::new(1, 0, 1);
216+
let version3 = Version::new(2, 0, 0);
217+
218+
// Test insertions
219+
assert!(map.try_insert(version0.clone(), "value0").is_ok());
220+
assert!(map.try_insert(version1.clone(), "value1").is_ok());
221+
assert!(map.try_insert(version2.clone(), "value2").is_ok());
222+
assert!(map.try_insert(version3.clone(), "value3").is_ok());
223+
224+
// Test duplicate insertion
225+
assert!(map.try_insert(version1.clone(), "duplicate").is_err());
226+
}
227+
228+
#[test]
229+
fn test_version_map_alternate_lookups() {
211230
let mut map = VersionMap::new();
212231

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

242+
// Test exact matches
223243
assert_eq!(map.get(&version0), Some(&"value0"));
224-
assert_eq!(map.get(&version1), Some(&"value2"));
225244
assert_eq!(map.get(&version2), Some(&"value2"));
226245
assert_eq!(map.get(&version3), Some(&"value3"));
227246

247+
// Test alternate matches (should get latest in group)
248+
assert_eq!(map.get(&version1), Some(&"value2")); // 1.0.0 -> latest in 1.x.x group
249+
assert_eq!(map.get(&Version::new(0, 4, 1)), Some(&"value0")); // 0.4.1 -> latest in 0.4.x group
250+
assert_eq!(map.get(&Version::new(1, 1, 0)), Some(&"value2")); // 1.1.0 -> latest in 1.x.x group
251+
assert_eq!(map.get(&Version::new(2, 0, 4)), Some(&"value3")); // 2.0.4 -> latest in 2.x.x group
252+
253+
// Test non-existent versions
228254
assert_eq!(map.get(&Version::new(0, 1, 0)), None);
229-
assert_eq!(map.get(&Version::new(0, 4, 1)), Some(&"value0"));
230-
assert_eq!(map.get(&Version::new(1, 1, 0)), Some(&"value2"));
231-
assert_eq!(map.get(&Version::new(2, 0, 4)), Some(&"value3"));
232255
assert_eq!(map.get(&Version::new(3, 0, 0)), None);
233256

257+
// Test exact lookups
234258
assert_eq!(map.get_exact(&version1), Some(&"value1"));
259+
assert_eq!(map.get_exact(&Version::new(1, 1, 0)), None); // No exact match
260+
}
261+
262+
#[test]
263+
fn test_version_map_latest_operations() {
264+
let mut map = VersionMap::new();
265+
266+
assert_eq!(map.get_latest(), None);
267+
assert_eq!(map.get_or_latest(None), None);
268+
269+
map.insert(Version::new(1, 0, 0), "v1.0.0");
270+
map.insert(Version::new(2, 0, 0), "v2.0.0");
271+
map.insert(Version::new(0, 1, 0), "v0.1.0");
272+
273+
assert_eq!(map.get_latest(), Some((&Version::new(2, 0, 0), &"v2.0.0")));
274+
assert_eq!(map.get_or_latest(None), Some(&"v2.0.0"));
275+
assert_eq!(
276+
map.get_or_latest(Some(&Version::new(1, 0, 0))),
277+
Some(&"v1.0.0")
278+
);
279+
}
280+
281+
#[test]
282+
fn test_version_map_insert_and_removal() {
283+
let mut map = VersionMap::new();
284+
285+
let v1 = Version::new(1, 0, 0);
286+
let v2 = Version::new(1, 0, 1);
287+
288+
map.insert(v1.clone(), "v1");
289+
map.insert(v2.clone(), "v2");
290+
291+
assert_eq!(map.remove(&v1), Some("v1"));
292+
assert_eq!(map.remove(&v1), None); // Already removed
293+
}
294+
295+
#[test]
296+
fn test_version_alternate_function() {
297+
// Pre-release versions have no alternates
298+
let pre = Version::parse("1.0.0-alpha").unwrap();
299+
assert_eq!(version_alternate(&pre), None);
300+
301+
// Major versions > 0
302+
assert_eq!(
303+
version_alternate(&Version::new(1, 2, 3)),
304+
Some(Version::new(1, 0, 0))
305+
);
306+
assert_eq!(
307+
version_alternate(&Version::new(2, 5, 1)),
308+
Some(Version::new(2, 0, 0))
309+
);
310+
311+
// Minor versions > 0 (when major is 0)
312+
assert_eq!(
313+
version_alternate(&Version::new(0, 1, 5)),
314+
Some(Version::new(0, 1, 0))
315+
);
316+
assert_eq!(
317+
version_alternate(&Version::new(0, 3, 2)),
318+
Some(Version::new(0, 3, 0))
319+
);
235320

236-
assert_eq!(map.get_or_latest(None), Some(&"value3"));
237-
assert_eq!(map.get_or_latest(Some(&version1)), Some(&"value2"));
321+
// Patch versions (when major and minor are 0)
322+
assert_eq!(
323+
version_alternate(&Version::new(0, 0, 1)),
324+
Some(Version::new(0, 0, 1))
325+
);
326+
assert_eq!(
327+
version_alternate(&Version::new(0, 0, 5)),
328+
Some(Version::new(0, 0, 5))
329+
);
238330
}
239331
}

0 commit comments

Comments
 (0)