mctrust 0.4.0

Universal search & planning toolkit — MCTS, bandit search, pluggable evaluators, tree reuse, DAG transpositions, root parallelism. Define an Environment, search handles the rest.
Documentation
// Property-based tests for mctrust using proptest.

use proptest::test_runner::{Config, TestCaseError, TestRunner};
use mctrust::*;

#[test]
fn outcome_terminal_implies_reward_exists() {
    let mut runner = TestRunner::new(Config::with_cases(128));
    runner
        .run(&(-1_000_000i32..=1_000_000), |scaled| {
            let reward = f64::from(scaled) / 1_000_000.0;
            let o = Outcome::Terminal(Reward::new(reward));
            if !o.is_terminal() || o.reward().is_none() {
                return Err(TestCaseError::fail("terminal outcome must carry reward"));
            }
            Ok(())
        })
        .unwrap();
}

#[test]
fn outcome_ongoing_implies_no_reward() {
    let o = Outcome::Ongoing;
    assert!(!o.is_terminal() && o.reward().is_none());
}

#[test]
fn outcome_failure_is_terminal_with_loss() {
    assert!(Outcome::Failure.is_terminal());
    assert_eq!(Outcome::Failure.reward(), Some(Reward::LOSS));
}

#[test]
fn outcome_neutral_is_terminal_with_draw() {
    assert!(Outcome::Neutral.is_terminal());
    assert_eq!(Outcome::Neutral.reward(), Some(Reward::DRAW));
}