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