blob: f2d440853096877bfd273500145c397c5b45178b [file] [log] [blame]
//-
// Copyright 2018 Jason Lingle
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// This #[cfg] is only here so that CI can test building proptest with the
// timeout feature disabled. You do not need it in your code.
#[cfg(feature = "timeout")]
mod fib {
use proptest::prelude::*;
// The worst possible way to calculate Fibonacci numbers
fn fib(n: u64) -> u64 {
if n <= 1 {
n
} else {
fib(n - 1) + fib(n - 2)
}
}
proptest! {
#![proptest_config(ProptestConfig {
// Setting both fork and timeout is redundant since timeout implies
// fork, but both are shown for clarity.
fork: true,
timeout: 1000,
.. ProptestConfig::default()
})]
// NB We omit #[test] on the test function so that main() can call it.
fn test_fib(n in prop::num::u64::ANY) {
// For large n, this will variously run for an extremely long time,
// overflow the stack, or panic due to integer overflow.
assert!(fib(n) >= n);
}
}
// This is just here so that main can call it
pub fn do_test_fib() {
test_fib();
}
}
fn main() {
#[cfg(feature = "timeout")]
fib::do_test_fib();
}