1pub fn drop<T>(collection: &[T], n: usize) -> Vec<T>
38where
39 T: Clone,
40{
41 if n >= collection.len() {
42 Vec::new()
43 } else {
44 collection[n..].to_vec()
45 }
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 #[test]
53 fn test_drop_normal_case() {
54 let numbers = vec![1, 2, 3, 4, 5];
55 let result = drop(&numbers, 2);
56 assert_eq!(result, vec![3, 4, 5]);
57 }
58
59 #[test]
60 fn test_drop_zero_elements() {
61 let numbers = vec![1, 2, 3];
62 let result = drop(&numbers, 0);
63 assert_eq!(result, vec![1, 2, 3]);
64 }
65
66 #[test]
67 fn test_drop_n_equal_length() {
68 let numbers = vec![1, 2, 3];
69 let result = drop(&numbers, 3);
70 assert_eq!(result, Vec::<i32>::new());
71 }
72
73 #[test]
74 fn test_drop_n_greater_than_length() {
75 let numbers = vec![1, 2, 3];
76 let result = drop(&numbers, 5);
77 assert_eq!(result, Vec::<i32>::new());
78 }
79
80 #[test]
81 fn test_drop_empty_collection() {
82 let empty: Vec<i32> = vec![];
83 let result = drop(&empty, 2);
84 assert_eq!(result, Vec::<i32>::new());
85 }
86
87 #[test]
88 fn test_drop_with_strings() {
89 let words = vec!["hello", "world", "rust"];
90 let result = drop(&words, 1);
91 assert_eq!(result, vec!["world", "rust"]);
92 }
93
94 #[test]
95 fn test_drop_with_structs() {
96 #[derive(Debug, PartialEq, Clone)]
97 struct Point {
98 x: i32,
99 y: i32,
100 }
101
102 let points = vec![
103 Point { x: 0, y: 0 },
104 Point { x: 1, y: 1 },
105 Point { x: 2, y: 2 },
106 ];
107 let result = drop(&points, 2);
108 let expected = vec![Point { x: 2, y: 2 }];
109 assert_eq!(result, expected);
110 }
111
112 #[test]
113 fn test_drop_n_is_zero() {
114 let letters = vec!['a', 'b', 'c'];
115 let result = drop(&letters, 0);
116 assert_eq!(result, vec!['a', 'b', 'c']);
117 }
118
119 #[test]
120 fn test_drop_full_drop() {
121 let letters = vec!['a', 'b', 'c'];
122 let result = drop(&letters, letters.len());
123 assert_eq!(result, Vec::<char>::new());
124 }
125}