diff --git a/Cargo.lock b/Cargo.lock index 934c3b2..47e9bd5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,6 +55,8 @@ dependencies = [ "num-derive", "num-traits", "pretty_env_logger", + "quickcheck", + "quickcheck_macros", "thiserror", "zip", ] @@ -137,6 +139,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "getrandom" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "heck" version = "0.3.1" @@ -241,6 +254,12 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b18befed8bc2b61abc79a457295e7e838417326da1586050b919414073977f19" +[[package]] +name = "ppv-lite86" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea" + [[package]] name = "pretty_env_logger" version = "0.4.0" @@ -292,6 +311,29 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quickcheck" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f" +dependencies = [ + "env_logger", + "log", + "rand", + "rand_core", +] + +[[package]] +name = "quickcheck_macros" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608c156fd8e97febc07dc9c2e2c80bf74cfc6ef26893eae3daf8bc2bc94a4b7f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.7" @@ -301,6 +343,47 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + [[package]] name = "regex" version = "1.3.9" @@ -424,6 +507,12 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "winapi" version = "0.3.8" diff --git a/Cargo.toml b/Cargo.toml index 5d369c0..e7e04fc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,3 +14,7 @@ num-traits = "0.2" pretty_env_logger = "0.4" thiserror = "1.0.20" zip = { version = "0.5.5", default-features = false, features = ["deflate"] } + +[dev-dependencies] +quickcheck = "0.9.2" +quickcheck_macros = "0.9.1" diff --git a/README.md b/README.md index 5660bc6..fa3c8f5 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Basic Usage: This is my first rust project. Don’t expect too much from the code in terms of quality, robustness or idiomacity (especially regarding error handling). There -currently are no tests. +currently are no tests for the actual functionality. Large portions of this tool would not have been possible without the following resources: diff --git a/src/lib.rs b/src/lib.rs index 1ac793a..882c4b5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,7 @@ +#[cfg(test)] +#[macro_use(quickcheck)] +extern crate quickcheck_macros; + pub mod converter; pub mod ddr; mod mini_parser; diff --git a/src/utils.rs b/src/utils.rs index 0a06c40..e227615 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,6 @@ use std::fmt; -pub fn get_nth_bit(byte: u8, n: u8) -> bool { +fn get_nth_bit(byte: u8, n: u8) -> bool { ((byte & (0b1 << n)) >> n) != 0 } @@ -12,6 +12,16 @@ pub fn byte_to_bitarray(byte: u8) -> [bool; 8] { bitarray } +#[allow(dead_code)] +/// Used to test `byte_to_bitarray` +pub fn bitarray_to_byte(bitarray: [bool; 8]) -> u8 { + bitarray + .iter() + .enumerate() + .map(|(i, bit)| (*bit as u8) << i) + .sum() +} + pub fn join_display_values(iterable: Vec, separator: &'_ str) -> String { iterable .iter() @@ -19,3 +29,40 @@ pub fn join_display_values(iterable: Vec, separator: &'_ str .collect::>() .join(&separator) } + +#[cfg(test)] +mod tests { + use super::*; + use quickcheck::TestResult; + + /// Helper function to test bitarray functions + fn vec_to_arr_bool_8(vector: Vec) -> [bool; 8] { + let mut array = [false; 8]; + for (arr_el, vec_el) in array.iter_mut().zip(vector.into_iter()) { + *arr_el = vec_el; + } + array + } + + #[quickcheck] + fn test_vec_to_arr_bool_8(vector: Vec) -> TestResult { + if vector.len() != 8 { + return TestResult::discard(); + } + TestResult::from_bool(vec_to_arr_bool_8(vector.clone()).to_vec() == vector) + } + + #[quickcheck] + fn test_byte_to_bitarray(byte: u8) -> bool { + bitarray_to_byte(byte_to_bitarray(byte)) == byte + } + + #[quickcheck] + fn test_bitarray_to_byte(bitvec: Vec) -> TestResult { + if bitvec.len() != 8 { + return TestResult::discard(); + } + let bitarray = vec_to_arr_bool_8(bitvec); + TestResult::from_bool(byte_to_bitarray(bitarray_to_byte(bitarray)) == bitarray) + } +}