raikan 0.2.2

Hanabi bot using Hyphenated rules for hanab.io
Documentation
mod tester;

use raikan::game;

#[test]
fn initial_game() {
    let mut tester1 = tester::InstructedPlayer::with_default(game::Move::Discard(0));
    let mut tester2 = tester::InstructedPlayer::with_default(game::Move::Discard(0));

    let mut players: Vec<&mut dyn game::PlayerStrategy> = Vec::new();
    players.push(&mut tester1);
    players.push(&mut tester2);

    let game = game::Game::new(&mut players, false, 234);
    assert_eq!(game.state, game::GameState::Early());
    assert_eq!(game.status.score, 0);
    assert_eq!(game.status.max_score, 25);
}

#[test]
fn discard_on_8_clues() {
    let mut tester1 = tester::InstructedPlayer::with_default(game::Move::Discard(0));
    let mut tester2 = tester::InstructedPlayer::with_default(game::Move::Discard(0));

    let mut players: Vec<&mut dyn game::PlayerStrategy> = Vec::new();
    players.push(&mut tester1);
    players.push(&mut tester2);

    let mut game = game::Game::new(&mut players, false, 234);
    assert_eq!(game.run(&mut players), 0);
    assert_eq!(game.state, game::GameState::Invalid());
    assert_eq!(game.status.max_score, 25); // most cards should have been discarded
}

#[test]
fn striked_game() {
    let mut tester1 = tester::InstructedPlayer::with_default(game::Move::Play(0));
    let mut tester2 = tester::InstructedPlayer::with_default(game::Move::Play(0));

    let mut players: Vec<&mut dyn game::PlayerStrategy> = Vec::new();
    players.push(&mut tester1);
    players.push(&mut tester2);

    let mut game = game::Game::new(&mut players, false, 1238);
    game.run(&mut players);
    assert_ne!(game.status.score, 25); // most cards should have been discarded
    assert_eq!(game.state, game::GameState::Lost());
}

#[test]
fn too_many_clues() {
    let mut tester1 =
        tester::InstructedPlayer::with_default(game::Move::Clue(1, game::Clue::Rank(1)));
    let mut tester2 =
        tester::InstructedPlayer::with_default(game::Move::Clue(1, game::Clue::Rank(1)));

    let mut players: Vec<&mut dyn game::PlayerStrategy> = Vec::new();
    players.push(&mut tester1);
    players.push(&mut tester2);

    let mut game = game::Game::new(&mut players, false, 32);
    assert_eq!(game.run(&mut players), 0);
    assert_eq!(game.status.score, 0);
    assert_eq!(game.status.max_score, 25);
    assert_eq!(game.state, game::GameState::Invalid());
}

#[test]
fn unknown_clued_player() {
    let mut tester1 = tester::InstructedPlayer::with_default(game::Move::Discard(0));
    tester1.add(game::Move::Clue(2, game::Clue::Rank(1)));
    let mut tester2 = tester::InstructedPlayer::with_default(game::Move::Discard(0));

    let mut players: Vec<&mut dyn game::PlayerStrategy> = Vec::new();
    players.push(&mut tester1);
    players.push(&mut tester2);

    let mut game = game::Game::new(&mut players, false, 42);
    assert_eq!(game.run(&mut players), 0);
    assert_eq!(game.status.score, 0);
    assert_eq!(game.status.max_score, 25);
    assert_eq!(game.state, game::GameState::Invalid());
}

#[test]
fn clued_self() {
    let mut tester1 = tester::InstructedPlayer::with_default(game::Move::Discard(0));
    tester1.add(game::Move::Clue(0, game::Clue::Rank(1)));
    let mut tester2 = tester::InstructedPlayer::with_default(game::Move::Discard(0));

    let mut players: Vec<&mut dyn game::PlayerStrategy> = Vec::new();
    players.push(&mut tester1);
    players.push(&mut tester2);

    let mut game = game::Game::new(&mut players, false, 23409);
    assert_eq!(game.run(&mut players), 0);
    assert_eq!(game.status.score, 0);
    assert_eq!(game.status.max_score, 25);
    assert_eq!(game.state, game::GameState::Invalid());
}