@@ -207,7 +207,27 @@ 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+
229+ #[ test]
230+ fn test_version_map_alternate_lookups ( ) {
211231 let mut map = VersionMap :: new ( ) ;
212232
213233 let version0 = Version :: new ( 0 , 4 , 2 ) ;
@@ -220,20 +240,94 @@ mod tests {
220240 map. try_insert ( version2. clone ( ) , "value2" ) . unwrap ( ) ;
221241 map. try_insert ( version3. clone ( ) , "value3" ) . unwrap ( ) ;
222242
243+ // Test exact matches
223244 assert_eq ! ( map. get( & version0) , Some ( & "value0" ) ) ;
224- assert_eq ! ( map. get( & version1) , Some ( & "value2" ) ) ;
225245 assert_eq ! ( map. get( & version2) , Some ( & "value2" ) ) ;
226246 assert_eq ! ( map. get( & version3) , Some ( & "value3" ) ) ;
227247
248+ // Test alternate matches (should get latest in group)
249+ assert_eq ! ( map. get( & version1) , Some ( & "value2" ) ) ; // 1.0.0 -> latest in 1.x.x group
250+ assert_eq ! ( map. get( & Version :: new( 0 , 4 , 1 ) ) , Some ( & "value0" ) ) ; // 0.4.1 -> latest in 0.4.x group
251+ assert_eq ! ( map. get( & Version :: new( 1 , 1 , 0 ) ) , Some ( & "value2" ) ) ; // 1.1.0 -> latest in 1.x.x group
252+ assert_eq ! ( map. get( & Version :: new( 2 , 0 , 4 ) ) , Some ( & "value3" ) ) ; // 2.0.4 -> latest in 2.x.x group
253+
254+ // Test non-existent versions
228255 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" ) ) ;
232256 assert_eq ! ( map. get( & Version :: new( 3 , 0 , 0 ) ) , None ) ;
233257
258+ // Test exact lookups
234259 assert_eq ! ( map. get_exact( & version1) , Some ( & "value1" ) ) ;
260+ assert_eq ! ( map. get_exact( & Version :: new( 1 , 1 , 0 ) ) , None ) ; // No exact match
261+ }
262+
263+ #[ test]
264+ fn test_version_map_latest_operations ( ) {
265+ let mut map = VersionMap :: new ( ) ;
266+
267+ assert_eq ! ( map. get_latest( ) , None ) ;
268+ assert_eq ! ( map. get_or_latest( None ) , None ) ;
269+
270+ map. insert ( Version :: new ( 1 , 0 , 0 ) , "v1.0.0" ) ;
271+ map. insert ( Version :: new ( 2 , 0 , 0 ) , "v2.0.0" ) ;
272+ map. insert ( Version :: new ( 0 , 1 , 0 ) , "v0.1.0" ) ;
273+
274+ assert_eq ! ( map. get_latest( ) , Some ( ( & Version :: new( 2 , 0 , 0 ) , & "v2.0.0" ) ) ) ;
275+ assert_eq ! ( map. get_or_latest( None ) , Some ( & "v2.0.0" ) ) ;
276+ assert_eq ! (
277+ map. get_or_latest( Some ( & Version :: new( 1 , 0 , 0 ) ) ) ,
278+ Some ( & "v1.0.0" )
279+ ) ;
280+ }
281+
282+ #[ test]
283+ fn test_version_map_removal ( ) {
284+ let mut map = VersionMap :: new ( ) ;
285+
286+ let v1 = Version :: new ( 1 , 0 , 0 ) ;
287+ let v2 = Version :: new ( 1 , 0 , 1 ) ;
288+
289+ map. insert ( v1. clone ( ) , "v1" ) ;
290+ map. insert ( v2. clone ( ) , "v2" ) ;
291+
292+ assert_eq ! ( map. remove( & v1) , Some ( "v1" ) ) ;
293+ assert_eq ! ( map. remove( & v1) , None ) ; // Already removed
294+
295+ }
296+
297+ #[ test]
298+ fn test_version_alternate_function ( ) {
299+ // Pre-release versions have no alternates
300+ let pre = Version :: parse ( "1.0.0-alpha" ) . unwrap ( ) ;
301+ assert_eq ! ( version_alternate( & pre) , None ) ;
302+
303+ // Major versions > 0
304+ assert_eq ! (
305+ version_alternate( & Version :: new( 1 , 2 , 3 ) ) ,
306+ Some ( Version :: new( 1 , 0 , 0 ) )
307+ ) ;
308+ assert_eq ! (
309+ version_alternate( & Version :: new( 2 , 5 , 1 ) ) ,
310+ Some ( Version :: new( 2 , 0 , 0 ) )
311+ ) ;
312+
313+ // Minor versions > 0 (when major is 0)
314+ assert_eq ! (
315+ version_alternate( & Version :: new( 0 , 1 , 5 ) ) ,
316+ Some ( Version :: new( 0 , 1 , 0 ) )
317+ ) ;
318+ assert_eq ! (
319+ version_alternate( & Version :: new( 0 , 3 , 2 ) ) ,
320+ Some ( Version :: new( 0 , 3 , 0 ) )
321+ ) ;
235322
236- assert_eq ! ( map. get_or_latest( None ) , Some ( & "value3" ) ) ;
237- assert_eq ! ( map. get_or_latest( Some ( & version1) ) , Some ( & "value2" ) ) ;
323+ // Patch versions (when major and minor are 0)
324+ assert_eq ! (
325+ version_alternate( & Version :: new( 0 , 0 , 1 ) ) ,
326+ Some ( Version :: new( 0 , 0 , 1 ) )
327+ ) ;
328+ assert_eq ! (
329+ version_alternate( & Version :: new( 0 , 0 , 5 ) ) ,
330+ Some ( Version :: new( 0 , 0 , 5 ) )
331+ ) ;
238332 }
239333}
0 commit comments