sim-lib-numbers-float 0.1.0-rc.1

SIM workspace package for sim lib numbers float.
Documentation
use std::sync::Arc;

use sim_kernel::{DefaultFactory, Expr, NoopEvalPolicy, NumberLiteral, Symbol};
use sim_lib_numbers_core::domains;

use crate::{F32NumbersLib, number_domain};

fn cx() -> sim_kernel::Cx {
    let mut cx = sim_kernel::Cx::new(Arc::new(NoopEvalPolicy), Arc::new(DefaultFactory));
    cx.load_lib(&F32NumbersLib::new()).unwrap();
    cx
}

#[test]
fn f32_literal_round_trips_through_expr() {
    let mut cx = cx();
    let value = cx
        .factory()
        .number_literal(number_domain(), "1.5".to_owned())
        .unwrap();
    assert_eq!(
        value.object().as_expr(&mut cx).unwrap(),
        Expr::Number(NumberLiteral {
            domain: number_domain(),
            canonical: "1.5".to_owned(),
        })
    );
}

#[test]
fn f32_arithmetic_adds_values() {
    let mut cx = cx();
    let left = cx
        .factory()
        .number_literal(number_domain(), "1.25".to_owned())
        .unwrap();
    let right = cx
        .factory()
        .number_literal(number_domain(), "2.5".to_owned())
        .unwrap();
    let value = cx
        .apply_value_number_binary_op(&Symbol::qualified("math", "add"), left, right)
        .unwrap();
    assert_eq!(
        value.object().as_expr(&mut cx).unwrap(),
        Expr::Number(NumberLiteral {
            domain: number_domain(),
            canonical: "3.75".to_owned(),
        })
    );
}

#[test]
fn f32_registers_value_promotion_to_f64() {
    let cx = cx();
    assert!(
        cx.registry()
            .value_promotion_rules()
            .iter()
            .any(|rule| rule.from_domain == domains::f32() && rule.to_domain == domains::f64())
    );
}