1#[macro_export]
77macro_rules! wrapped_list {
78 [$wrapper:path ; $($e:expr),* $(,)?] => {
79 [$($wrapper($e)),*]
80 };
81 [$wrapper:ident! ; $($e:expr),* $(,)?] => {
82 [$($wrapper!($e)),*]
83 }
84}
85
86#[macro_export]
88macro_rules! wrapped_vec {
89 [$wrapper:path ; $($e:expr),* $(,)?] => {
90 vec![$($wrapper($e)),*]
91 };
92 [$wrapper:ident! ; $($e:expr),* $(,)?] => {
93 vec![$($wrapper!($e)),*]
94 }
95}
96
97#[macro_export]
99macro_rules! wrapped_tuple {
100 ($wrapper:path ; $($e:expr),* $(,)?) => {
101 ($($wrapper($e)),*)
102 };
103 ($wrapper:ident! ; $($e:expr),* $(,)?) => {
104 ($($wrapper!($e)),*)
105 }
106}
107
108#[doc(hidden)]
109#[cfg(test)]
110mod tests {
111 use duplicate::duplicate_item;
112
113 #[derive(PartialEq, Eq, Debug)]
114 struct Wrapper(i32);
115
116 #[derive(PartialEq, Eq, Debug)]
117 struct ComplexWrapper {
118 wrapped_item: i32,
119 }
120
121 impl ComplexWrapper {
122 pub fn new(item: i32) -> Self {
123 ComplexWrapper { wrapped_item: item }
124 }
125 }
126
127 fn wrapper_function1(input: i32) -> i32 {
128 input * 10
129 }
130
131 fn wrapper_function2(input: i32) -> bool {
132 input > 2
133 }
134
135 macro_rules! wrapper_macro1 {
136 ($e:expr) => {
137 Wrapper($e)
138 };
139 }
140
141 macro_rules! add_one {
142 ($e:expr) => {
143 $e + 1
144 };
145 }
146
147 macro_rules! wrapper_macro2 {
148 ($e:expr) => {
149 Wrapper(add_one!($e))
150 };
151 }
152
153 #[duplicate_item(
154 wrapper test_name;
155 [Wrapper] [wrapper_test];
156 [ComplexWrapper::new] [complex_wrapper_test];
157 [Box::new] [box_test];
158 [wrapper_function1] [function_test1];
159 [wrapper_function2] [function_test2];
160 )]
161 #[test]
162 fn test_name() {
163 let my_list = [wrapper(1)];
164 assert_eq!(my_list, wrapped_list![wrapper; 1]);
165 let my_list = [wrapper(1), wrapper(2)];
166 assert_eq!(my_list, wrapped_list![wrapper; 1, 2]);
167 let my_list = [wrapper(1), wrapper(2), wrapper(3)];
168 assert_eq!(my_list, wrapped_list![wrapper; 1, 2, 3]);
169 let my_list = [wrapper(1), wrapper(2), wrapper(3), wrapper(4)];
170 assert_eq!(my_list, wrapped_list![wrapper; 1, 2, 3, 4]);
171 }
172
173 #[duplicate_item(
174 wrapper test_name;
175 [Wrapper] [vec_wrapper_test];
176 [ComplexWrapper::new] [vec_complex_wrapper_test];
177 [Box::new] [vec_box_test];
178 [wrapper_function1] [vec_function_test1];
179 [wrapper_function2] [vec_function_test2];
180 )]
181 #[test]
182 fn test_name() {
183 let my_list = vec![wrapper(1)];
184 assert_eq!(my_list, wrapped_vec![wrapper; 1]);
185 let my_list = vec![wrapper(1), wrapper(2)];
186 assert_eq!(my_list, wrapped_vec![wrapper; 1, 2]);
187 let my_list = vec![wrapper(1), wrapper(2), wrapper(3)];
188 assert_eq!(my_list, wrapped_vec![wrapper; 1, 2, 3]);
189 let my_list = vec![wrapper(1), wrapper(2), wrapper(3), wrapper(4)];
190 assert_eq!(my_list, wrapped_vec![wrapper; 1, 2, 3, 4]);
191 }
192
193 #[duplicate_item(
194 wrapper test_name;
195 [Wrapper] [tuple_wrapper_test];
196 [ComplexWrapper::new] [tuple_complex_wrapper_test];
197 [Box::new] [tuple_box_test];
198 [wrapper_function1] [tuple_function_test1];
199 [wrapper_function2] [tuple_function_test2];
200 )]
201 #[test]
202 fn test_name() {
203 let my_list = wrapper(1);
204 assert_eq!(my_list, wrapped_tuple!(wrapper; 1));
205 let my_list = (wrapper(1), wrapper(2));
206 assert_eq!(my_list, wrapped_tuple!(wrapper; 1, 2));
207 let my_list = (wrapper(1), wrapper(2), wrapper(3));
208 assert_eq!(my_list, wrapped_tuple!(wrapper; 1, 2, 3));
209 let my_list = (wrapper(1), wrapper(2), wrapper(3), wrapper(4));
210 assert_eq!(my_list, wrapped_tuple!(wrapper; 1, 2, 3, 4));
211 }
212
213 #[test]
214 fn trailing_commas() {
215 let my_list = [Wrapper(1)];
216 assert_eq!(my_list, wrapped_list![Wrapper; 1,]);
217 let my_list = [Wrapper(1), Wrapper(2)];
218 assert_eq!(my_list, wrapped_list![Wrapper; 1, 2,]);
219 let my_list = [Wrapper(1), Wrapper(2), Wrapper(3)];
220 assert_eq!(my_list, wrapped_list![Wrapper; 1, 2, 3,]);
221 let my_list = [Wrapper(1), Wrapper(2), Wrapper(3), Wrapper(4)];
222 assert_eq!(my_list, wrapped_list![Wrapper; 1, 2, 3, 4,]);
223 }
224
225 #[duplicate_item(
226 macro_name test_name;
227 [wrapper_macro1] [macro_test1];
228 [wrapper_macro2] [macro_test2];
229 )]
230 #[test]
231 fn test_name() {
232 let my_list = [macro_name!(1)];
233 assert_eq!(my_list, wrapped_list![macro_name!; 1]);
234 let my_list = [macro_name!(1), macro_name!(2)];
235 assert_eq!(my_list, wrapped_list![macro_name!; 1, 2]);
236 let my_list = [macro_name!(1), macro_name!(2), macro_name!(3)];
237 assert_eq!(my_list, wrapped_list![macro_name!; 1, 2, 3]);
238 let my_list = [
239 macro_name!(1),
240 macro_name!(2),
241 macro_name!(3),
242 macro_name!(4),
243 ];
244 assert_eq!(my_list, wrapped_list!(macro_name!; 1, 2, 3, 4));
245 }
246
247 #[test]
248 fn trailing_commas_macro() {
249 let my_list = [wrapper_macro2!(1)];
250 assert_eq!(my_list, wrapped_list![wrapper_macro2!; 1,]);
251 let my_list = [wrapper_macro2!(1), wrapper_macro2!(2)];
252 assert_eq!(my_list, wrapped_list![wrapper_macro2!; 1, 2,]);
253 let my_list = [wrapper_macro2!(1), wrapper_macro2!(2), wrapper_macro2!(3)];
254 assert_eq!(my_list, wrapped_list![wrapper_macro2!; 1, 2, 3,]);
255 let my_list = [
256 wrapper_macro2!(1),
257 wrapper_macro2!(2),
258 wrapper_macro2!(3),
259 wrapper_macro2!(4),
260 ];
261 assert_eq!(my_list, wrapped_list![wrapper_macro2!; 1, 2, 3, 4,]);
262 }
263}