use super::super::Expression;
use crate::algebra::equation_analyzer::SmartEquationSolver;
use crate::algebra::solvers::SolverResult;
use crate::core::Symbol;
use crate::educational::step_by_step::StepByStepExplanation;
impl Expression {
pub fn solve(&self, variable: &Symbol) -> SolverResult {
let (result, _explanation) = self.solve_with_steps(variable);
result
}
pub fn solve_with_steps(&self, variable: &Symbol) -> (SolverResult, StepByStepExplanation) {
let solver = SmartEquationSolver::new();
solver.solve_with_equation(self, variable)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::expr;
use crate::symbol;
#[test]
fn test_solve_linear_equation() {
let x = symbol!(x);
let equation = Expression::add(vec![expr!(2 * x), expr!(-6)]);
let result = equation.solve(&x);
match result {
SolverResult::Single(solution) => {
assert_eq!(solution, expr!(3));
}
_ => panic!("Expected single solution"),
}
}
#[test]
fn test_solve_with_steps() {
let x = symbol!(x);
let equation = Expression::add(vec![expr!(2 * x), expr!(-6)]);
let (result, _explanation) = equation.solve_with_steps(&x);
match result {
SolverResult::Single(solution) => {
assert_eq!(solution, Expression::integer(3));
}
_ => panic!("Expected single solution"),
}
}
}