use assert_cmd::Command;
use predicates::prelude::*;
use std::env;
use std::fs;
fn linear_dataset() -> String {
let mut s = String::from("# y = x0\n");
for i in 0..5 {
let x0 = i as f64;
s.push_str(&format!("{x0} {x0}\n"));
}
s
}
#[test]
fn format_pretty_default() {
let mut cmd = Command::cargo_bin("oxieml").expect("binary built");
cmd.arg("--lower").arg("E(x0,1)");
cmd.assert()
.success()
.stdout(predicate::str::contains("exp"));
}
#[test]
fn format_latex() {
let mut cmd = Command::cargo_bin("oxieml").expect("binary built");
cmd.arg("--lower")
.arg("E(x0,1)")
.arg("--format")
.arg("latex");
cmd.assert()
.success()
.stdout(predicate::str::contains("$$"))
.stdout(predicate::str::contains("x_{"));
}
#[test]
fn format_json_lower() {
let mut cmd = Command::cargo_bin("oxieml").expect("binary built");
cmd.arg("--lower")
.arg("E(x0,1)")
.arg("--format")
.arg("json");
cmd.assert()
.success()
.stdout(predicate::str::contains("\"version\":1"))
.stdout(predicate::str::contains("\"formulas\""))
.stdout(predicate::str::contains("\"pretty\""))
.stdout(predicate::str::contains("\"latex\""));
}
#[test]
fn output_to_file() {
let filename = format!("oxieml_test_out_format_{}.txt", std::process::id());
let out_path = env::temp_dir().join(&filename);
let _ = fs::remove_file(&out_path);
let mut cmd = Command::cargo_bin("oxieml").expect("binary built");
cmd.arg("--lower")
.arg("E(x0,1)")
.arg("--format")
.arg("pretty")
.arg("--output")
.arg(&out_path);
cmd.assert().success().stdout(predicate::str::is_empty());
let content = fs::read_to_string(&out_path).expect("output file should exist");
assert!(
content.contains("exp"),
"output file should contain 'exp', got: {content:?}"
);
let _ = fs::remove_file(&out_path);
}
#[test]
fn format_json_symreg() {
let data = linear_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("--format")
.arg("json")
.write_stdin(data);
cmd.assert()
.success()
.stdout(predicate::str::contains("\"version\":1"))
.stdout(predicate::str::contains("\"formulas\""))
.stdout(predicate::str::contains("\"rank\""))
.stdout(predicate::str::contains("\"mse\""));
}
#[test]
fn format_latex_symreg() {
let data = linear_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("--format")
.arg("latex")
.write_stdin(data);
cmd.assert()
.success()
.stdout(predicate::str::contains("Rank 1:"))
.stdout(predicate::str::contains("$$"));
}