use assert_cmd::Command;
use predicates::str::contains;
#[test]
fn list_cases_prints_bundled_cases() {
Command::cargo_bin("newt-eval")
.unwrap()
.arg("list-cases")
.assert()
.success()
.stdout(contains("001-rename-function"))
.stdout(contains("005-extract-constant"));
}
#[test]
fn run_mock_mode_directs_user_to_test_harness() {
Command::cargo_bin("newt-eval")
.unwrap()
.args(["run", "--mode", "mock"])
.assert()
.failure()
.stderr(contains("cargo test"));
}
#[test]
fn run_help_shows_worker_timeout_flag() {
Command::cargo_bin("newt-eval")
.unwrap()
.args(["run", "--help"])
.assert()
.success()
.stdout(contains("--worker-timeout-ms"))
.stdout(contains("NEWT_EVAL_WORKER_TIMEOUT_MS"));
}
#[test]
fn run_accepts_worker_timeout_flag() {
Command::cargo_bin("newt-eval")
.unwrap()
.args(["run", "--mode", "mock", "--worker-timeout-ms", "180000"])
.assert()
.failure()
.stderr(contains("cargo test"));
}
#[test]
fn run_live_mode_reports_missing_worker() {
Command::cargo_bin("newt-eval")
.unwrap()
.args([
"run",
"--mode",
"live",
"--case",
"001",
"--worker-bin",
"/definitely/not/here/newt",
])
.assert()
.failure()
.stderr(contains("not found"))
.stderr(contains("/definitely/not/here/newt"));
}
#[test]
fn run_help_documents_worker_bin_resolution() {
Command::cargo_bin("newt-eval")
.unwrap()
.args(["run", "--help"])
.assert()
.success()
.stdout(contains("NEWT_WORKER_BIN"))
.stdout(contains("--worker-bin"));
}
#[test]
fn run_help_documents_legacy_exit_codes_flag() {
Command::cargo_bin("newt-eval")
.unwrap()
.args(["run", "--help"])
.assert()
.success()
.stdout(contains("--legacy-exit-codes"));
}
#[cfg(unix)]
#[test]
fn run_live_mode_runner_failure_exits_one() {
Command::cargo_bin("newt-eval")
.unwrap()
.args([
"run",
"--mode",
"live",
"--case",
"001",
"--worker-bin",
"/usr/bin/true",
])
.assert()
.code(1);
}
#[cfg(unix)]
#[test]
fn run_live_mode_runner_failure_legacy_exit_code() {
Command::cargo_bin("newt-eval")
.unwrap()
.args([
"run",
"--mode",
"live",
"--case",
"001",
"--worker-bin",
"/usr/bin/true",
"--legacy-exit-codes",
])
.assert()
.code(2);
}
#[cfg(unix)]
#[test]
fn run_json_emits_the_scorecard_and_keeps_exit_codes() {
let out = Command::cargo_bin("newt-eval")
.unwrap()
.args([
"run",
"--case",
"001",
"--worker-bin",
"/usr/bin/true",
"--json",
])
.assert()
.code(1)
.get_output()
.stdout
.clone();
let card: serde_json::Value = serde_json::from_slice(&out).expect("stdout is JSON");
assert_eq!(card["cases"][0]["results"][0]["evaluator"], "runner");
assert_eq!(card["cases"][0]["results"][0]["passed"], false);
}
#[test]
fn grade_help_shows_case_and_workspace_flags() {
Command::cargo_bin("newt-eval")
.unwrap()
.args(["grade", "--help"])
.assert()
.success()
.stdout(contains("--case"))
.stdout(contains("--workspace"));
}
#[test]
fn grade_unchanged_fixture_fails_and_exits_two() {
Command::cargo_bin("newt-eval")
.unwrap()
.args([
"grade",
"--case",
"007-add-struct-method",
"--workspace",
"cases/007-add-struct-method/workspace",
])
.assert()
.code(2)
.stdout(contains("diff_nonempty"));
}
#[test]
fn grade_unknown_case_errors() {
Command::cargo_bin("newt-eval")
.unwrap()
.args(["grade", "--case", "no-such-case", "--workspace", "cases"])
.assert()
.failure()
.stderr(contains("not found"));
}