#[cfg(test)]
mod tests {
use crate::solver::status::SolverStatus;
use crate::standard_form::{
constraint::StandardConstraint, model::StandardModel, variable::StandardVariable,
};
fn assert_approx_eq(a: f64, b: f64) {
assert!((a - b).abs() < 1e-6, "Expected {}, got {}", b, a);
}
#[test]
fn test_standard_model_optimal() {
let mut std_model = StandardModel::new();
let x1 = std_model.add_variable(StandardVariable::new());
let x2 = std_model.add_variable(StandardVariable::new());
std_model.set_objective(3.0 * x1 + 2.0 * x2);
std_model.add_constraint(StandardConstraint::new(2.0 * x1 + x2, 10.0));
std_model.add_constraint(StandardConstraint::new(x1 + 3.0 * x2, 15.0));
let result = std_model.solve();
assert!(result.is_ok());
let solution = result.unwrap();
assert!(matches!(solution.status(), SolverStatus::Optimal));
assert_approx_eq(solution.objective_value().unwrap(), 17.0);
}
#[test]
fn test_standard_model_infeasible() {
let mut std_model = StandardModel::new();
let x = std_model.add_variable(StandardVariable::new());
std_model.set_objective(1.0 * x);
std_model.add_constraint(StandardConstraint::new(1.0 * x, -5.0));
let result = std_model.solve();
let solution = result.unwrap();
assert!(matches!(solution.status(), SolverStatus::Infeasible));
}
}