@@ -118,289 +118,6 @@ pub fn remove_items_from_vec_by_indices<Item>(vec: &mut Vec<Item>, indices: &Has
118118
119119#[ cfg( unix) ]
120120#[ cfg( test) ]
121- mod tests {
122- use super :: { deduplicate_arguments, remove_items_from_vec_by_indices, Api } ;
123- use maplit:: hashset;
124- use normalize_path:: NormalizePath ;
125- use pipe_trait:: Pipe ;
126- use pretty_assertions:: assert_eq;
127- use std:: { collections:: HashSet , convert:: Infallible , path:: PathBuf } ;
128-
129- const MOCKED_CURRENT_DIR : & str = "/home/user/current-dir" ;
130-
131- const MOCKED_SYMLINKS : & [ ( & str , & str ) ] = & [
132- ( "/home/user/current-dir/link-to-current-dir" , "." ) ,
133- ( "/home/user/current-dir/link-to-parent-dir" , ".." ) ,
134- ( "/home/user/current-dir/link-to-root" , "/" ) ,
135- ( "/home/user/current-dir/link-to-bin" , "/usr/bin" ) ,
136- ( "/home/user/current-dir/link-to-foo" , "foo" ) ,
137- ( "/home/user/current-dir/link-to-bar" , "bar" ) ,
138- ( "/home/user/current-dir/link-to-012" , "0/1/2" ) ,
139- ] ;
140-
141- fn resolve_symlink ( absolute_path : PathBuf ) -> PathBuf {
142- assert ! (
143- absolute_path. is_absolute( ) ,
144- "absolute_path should be absolute: {absolute_path:?}" ,
145- ) ;
146- for & ( link_path, link_target) in MOCKED_SYMLINKS {
147- let link_path = PathBuf :: from ( link_path) ;
148- assert ! (
149- link_path. is_absolute( ) ,
150- "link_path should be absolute: {link_path:?}" ,
151- ) ;
152- let Some ( parent) = link_path. parent ( ) else {
153- panic ! ( "Cannot get parent of {link_path:?}" ) ;
154- } ;
155- if let Ok ( suffix) = absolute_path. strip_prefix ( & link_path) {
156- return parent
157- . join ( link_target)
158- . join ( suffix)
159- . normalize ( )
160- . pipe ( resolve_symlink) ;
161- }
162- }
163- absolute_path
164- }
165-
166- /// Mocked implementation of [`Api`] for testing purposes.
167- struct MockedApi ;
168- impl Api for MockedApi {
169- type Argument = & ' static str ;
170- type RealPath = PathBuf ;
171- type RealPathError = Infallible ;
172-
173- fn canonicalize ( path : & Self :: Argument ) -> Result < Self :: RealPath , Self :: RealPathError > {
174- MOCKED_CURRENT_DIR
175- . pipe ( PathBuf :: from)
176- . join ( path)
177- . normalize ( )
178- . pipe ( resolve_symlink)
179- . pipe ( Ok )
180- }
181-
182- fn is_real_dir ( path : & Self :: Argument ) -> bool {
183- let path = MOCKED_CURRENT_DIR . pipe ( PathBuf :: from) . join ( path) ;
184- MOCKED_SYMLINKS
185- . iter ( )
186- . all ( |( link, _) | PathBuf :: from ( link) . normalize ( ) != path)
187- }
188-
189- fn starts_with ( a : & Self :: RealPath , b : & Self :: RealPath ) -> bool {
190- a. starts_with ( b)
191- }
192- }
193-
194- #[ test]
195- fn find_nothing_to_remove ( ) {
196- let original = vec ! [ "foo" , "bar" , "abc/def" , "0/1/2" ] ;
197- let mut actual = original. clone ( ) ;
198- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
199- let expected = original;
200- assert_eq ! ( actual, expected) ;
201- }
202-
203- #[ test]
204- fn remove_duplicated_arguments ( ) {
205- let original = dbg ! ( vec![
206- "foo" ,
207- "bar" ,
208- "abc/def" ,
209- "foo" ,
210- "0/1/2" ,
211- "./bar" ,
212- "./abc/./def" ,
213- ] ) ;
214- let mut actual = original. clone ( ) ;
215- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
216- let expected = vec ! [ "foo" , "bar" , "abc/def" , "0/1/2" ] ;
217- assert_eq ! ( actual, expected) ;
218-
219- let original = dbg ! ( vec![
220- "foo" ,
221- "./bar" ,
222- "bar" ,
223- "./abc/./def" ,
224- "abc/def" ,
225- "foo" ,
226- "0/1/2" ,
227- ] ) ;
228- let mut actual = original. clone ( ) ;
229- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
230- let expected = vec ! [ "foo" , "./bar" , "./abc/./def" , "0/1/2" ] ;
231- assert_eq ! ( actual, expected) ;
232- }
233-
234- #[ test]
235- fn remove_duplicated_sub_paths ( ) {
236- let original = vec ! [
237- "foo/child" ,
238- "foo" ,
239- "bar" ,
240- "abc/def" ,
241- "0/1/2" ,
242- "bar/child" ,
243- "0/1/2/3" ,
244- ] ;
245- let mut actual = original. clone ( ) ;
246- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
247- let expected = vec ! [ "foo" , "bar" , "abc/def" , "0/1/2" ] ;
248- assert_eq ! ( actual, expected) ;
249- }
250-
251- #[ test]
252- fn remove_all_except_current_dir ( ) {
253- let original = dbg ! ( vec![ "foo" , "bar" , "." , "abc/def" , "0/1/2" ] ) ;
254- let mut actual = original. clone ( ) ;
255- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
256- let expected = vec ! [ "." ] ;
257- assert_eq ! ( actual, expected) ;
258-
259- let original = dbg ! ( vec![
260- "foo" ,
261- "bar" ,
262- "." ,
263- "abc/def" ,
264- "0/1/2" ,
265- MOCKED_CURRENT_DIR ,
266- ] ) ;
267- let mut actual = original. clone ( ) ;
268- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
269- let expected = vec ! [ "." ] ;
270- assert_eq ! ( actual, expected) ;
271-
272- let original = dbg ! ( vec![
273- "foo" ,
274- "bar" ,
275- MOCKED_CURRENT_DIR ,
276- "." ,
277- "abc/def" ,
278- "0/1/2" ,
279- ] ) ;
280- let mut actual = original. clone ( ) ;
281- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
282- let expected = vec ! [ MOCKED_CURRENT_DIR ] ;
283- assert_eq ! ( actual, expected) ;
284- }
285-
286- #[ test]
287- fn remove_all_except_parent_dir ( ) {
288- let original = dbg ! ( vec![ "foo" , "bar" , ".." , "abc/def" , "." , "0/1/2" ] ) ;
289- let mut actual = original. clone ( ) ;
290- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
291- let expected = vec ! [ ".." ] ;
292- assert_eq ! ( actual, expected) ;
293-
294- let original = dbg ! ( vec![
295- "foo" ,
296- "/home/user" ,
297- "bar" ,
298- ".." ,
299- "abc/def" ,
300- "." ,
301- "0/1/2" ,
302- ] ) ;
303- let mut actual = original. clone ( ) ;
304- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
305- let expected = vec ! [ "/home/user" ] ;
306- assert_eq ! ( actual, expected) ;
307- }
308-
309- #[ test]
310- fn remove_duplicated_real_paths ( ) {
311- let original = dbg ! ( vec![
312- "foo" ,
313- "bar" ,
314- "abc/def" ,
315- "link-to-foo/child" ,
316- "link-to-bar/a/b/c" ,
317- "0/1/2" ,
318- ] ) ;
319- let mut actual = original. clone ( ) ;
320- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
321- let expected = vec ! [ "foo" , "bar" , "abc/def" , "0/1/2" ] ;
322- assert_eq ! ( actual, expected) ;
323-
324- let original = dbg ! ( vec![
325- "link-to-foo/child" ,
326- "link-to-bar/a/b/c" ,
327- "foo" ,
328- "bar" ,
329- "abc/def" ,
330- "0/1/2" ,
331- ] ) ;
332- let mut actual = original. clone ( ) ;
333- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
334- let expected = vec ! [ "foo" , "bar" , "abc/def" , "0/1/2" ] ;
335- assert_eq ! ( actual, expected) ;
336-
337- let original = dbg ! ( vec![
338- "link-to-current-dir/foo" ,
339- "foo" ,
340- "bar" ,
341- "abc/def" ,
342- "link-to-current-dir/bar" ,
343- "0/1/2" ,
344- ] ) ;
345- let mut actual = original. clone ( ) ;
346- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
347- let expected = vec ! [ "link-to-current-dir/foo" , "bar" , "abc/def" , "0/1/2" ] ;
348- assert_eq ! ( actual, expected) ;
349- }
350-
351- #[ test]
352- fn do_not_remove_symlinks ( ) {
353- let original = dbg ! ( vec![
354- "foo" ,
355- "bar" ,
356- "abc/def" ,
357- "link-to-foo" ,
358- "link-to-bar" ,
359- "0/1/2" ,
360- ] ) ;
361- let mut actual = original. clone ( ) ;
362- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
363- let expected = original;
364- assert_eq ! ( actual, expected) ;
365-
366- let original = dbg ! ( vec![
367- "foo/child" ,
368- "bar" ,
369- "abc/def" ,
370- "link-to-foo" ,
371- "link-to-bar" ,
372- "0/1/2" ,
373- ] ) ;
374- let mut actual = original. clone ( ) ;
375- deduplicate_arguments :: < MockedApi > ( & mut actual) ;
376- let expected = original;
377- assert_eq ! ( actual, expected) ;
378- }
379-
380- #[ test]
381- fn remove_nothing ( ) {
382- let original = vec ! [ 31 , 54 , 22 , 81 , 67 , 45 , 52 , 20 , 85 , 66 , 27 , 84 ] ;
383- let mut modified = original. clone ( ) ;
384- remove_items_from_vec_by_indices ( & mut modified, & HashSet :: new ( ) ) ;
385- assert_eq ! ( modified, original) ;
386- }
387-
388- #[ test]
389- fn remove_single ( ) {
390- let original = vec ! [ 31 , 54 , 22 , 81 , 67 , 45 , 52 , 20 , 85 , 66 , 27 , 84 ] ;
391- let mut modified = original. clone ( ) ;
392- remove_items_from_vec_by_indices ( & mut modified, & hashset ! { 3 } ) ;
393- assert_eq ! ( & modified[ ..3 ] , & original[ ..3 ] ) ;
394- assert_eq ! ( & modified[ 3 ..] , & original[ 4 ..] ) ;
395- }
396-
397- #[ test]
398- fn remove_multiple ( ) {
399- let original = vec ! [ 31 , 54 , 22 , 81 , 67 , 45 , 52 , 20 , 85 , 66 , 27 , 84 ] ;
400- let mut modified = original. clone ( ) ;
401- remove_items_from_vec_by_indices ( & mut modified, & hashset ! { 3 , 4 , 5 , 7 } ) ;
402- assert_eq ! ( & modified[ ..3 ] , & original[ ..3 ] ) ;
403- assert_eq ! ( & modified[ 3 ..4 ] , & original[ 6 ..7 ] ) ;
404- assert_eq ! ( & modified[ 4 ..] , & original[ 8 ..] ) ;
405- }
406- }
121+ mod test_deduplicate_arguments;
122+ #[ cfg( test) ]
123+ mod test_remove_items_from_vec_by_indices;
0 commit comments