use crate::aux::Polynomial;
use crate::solver::degree_0::degree_0;
use crate::solver::Roots;
pub fn degree_1(poly: Polynomial) -> Result<Roots, String> {
let a: f64 = poly.terms.get(&1).copied().unwrap_or(0.0);
let b: f64 = poly.terms.get(&0).copied().unwrap_or(0.0);
if a == 0.0 {
return degree_0(poly);
}
let sol: f64 = -b / a;
Ok(Roots::with_real(vec![sol]))
}
#[cfg(test)]
mod tests {
use super::*;
use crate::parser::parse_equation;
mod degree_1 {
use super::*;
#[test]
fn test_not_degree_1() {
let equation: &str = "0*X^0 + 0 = 0";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![]);
}
#[test]
fn test_poly_0_is_0() {
let equation: &str = "1*X^1 + 0 = 0";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![0.0]);
}
#[test]
fn test_simple_positive_solution() {
let equation: &str = "2 * X^1 + 4 = 0";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![-2.0]);
let equation: &str = "1.0 * X = 42";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![42.0]);
}
#[test]
fn test_simple_negative_solution() {
let equation: &str = "-3 * X^1 + 6 = 0";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![2.0]);
}
#[test]
fn test_zero_coefficient() {
let equation: &str = "0 * X^1 + 5 = 0";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result:Result<Roots, String> = degree_1(poly);
assert!(result.is_err(), "Expected an error for zero coefficient got {:?}", result);
}
#[test]
fn test_zero_solution() {
let equation: &str = "4 * X^1 = 0";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![0.0]);
}
#[test]
fn test_fractional_solution() {
let equation: &str = "3 * X^1 + 1.5 = 0";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![-0.5]);
}
#[test]
fn test_reduced_to_degree_1() {
let equation: &str = "5 + 4 * X + X^2= X^2";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![-1.25]);
}
#[test]
fn test_no_solution_due_to_zero_coefficients() {
let equation: &str = "0 * X^1 + 0 = 0";
let poly: Polynomial = parse_equation(equation).expect("Failed to parse equation");
let result: Roots = degree_1(poly).unwrap();
assert_eq!(result.real, vec![]); }
}
}