use chemistry_parser::{ChemParser, Rule}; use pest::Parser; #[test] fn test_successful_element_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::element, "H").is_ok()); assert!(ChemParser::parse(Rule::element, "Li").is_ok()); Ok(()) } #[test] fn test_unsuccessful_element_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::element, "2").is_err()); assert!(ChemParser::parse(Rule::element, "h").is_err()); Ok(()) } #[test] fn test_correct_element_parse() -> anyhow::Result<()> { let successful_parse = ChemParser::parse(Rule::element, "Na"); assert!(successful_parse.is_ok()); let pair = successful_parse?.next().unwrap(); assert_eq!(pair.as_rule(), Rule::element); assert_eq!(pair.as_str(), "Na"); Ok(()) } #[test] fn test_successful_index_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::index, "2").is_ok()); assert!(ChemParser::parse(Rule::index, "12").is_ok()); Ok(()) } #[test] fn test_unsuccessful_index_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::index, "0").is_err()); assert!(ChemParser::parse(Rule::index, "H").is_err()); Ok(()) } #[test] fn test_successful_formula_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::formula, "H2O").is_ok()); assert!(ChemParser::parse(Rule::formula, "NaCl").is_ok()); Ok(()) } #[test] fn test_correct_formula_parse() -> anyhow::Result<()> { let successful_parse = ChemParser::parse(Rule::formula, "CH2O"); assert!(successful_parse.is_ok()); let mut pairs = successful_parse?; let formula = pairs.next().unwrap(); assert_eq!(formula.as_rule(), Rule::formula); assert_eq!(formula.as_str(), "CH2O"); let mut inner = formula.into_inner(); let elem1 = inner.next().unwrap(); assert_eq!(elem1.as_rule(), Rule::element); assert_eq!(elem1.as_str(), "C"); let elem2 = inner.next().unwrap(); assert_eq!(elem2.as_rule(), Rule::element); assert_eq!(elem2.as_str(), "H"); let index = inner.next().unwrap(); assert_eq!(index.as_rule(), Rule::index); assert_eq!(index.as_str(), "2"); let elem3 = inner.next().unwrap(); assert_eq!(elem3.as_rule(), Rule::element); assert_eq!(elem3.as_str(), "O"); Ok(()) } #[test] fn test_invalid_formula() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::formula, "2O2").is_err()); assert!(ChemParser::parse(Rule::formula, "h2o").is_err()); Ok(()) } #[test] fn test_successful_group_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::group, "(H2O)").is_ok()); assert!(ChemParser::parse(Rule::group, "(CO2)4").is_ok()); Ok(()) } #[test] fn test_unsuccessful_group_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::group, "((H2O)").is_err()); assert!(ChemParser::parse(Rule::group, "CO2 4").is_err()); Ok(()) } #[test] fn test_successful_formula_with_group_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::formula, "Al2(Si2O5)(OH)4").is_ok()); assert!(ChemParser::parse(Rule::formula, "Ca5(PO4)3(OH)").is_ok()); Ok(()) } #[test] fn test_successful_equation_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::equation, "2H2 + O2 -> 2H2O").is_ok()); assert!(ChemParser::parse(Rule::equation, "2HCl+2Na->2NaCl+H2").is_ok()); Ok(()) } #[test] fn test_unsuccessful_equation_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::equation, "2 + O2 -> 2H2O").is_err()); assert!(ChemParser::parse(Rule::equation, "2 HCl + 2Na -> 2NaCl + H2").is_err()); Ok(()) } #[test] fn test_successful_reactants_and_products_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::reactants, "2H2O").is_ok()); assert!(ChemParser::parse(Rule::products, "2HCl+2Na").is_ok()); assert!(ChemParser::parse(Rule::reactants, "2H2O").is_ok()); assert!(ChemParser::parse(Rule::products, "2HCl+2Na").is_ok()); Ok(()) } #[test] fn test_unsuccessful_reactants_and_products_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::reactants, "2 + O2").is_err()); assert!(ChemParser::parse(Rule::products, "2cl + 2h2").is_err()); assert!(ChemParser::parse(Rule::reactants, "na2").is_err()); assert!(ChemParser::parse(Rule::products, "2 HCl").is_err()); Ok(()) } #[test] fn test_successful_coefficient_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::coefficient, "4").is_ok()); assert!(ChemParser::parse(Rule::coefficient, "10").is_ok()); Ok(()) } #[test] fn test_unsuccessful_coefficient_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::coefficient, "0").is_err()); assert!(ChemParser::parse(Rule::coefficient, "02").is_err()); Ok(()) } #[test] fn test_successful_whitespace_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::WS, " ").is_ok()); Ok(()) } #[test] fn test_unsuccessful_whitespace_parse() -> anyhow::Result<()> { assert!(ChemParser::parse(Rule::WS, "_").is_err()); Ok(()) }