Skip to content

Commit 6250d56

Browse files
committedJan 19, 2020
Auto merge of #67758 - ssomers:testing_range, r=Mark-Simulacrum
More thorough testing of BTreeMap::range Test more of the paths in the `range_search` function in map.rs
2 parents bb410ad + 8314b7f commit 6250d56

File tree

1 file changed

+150
-31
lines changed
  • src/liballoc/tests/btree

1 file changed

+150
-31
lines changed
 

‎src/liballoc/tests/btree/map.rs

+150-31
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::convert::TryFrom;
44
use std::fmt::Debug;
55
use std::iter::FromIterator;
66
use std::ops::Bound::{self, Excluded, Included, Unbounded};
7+
use std::ops::RangeBounds;
78
use std::rc::Rc;
89

910
use super::DeterministicRng;
@@ -68,6 +69,11 @@ fn test_basic_small() {
6869
assert_eq!(map.last_key_value(), None);
6970
assert_eq!(map.keys().count(), 0);
7071
assert_eq!(map.values().count(), 0);
72+
assert_eq!(map.range(..).next(), None);
73+
assert_eq!(map.range(..1).next(), None);
74+
assert_eq!(map.range(1..).next(), None);
75+
assert_eq!(map.range(1..=1).next(), None);
76+
assert_eq!(map.range(1..2).next(), None);
7177
assert_eq!(map.insert(1, 1), None);
7278

7379
// 1 key-value pair:
@@ -118,6 +124,11 @@ fn test_basic_small() {
118124
assert_eq!(map.last_key_value(), None);
119125
assert_eq!(map.keys().count(), 0);
120126
assert_eq!(map.values().count(), 0);
127+
assert_eq!(map.range(..).next(), None);
128+
assert_eq!(map.range(..1).next(), None);
129+
assert_eq!(map.range(1..).next(), None);
130+
assert_eq!(map.range(1..=1).next(), None);
131+
assert_eq!(map.range(1..2).next(), None);
121132
assert_eq!(map.remove(&1), None);
122133
}
123134

@@ -128,7 +139,6 @@ fn test_iter() {
128139
#[cfg(miri)]
129140
let size = 200;
130141

131-
// Forwards
132142
let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
133143

134144
fn test<T>(size: usize, mut iter: T)
@@ -154,7 +164,6 @@ fn test_iter_rev() {
154164
#[cfg(miri)]
155165
let size = 200;
156166

157-
// Forwards
158167
let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
159168

160169
fn test<T>(size: usize, mut iter: T)
@@ -275,7 +284,6 @@ fn test_iter_mixed() {
275284
#[cfg(miri)]
276285
let size = 200;
277286

278-
// Forwards
279287
let mut map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
280288

281289
fn test<T>(size: usize, mut iter: T)
@@ -299,27 +307,147 @@ fn test_iter_mixed() {
299307
test(size, map.into_iter());
300308
}
301309

302-
#[test]
303-
fn test_range_small() {
304-
let size = 5;
305-
306-
// Forwards
307-
let map: BTreeMap<_, _> = (0..size).map(|i| (i, i)).collect();
308-
309-
let mut j = 0;
310-
for ((&k, &v), i) in map.range(2..).zip(2..size) {
311-
assert_eq!(k, i);
312-
assert_eq!(v, i);
313-
j += 1;
314-
}
315-
assert_eq!(j, size - 2);
310+
fn range_keys(map: &BTreeMap<i32, i32>, range: impl RangeBounds<i32>) -> Vec<i32> {
311+
map.range(range)
312+
.map(|(&k, &v)| {
313+
assert_eq!(k, v);
314+
k
315+
})
316+
.collect()
316317
}
317318

318319
#[test]
319-
fn test_range_inclusive() {
320-
let size = 500;
320+
fn test_range_small() {
321+
let size = 4;
322+
323+
let map: BTreeMap<_, _> = (1..=size).map(|i| (i, i)).collect();
324+
let all: Vec<_> = (1..=size).collect();
325+
let (first, last) = (vec![all[0]], vec![all[size as usize - 1]]);
326+
327+
assert_eq!(range_keys(&map, (Excluded(0), Excluded(size + 1))), all);
328+
assert_eq!(range_keys(&map, (Excluded(0), Included(size + 1))), all);
329+
assert_eq!(range_keys(&map, (Excluded(0), Included(size))), all);
330+
assert_eq!(range_keys(&map, (Excluded(0), Unbounded)), all);
331+
assert_eq!(range_keys(&map, (Included(0), Excluded(size + 1))), all);
332+
assert_eq!(range_keys(&map, (Included(0), Included(size + 1))), all);
333+
assert_eq!(range_keys(&map, (Included(0), Included(size))), all);
334+
assert_eq!(range_keys(&map, (Included(0), Unbounded)), all);
335+
assert_eq!(range_keys(&map, (Included(1), Excluded(size + 1))), all);
336+
assert_eq!(range_keys(&map, (Included(1), Included(size + 1))), all);
337+
assert_eq!(range_keys(&map, (Included(1), Included(size))), all);
338+
assert_eq!(range_keys(&map, (Included(1), Unbounded)), all);
339+
assert_eq!(range_keys(&map, (Unbounded, Excluded(size + 1))), all);
340+
assert_eq!(range_keys(&map, (Unbounded, Included(size + 1))), all);
341+
assert_eq!(range_keys(&map, (Unbounded, Included(size))), all);
342+
assert_eq!(range_keys(&map, ..), all);
343+
344+
assert_eq!(range_keys(&map, (Excluded(0), Excluded(1))), vec![]);
345+
assert_eq!(range_keys(&map, (Excluded(0), Included(0))), vec![]);
346+
assert_eq!(range_keys(&map, (Included(0), Included(0))), vec![]);
347+
assert_eq!(range_keys(&map, (Included(0), Excluded(1))), vec![]);
348+
assert_eq!(range_keys(&map, (Unbounded, Excluded(1))), vec![]);
349+
assert_eq!(range_keys(&map, (Unbounded, Included(0))), vec![]);
350+
assert_eq!(range_keys(&map, (Excluded(0), Excluded(2))), first);
351+
assert_eq!(range_keys(&map, (Excluded(0), Included(1))), first);
352+
assert_eq!(range_keys(&map, (Included(0), Excluded(2))), first);
353+
assert_eq!(range_keys(&map, (Included(0), Included(1))), first);
354+
assert_eq!(range_keys(&map, (Included(1), Excluded(2))), first);
355+
assert_eq!(range_keys(&map, (Included(1), Included(1))), first);
356+
assert_eq!(range_keys(&map, (Unbounded, Excluded(2))), first);
357+
assert_eq!(range_keys(&map, (Unbounded, Included(1))), first);
358+
assert_eq!(range_keys(&map, (Excluded(size - 1), Excluded(size + 1))), last);
359+
assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size + 1))), last);
360+
assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size))), last);
361+
assert_eq!(range_keys(&map, (Excluded(size - 1), Unbounded)), last);
362+
assert_eq!(range_keys(&map, (Included(size), Excluded(size + 1))), last);
363+
assert_eq!(range_keys(&map, (Included(size), Included(size + 1))), last);
364+
assert_eq!(range_keys(&map, (Included(size), Included(size))), last);
365+
assert_eq!(range_keys(&map, (Included(size), Unbounded)), last);
366+
assert_eq!(range_keys(&map, (Excluded(size), Excluded(size + 1))), vec![]);
367+
assert_eq!(range_keys(&map, (Excluded(size), Included(size))), vec![]);
368+
assert_eq!(range_keys(&map, (Excluded(size), Unbounded)), vec![]);
369+
assert_eq!(range_keys(&map, (Included(size + 1), Excluded(size + 1))), vec![]);
370+
assert_eq!(range_keys(&map, (Included(size + 1), Included(size + 1))), vec![]);
371+
assert_eq!(range_keys(&map, (Included(size + 1), Unbounded)), vec![]);
372+
373+
assert_eq!(range_keys(&map, ..3), vec![1, 2]);
374+
assert_eq!(range_keys(&map, 3..), vec![3, 4]);
375+
assert_eq!(range_keys(&map, 2..=3), vec![2, 3]);
376+
}
377+
378+
#[test]
379+
fn test_range_depth_2() {
380+
// Assuming that node.CAPACITY is 11, having 12 pairs implies a depth 2 tree
381+
// with 2 leaves. Depending on details we don't want or need to rely upon,
382+
// the single key at the root will be 6 or 7.
383+
384+
let map: BTreeMap<_, _> = (1..=12).map(|i| (i, i)).collect();
385+
for &root in &[6, 7] {
386+
assert_eq!(range_keys(&map, (Excluded(root), Excluded(root + 1))), vec![]);
387+
assert_eq!(range_keys(&map, (Excluded(root), Included(root + 1))), vec![root + 1]);
388+
assert_eq!(range_keys(&map, (Included(root), Excluded(root + 1))), vec![root]);
389+
assert_eq!(range_keys(&map, (Included(root), Included(root + 1))), vec![root, root + 1]);
390+
391+
assert_eq!(range_keys(&map, (Excluded(root - 1), Excluded(root))), vec![]);
392+
assert_eq!(range_keys(&map, (Included(root - 1), Excluded(root))), vec![root - 1]);
393+
assert_eq!(range_keys(&map, (Excluded(root - 1), Included(root))), vec![root]);
394+
assert_eq!(range_keys(&map, (Included(root - 1), Included(root))), vec![root - 1, root]);
395+
}
396+
}
397+
398+
#[test]
399+
fn test_range_large() {
400+
let size = 200;
321401

322-
let map: BTreeMap<_, _> = (0..=size).map(|i| (i, i)).collect();
402+
let map: BTreeMap<_, _> = (1..=size).map(|i| (i, i)).collect();
403+
let all: Vec<_> = (1..=size).collect();
404+
let (first, last) = (vec![all[0]], vec![all[size as usize - 1]]);
405+
406+
assert_eq!(range_keys(&map, (Excluded(0), Excluded(size + 1))), all);
407+
assert_eq!(range_keys(&map, (Excluded(0), Included(size + 1))), all);
408+
assert_eq!(range_keys(&map, (Excluded(0), Included(size))), all);
409+
assert_eq!(range_keys(&map, (Excluded(0), Unbounded)), all);
410+
assert_eq!(range_keys(&map, (Included(0), Excluded(size + 1))), all);
411+
assert_eq!(range_keys(&map, (Included(0), Included(size + 1))), all);
412+
assert_eq!(range_keys(&map, (Included(0), Included(size))), all);
413+
assert_eq!(range_keys(&map, (Included(0), Unbounded)), all);
414+
assert_eq!(range_keys(&map, (Included(1), Excluded(size + 1))), all);
415+
assert_eq!(range_keys(&map, (Included(1), Included(size + 1))), all);
416+
assert_eq!(range_keys(&map, (Included(1), Included(size))), all);
417+
assert_eq!(range_keys(&map, (Included(1), Unbounded)), all);
418+
assert_eq!(range_keys(&map, (Unbounded, Excluded(size + 1))), all);
419+
assert_eq!(range_keys(&map, (Unbounded, Included(size + 1))), all);
420+
assert_eq!(range_keys(&map, (Unbounded, Included(size))), all);
421+
assert_eq!(range_keys(&map, ..), all);
422+
423+
assert_eq!(range_keys(&map, (Excluded(0), Excluded(1))), vec![]);
424+
assert_eq!(range_keys(&map, (Excluded(0), Included(0))), vec![]);
425+
assert_eq!(range_keys(&map, (Included(0), Included(0))), vec![]);
426+
assert_eq!(range_keys(&map, (Included(0), Excluded(1))), vec![]);
427+
assert_eq!(range_keys(&map, (Unbounded, Excluded(1))), vec![]);
428+
assert_eq!(range_keys(&map, (Unbounded, Included(0))), vec![]);
429+
assert_eq!(range_keys(&map, (Excluded(0), Excluded(2))), first);
430+
assert_eq!(range_keys(&map, (Excluded(0), Included(1))), first);
431+
assert_eq!(range_keys(&map, (Included(0), Excluded(2))), first);
432+
assert_eq!(range_keys(&map, (Included(0), Included(1))), first);
433+
assert_eq!(range_keys(&map, (Included(1), Excluded(2))), first);
434+
assert_eq!(range_keys(&map, (Included(1), Included(1))), first);
435+
assert_eq!(range_keys(&map, (Unbounded, Excluded(2))), first);
436+
assert_eq!(range_keys(&map, (Unbounded, Included(1))), first);
437+
assert_eq!(range_keys(&map, (Excluded(size - 1), Excluded(size + 1))), last);
438+
assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size + 1))), last);
439+
assert_eq!(range_keys(&map, (Excluded(size - 1), Included(size))), last);
440+
assert_eq!(range_keys(&map, (Excluded(size - 1), Unbounded)), last);
441+
assert_eq!(range_keys(&map, (Included(size), Excluded(size + 1))), last);
442+
assert_eq!(range_keys(&map, (Included(size), Included(size + 1))), last);
443+
assert_eq!(range_keys(&map, (Included(size), Included(size))), last);
444+
assert_eq!(range_keys(&map, (Included(size), Unbounded)), last);
445+
assert_eq!(range_keys(&map, (Excluded(size), Excluded(size + 1))), vec![]);
446+
assert_eq!(range_keys(&map, (Excluded(size), Included(size))), vec![]);
447+
assert_eq!(range_keys(&map, (Excluded(size), Unbounded)), vec![]);
448+
assert_eq!(range_keys(&map, (Included(size + 1), Excluded(size + 1))), vec![]);
449+
assert_eq!(range_keys(&map, (Included(size + 1), Included(size + 1))), vec![]);
450+
assert_eq!(range_keys(&map, (Included(size + 1), Unbounded)), vec![]);
323451

324452
fn check<'a, L, R>(lhs: L, rhs: R)
325453
where
@@ -331,18 +459,9 @@ fn test_range_inclusive() {
331459
assert_eq!(lhs, rhs);
332460
}
333461

334-
check(map.range(size + 1..=size + 1), vec![]);
335-
check(map.range(size..=size), vec![(&size, &size)]);
336-
check(map.range(size..=size + 1), vec![(&size, &size)]);
337-
check(map.range(0..=0), vec![(&0, &0)]);
338-
check(map.range(0..=size - 1), map.range(..size));
339-
check(map.range(-1..=-1), vec![]);
340-
check(map.range(-1..=size), map.range(..));
341-
check(map.range(..=size), map.range(..));
342-
check(map.range(..=200), map.range(..201));
462+
check(map.range(..=100), map.range(..101));
343463
check(map.range(5..=8), vec![(&5, &5), (&6, &6), (&7, &7), (&8, &8)]);
344-
check(map.range(-1..=0), vec![(&0, &0)]);
345-
check(map.range(-1..=2), vec![(&0, &0), (&1, &1), (&2, &2)]);
464+
check(map.range(-1..=2), vec![(&1, &1), (&2, &2)]);
346465
}
347466

348467
#[test]

0 commit comments

Comments
 (0)
Please sign in to comment.