Skip to content

Commit 70a685e

Browse files
authored
Rewrite Tests for Sorting Algorithms Idiomatically (#479)
1 parent 44fb98b commit 70a685e

24 files changed

+292
-175
lines changed

src/lib.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,13 @@ mod tests {
2323
//descending
2424
let mut ve1 = vec![6, 5, 4, 3, 2, 1];
2525
sorting::quick_sort(&mut ve1);
26-
for i in 0..ve1.len() - 1 {
27-
assert!(ve1[i] <= ve1[i + 1]);
28-
}
26+
27+
assert!(sorting::is_sorted(&ve1));
2928

3029
//pre-sorted
3130
let mut ve2 = vec![1, 2, 3, 4, 5, 6];
3231
sorting::quick_sort(&mut ve2);
33-
for i in 0..ve2.len() - 1 {
34-
assert!(ve2[i] <= ve2[i + 1]);
35-
}
32+
33+
assert!(sorting::is_sorted(&ve2));
3634
}
3735
}

src/sorting/bead_sort.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
pub fn bead_sort(a: &mut [usize]) {
44
// Find the maximum element
55
let mut max = a[0];
6-
for i in 1..a.len() {
6+
(1..a.len()).for_each(|i| {
77
if a[i] > max {
88
max = a[i];
99
}
10-
}
10+
});
1111

1212
// allocating memory
1313
let mut beads = vec![vec![0; max]; a.len()];
@@ -22,10 +22,10 @@ pub fn bead_sort(a: &mut [usize]) {
2222
// move down the beads
2323
for j in 0..max {
2424
let mut sum = 0;
25-
for i in 0..a.len() {
25+
(0..a.len()).for_each(|i| {
2626
sum += beads[i][j];
2727
beads[i][j] = 0;
28-
}
28+
});
2929

3030
for k in ((a.len() - sum)..a.len()).rev() {
3131
a[k] = j + 1;
@@ -36,24 +36,24 @@ pub fn bead_sort(a: &mut [usize]) {
3636
#[cfg(test)]
3737
mod tests {
3838
use super::*;
39+
use crate::sorting::have_same_elements;
40+
use crate::sorting::is_sorted;
3941

4042
#[test]
4143
fn descending() {
4244
//descending
4345
let mut ve1: [usize; 5] = [5, 4, 3, 2, 1];
46+
let cloned = ve1;
4447
bead_sort(&mut ve1);
45-
for i in 0..ve1.len() - 1 {
46-
assert!(ve1[i] <= ve1[i + 1]);
47-
}
48+
assert!(is_sorted(&ve1) && have_same_elements(&ve1, &cloned));
4849
}
4950

5051
#[test]
5152
fn mix_values() {
5253
//pre-sorted
5354
let mut ve2: [usize; 5] = [7, 9, 6, 2, 3];
55+
let cloned = ve2;
5456
bead_sort(&mut ve2);
55-
for j in 0..ve2.len() - 1 {
56-
assert!(ve2[j] <= ve2[j + 1]);
57-
}
57+
assert!(is_sorted(&ve2) && have_same_elements(&ve2, &cloned));
5858
}
5959
}

src/sorting/bitonic_sort.rs

+4-6
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,17 @@ mod tests {
3535
fn descending() {
3636
//descending
3737
let mut ve1 = vec![6, 5, 4, 3];
38+
let cloned = ve1.clone();
3839
bitonic_sort(&mut ve1, 0, 4, 1);
39-
for i in 0..ve1.len() - 1 {
40-
assert!(ve1[i] <= ve1[i + 1]);
41-
}
40+
assert!(is_sorted(&ve1) && have_same_elements(&ve1, &cloned));
4241
}
4342

4443
#[test]
4544
fn ascending() {
4645
//pre-sorted
4746
let mut ve2 = vec![1, 2, 3, 4];
47+
let cloned = ve2.clone();
4848
bitonic_sort(&mut ve2, 0, 4, 0);
49-
for i in 0..ve2.len() - 1 {
50-
assert!(ve2[i] >= ve2[i + 1]);
51-
}
49+
assert!(is_sorted(&ve2) && have_same_elements(&ve2, &cloned));
5250
}
5351
}

src/sorting/bubble_sort.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,32 @@ pub fn bubble_sort<T: Ord>(arr: &mut [T]) {
1818

1919
#[cfg(test)]
2020
mod tests {
21-
use super::super::is_sorted;
2221
use super::*;
22+
use crate::sorting::have_same_elements;
23+
use crate::sorting::is_sorted;
2324

2425
#[test]
2526
fn descending() {
2627
//descending
2728
let mut ve1 = vec![6, 5, 4, 3, 2, 1];
29+
let cloned = ve1.clone();
2830
bubble_sort(&mut ve1);
29-
assert!(is_sorted(&ve1));
31+
assert!(is_sorted(&ve1) && have_same_elements(&ve1, &cloned));
3032
}
3133

3234
#[test]
3335
fn ascending() {
3436
//pre-sorted
3537
let mut ve2 = vec![1, 2, 3, 4, 5, 6];
38+
let cloned = ve2.clone();
3639
bubble_sort(&mut ve2);
37-
assert!(is_sorted(&ve2));
40+
assert!(is_sorted(&ve2) && have_same_elements(&ve2, &cloned));
3841
}
3942
#[test]
4043
fn empty() {
4144
let mut ve3: Vec<usize> = vec![];
45+
let cloned = ve3.clone();
4246
bubble_sort(&mut ve3);
43-
assert!(is_sorted(&ve3));
47+
assert!(is_sorted(&ve3) && have_same_elements(&ve3, &cloned));
4448
}
4549
}

src/sorting/bucket_sort.rs

+15-8
Original file line numberDiff line numberDiff line change
@@ -33,48 +33,55 @@ pub fn bucket_sort(arr: &[usize]) -> Vec<usize> {
3333

3434
#[cfg(test)]
3535
mod tests {
36-
use super::super::is_sorted;
3736
use super::*;
37+
use crate::sorting::have_same_elements;
38+
use crate::sorting::is_sorted;
3839

3940
#[test]
4041
fn empty() {
4142
let arr: [usize; 0] = [];
43+
let cloned = arr;
4244
let res = bucket_sort(&arr);
43-
assert!(is_sorted(&res));
45+
assert!(is_sorted(&res) && have_same_elements(&res, &cloned));
4446
}
4547

4648
#[test]
4749
fn one_element() {
4850
let arr: [usize; 1] = [4];
51+
let cloned = arr;
4952
let res = bucket_sort(&arr);
50-
assert!(is_sorted(&res));
53+
assert!(is_sorted(&res) && have_same_elements(&res, &cloned));
5154
}
5255

5356
#[test]
5457
fn already_sorted() {
55-
let arr: [usize; 3] = [10, 9, 105];
58+
let arr: [usize; 3] = [10, 19, 105];
59+
let cloned = arr;
5660
let res = bucket_sort(&arr);
57-
assert!(is_sorted(&res));
61+
assert!(is_sorted(&res) && have_same_elements(&res, &cloned));
5862
}
5963

6064
#[test]
6165
fn basic() {
6266
let arr: [usize; 4] = [35, 53, 1, 0];
67+
let cloned = arr;
6368
let res = bucket_sort(&arr);
64-
assert!(is_sorted(&res));
69+
assert!(is_sorted(&res) && have_same_elements(&res, &cloned));
6570
}
6671

6772
#[test]
6873
fn odd_number_of_elements() {
6974
let arr: Vec<usize> = vec![1, 21, 5, 11, 58];
75+
let cloned = arr.clone();
7076
let res = bucket_sort(&arr);
71-
assert!(is_sorted(&res));
77+
assert!(is_sorted(&res) && have_same_elements(&res, &cloned));
7278
}
7379

7480
#[test]
7581
fn repeated_elements() {
7682
let arr: Vec<usize> = vec![542, 542, 542, 542];
83+
let cloned = arr.clone();
7784
let res = bucket_sort(&arr);
78-
assert!(is_sorted(&res));
85+
assert!(is_sorted(&res) && have_same_elements(&res, &cloned));
7986
}
8087
}

src/sorting/cocktail_shaker_sort.rs

+10-4
Original file line numberDiff line numberDiff line change
@@ -37,32 +37,38 @@ pub fn cocktail_shaker_sort<T: Ord>(arr: &mut [T]) {
3737
#[cfg(test)]
3838
mod tests {
3939
use super::*;
40+
use crate::sorting::have_same_elements;
41+
use crate::sorting::is_sorted;
4042

4143
#[test]
4244
fn basic() {
4345
let mut arr = vec![5, 2, 1, 3, 4, 6];
46+
let cloned = arr.clone();
4447
cocktail_shaker_sort(&mut arr);
45-
assert_eq!(arr, vec![1, 2, 3, 4, 5, 6]);
48+
assert!(is_sorted(&arr) && have_same_elements(&arr, &cloned));
4649
}
4750

4851
#[test]
4952
fn empty() {
5053
let mut arr = Vec::<i32>::new();
54+
let cloned = arr.clone();
5155
cocktail_shaker_sort(&mut arr);
52-
assert_eq!(arr, vec![]);
56+
assert!(is_sorted(&arr) && have_same_elements(&arr, &cloned));
5357
}
5458

5559
#[test]
5660
fn one_element() {
5761
let mut arr = vec![1];
62+
let cloned = arr.clone();
5863
cocktail_shaker_sort(&mut arr);
59-
assert_eq!(arr, vec![1]);
64+
assert!(is_sorted(&arr) && have_same_elements(&arr, &cloned));
6065
}
6166

6267
#[test]
6368
fn pre_sorted() {
6469
let mut arr = vec![1, 2, 3, 4, 5, 6];
70+
let cloned = arr.clone();
6571
cocktail_shaker_sort(&mut arr);
66-
assert_eq!(arr, vec![1, 2, 3, 4, 5, 6]);
72+
assert!(is_sorted(&arr) && have_same_elements(&arr, &cloned));
6773
}
6874
}

src/sorting/comb_sort.rs

+8-9
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,33 @@ pub fn comb_sort<T: Ord>(arr: &mut [T]) {
2222
#[cfg(test)]
2323
mod tests {
2424
use super::*;
25+
use crate::sorting::have_same_elements;
26+
use crate::sorting::is_sorted;
2527

2628
#[test]
2729
fn descending() {
2830
//descending
2931
let mut ve1 = vec![6, 5, 4, 3, 2, 1];
32+
let cloned = ve1.clone();
3033
comb_sort(&mut ve1);
31-
for i in 0..ve1.len() - 1 {
32-
assert!(ve1[i] <= ve1[i + 1]);
33-
}
34+
assert!(is_sorted(&ve1) && have_same_elements(&ve1, &cloned));
3435
}
3536

3637
#[test]
3738
fn ascending() {
3839
//pre-sorted
3940
let mut ve2 = vec![1, 2, 3, 4, 5, 6];
41+
let cloned = ve2.clone();
4042
comb_sort(&mut ve2);
41-
for i in 0..ve2.len() - 1 {
42-
assert!(ve2[i] <= ve2[i + 1]);
43-
}
43+
assert!(is_sorted(&ve2) && have_same_elements(&ve2, &cloned));
4444
}
4545

4646
#[test]
4747
fn duplicates() {
4848
//pre-sorted
4949
let mut ve3 = vec![2, 2, 2, 2, 2, 1];
50+
let cloned = ve3.clone();
5051
comb_sort(&mut ve3);
51-
for i in 0..ve3.len() - 1 {
52-
assert!(ve3[i] <= ve3[i + 1]);
53-
}
52+
assert!(is_sorted(&ve3) && have_same_elements(&ve3, &cloned));
5453
}
5554
}

src/sorting/counting_sort.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -51,38 +51,43 @@ pub fn generic_counting_sort<T: Into<u64> + From<u8> + AddAssign + Copy>(
5151

5252
#[cfg(test)]
5353
mod test {
54-
use super::super::is_sorted;
5554
use super::*;
55+
use crate::sorting::have_same_elements;
56+
use crate::sorting::is_sorted;
5657

5758
#[test]
5859
fn counting_sort_descending() {
5960
let mut ve1 = vec![6, 5, 4, 3, 2, 1];
61+
let cloned = ve1.clone();
6062
counting_sort(&mut ve1, 6);
6163

62-
assert!(is_sorted(&ve1));
64+
assert!(is_sorted(&ve1) && have_same_elements(&ve1, &cloned));
6365
}
6466

6567
#[test]
6668
fn counting_sort_pre_sorted() {
6769
let mut ve2 = vec![1, 2, 3, 4, 5, 6];
70+
let cloned = ve2.clone();
6871
counting_sort(&mut ve2, 6);
6972

70-
assert!(is_sorted(&ve2));
73+
assert!(is_sorted(&ve2) && have_same_elements(&ve2, &cloned));
7174
}
7275

7376
#[test]
7477
fn generic_counting_sort() {
7578
let mut ve1: Vec<u8> = vec![100, 30, 60, 10, 20, 120, 1];
79+
let cloned = ve1.clone();
7680
super::generic_counting_sort(&mut ve1, 120);
7781

78-
assert!(is_sorted(&ve1));
82+
assert!(is_sorted(&ve1) && have_same_elements(&ve1, &cloned));
7983
}
8084

8185
#[test]
8286
fn presorted_u64_counting_sort() {
8387
let mut ve2: Vec<u64> = vec![1, 2, 3, 4, 5, 6];
88+
let cloned = ve2.clone();
8489
super::generic_counting_sort(&mut ve2, 6);
8590

86-
assert!(is_sorted(&ve2));
91+
assert!(is_sorted(&ve2) && have_same_elements(&ve2, &cloned));
8792
}
8893
}

src/sorting/cycle_sort.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,28 @@ pub fn cycle_sort(arr: &mut [i32]) {
3333

3434
#[cfg(test)]
3535
mod tests {
36-
use super::super::is_sorted;
36+
3737
use super::*;
38+
use crate::sorting::have_same_elements;
39+
use crate::sorting::is_sorted;
40+
3841
#[test]
3942
fn it_works() {
4043
let mut arr1 = [6, 5, 4, 3, 2, 1];
44+
let cloned = arr1;
4145
cycle_sort(&mut arr1);
42-
assert!(is_sorted(&arr1));
46+
assert!(is_sorted(&arr1) && have_same_elements(&arr1, &cloned));
4347
arr1 = [12, 343, 21, 90, 3, 21];
48+
let cloned = arr1;
4449
cycle_sort(&mut arr1);
45-
assert!(is_sorted(&arr1));
50+
assert!(is_sorted(&arr1) && have_same_elements(&arr1, &cloned));
4651
let mut arr2 = [1];
52+
let cloned = arr2;
4753
cycle_sort(&mut arr2);
48-
assert!(is_sorted(&arr2));
54+
assert!(is_sorted(&arr2) && have_same_elements(&arr2, &cloned));
4955
let mut arr3 = [213, 542, 90, -23412, -32, 324, -34, 3324, 54];
56+
let cloned = arr3;
5057
cycle_sort(&mut arr3);
51-
assert!(is_sorted(&arr3));
58+
assert!(is_sorted(&arr3) && have_same_elements(&arr3, &cloned));
5259
}
5360
}

0 commit comments

Comments
 (0)