expy 0.0.2

Embeddable & extensible expression evaluator
Documentation
//! Tests for basic math.

use std::f32::consts::{E, PI};

use expy::{Context, eval, eval_in};


#[test]
fn increment() {
    let x = 5;
    let mut ctx = Context::empty();
    ctx.set("x", x);
    assert_eq!(eval_in(&mut ctx, "x + 1").unwrap().unwrap_integer(), x + 1);
}

#[test]
fn add_multiple_vars() {
    let x = 7;
    let y = 12;
    let mut ctx = Context::empty();
    ctx.set("x", x);
    ctx.set("y", y);
    assert_eq!(eval_in(&mut ctx, "x + y").unwrap().unwrap_integer(), x + y);
}

// TODO: multiplication, division, etc.

#[test]
fn power() {
    assert_eq!(eval("2^16").unwrap().unwrap_integer(), 65536);
    assert_eq!(eval("e^2.5").unwrap().unwrap_float(), E.powf(2.5));
}

#[test]
fn identity_function() {
    assert_eq!(eval("id(true)").unwrap().unwrap_bool(), true);
    assert_eq!(eval("id(false)").unwrap().unwrap_bool(), false);
    assert_eq!(eval("id(42)").unwrap().unwrap_integer(), 42);
    assert_eq!(eval("id(3.14)").unwrap().unwrap_float(), 3.14);

    let mut ctx = Context::new();
    ctx.set("x", true); assert_eq!(eval_in(&mut ctx, "id(x)").unwrap().unwrap_bool(), true);
    ctx.set("x", false); assert_eq!(eval_in(&mut ctx, "id(x)").unwrap().unwrap_bool(), false);
    ctx.set("x", 42); assert_eq!(eval_in(&mut ctx, "id(x)").unwrap().unwrap_integer(), 42);
    ctx.set("x", 3.14); assert_eq!(eval_in(&mut ctx, "id(x)").unwrap().unwrap_float(), 3.14);
}

#[test]
fn absolute_value() {
    assert_eq!(eval("abs(1)").unwrap().unwrap_integer(), 1);
    assert_eq!(eval("abs(-4)").unwrap().unwrap_integer(), 4);
    assert_eq!(eval("abs(-17.8)").unwrap().unwrap_float(), 17.8);
    assert_eq!(eval("abs(1.234)").unwrap().unwrap_float(), 1.234);
}

#[test]
fn trig_functions() {
    assert_eq!(eval("sin(0.)").unwrap().unwrap_float(), 0f32.sin());
    assert_eq!(eval("cos(pi)").unwrap().unwrap_float(), PI.cos());
    assert_eq!(eval("tan(pi/4)").unwrap().unwrap_float(), (PI/4.).tan());
}