@@ -109,7 +109,27 @@ mod tests {
109109 use semver:: Version ;
110110
111111 #[ test]
112- fn test_version_map ( ) {
112+ fn test_version_map_basic_operations ( ) {
113+ let mut map = VersionMap :: new ( ) ;
114+
115+ let version0 = Version :: new ( 0 , 4 , 2 ) ;
116+ let version1 = Version :: new ( 1 , 0 , 0 ) ;
117+ let version2 = Version :: new ( 1 , 0 , 1 ) ;
118+ let version3 = Version :: new ( 2 , 0 , 0 ) ;
119+
120+ // Test insertions
121+ assert ! ( map. try_insert( version0. clone( ) , "value0" ) . is_ok( ) ) ;
122+ assert ! ( map. try_insert( version1. clone( ) , "value1" ) . is_ok( ) ) ;
123+ assert ! ( map. try_insert( version2. clone( ) , "value2" ) . is_ok( ) ) ;
124+ assert ! ( map. try_insert( version3. clone( ) , "value3" ) . is_ok( ) ) ;
125+
126+ // Test duplicate insertion
127+ assert ! ( map. try_insert( version1. clone( ) , "duplicate" ) . is_err( ) ) ;
128+
129+ }
130+
131+ #[ test]
132+ fn test_version_map_alternate_lookups ( ) {
113133 let mut map = VersionMap :: new ( ) ;
114134
115135 let version0 = Version :: new ( 0 , 4 , 2 ) ;
@@ -122,20 +142,94 @@ mod tests {
122142 map. try_insert ( version2. clone ( ) , "value2" ) . unwrap ( ) ;
123143 map. try_insert ( version3. clone ( ) , "value3" ) . unwrap ( ) ;
124144
145+ // Test exact matches
125146 assert_eq ! ( map. get( & version0) , Some ( & "value0" ) ) ;
126- assert_eq ! ( map. get( & version1) , Some ( & "value2" ) ) ;
127147 assert_eq ! ( map. get( & version2) , Some ( & "value2" ) ) ;
128148 assert_eq ! ( map. get( & version3) , Some ( & "value3" ) ) ;
129149
150+ // Test alternate matches (should get latest in group)
151+ assert_eq ! ( map. get( & version1) , Some ( & "value2" ) ) ; // 1.0.0 -> latest in 1.x.x group
152+ assert_eq ! ( map. get( & Version :: new( 0 , 4 , 1 ) ) , Some ( & "value0" ) ) ; // 0.4.1 -> latest in 0.4.x group
153+ assert_eq ! ( map. get( & Version :: new( 1 , 1 , 0 ) ) , Some ( & "value2" ) ) ; // 1.1.0 -> latest in 1.x.x group
154+ assert_eq ! ( map. get( & Version :: new( 2 , 0 , 4 ) ) , Some ( & "value3" ) ) ; // 2.0.4 -> latest in 2.x.x group
155+
156+ // Test non-existent versions
130157 assert_eq ! ( map. get( & Version :: new( 0 , 1 , 0 ) ) , None ) ;
131- assert_eq ! ( map. get( & Version :: new( 0 , 4 , 1 ) ) , Some ( & "value0" ) ) ;
132- assert_eq ! ( map. get( & Version :: new( 1 , 1 , 0 ) ) , Some ( & "value2" ) ) ;
133- assert_eq ! ( map. get( & Version :: new( 2 , 0 , 4 ) ) , Some ( & "value3" ) ) ;
134158 assert_eq ! ( map. get( & Version :: new( 3 , 0 , 0 ) ) , None ) ;
135159
160+ // Test exact lookups
136161 assert_eq ! ( map. get_exact( & version1) , Some ( & "value1" ) ) ;
162+ assert_eq ! ( map. get_exact( & Version :: new( 1 , 1 , 0 ) ) , None ) ; // No exact match
163+ }
164+
165+ #[ test]
166+ fn test_version_map_latest_operations ( ) {
167+ let mut map = VersionMap :: new ( ) ;
168+
169+ assert_eq ! ( map. get_latest( ) , None ) ;
170+ assert_eq ! ( map. get_or_latest( None ) , None ) ;
171+
172+ map. insert ( Version :: new ( 1 , 0 , 0 ) , "v1.0.0" ) ;
173+ map. insert ( Version :: new ( 2 , 0 , 0 ) , "v2.0.0" ) ;
174+ map. insert ( Version :: new ( 0 , 1 , 0 ) , "v0.1.0" ) ;
137175
138- assert_eq ! ( map. get_or_latest( None ) , Some ( & "value3" ) ) ;
139- assert_eq ! ( map. get_or_latest( Some ( & version1) ) , Some ( & "value2" ) ) ;
176+ assert_eq ! ( map. get_latest( ) , Some ( ( & Version :: new( 2 , 0 , 0 ) , & "v2.0.0" ) ) ) ;
177+ assert_eq ! ( map. get_or_latest( None ) , Some ( & "v2.0.0" ) ) ;
178+ assert_eq ! (
179+ map. get_or_latest( Some ( & Version :: new( 1 , 0 , 0 ) ) ) ,
180+ Some ( & "v1.0.0" )
181+ ) ;
182+ }
183+
184+ #[ test]
185+ fn test_version_map_removal ( ) {
186+ let mut map = VersionMap :: new ( ) ;
187+
188+ let v1 = Version :: new ( 1 , 0 , 0 ) ;
189+ let v2 = Version :: new ( 1 , 0 , 1 ) ;
190+
191+ map. insert ( v1. clone ( ) , "v1" ) ;
192+ map. insert ( v2. clone ( ) , "v2" ) ;
193+
194+ assert_eq ! ( map. remove( & v1) , Some ( "v1" ) ) ;
195+ assert_eq ! ( map. remove( & v1) , None ) ; // Already removed
196+
197+ }
198+
199+ #[ test]
200+ fn test_version_alternate_function ( ) {
201+ // Pre-release versions have no alternates
202+ let pre = Version :: parse ( "1.0.0-alpha" ) . unwrap ( ) ;
203+ assert_eq ! ( version_alternate( & pre) , None ) ;
204+
205+ // Major versions > 0
206+ assert_eq ! (
207+ version_alternate( & Version :: new( 1 , 2 , 3 ) ) ,
208+ Some ( Version :: new( 1 , 0 , 0 ) )
209+ ) ;
210+ assert_eq ! (
211+ version_alternate( & Version :: new( 2 , 5 , 1 ) ) ,
212+ Some ( Version :: new( 2 , 0 , 0 ) )
213+ ) ;
214+
215+ // Minor versions > 0 (when major is 0)
216+ assert_eq ! (
217+ version_alternate( & Version :: new( 0 , 1 , 5 ) ) ,
218+ Some ( Version :: new( 0 , 1 , 0 ) )
219+ ) ;
220+ assert_eq ! (
221+ version_alternate( & Version :: new( 0 , 3 , 2 ) ) ,
222+ Some ( Version :: new( 0 , 3 , 0 ) )
223+ ) ;
224+
225+ // Patch versions (when major and minor are 0)
226+ assert_eq ! (
227+ version_alternate( & Version :: new( 0 , 0 , 1 ) ) ,
228+ Some ( Version :: new( 0 , 0 , 1 ) )
229+ ) ;
230+ assert_eq ! (
231+ version_alternate( & Version :: new( 0 , 0 , 5 ) ) ,
232+ Some ( Version :: new( 0 , 0 , 5 ) )
233+ ) ;
140234 }
141235}
0 commit comments