From 6e5de816552ab47151f83f8ecb2bea1af47c3e7b Mon Sep 17 00:00:00 2001 From: Jason Staten Date: Tue, 10 Jul 2018 13:35:38 -0600 Subject: [PATCH] Quickcheck! --- Cargo.lock | 204 +++++++++++++++++++++++++++++++ Cargo.toml | 3 +- src/ch05_bigo/mod.rs | 1 + src/ch05_bigo/search.rs | 67 +++++----- src/ch07_algorithms/bubble.rs | 13 ++ src/ch07_algorithms/insertion.rs | 10 ++ src/ch07_algorithms/mod.rs | 2 + src/ch07_algorithms/selection.rs | 10 ++ src/lib.rs | 8 +- 9 files changed, 285 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e8877e..e7e445e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,8 +1,31 @@ +[[package]] +name = "aho-corasick" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "atty" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "bitflags" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "cfg-if" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cloudabi" version = "0.0.3" @@ -11,6 +34,18 @@ dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "env_logger" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -25,18 +60,73 @@ name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "humantime" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "imposters" version = "0.1.0" dependencies = [ + "quickcheck 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lazy_static" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" version = "0.2.42" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "log" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "memchr" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quick-error" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "quickcheck" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "env_logger 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand" version = "0.5.3" @@ -54,6 +144,89 @@ name = "rand_core" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "redox_syscall" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "redox_termios" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "termcolor" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "termion" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread_local" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ucd-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "utf8-ranges" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi" version = "0.3.5" @@ -73,14 +246,45 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wincolor" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] +"checksum aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0ba20154ea1f47ce2793322f049c5646cc6d0fa9759d5f333f286e507bf8080" +"checksum atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc4a1aa4c24c0718a250f0681885c1af91419d242f29eb8f2ab28502d80dbd1" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" +"checksum cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efe5c877e17a9c717a0bf3613b2709f723202c4e4675cc8f12926ded29bcb17e" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +"checksum env_logger 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0e6e40ebb0e66918a37b38c7acab4e10d299e0463fe2af5d29b9cc86710cfd2a" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum humantime 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0484fda3e7007f2a4a0d9c3a703ca38c71c54c55602ce4660c419fd32e188c9e" +"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" +"checksum log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "61bd98ae7f7b754bc53dca7d44b604f733c6bba044ea6f41bc8d89272d8161d2" +"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" +"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" +"checksum quickcheck 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c01babc5ffd48a2a83744b3024814bb46dfd4f2a4705ccb44b1b60e644fdcab7" +"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rand 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6802c0e883716383777e147b7c21323d5de7527257c8b6dc1365a7f2983e90f6" "checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2" +"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" +"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" +"checksum regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13c93d55961981ba9226a213b385216f83ab43bd6ac53ab16b2eeb47e337cf4e" +"checksum regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05b06a75f5217880fc5e905952a42750bf44787e56a6c6d6852ed0992f5e1d54" +"checksum termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "adc4587ead41bf016f11af03e55a624c06568b5a19db4e90fde573d805074f83" +"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" +"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" +"checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" +"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" +"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "773ef9dcc5f24b7d850d0ff101e542ff24c3b090a9768e03ff889fdef41f00fd" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum wincolor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb06499a3a4d44302791052df005d5232b927ed1a9658146d842165c4de7767" diff --git a/Cargo.toml b/Cargo.toml index efbd741..fec7d42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,5 +2,6 @@ authors = ["Jason Staten "] name = "imposters" version = "0.1.0" -[dependencies] +[dev-dependencies] +quickcheck = "0.6.2" rand = "0.5.3" diff --git a/src/ch05_bigo/mod.rs b/src/ch05_bigo/mod.rs index 0d4d895..5bd34e0 100644 --- a/src/ch05_bigo/mod.rs +++ b/src/ch05_bigo/mod.rs @@ -1,2 +1,3 @@ mod search; +#[cfg(test)] mod vec_basic; diff --git a/src/ch05_bigo/search.rs b/src/ch05_bigo/search.rs index 8670cbd..62b6ed2 100644 --- a/src/ch05_bigo/search.rs +++ b/src/ch05_bigo/search.rs @@ -1,7 +1,5 @@ #![allow(unused)] #[allow(unused_imports)] -extern crate test; -use test::{black_box, Bencher}; pub fn brute_force_search(arr: &[T], el: T) -> bool { for i in 0..arr.len() { @@ -26,38 +24,45 @@ pub fn binary_search(arr: &[T], el: T) -> bool { } } -#[test] -fn test_brute_force_miss() { - let vec: Vec = (0..100).collect(); - assert_eq!(brute_force_search(&vec, 101), false) -} +#[cfg(test)] +mod test { + use super::*; + use test::{black_box, Bencher}; -#[test] -fn test_brute_force_hit() { - let vec: Vec = (0..100).collect(); - assert_eq!(brute_force_search(&vec, 42), true) -} + #[test] + fn test_brute_force_miss() { + let vec: Vec = (0..100).collect(); + assert_eq!(brute_force_search(&vec, 101), false) + } -#[test] -fn test_binary_miss() { - let vec: Vec = (0..100).collect(); - assert_eq!(binary_search(&vec, 101), false) -} + #[test] + fn test_brute_force_hit() { + let vec: Vec = (0..100).collect(); + assert_eq!(brute_force_search(&vec, 42), true) + } -#[test] -fn test_binary_hit() { - let vec: Vec = (0..100).collect(); - assert_eq!(binary_search(&vec, 42), true) -} + #[test] + fn test_binary_miss() { + let vec: Vec = (0..100).collect(); + assert_eq!(binary_search(&vec, 101), false) + } -#[bench] -fn bench_brute_force(b: &mut test::Bencher) { - let vec: Vec = (0..1000000).collect(); - b.iter(|| black_box(brute_force_search(&vec, 900000))); -} + #[test] + fn test_binary_hit() { + let vec: Vec = (0..100).collect(); + assert_eq!(binary_search(&vec, 42), true) + } + + #[bench] + fn bench_brute_force(b: &mut test::Bencher) { + let vec: Vec = (0..1000000).collect(); + b.iter(|| black_box(brute_force_search(&vec, 900000))); + } + + #[bench] + fn bench_binary_search(b: &mut test::Bencher) { + let vec: Vec = (0..1000000).collect(); + b.iter(|| black_box(binary_search(&vec, 900000))); + } -#[bench] -fn bench_binary_search(b: &mut test::Bencher) { - let vec: Vec = (0..1000000).collect(); - b.iter(|| black_box(binary_search(&vec, 900000))); } diff --git a/src/ch07_algorithms/bubble.rs b/src/ch07_algorithms/bubble.rs index 7fe36c3..73f3f83 100644 --- a/src/ch07_algorithms/bubble.rs +++ b/src/ch07_algorithms/bubble.rs @@ -2,6 +2,9 @@ pub fn bubble_sort(source: &mut [T]) where T: Ord, { + if source.len() == 0 { + return; + } let mut keep_going = true; while keep_going { keep_going = false; @@ -24,4 +27,14 @@ mod test { bubble_sort(&mut my_vec); assert_eq!(my_vec, vec![24, 42, 73, 100]) } + + quickcheck! { + fn test_any_sort(xs : Vec) -> bool { + let mut expected = xs.clone(); + expected.sort(); + let mut xs = xs; + bubble_sort(&mut xs); + xs == expected + } + } } diff --git a/src/ch07_algorithms/insertion.rs b/src/ch07_algorithms/insertion.rs index 0536c33..e578e6f 100644 --- a/src/ch07_algorithms/insertion.rs +++ b/src/ch07_algorithms/insertion.rs @@ -23,4 +23,14 @@ mod test { insertion_sort(&mut my_vec); assert_eq!(my_vec, vec![24, 42, 73, 100]) } + + quickcheck! { + fn test_any_sort(xs : Vec) -> bool { + let mut expected = xs.clone(); + expected.sort(); + let mut xs = xs; + insertion_sort(&mut xs); + xs == expected + } + } } diff --git a/src/ch07_algorithms/mod.rs b/src/ch07_algorithms/mod.rs index 9c287ab..c359f6d 100644 --- a/src/ch07_algorithms/mod.rs +++ b/src/ch07_algorithms/mod.rs @@ -1,4 +1,6 @@ +#![cfg(test)] pub mod bench; + pub mod bubble; pub mod insertion; pub mod selection; diff --git a/src/ch07_algorithms/selection.rs b/src/ch07_algorithms/selection.rs index 2ab6734..9185569 100644 --- a/src/ch07_algorithms/selection.rs +++ b/src/ch07_algorithms/selection.rs @@ -23,4 +23,14 @@ mod test { selection_sort(&mut my_vec); assert_eq!(my_vec, vec![24, 42, 73, 100]) } + + quickcheck! { + fn test_any_sort(xs : Vec) -> bool { + let mut expected = xs.clone(); + expected.sort(); + let mut xs = xs; + selection_sort(&mut xs); + xs == expected + } + } } diff --git a/src/lib.rs b/src/lib.rs index 9a45908..2e07dea 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,12 @@ -#![feature(test)] +#![cfg_attr(test, feature(test))] + +#[cfg(test)] extern crate test; +#[cfg(test)] +#[macro_use] +extern crate quickcheck; + pub mod ch04_machinery; pub mod ch05_bigo; pub mod ch06_datastructures;