mod problems; use ellp::*; use paste::paste; #[allow(dead_code)] pub fn setup_logger(log_level: log::LevelFilter) { use fern::colors::{Color, ColoredLevelConfig}; let colors = ColoredLevelConfig::new() .debug(Color::White) .info(Color::Green) .warn(Color::BrightYellow) .error(Color::BrightRed); let _ = fern::Dispatch::new() .format(move |out, message, record| { out.finish(format_args!( "{} | {:5} | {}", chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.6f"), colors.color(record.level()), message )) }) .level(log_level) .chain(std::io::stdout()) .apply(); } macro_rules! generate_tests { ($solver_name:ident, $solver:expr, $($problem:ident,)+) => { paste! { $( #[test] fn [<$solver_name _ $problem>]() { if let Ok(val) = std::env::var("LOG") { if val == "1" { setup_logger(log::LevelFilter::Info); } } let test_prob = problems::$problem(); let solver = $solver; let result = solver.solve(test_prob.prob).unwrap(); (test_prob.check_result)(&result) } )+ } }; } generate_tests! { primal, PrimalSimplexSolver::default(), empty_problem, one_variable_no_constraints, one_variable_infeasible, one_variable_unbounded_upper, one_variable_unbounded_free, two_variables_unbounded, two_variables_infeasible_with_bounds, two_variables_infeasible_free, infeasible_constraint_without_coeffs, feasible_constraint_without_coeffs, feasible_constraint_without_coeffs_and_no_vars, infeasible_constraint_without_coeffs_and_no_vars, linear_system_2d, linear_system_3d, linear_system_3d_infeasible, small_prob_1, small_prob_2, small_prob_3, small_prob_4, small_prob_5, small_prob_6, small_prob_7, small_prob_unbounded_1, small_prob_unbounded_2, beale_cycle, } generate_tests! { dual, DualSimplexSolver::default(), empty_problem, one_variable_no_constraints, one_variable_infeasible, one_variable_unbounded_upper, one_variable_unbounded_free, two_variables_unbounded, two_variables_infeasible_with_bounds, two_variables_infeasible_free, infeasible_constraint_without_coeffs, feasible_constraint_without_coeffs, feasible_constraint_without_coeffs_and_no_vars, infeasible_constraint_without_coeffs_and_no_vars, linear_system_2d, linear_system_3d, linear_system_3d_infeasible, small_prob_1, small_prob_2, small_prob_3, small_prob_4, small_prob_5, small_prob_6, small_prob_7, small_prob_unbounded_1, small_prob_unbounded_2, beale_cycle, } #[cfg(feature = "benchmarks")] generate_tests! { primal, PrimalSimplexSolver::default(), afiro, adlittle, blend, } #[cfg(feature = "benchmarks")] generate_tests! { dual, DualSimplexSolver::default(), afiro, adlittle, blend, }