Skip to content

Commit 51dbaa4

Browse files
committed
tests on semver
1 parent 44601fe commit 51dbaa4

File tree

1 file changed

+104
-8
lines changed

1 file changed

+104
-8
lines changed

src/semver.rs

Lines changed: 104 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ impl<T> VersionMap<T> {
7272
Ok(())
7373
}
7474

75-
/// Insert a version-value pair, returning the old value if it exists.
75+
/// Inserts a version-value pair, returning the previous value if the version existed.
76+
///
77+
/// Updates the alternates mapping appropriately.
7678
pub fn insert(&mut self, version: Version, value: T) -> Option<T> {
7779
if let Some(alternate) = version_alternate(&version) {
7880
self.alternates
@@ -163,7 +165,27 @@ mod tests {
163165
use semver::Version;
164166

165167
#[test]
166-
fn test_version_map() {
168+
fn test_version_map_basic_operations() {
169+
let mut map = VersionMap::new();
170+
171+
let version0 = Version::new(0, 4, 2);
172+
let version1 = Version::new(1, 0, 0);
173+
let version2 = Version::new(1, 0, 1);
174+
let version3 = Version::new(2, 0, 0);
175+
176+
// Test insertions
177+
assert!(map.try_insert(version0.clone(), "value0").is_ok());
178+
assert!(map.try_insert(version1.clone(), "value1").is_ok());
179+
assert!(map.try_insert(version2.clone(), "value2").is_ok());
180+
assert!(map.try_insert(version3.clone(), "value3").is_ok());
181+
182+
// Test duplicate insertion
183+
assert!(map.try_insert(version1.clone(), "duplicate").is_err());
184+
185+
}
186+
187+
#[test]
188+
fn test_version_map_alternate_lookups() {
167189
let mut map = VersionMap::new();
168190

169191
let version0 = Version::new(0, 4, 2);
@@ -176,20 +198,94 @@ mod tests {
176198
map.try_insert(version2.clone(), "value2").unwrap();
177199
map.try_insert(version3.clone(), "value3").unwrap();
178200

201+
// Test exact matches
179202
assert_eq!(map.get(&version0), Some(&"value0"));
180-
assert_eq!(map.get(&version1), Some(&"value2"));
181203
assert_eq!(map.get(&version2), Some(&"value2"));
182204
assert_eq!(map.get(&version3), Some(&"value3"));
183205

206+
// Test alternate matches (should get latest in group)
207+
assert_eq!(map.get(&version1), Some(&"value2")); // 1.0.0 -> latest in 1.x.x group
208+
assert_eq!(map.get(&Version::new(0, 4, 1)), Some(&"value0")); // 0.4.1 -> latest in 0.4.x group
209+
assert_eq!(map.get(&Version::new(1, 1, 0)), Some(&"value2")); // 1.1.0 -> latest in 1.x.x group
210+
assert_eq!(map.get(&Version::new(2, 0, 4)), Some(&"value3")); // 2.0.4 -> latest in 2.x.x group
211+
212+
// Test non-existent versions
184213
assert_eq!(map.get(&Version::new(0, 1, 0)), None);
185-
assert_eq!(map.get(&Version::new(0, 4, 1)), Some(&"value0"));
186-
assert_eq!(map.get(&Version::new(1, 1, 0)), Some(&"value2"));
187-
assert_eq!(map.get(&Version::new(2, 0, 4)), Some(&"value3"));
188214
assert_eq!(map.get(&Version::new(3, 0, 0)), None);
189215

216+
// Test exact lookups
190217
assert_eq!(map.get_exact(&version1), Some(&"value1"));
218+
assert_eq!(map.get_exact(&Version::new(1, 1, 0)), None); // No exact match
219+
}
220+
221+
#[test]
222+
fn test_version_map_latest_operations() {
223+
let mut map = VersionMap::new();
224+
225+
assert_eq!(map.get_latest(), None);
226+
assert_eq!(map.get_or_latest(None), None);
227+
228+
map.insert(Version::new(1, 0, 0), "v1.0.0");
229+
map.insert(Version::new(2, 0, 0), "v2.0.0");
230+
map.insert(Version::new(0, 1, 0), "v0.1.0");
231+
232+
assert_eq!(map.get_latest(), Some((&Version::new(2, 0, 0), &"v2.0.0")));
233+
assert_eq!(map.get_or_latest(None), Some(&"v2.0.0"));
234+
assert_eq!(
235+
map.get_or_latest(Some(&Version::new(1, 0, 0))),
236+
Some(&"v1.0.0")
237+
);
238+
}
239+
240+
#[test]
241+
fn test_version_map_removal() {
242+
let mut map = VersionMap::new();
243+
244+
let v1 = Version::new(1, 0, 0);
245+
let v2 = Version::new(1, 0, 1);
246+
247+
map.insert(v1.clone(), "v1");
248+
map.insert(v2.clone(), "v2");
249+
250+
assert_eq!(map.remove(&v1), Some("v1"));
251+
assert_eq!(map.remove(&v1), None); // Already removed
252+
253+
}
254+
255+
#[test]
256+
fn test_version_alternate_function() {
257+
// Pre-release versions have no alternates
258+
let pre = Version::parse("1.0.0-alpha").unwrap();
259+
assert_eq!(version_alternate(&pre), None);
260+
261+
// Major versions > 0
262+
assert_eq!(
263+
version_alternate(&Version::new(1, 2, 3)),
264+
Some(Version::new(1, 0, 0))
265+
);
266+
assert_eq!(
267+
version_alternate(&Version::new(2, 5, 1)),
268+
Some(Version::new(2, 0, 0))
269+
);
270+
271+
// Minor versions > 0 (when major is 0)
272+
assert_eq!(
273+
version_alternate(&Version::new(0, 1, 5)),
274+
Some(Version::new(0, 1, 0))
275+
);
276+
assert_eq!(
277+
version_alternate(&Version::new(0, 3, 2)),
278+
Some(Version::new(0, 3, 0))
279+
);
191280

192-
assert_eq!(map.get_or_latest(None), Some(&"value3"));
193-
assert_eq!(map.get_or_latest(Some(&version1)), Some(&"value2"));
281+
// Patch versions (when major and minor are 0)
282+
assert_eq!(
283+
version_alternate(&Version::new(0, 0, 1)),
284+
Some(Version::new(0, 0, 1))
285+
);
286+
assert_eq!(
287+
version_alternate(&Version::new(0, 0, 5)),
288+
Some(Version::new(0, 0, 5))
289+
);
194290
}
195291
}

0 commit comments

Comments
 (0)