rust-life 0.7.0

An implementation of Conway's Game of Life.
Documentation
use assert_cmd::{Command, cargo};
use rust_life::CLEAR;

fn bin() -> Command {
    Command::new(cargo::cargo_bin!("rust-life"))
}

#[test]
fn test_help() {
    bin().arg("--help").assert().success();
}

#[test]
fn test_cli() {
    bin()
        .args(&[
            #[cfg(feature = "gui")]
            "--no-gui",
            "-g0",
        ])
        .assert()
        .success();
}

#[test]
fn test_cli_template() {
    let base_args = &[
        #[cfg(feature = "gui")]
        "--no-gui",
        "-g0",
        "-t",
        "@",
    ][..];

    bin()
        .args([base_args, &["-p1"]].concat())
        .assert()
        .stdout("...\n.@.\n...\n")
        .success();

    bin()
        .args([base_args, &["-p", "1", "1"]].concat())
        .assert()
        .stdout("...\n.@.\n...\n")
        .success();

    bin()
        .args([base_args, &["-p", "1", "1", "1"]].concat())
        .assert()
        .stdout("...\n.@.\n...\n")
        .success();

    bin()
        .args([base_args, &["-p", "1", "1", "1", "1"]].concat())
        .assert()
        .stdout("...\n.@.\n...\n")
        .success();

    bin()
        .args([base_args, &["-p", "1", "1", "1", "1", "1"]].concat())
        .assert()
        .failure();

    bin().args([base_args, &["-p"]].concat()).assert().failure();

    let align_args = &[base_args, &["-r3", "-c3"]].concat()[..];

    bin()
        .args(align_args)
        .assert()
        .stdout("...\n.@.\n...\n")
        .success();

    bin()
        .args([align_args, &["--align", "top-left"]].concat())
        .assert()
        .stdout("@..\n...\n...\n")
        .success();

    bin()
        .args([align_args, &["-a=bottom-right"]].concat())
        .assert()
        .stdout("...\n...\n..@\n")
        .success();
}

#[test]
fn test_cli_generations() {
    let base_args = &[
        #[cfg(feature = "gui")]
        "--no-gui",
        "-t",
        "...\n@@@\n...",
        "-p0",
    ][..];

    bin()
        .args([base_args, &["-g0"]].concat())
        .assert()
        .stdout("...\n@@@\n...\n")
        .success();

    bin()
        .args([base_args, &["-g1"]].concat())
        .assert()
        .stdout(".@.\n.@.\n.@.\n")
        .success();

    bin()
        .args([base_args, &["-g2"]].concat())
        .assert()
        .stdout("...\n@@@\n...\n")
        .success();

    bin()
        .args([base_args, &["-G1"]].concat())
        .assert()
        .stdout(format!("{CLEAR}...\n@@@\n...\n{CLEAR}.@.\n.@.\n.@.\n"))
        .success();

    bin()
        .args([base_args, &["-G2"]].concat())
        .assert()
        .stdout(format!(
            "{CLEAR}...\n@@@\n...\n{CLEAR}.@.\n.@.\n.@.\n{CLEAR}...\n@@@\n...\n"
        ))
        .success();

    bin()
        .args([base_args, &["-g1", "-G2"]].concat())
        .assert()
        .stdout(format!("{CLEAR}.@.\n.@.\n.@.\n{CLEAR}...\n@@@\n...\n"))
        .success();
}

#[test]
#[cfg(feature = "gui")]
fn test_gui_scale() {
    bin().args(["-s0"]).assert().failure();
    bin().args(["-s.5", "-G0", "-x"]).assert().success();
    bin().args(["-s4", "-G0", "-x"]).assert().success();
    bin().args(["-s9999"]).assert().failure();
}

#[test]
#[cfg(feature = "gui")]
fn test_gui_run() {
    bin().args(["-g0", "-G5", "-x"]).assert().success();
}