Skip to content

Commit

Permalink
Rollup merge of #40947 - stjepang:test-sort-random-cmp, r=alexcrichton
Browse files Browse the repository at this point in the history
Test sort algorithms using a random cmp function

This ensures that sorting using a broken comparison function doesn't panic nor fail in some other way (especially not segfault).

r? @alexcrichton
  • Loading branch information
frewsxcv committed Mar 31, 2017
2 parents cd631a9 + 0e2d3d4 commit 07b657a
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
16 changes: 15 additions & 1 deletion src/libcollectionstest/slice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,9 +383,11 @@ fn test_reverse() {

#[test]
fn test_sort() {
let mut rng = thread_rng();

for len in (2..25).chain(500..510) {
for _ in 0..100 {
let mut v: Vec<_> = thread_rng().gen_iter::<i32>().take(len).collect();
let mut v: Vec<_> = rng.gen_iter::<i32>().take(len).collect();
let mut v1 = v.clone();

v.sort();
Expand All @@ -399,6 +401,18 @@ fn test_sort() {
}
}

// Sort using a completely random comparison function.
// This will reorder the elements *somehow*, but won't panic.
let mut v = [0; 500];
for i in 0..v.len() {
v[i] = i as i32;
}
v.sort_by(|_, _| *rng.choose(&[Less, Equal, Greater]).unwrap());
v.sort();
for i in 0..v.len() {
assert_eq!(v[i], i as i32);
}

// Should not panic.
[0i32; 0].sort();
[(); 10].sort();
Expand Down
12 changes: 12 additions & 0 deletions src/libcoretest/slice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use core::cmp::Ordering::{Equal, Greater, Less};
use core::slice::heapsort;
use core::result::Result::{Ok, Err};
use rand::{Rng, XorShiftRng};
Expand Down Expand Up @@ -268,6 +269,17 @@ fn sort_unstable() {
}
}

// Sort using a completely random comparison function.
// This will reorder the elements *somehow*, but won't panic.
for i in 0..v.len() {
v[i] = i as i32;
}
v.sort_unstable_by(|_, _| *rng.choose(&[Less, Equal, Greater]).unwrap());
v.sort_unstable();
for i in 0..v.len() {
assert_eq!(v[i], i as i32);
}

// Should not panic.
[0i32; 0].sort_unstable();
[(); 10].sort_unstable();
Expand Down

0 comments on commit 07b657a

Please sign in to comment.