1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
use ergotree_ir::mir::option_get_or_else::OptionGetOrElse; use ergotree_ir::mir::value::Value; use crate::eval::env::Env; use crate::eval::EvalContext; use crate::eval::EvalError; use crate::eval::Evaluable; impl Evaluable for OptionGetOrElse { fn eval(&self, env: &Env, ctx: &mut EvalContext) -> Result<Value, EvalError> { let v = self.input.eval(env, ctx)?; let default_v = self.default.eval(env, ctx)?; match v { Value::Opt(opt_v) => Ok(opt_v.unwrap_or(default_v)), _ => Err(EvalError::UnexpectedExpr(format!( "Don't know how to eval OptM: {0:?}", self ))), } } } #[cfg(test)] mod tests { use super::OptionGetOrElse; use crate::eval::context::Context; use crate::eval::tests::eval_out; use ergotree_ir::mir::constant::Constant; use ergotree_ir::mir::expr::Expr; use ergotree_ir::mir::extract_reg_as::ExtractRegisterAs; use ergotree_ir::mir::global_vars::GlobalVars; use ergotree_ir::types::stype::SType; use sigma_test_util::force_any_val; use std::rc::Rc; #[test] fn eval_non_empty() { let get_reg_expr: Expr = ExtractRegisterAs::new( GlobalVars::SelfBox.into(), 0, SType::SOption(SType::SLong.into()), ) .unwrap() .into(); let default_expr: Constant = 1i64.into(); let option_get_expr: Expr = OptionGetOrElse::new(get_reg_expr, default_expr.into()) .unwrap() .into(); let ctx = Rc::new(force_any_val::<Context>()); let v = eval_out::<i64>(&option_get_expr, ctx.clone()); assert_eq!(v, ctx.self_box.get_box(&ctx.box_arena).unwrap().value()); } #[test] fn eval_empty() { let get_reg_expr: Expr = ExtractRegisterAs::new( GlobalVars::SelfBox.into(), 9, SType::SOption(SType::SLong.into()), ) .unwrap() .into(); let default_expr: Constant = 1i64.into(); let option_get_expr: Expr = OptionGetOrElse::new(get_reg_expr, default_expr.into()) .unwrap() .into(); let ctx = Rc::new(force_any_val::<Context>()); let v = eval_out::<i64>(&option_get_expr, ctx); assert_eq!(v, 1i64); } }