Skip to content

Commit 5334a30

Browse files
Add unit tests for array::IntoIter
Many tests are based on tests by Josh Stone <[email protected]>
1 parent a2e94ca commit 5334a30

File tree

2 files changed

+207
-1
lines changed

2 files changed

+207
-1
lines changed

src/libcore/tests/array.rs

+206-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use core::array::FixedSizeArray;
1+
use core::array::{FixedSizeArray, IntoIter};
22
use core::convert::TryFrom;
33

44
#[test]
@@ -40,3 +40,208 @@ fn array_try_from() {
4040
30 31 32
4141
}
4242
}
43+
44+
45+
#[test]
46+
fn iterator_collect() {
47+
let arr = [0, 1, 2, 5, 9];
48+
let v: Vec<_> = IntoIter::new(arr.clone()).collect();
49+
assert_eq!(&arr[..], &v[..]);
50+
}
51+
52+
#[test]
53+
fn iterator_rev_collect() {
54+
let arr = [0, 1, 2, 5, 9];
55+
let v: Vec<_> = IntoIter::new(arr.clone()).rev().collect();
56+
assert_eq!(&v[..], &[9, 5, 2, 1, 0]);
57+
}
58+
59+
#[test]
60+
fn iterator_nth() {
61+
let v = [0, 1, 2, 3, 4];
62+
for i in 0..v.len() {
63+
assert_eq!(IntoIter::new(v.clone()).nth(i).unwrap(), v[i]);
64+
}
65+
assert_eq!(IntoIter::new(v.clone()).nth(v.len()), None);
66+
67+
let mut iter = IntoIter::new(v);
68+
assert_eq!(iter.nth(2).unwrap(), v[2]);
69+
assert_eq!(iter.nth(1).unwrap(), v[4]);
70+
}
71+
72+
#[test]
73+
fn iterator_last() {
74+
let v = [0, 1, 2, 3, 4];
75+
assert_eq!(IntoIter::new(v).last().unwrap(), 4);
76+
assert_eq!(IntoIter::new([0]).last().unwrap(), 0);
77+
78+
let mut it = IntoIter::new([0, 9, 2, 4]);
79+
assert_eq!(it.next_back(), Some(4));
80+
assert_eq!(it.last(), Some(2));
81+
}
82+
83+
#[test]
84+
fn iterator_clone() {
85+
let mut it = IntoIter::new([0, 2, 4, 6, 8]);
86+
assert_eq!(it.next(), Some(0));
87+
assert_eq!(it.next_back(), Some(8));
88+
let mut clone = it.clone();
89+
assert_eq!(it.next_back(), Some(6));
90+
assert_eq!(clone.next_back(), Some(6));
91+
assert_eq!(it.next_back(), Some(4));
92+
assert_eq!(clone.next_back(), Some(4));
93+
assert_eq!(it.next(), Some(2));
94+
assert_eq!(clone.next(), Some(2));
95+
}
96+
97+
#[test]
98+
fn iterator_fused() {
99+
let mut it = IntoIter::new([0, 9, 2]);
100+
assert_eq!(it.next(), Some(0));
101+
assert_eq!(it.next(), Some(9));
102+
assert_eq!(it.next(), Some(2));
103+
assert_eq!(it.next(), None);
104+
assert_eq!(it.next(), None);
105+
assert_eq!(it.next(), None);
106+
assert_eq!(it.next(), None);
107+
assert_eq!(it.next(), None);
108+
}
109+
110+
#[test]
111+
fn iterator_len() {
112+
let mut it = IntoIter::new([0, 1, 2, 5, 9]);
113+
assert_eq!(it.size_hint(), (5, Some(5)));
114+
assert_eq!(it.len(), 5);
115+
assert_eq!(it.is_empty(), false);
116+
117+
assert_eq!(it.next(), Some(0));
118+
assert_eq!(it.size_hint(), (4, Some(4)));
119+
assert_eq!(it.len(), 4);
120+
assert_eq!(it.is_empty(), false);
121+
122+
assert_eq!(it.next_back(), Some(9));
123+
assert_eq!(it.size_hint(), (3, Some(3)));
124+
assert_eq!(it.len(), 3);
125+
assert_eq!(it.is_empty(), false);
126+
127+
// Empty
128+
let it = IntoIter::new([] as [String; 0]);
129+
assert_eq!(it.size_hint(), (0, Some(0)));
130+
assert_eq!(it.len(), 0);
131+
assert_eq!(it.is_empty(), true);
132+
}
133+
134+
#[test]
135+
fn iterator_count() {
136+
let v = [0, 1, 2, 3, 4];
137+
assert_eq!(IntoIter::new(v.clone()).count(), 5);
138+
139+
let mut iter2 = IntoIter::new(v);
140+
iter2.next();
141+
iter2.next();
142+
assert_eq!(iter2.count(), 3);
143+
}
144+
145+
#[test]
146+
fn iterator_flat_map() {
147+
assert!((0..5).flat_map(|i| IntoIter::new([2 * i, 2 * i + 1])).eq(0..10));
148+
}
149+
150+
#[test]
151+
fn iterator_debug() {
152+
let arr = [0, 1, 2, 5, 9];
153+
assert_eq!(
154+
format!("{:?}", IntoIter::new(arr)),
155+
"IntoIter([0, 1, 2, 5, 9])",
156+
);
157+
}
158+
159+
#[test]
160+
fn iterator_drops() {
161+
use core::cell::Cell;
162+
163+
// This test makes sure the correct number of elements are dropped. The `R`
164+
// type is just a reference to a `Cell` that is incremented when an `R` is
165+
// dropped.
166+
167+
#[derive(Clone)]
168+
struct Foo<'a>(&'a Cell<usize>);
169+
170+
impl Drop for Foo<'_> {
171+
fn drop(&mut self) {
172+
self.0.set(self.0.get() + 1);
173+
}
174+
}
175+
176+
fn five(i: &Cell<usize>) -> [Foo<'_>; 5] {
177+
// This is somewhat verbose because `Foo` does not implement `Copy`
178+
// since it implements `Drop`. Consequently, we cannot write
179+
// `[Foo(i); 5]`.
180+
[Foo(i), Foo(i), Foo(i), Foo(i), Foo(i)]
181+
}
182+
183+
// Simple: drop new iterator.
184+
let i = Cell::new(0);
185+
{
186+
IntoIter::new(five(&i));
187+
}
188+
assert_eq!(i.get(), 5);
189+
190+
// Call `next()` once.
191+
let i = Cell::new(0);
192+
{
193+
let mut iter = IntoIter::new(five(&i));
194+
let _x = iter.next();
195+
assert_eq!(i.get(), 0);
196+
assert_eq!(iter.count(), 4);
197+
assert_eq!(i.get(), 4);
198+
}
199+
assert_eq!(i.get(), 5);
200+
201+
// Check `clone` and calling `next`/`next_back`.
202+
let i = Cell::new(0);
203+
{
204+
let mut iter = IntoIter::new(five(&i));
205+
iter.next();
206+
assert_eq!(i.get(), 1);
207+
iter.next_back();
208+
assert_eq!(i.get(), 2);
209+
210+
let mut clone = iter.clone();
211+
assert_eq!(i.get(), 2);
212+
213+
iter.next();
214+
assert_eq!(i.get(), 3);
215+
216+
clone.next();
217+
assert_eq!(i.get(), 4);
218+
219+
assert_eq!(clone.count(), 2);
220+
assert_eq!(i.get(), 6);
221+
}
222+
assert_eq!(i.get(), 8);
223+
224+
// Check via `nth`.
225+
let i = Cell::new(0);
226+
{
227+
let mut iter = IntoIter::new(five(&i));
228+
let _x = iter.nth(2);
229+
assert_eq!(i.get(), 2);
230+
let _y = iter.last();
231+
assert_eq!(i.get(), 3);
232+
}
233+
assert_eq!(i.get(), 5);
234+
235+
// Check every element.
236+
let i = Cell::new(0);
237+
for (index, _x) in IntoIter::new(five(&i)).enumerate() {
238+
assert_eq!(i.get(), index);
239+
}
240+
assert_eq!(i.get(), 5);
241+
242+
let i = Cell::new(0);
243+
for (index, _x) in IntoIter::new(five(&i)).rev().enumerate() {
244+
assert_eq!(i.get(), index);
245+
}
246+
assert_eq!(i.get(), 5);
247+
}

src/libcore/tests/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#![feature(slice_partition_dedup)]
3232
#![feature(int_error_matching)]
3333
#![feature(const_fn)]
34+
#![feature(array_value_iter)]
3435
#![feature(iter_partition_in_place)]
3536
#![feature(iter_is_partitioned)]
3637
#![feature(iter_order_by)]

0 commit comments

Comments
 (0)