extern crate bytecount; #[macro_use] extern crate quickcheck; extern crate rand; use bytecount::{count, naive_count, naive_num_chars, num_chars}; use rand::RngCore; fn random_bytes(len: usize) -> Vec { let mut result = vec![0; len]; rand::thread_rng().fill_bytes(&mut result); result } quickcheck! { fn check_count_correct(x: (Vec, u8)) -> bool { let (haystack, needle) = x; count(&haystack, needle) == naive_count(&haystack, needle) } } #[test] fn check_count_large() { let haystack = vec![0u8; if cfg!(miri) { 2_000 } else { 10_000_000 }]; assert_eq!(naive_count(&haystack, 0), count(&haystack, 0)); assert_eq!(naive_count(&haystack, 1), count(&haystack, 1)); } #[test] fn check_count_large_rand() { let haystack = random_bytes(if cfg!(miri) { 200 } else { 100_000 }); for i in 0..=255 { assert_eq!(naive_count(&haystack, i), count(&haystack, i)); } } #[test] fn check_count_some() { let haystack = vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68]; let needle = 68; assert_eq!(count(&haystack, needle), naive_count(&haystack, needle)); } #[test] fn check_count_overflow() { let haystack = vec![0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; let needle = 2; assert_eq!(count(&haystack, needle), naive_count(&haystack, needle)); } #[test] fn check_count_overflow_many() { let string = [b'x'; 20000]; for i in 0..20000 { assert_eq!(count(&string[..i], b'x'), i); } } quickcheck! { fn check_num_chars_correct(haystack: Vec) -> bool { num_chars(&haystack) == naive_num_chars(&haystack) } } #[test] fn check_num_chars_large() { let haystack = vec![0u8; if cfg!(miri) { 2_000 } else { 10_000_000 }]; assert_eq!(naive_num_chars(&haystack), num_chars(&haystack)); assert_eq!(naive_num_chars(&haystack), num_chars(&haystack)); } #[test] fn check_num_chars_some() { let haystack = vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68]; assert_eq!(num_chars(&haystack), naive_num_chars(&haystack)); } #[test] fn check_num_chars_overflow() { let haystack = vec![0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; assert_eq!(num_chars(&haystack), naive_num_chars(&haystack)); } #[test] fn check_num_chars_overflow_many() { let string = [b'x'; 20000]; for i in 0..20000 { assert_eq!(num_chars(&string[..i]), i); } }