use claims::*;
use expy::{BinaryOp::*, Expr, Literal, ParseError, parse};
#[test]
#[allow(illegal_floating_point_literal_pattern)]
fn literals() {
assert_matches!(parse("1e12").unwrap(), Expr::Literal(Literal::Float(1e12)));
assert_matches!(parse("1e+8").unwrap(), Expr::Literal(Literal::Float(1e8)));
assert_matches!(parse("42.").unwrap(), Expr::Literal(Literal::Float(42.)));
assert_matches!(parse("1.e-9").unwrap(), Expr::Literal(Literal::Float(1e-9)));
assert_eq!(parse("@true").unwrap(), Expr::Literal(Literal::symbol("true")));
assert_eq!(parse("@_").unwrap(), Expr::Literal(Literal::symbol("_")));
assert_eq!(parse("True").unwrap(), Expr::ref_("True"));
assert_eq!(parse("e12").unwrap(), Expr::ref_("e12"));
assert_eq!(parse("e+8").unwrap(), Expr::binary(Add, Expr::ref_("e"), Expr::literal(8)));
}
#[test]
fn terms() {
assert_eq!(parse("_").unwrap(), Expr::ref_("_"));
assert_eq!(parse("__").unwrap(), Expr::ref_("__"));
assert_eq!(parse("_foo").unwrap(), Expr::ref_("_foo"));
assert_eq!(parse("__magic__").unwrap(), Expr::ref_("__magic__"));
assert_eq!(parse("_1").unwrap(), Expr::ref_("_1"));
assert_matches!(parse("42identifier").unwrap_err(), ParseError::Syntax(_));
if cfg!(glam) {
assert_eq!(parse("[]").unwrap_err(), ParseError::Unsupported("vector of length 0".into()));
}
assert_matches!(parse("()").unwrap_err(), ParseError::Syntax(_))
}
#[test]
fn suffix_member_accesses() {
assert_eq!(parse("_._").unwrap(), Expr::access(Expr::ref_("_"), "_"));
assert_eq!(parse("_1._1").unwrap(), Expr::access(Expr::ref_("_1"), "_1"));
assert_eq!(parse("@_._").unwrap(), Expr::access(Expr::literal(Literal::symbol("_")), "_"));
assert_matches!(parse("42._").unwrap_err(), ParseError::Syntax(_));
assert_eq!(parse("(42)._").unwrap(), Expr::access(Expr::literal(42), "_"));
assert_matches!(parse("1.e").unwrap_err(), ParseError::Syntax(_));
assert_eq!(parse("(1).e").unwrap(), Expr::access(Expr::literal(1), "e"));
assert_eq!(parse("1.e+12").unwrap(), Expr::literal(1e12));
}