]> git.proxmox.com Git - rustc.git/blob - library/core/tests/iter/adapters/zip.rs
New upstream version 1.51.0+dfsg1
[rustc.git] / library / core / tests / iter / adapters / zip.rs
1 use super::*;
2 use core::iter::*;
3
4 #[test]
5 fn test_zip_nth() {
6 let xs = [0, 1, 2, 4, 5];
7 let ys = [10, 11, 12];
8
9 let mut it = xs.iter().zip(&ys);
10 assert_eq!(it.nth(0), Some((&0, &10)));
11 assert_eq!(it.nth(1), Some((&2, &12)));
12 assert_eq!(it.nth(0), None);
13
14 let mut it = xs.iter().zip(&ys);
15 assert_eq!(it.nth(3), None);
16
17 let mut it = ys.iter().zip(&xs);
18 assert_eq!(it.nth(3), None);
19 }
20
21 #[test]
22 fn test_zip_nth_side_effects() {
23 let mut a = Vec::new();
24 let mut b = Vec::new();
25 let value = [1, 2, 3, 4, 5, 6]
26 .iter()
27 .cloned()
28 .map(|n| {
29 a.push(n);
30 n * 10
31 })
32 .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
33 b.push(n * 100);
34 n * 1000
35 }))
36 .skip(1)
37 .nth(3);
38 assert_eq!(value, Some((50, 6000)));
39 assert_eq!(a, vec![1, 2, 3, 4, 5]);
40 assert_eq!(b, vec![200, 300, 400, 500, 600]);
41 }
42
43 #[test]
44 fn test_zip_next_back_side_effects() {
45 let mut a = Vec::new();
46 let mut b = Vec::new();
47 let mut iter = [1, 2, 3, 4, 5, 6]
48 .iter()
49 .cloned()
50 .map(|n| {
51 a.push(n);
52 n * 10
53 })
54 .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
55 b.push(n * 100);
56 n * 1000
57 }));
58
59 // The second iterator is one item longer, so `next_back` is called on it
60 // one more time.
61 assert_eq!(iter.next_back(), Some((60, 7000)));
62 assert_eq!(iter.next_back(), Some((50, 6000)));
63 assert_eq!(iter.next_back(), Some((40, 5000)));
64 assert_eq!(iter.next_back(), Some((30, 4000)));
65 assert_eq!(a, vec![6, 5, 4, 3]);
66 assert_eq!(b, vec![800, 700, 600, 500, 400]);
67 }
68
69 #[test]
70 fn test_zip_nth_back_side_effects() {
71 let mut a = Vec::new();
72 let mut b = Vec::new();
73 let value = [1, 2, 3, 4, 5, 6]
74 .iter()
75 .cloned()
76 .map(|n| {
77 a.push(n);
78 n * 10
79 })
80 .zip([2, 3, 4, 5, 6, 7, 8].iter().cloned().map(|n| {
81 b.push(n * 100);
82 n * 1000
83 }))
84 .nth_back(3);
85 assert_eq!(value, Some((30, 4000)));
86 assert_eq!(a, vec![6, 5, 4, 3]);
87 assert_eq!(b, vec![800, 700, 600, 500, 400]);
88 }
89
90 #[test]
91 fn test_zip_next_back_side_effects_exhausted() {
92 let mut a = Vec::new();
93 let mut b = Vec::new();
94 let mut iter = [1, 2, 3, 4, 5, 6]
95 .iter()
96 .cloned()
97 .map(|n| {
98 a.push(n);
99 n * 10
100 })
101 .zip([2, 3, 4].iter().cloned().map(|n| {
102 b.push(n * 100);
103 n * 1000
104 }));
105
106 iter.next();
107 iter.next();
108 iter.next();
109 iter.next();
110 assert_eq!(iter.next_back(), None);
111 assert_eq!(a, vec![1, 2, 3, 4, 6, 5]);
112 assert_eq!(b, vec![200, 300, 400]);
113 }
114
115 #[test]
116 fn test_zip_cloned_sideffectful() {
117 let xs = [CountClone::new(), CountClone::new(), CountClone::new(), CountClone::new()];
118 let ys = [CountClone::new(), CountClone::new()];
119
120 for _ in xs.iter().cloned().zip(ys.iter().cloned()) {}
121
122 assert_eq!(&xs, &[1, 1, 1, 0][..]);
123 assert_eq!(&ys, &[1, 1][..]);
124
125 let xs = [CountClone::new(), CountClone::new()];
126 let ys = [CountClone::new(), CountClone::new(), CountClone::new(), CountClone::new()];
127
128 for _ in xs.iter().cloned().zip(ys.iter().cloned()) {}
129
130 assert_eq!(&xs, &[1, 1][..]);
131 assert_eq!(&ys, &[1, 1, 0, 0][..]);
132 }
133
134 #[test]
135 fn test_zip_map_sideffectful() {
136 let mut xs = [0; 6];
137 let mut ys = [0; 4];
138
139 for _ in xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1)) {}
140
141 assert_eq!(&xs, &[1, 1, 1, 1, 1, 0]);
142 assert_eq!(&ys, &[1, 1, 1, 1]);
143
144 let mut xs = [0; 4];
145 let mut ys = [0; 6];
146
147 for _ in xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1)) {}
148
149 assert_eq!(&xs, &[1, 1, 1, 1]);
150 assert_eq!(&ys, &[1, 1, 1, 1, 0, 0]);
151 }
152
153 #[test]
154 fn test_zip_map_rev_sideffectful() {
155 let mut xs = [0; 6];
156 let mut ys = [0; 4];
157
158 {
159 let mut it = xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1));
160 it.next_back();
161 }
162 assert_eq!(&xs, &[0, 0, 0, 1, 1, 1]);
163 assert_eq!(&ys, &[0, 0, 0, 1]);
164
165 let mut xs = [0; 6];
166 let mut ys = [0; 4];
167
168 {
169 let mut it = xs.iter_mut().map(|x| *x += 1).zip(ys.iter_mut().map(|y| *y += 1));
170 (&mut it).take(5).count();
171 it.next_back();
172 }
173 assert_eq!(&xs, &[1, 1, 1, 1, 1, 1]);
174 assert_eq!(&ys, &[1, 1, 1, 1]);
175 }
176
177 #[test]
178 fn test_zip_nested_sideffectful() {
179 let mut xs = [0; 6];
180 let ys = [0; 4];
181
182 {
183 // test that it has the side effect nested inside enumerate
184 let it = xs.iter_mut().map(|x| *x = 1).enumerate().zip(&ys);
185 it.count();
186 }
187 assert_eq!(&xs, &[1, 1, 1, 1, 1, 0]);
188 }
189
190 #[test]
191 fn test_zip_nth_back_side_effects_exhausted() {
192 let mut a = Vec::new();
193 let mut b = Vec::new();
194 let mut iter = [1, 2, 3, 4, 5, 6]
195 .iter()
196 .cloned()
197 .map(|n| {
198 a.push(n);
199 n * 10
200 })
201 .zip([2, 3, 4].iter().cloned().map(|n| {
202 b.push(n * 100);
203 n * 1000
204 }));
205
206 iter.next();
207 iter.next();
208 iter.next();
209 iter.next();
210 assert_eq!(iter.nth_back(0), None);
211 assert_eq!(a, vec![1, 2, 3, 4, 6, 5]);
212 assert_eq!(b, vec![200, 300, 400]);
213 }
214
215 #[test]
216 fn test_zip_trusted_random_access_composition() {
217 let a = [0, 1, 2, 3, 4];
218 let b = a;
219 let c = a;
220
221 let a = a.iter().copied();
222 let b = b.iter().copied();
223 let mut c = c.iter().copied();
224 c.next();
225
226 let mut z1 = a.zip(b);
227 assert_eq!(z1.next().unwrap(), (0, 0));
228
229 let mut z2 = z1.zip(c);
230 fn assert_trusted_random_access<T: TrustedRandomAccess>(_a: &T) {}
231 assert_trusted_random_access(&z2);
232 assert_eq!(z2.next().unwrap(), ((1, 1), 1));
233 }
234
235 #[test]
236 fn test_double_ended_zip() {
237 let xs = [1, 2, 3, 4, 5, 6];
238 let ys = [1, 2, 3, 7];
239 let a = xs.iter().cloned();
240 let b = ys.iter().cloned();
241 let mut it = a.zip(b);
242 assert_eq!(it.next(), Some((1, 1)));
243 assert_eq!(it.next(), Some((2, 2)));
244 assert_eq!(it.next_back(), Some((4, 7)));
245 assert_eq!(it.next_back(), Some((3, 3)));
246 assert_eq!(it.next(), None);
247 }