use crate::{never, ord_t_comparator};
#[test]
fn empty() {
let mut list: Vec<u32> = vec![];
sort(&mut list);
assert!(list.is_empty());
}
#[test]
fn single() {
let mut list = vec![42];
sort(&mut list);
assert!(list[0] == 42);
}
#[test]
fn unsorted() {
let mut list = vec![3, 1, 0, 4];
sort(&mut list);
assert!(list[0] == 0);
assert!(list[1] == 1);
assert!(list[2] == 3);
assert!(list[3] == 4);
}
#[test]
fn reverse() {
let mut list = vec![21, 18, 7, 1];
sort(&mut list);
assert!(list[0] == 1);
assert!(list[1] == 7);
assert!(list[2] == 18);
assert!(list[3] == 21);
}
#[test]
fn sorted() {
let mut list = vec![0, 1, 2, 3];
sort(&mut list);
assert!(list[0] == 0);
assert!(list[1] == 1);
assert!(list[2] == 2);
assert!(list[3] == 3);
}
#[test]
fn stable_npow2() {
let len = 259;
let mut key1: usize = 0;
let mut key2: usize = 0;
#[derive(Debug)]
struct Item {
key1: usize,
key2: usize,
}
let mut list: Vec<Item> = (0..len)
.map(|_| {
key1 += 1;
key1 %= 5;
key2 += 1;
Item { key1, key2 }
})
.collect();
crate::sort_by_gt(&mut list, |a, b| a.key1 > b.key1);
for i in 0..(len - 1) {
assert!(list[i].key1 <= list[i + 1].key1);
if list[i].key1 == list[i + 1].key1 {
assert!(list[i].key2 <= list[i + 1].key2);
}
}
}
#[test]
fn stable() {
let len = 256;
let mut key1: usize = 0;
let mut key2: usize = 0;
#[derive(Debug)]
struct Item {
key1: usize,
key2: usize,
}
let mut list: Vec<Item> = (0..len)
.map(|_| {
key1 += 1;
key1 %= 5;
key2 += 1;
Item { key1, key2 }
})
.collect();
crate::sort_by_gt(&mut list, |a, b| a.key1 > b.key1);
for i in 0..(len - 1) {
assert!(list[i].key1 <= list[i + 1].key1);
if list[i].key1 == list[i + 1].key1 {
assert!(list[i].key2 <= list[i + 1].key2);
}
}
}
fn sort<T: Ord>(list: &mut [T]) {
super::SortState::new(list, &ord_t_comparator())
.sort()
.unwrap_or_else(never)
}