diff options
| author | Corey Farwell <coreyf@rwell.org> | 2017-03-31 16:48:29 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-03-31 16:48:29 -0400 |
| commit | 54b3f6aa21818318c0cf9c6d7fc2e17d50bfe4d4 (patch) | |
| tree | 3bd9adab1026631921ab10fca0efe84dc67b53aa | |
| parent | c9a9d7acaf74a57ad37cdd883c2f138ea59efc28 (diff) | |
| parent | 0e2d3d41bb42abe1c40585d2ed06aea2840e664f (diff) | |
| download | rust-54b3f6aa21818318c0cf9c6d7fc2e17d50bfe4d4.tar.gz rust-54b3f6aa21818318c0cf9c6d7fc2e17d50bfe4d4.zip | |
Rollup merge of #40947 - stjepang:test-sort-random-cmp, r=alexcrichton
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
| -rw-r--r-- | src/libcollectionstest/slice.rs | 16 | ||||
| -rw-r--r-- | src/libcoretest/slice.rs | 12 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/libcollectionstest/slice.rs b/src/libcollectionstest/slice.rs index 00d4dbe9c04..c3e5304fb2b 100644 --- a/src/libcollectionstest/slice.rs +++ b/src/libcollectionstest/slice.rs @@ -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(); @@ -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(); diff --git a/src/libcoretest/slice.rs b/src/libcoretest/slice.rs index 89bd3be0851..ec38345030f 100644 --- a/src/libcoretest/slice.rs +++ b/src/libcoretest/slice.rs @@ -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}; @@ -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(); |
