use chemistry_parser::{ChemParseError, ChemParser};
#[test]
fn test_parse_element_valid() -> anyhow::Result<()> {
let parser = ChemParser::new();
let element = parser.parse_element("H")?;
assert_eq!(element.symbol, "H");
assert_eq!(element.atomic_mass, 1.008);
Ok(())
}
#[test]
fn test_parse_element_invalid() -> anyhow::Result<()> {
let parser = ChemParser::new();
let result = parser.parse_element("Ha");
assert!(matches!(result, Err(ChemParseError::InvalidElement(_))));
Ok(())
}
#[test]
fn test_parse_formula() -> anyhow::Result<()> {
let parser = ChemParser::new();
let formula = parser.parse_formula("H2O")?;
assert_eq!(formula.formula, "H2O");
assert_eq!(formula.elements["H"], 2);
assert_eq!(formula.elements["O"], 1);
assert_eq!(formula.mass, 18.015);
Ok(())
}
#[test]
fn test_parse_formula_with_groups() -> anyhow::Result<()> {
let parser = ChemParser::new();
let formula = parser.parse_formula("Cu2(OH)2CO3")?;
assert_eq!(formula.elements["Cu"], 2);
assert_eq!(formula.elements["O"], 5);
assert_eq!(formula.elements["H"], 2);
assert_eq!(formula.elements["C"], 1);
Ok(())
}
#[test]
fn test_parse_formula_invalid_element() -> anyhow::Result<()> {
let parser = ChemParser::new();
let result = parser.parse_formula("Yx2");
assert!(matches!(result, Err(ChemParseError::InvalidFormula(_, _))));
Ok(())
}
#[test]
fn test_parse_equation_balanced() -> anyhow::Result<()> {
let parser = ChemParser::new();
let equation = parser.parse_equation("2H2 + O2 -> 2H2O")?;
assert_eq!(equation.reactants["H2"], 2);
assert_eq!(equation.reactants["O2"], 1);
assert_eq!(equation.products["H2O"], 2);
assert!(equation.check_equation());
Ok(())
}
#[test]
fn test_parse_equation_unbalanced() -> anyhow::Result<()> {
let parser = ChemParser::new();
let equation = parser.parse_equation("H2 + O2 -> H2O")?;
assert!(!equation.check_equation());
Ok(())
}