use assert_cmd::Command;
use predicates::prelude::*;
use std::env;
use std::fs;
#[test]
fn recovery_linear() {
let mut data = String::new();
data.push_str("# y = x0 + x1\n");
for i in 0..4 {
for j in 0..5 {
let x0 = i as f64;
let x1 = j as f64;
let y = x0 + x1;
data.push_str(&format!("{x0} {x1} {y}\n"));
}
}
let mut cmd = Command::cargo_bin("oxieml").expect("binary built");
cmd.arg("--symreg")
.arg("--vars")
.arg("2")
.arg("--max-depth")
.arg("1")
.arg("--max-iter")
.arg("50")
.arg("--num-restarts")
.arg("1")
.arg("--top")
.arg("1")
.write_stdin(data);
cmd.assert()
.success()
.stdout(predicate::str::contains("Rank 1:"));
}
#[test]
fn no_data_errors() {
let mut cmd = Command::cargo_bin("oxieml").expect("binary built");
cmd.arg("--symreg").arg("--vars").arg("2").write_stdin("");
cmd.assert()
.failure()
.stderr(predicate::str::contains("no data"));
}
#[test]
fn help_mentions_symreg() {
let mut cmd = Command::cargo_bin("oxieml").expect("binary built");
cmd.arg("--help");
cmd.assert()
.success()
.stdout(predicate::str::contains("--symreg"));
}
#[test]
fn file_input_works() {
let mut data = String::new();
data.push_str("# y = 2*x0\n");
for i in 0..10 {
let x0 = i as f64;
let y = 2.0 * x0;
data.push_str(&format!("{x0} {y}\n"));
}
let dir = env::temp_dir();
let path = dir.join("oxieml_cli_symreg_test_file_input.txt");
fs::write(&path, &data).expect("failed to write temp dataset");
let mut cmd = Command::cargo_bin("oxieml").expect("binary built");
cmd.arg("--symreg")
.arg("--vars")
.arg("1")
.arg("--max-depth")
.arg("1")
.arg("--max-iter")
.arg("50")
.arg("--num-restarts")
.arg("1")
.arg("--top")
.arg("1")
.arg("--file")
.arg(&path);
cmd.assert()
.success()
.stdout(predicate::str::contains("Rank 1:"));
let _ = fs::remove_file(&path);
}