use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
use tempfile::TempDir;
fn ruchy_cmd() -> Command {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
}
#[test]
fn test_oracle_train_basic() {
ruchy_cmd()
.args(["oracle", "train"])
.assert()
.success()
.stdout(predicate::str::contains("Training"));
}
#[test]
fn test_oracle_train_verbose() {
ruchy_cmd()
.args(["oracle", "train", "--verbose"])
.assert()
.success()
.stdout(predicate::str::contains("Samples"))
.stdout(predicate::str::contains("Accuracy"));
}
#[test]
fn test_oracle_train_json_output() {
ruchy_cmd()
.args(["oracle", "train", "--format", "json"])
.assert()
.success()
.stdout(predicate::str::contains("\"status\""))
.stdout(predicate::str::contains("\"samples\""));
}
#[test]
fn test_oracle_save_default_path() {
let temp_dir = TempDir::new().expect("create temp dir");
let model_path = temp_dir.path().join("ruchy_oracle.apr");
ruchy_cmd().args(["oracle", "train"]).assert().success();
ruchy_cmd()
.args(["oracle", "save", model_path.to_str().unwrap()])
.assert()
.success()
.stdout(predicate::str::contains("Saved"));
assert!(model_path.exists(), "Model file should be created");
}
#[test]
fn test_oracle_save_custom_path() {
let temp_dir = TempDir::new().expect("create temp dir");
let custom_path = temp_dir.path().join("custom_model.apr");
ruchy_cmd()
.args(["oracle", "save", custom_path.to_str().unwrap()])
.assert()
.success();
assert!(custom_path.exists(), "Custom model file should be created");
}
#[test]
fn test_oracle_save_overwrites_existing() {
let temp_dir = TempDir::new().expect("create temp dir");
let model_path = temp_dir.path().join("model.apr");
fs::write(&model_path, "dummy").expect("create dummy file");
ruchy_cmd()
.args(["oracle", "save", model_path.to_str().unwrap()])
.assert()
.success();
let metadata = fs::metadata(&model_path).expect("get metadata");
assert!(metadata.len() > 5, "Model file should be larger than dummy");
}
#[test]
fn test_oracle_status_trained() {
ruchy_cmd()
.args(["oracle", "status"])
.assert()
.success()
.stdout(predicate::str::contains("Status"));
}
#[test]
fn test_oracle_status_after_train() {
let temp_dir = TempDir::new().expect("create temp dir");
let model_path = temp_dir.path().join("model.apr");
ruchy_cmd()
.args(["oracle", "save", model_path.to_str().unwrap()])
.assert()
.success();
ruchy_cmd()
.args(["oracle", "status"])
.assert()
.success()
.stdout(predicate::str::contains("Status"));
}
#[test]
#[ignore = "RED phase: oracle status --format json not yet implemented - ORACLE-001"]
fn test_oracle_status_json() {
ruchy_cmd()
.args(["oracle", "status", "--format", "json"])
.assert()
.success()
.stdout(predicate::str::contains("\"status\""))
.stdout(predicate::str::contains("\"accuracy\""))
.stdout(predicate::str::contains("\"samples\""));
}
#[test]
fn test_oracle_classify_basic() {
ruchy_cmd()
.args(["oracle", "classify", "error[E0308]: mismatched types"])
.assert()
.success()
.stdout(predicate::str::contains("Category:"));
}
#[test]
fn test_oracle_classify_with_code() {
ruchy_cmd()
.args(["oracle", "classify", "mismatched types", "--code", "E0308"])
.assert()
.success();
}
#[test]
fn test_oracle_classify_json() {
ruchy_cmd()
.args([
"oracle",
"classify",
"borrow of moved value",
"--format",
"json",
])
.assert()
.success()
.stdout(predicate::str::contains("\"category\""));
}
#[test]
fn test_oracle_load_existing_model() {
let temp_dir = TempDir::new().expect("create temp dir");
let model_path = temp_dir.path().join("model.apr");
ruchy_cmd()
.args(["oracle", "save", model_path.to_str().unwrap()])
.assert()
.success();
ruchy_cmd()
.args(["oracle", "load", model_path.to_str().unwrap()])
.assert()
.success()
.stdout(predicate::str::contains("Loaded"));
}
#[test]
fn test_oracle_load_nonexistent_fails() {
ruchy_cmd()
.args(["oracle", "load", "/nonexistent/model.apr"])
.assert()
.failure();
}
#[test]
fn test_oracle_train_save_load_classify_roundtrip() {
let temp_dir = TempDir::new().expect("create temp dir");
let model_path = temp_dir.path().join("roundtrip.apr");
ruchy_cmd().args(["oracle", "train"]).assert().success();
ruchy_cmd()
.args(["oracle", "save", model_path.to_str().unwrap()])
.assert()
.success();
let contents = fs::read(&model_path).expect("read model");
assert_eq!(&contents[0..4], b"APRN", "Should have APR magic bytes");
ruchy_cmd()
.args(["oracle", "load", model_path.to_str().unwrap()])
.assert()
.success();
ruchy_cmd()
.args(["oracle", "classify", "error[E0308]: mismatched types"])
.assert()
.success();
}
#[test]
fn test_oracle_help_shows_subcommands() {
ruchy_cmd()
.args(["oracle", "--help"])
.assert()
.success()
.stdout(predicate::str::contains("train"))
.stdout(predicate::str::contains("save"))
.stdout(predicate::str::contains("status"))
.stdout(predicate::str::contains("classify"));
}