ever 0.2.0

Print the build information of your program with minimal boilerplate
Documentation
use regex::Regex;
use std::process::Command;

#[test]
fn test_ever_never() {
    let output = Command::new("cargo")
        .arg("run")
        .arg("-p")
        .arg("ever-tests-noarg")
        .output()
        .unwrap();
    assert!(output.status.success());
    assert_eq!(output.stdout, b"Hello, world!\n");
}

fn is_match(pattern: &str, input: &str) {
    let regex = Regex::new(pattern).unwrap();
    assert!(regex.is_match(input), "regex check failed `{}`", input);
}

fn is_ever(info: &str) {
    let mut lines = info.lines();

    is_match(
        r"^ever-tests-(arg|noarg) [^\s]+ \(.+\): crate to test ever$",
        lines.next().unwrap(),
    );
    assert!(lines.next().unwrap().is_empty());

    is_match(r"date:\s+[^\s]*", lines.next().unwrap());
    is_match(r"commit:\s+[a-f0-9]+(-dirty)?$", lines.next().unwrap());
    is_match(r"user:\s+[^\s]*", lines.next().unwrap());
    is_match(r"host:\s+[^\s]*", lines.next().unwrap());
    is_match(r"builddir:\s+[^\s]*", lines.next().unwrap());
    is_match(
        r"rustc:\s+ [^\s]+(-nightly)? \([^\s]* \d+-\d+-\d+\)",
        lines.next().unwrap(),
    );
}

const PACKAGES: &[(&str, &str)] = &[
    ("ever-tests-noarg", "EVER"),
    ("ever-tests-arg", "MY_VERSION"),
];
const VALUES: &[&str] = &["1", "true"];

#[test]
fn test_ever() {
    for (package, env) in PACKAGES {
        for val in VALUES {
            let output = Command::new("cargo")
                .arg("run")
                .arg("-p")
                .arg(package)
                .env(env, val)
                .output()
                .unwrap();
            assert_eq!(output.status.code().unwrap(), 1);
            let info = String::from_utf8_lossy(&output.stdout).to_string();
            is_ever(&info);
        }
    }
}

#[test]
fn test_ever_dump_lock() {
    let output = Command::new("cargo")
        .arg("run")
        .arg("-p")
        .arg("ever-tests-noarg")
        .env("EVER", "dump_lock")
        .output()
        .unwrap();
    assert_eq!(output.status.code().unwrap(), 1);
    let lock = String::from_utf8_lossy(&output.stdout).to_string();
    let _: cargo_lock::Lockfile = lock.parse().unwrap();
}