Skip to content

Commit 949c9a9

Browse files
committed
Add tests of slice indexing
1 parent 20c0506 commit 949c9a9

File tree

2 files changed

+166
-0
lines changed

2 files changed

+166
-0
lines changed

src/map/slice.rs

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,3 +396,119 @@ impl<K, V> IndexMut<(Bound<usize>, Bound<usize>)> for Slice<K, V> {
396396
Slice::from_mut_slice(&mut entries[range])
397397
}
398398
}
399+
400+
#[cfg(test)]
401+
mod tests {
402+
use super::*;
403+
use alloc::vec::Vec;
404+
405+
#[test]
406+
fn slice_index() {
407+
fn check(
408+
vec_slice: &[(i32, i32)],
409+
map_slice: &Slice<i32, i32>,
410+
sub_slice: &Slice<i32, i32>,
411+
) {
412+
assert_eq!(map_slice as *const _, sub_slice as *const _);
413+
itertools::assert_equal(
414+
vec_slice.iter().copied(),
415+
map_slice.iter().map(|(&k, &v)| (k, v)),
416+
);
417+
itertools::assert_equal(vec_slice.iter().map(|(k, _)| k), map_slice.keys());
418+
itertools::assert_equal(vec_slice.iter().map(|(_, v)| v), map_slice.values());
419+
}
420+
421+
let vec: Vec<(i32, i32)> = (0..10).map(|i| (i, i * i)).collect();
422+
let map: IndexMap<i32, i32> = vec.iter().cloned().collect();
423+
let slice = map.as_slice();
424+
425+
// RangeFull
426+
check(&vec[..], &map[..], &slice[..]);
427+
428+
for i in 0usize..10 {
429+
// Index
430+
assert_eq!(vec[i].1, map[i]);
431+
assert_eq!(vec[i].1, slice[i]);
432+
assert_eq!(map[&(i as i32)], map[i]);
433+
assert_eq!(map[&(i as i32)], slice[i]);
434+
435+
// RangeFrom
436+
check(&vec[i..], &map[i..], &slice[i..]);
437+
438+
// RangeTo
439+
check(&vec[..i], &map[..i], &slice[..i]);
440+
441+
// RangeToInclusive
442+
check(&vec[..=i], &map[..=i], &slice[..=i]);
443+
444+
// (Bound<usize>, Bound<usize>)
445+
let bounds = (Bound::Excluded(i), Bound::Unbounded);
446+
check(&vec[i + 1..], &map[bounds], &slice[bounds]);
447+
448+
for j in i..=10 {
449+
// Range
450+
check(&vec[i..j], &map[i..j], &slice[i..j]);
451+
}
452+
453+
for j in i..10 {
454+
// RangeInclusive
455+
check(&vec[i..=j], &map[i..=j], &slice[i..=j]);
456+
}
457+
}
458+
}
459+
460+
#[test]
461+
fn slice_index_mut() {
462+
fn check_mut(
463+
vec_slice: &[(i32, i32)],
464+
map_slice: &mut Slice<i32, i32>,
465+
sub_slice: &mut Slice<i32, i32>,
466+
) {
467+
assert_eq!(map_slice, sub_slice);
468+
itertools::assert_equal(
469+
vec_slice.iter().copied(),
470+
map_slice.iter_mut().map(|(&k, &mut v)| (k, v)),
471+
);
472+
itertools::assert_equal(
473+
vec_slice.iter().map(|&(_, v)| v),
474+
map_slice.values_mut().map(|&mut v| v),
475+
);
476+
}
477+
478+
let vec: Vec<(i32, i32)> = (0..10).map(|i| (i, i * i)).collect();
479+
let mut map: IndexMap<i32, i32> = vec.iter().cloned().collect();
480+
let mut map2 = map.clone();
481+
let slice = map2.as_mut_slice();
482+
483+
// RangeFull
484+
check_mut(&vec[..], &mut map[..], &mut slice[..]);
485+
486+
for i in 0usize..10 {
487+
// IndexMut
488+
assert_eq!(&mut map[i], &mut slice[i]);
489+
490+
// RangeFrom
491+
check_mut(&vec[i..], &mut map[i..], &mut slice[i..]);
492+
493+
// RangeTo
494+
check_mut(&vec[..i], &mut map[..i], &mut slice[..i]);
495+
496+
// RangeToInclusive
497+
check_mut(&vec[..=i], &mut map[..=i], &mut slice[..=i]);
498+
499+
// (Bound<usize>, Bound<usize>)
500+
let bounds = (Bound::Excluded(i), Bound::Unbounded);
501+
check_mut(&vec[i + 1..], &mut map[bounds], &mut slice[bounds]);
502+
503+
for j in i..=10 {
504+
// Range
505+
check_mut(&vec[i..j], &mut map[i..j], &mut slice[i..j]);
506+
}
507+
508+
for j in i..10 {
509+
// RangeInclusive
510+
check_mut(&vec[i..=j], &mut map[i..=j], &mut slice[i..=j]);
511+
}
512+
}
513+
}
514+
}

src/set/slice.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,3 +231,53 @@ impl<T> Index<(Bound<usize>, Bound<usize>)> for Slice<T> {
231231
Slice::from_slice(&entries[range])
232232
}
233233
}
234+
235+
#[cfg(test)]
236+
mod tests {
237+
use super::*;
238+
use alloc::vec::Vec;
239+
240+
#[test]
241+
fn slice_index() {
242+
fn check(vec_slice: &[i32], set_slice: &Slice<i32>, sub_slice: &Slice<i32>) {
243+
assert_eq!(set_slice as *const _, sub_slice as *const _);
244+
itertools::assert_equal(vec_slice, set_slice);
245+
}
246+
247+
let vec: Vec<i32> = (0..10).map(|i| i * i).collect();
248+
let set: IndexSet<i32> = vec.iter().cloned().collect();
249+
let slice = set.as_slice();
250+
251+
// RangeFull
252+
check(&vec[..], &set[..], &slice[..]);
253+
254+
for i in 0usize..10 {
255+
// Index
256+
assert_eq!(vec[i], set[i]);
257+
assert_eq!(vec[i], slice[i]);
258+
259+
// RangeFrom
260+
check(&vec[i..], &set[i..], &slice[i..]);
261+
262+
// RangeTo
263+
check(&vec[..i], &set[..i], &slice[..i]);
264+
265+
// RangeToInclusive
266+
check(&vec[..=i], &set[..=i], &slice[..=i]);
267+
268+
// (Bound<usize>, Bound<usize>)
269+
let bounds = (Bound::Excluded(i), Bound::Unbounded);
270+
check(&vec[i + 1..], &set[bounds], &slice[bounds]);
271+
272+
for j in i..=10 {
273+
// Range
274+
check(&vec[i..j], &set[i..j], &slice[i..j]);
275+
}
276+
277+
for j in i..10 {
278+
// RangeInclusive
279+
check(&vec[i..=j], &set[i..=j], &slice[i..=j]);
280+
}
281+
}
282+
}
283+
}

0 commit comments

Comments
 (0)