use anyhow::anyhow;
use arithmetic_parser_kma::*;
use pest::Parser;
#[test]
fn test_number() -> anyhow::Result<()> {
let pair = MyParser::parse(Rule::number, "8")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "8");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
let pair = MyParser::parse(Rule::number, "1234567890")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1234567890");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 10);
let pair = MyParser::parse(Rule::number, "1.234")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1.234");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 5);
let pair = MyParser::parse(Rule::number, "0.00000123")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "0.00000123");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 10);
let pair = MyParser::parse(Rule::number, "x");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::number, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn test_unary_minus() -> anyhow::Result<()> {
let pair = MyParser::parse(Rule::unary_minus, "-")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "-");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
let pair = MyParser::parse(Rule::unary_minus, "x");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::unary_minus, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn test_primary() -> anyhow::Result<()> {
let pair = MyParser::parse(Rule::primary, "8")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "8");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
let pair = MyParser::parse(Rule::primary, "1234567890")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1234567890");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 10);
let pair = MyParser::parse(Rule::primary, "(1234567890)")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1234567890");
assert_eq!(pair.as_span().start(), 1);
assert_eq!(pair.as_span().end(), 11);
let pair = MyParser::parse(Rule::primary, "(1.234)")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1.234");
assert_eq!(pair.as_span().start(), 1);
assert_eq!(pair.as_span().end(), 6);
let pair = MyParser::parse(Rule::primary, "(0.00000123)")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "0.00000123");
assert_eq!(pair.as_span().start(), 1);
assert_eq!(pair.as_span().end(), 11);
let pair = MyParser::parse(Rule::primary, "0.00000123")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "0.00000123");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 10);
let pair = MyParser::parse(Rule::primary, "x");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::primary, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn test_atom() -> anyhow::Result<()> {
let pair = MyParser::parse(Rule::atom, "8")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "8");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
let pair = MyParser::parse(Rule::atom, "-1234567890")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "-");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
let pair = MyParser::parse(Rule::atom, "1234567890")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1234567890");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 10);
let pair = MyParser::parse(Rule::atom, "(1.234)")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "1.234");
assert_eq!(pair.as_span().start(), 1);
assert_eq!(pair.as_span().end(), 6);
let pair = MyParser::parse(Rule::atom, "-0.00000123")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "-");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
let pair = MyParser::parse(Rule::atom, "0.00000123")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "0.00000123");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 10);
let pair = MyParser::parse(Rule::atom, "(0.00000123)")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "0.00000123");
assert_eq!(pair.as_span().start(), 1);
assert_eq!(pair.as_span().end(), 11);
let pair = MyParser::parse(Rule::atom, "x");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::atom, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn test_operations() -> anyhow::Result<()> {
for s in "+-*/".chars() {
let symb = s.to_string();
let pair = MyParser::parse(Rule::bin_op, symb.as_str())?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), symb.as_str());
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
}
let pair = MyParser::parse(Rule::bin_op, "/")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "/");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
let pair = MyParser::parse(Rule::bin_op, "x");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::bin_op, "%");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::bin_op, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn test_expresion() -> anyhow::Result<()> {
let pair = MyParser::parse(Rule::expr, "8")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "8");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 1);
let pair = MyParser::parse(Rule::expr, "8 + 1")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "8 + 1");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 5);
let pair = MyParser::parse(Rule::expr, "8 + 1 - (0.5 / 33.7)")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "8 + 1 - (0.5 / 33.7)");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 20);
let pair = MyParser::parse(Rule::expr, "x");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::expr, "");
assert!(pair.is_err());
Ok(())
}
#[test]
fn test_equation() -> anyhow::Result<()> {
let pair = MyParser::parse(Rule::equation, "8 + 1 - (0.5 / 33.7)")?
.next()
.ok_or_else(|| anyhow!("no pair"))?;
assert_eq!(pair.as_str(), "8 + 1 - (0.5 / 33.7)");
assert_eq!(pair.as_span().start(), 0);
assert_eq!(pair.as_span().end(), 20);
let pair = MyParser::parse(Rule::equation, "x");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::equation, "x +");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::equation, "x + (");
assert!(pair.is_err());
let pair = MyParser::parse(Rule::equation, "");
assert!(pair.is_err());
Ok(())
}