@@ -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