#[cfg(test)] use std::rc::Rc; extern crate statechart; use statechart::*; fn a_eq_x(x: i32) -> Condition { cond_fn!(move |it: &Interpreter| -> bool { match it.get_var("a") { Some(&Value::Int(n)) => n == x, _ => false, } }) } #[test] fn first_choice_only_match() { let sc = states!{ S { substates: [ state!{ S0 { transitions: [goto!(target: SF)], on_entry: [action_assign!(key: "a", value: Value::Int(1))], on_exit: [choose!(when: [ (a_eq_x(1), action_assign!(key: "b", value: Value::from_str("matched")))])] }}, final_state!{ SF { result: Output::ValueOf(ValueOfBuilder::default().key("b").build().unwrap()), }}, ]}}; let ctx = Context::new(sc); let mut it = Interpreter::new(); let result = it.run(&ctx); assert!(result.is_ok(), "fault: {:?}", result.err().unwrap()); assert_eq!(result.unwrap(), Value::from_str("matched")); } #[test] fn last_match() { let sc = states!{ S { substates: [ state!{ S0 { transitions: [goto!(target: SF)], on_entry: [action_assign!(key: "a", value: Value::Int(2))], on_exit: [choose!(when: [ (a_eq_x(1), action_assign!(key: "b", value: Value::from_str("not matched"))), (a_eq_x(2), action_assign!(key: "b", value: Value::from_str("matched")))])], }}, final_state!{ SF { result: Output::ValueOf(ValueOfBuilder::default().key("b").build().unwrap()), }}, ]}}; let ctx = Context::new(sc); let mut it = Interpreter::new(); let result = it.run(&ctx); assert!(result.is_ok(), "fault: {:?}", result.err().unwrap()); assert_eq!(result.unwrap(), Value::from_str("matched")); } #[test] fn otherwise() { let sc = states!{ S { substates: [ state!{ S0 { transitions: [goto!(target: SF)], on_exit: [choose!(when: [ (a_eq_x(1), action_assign!(key: "b", value: Value::from_str("not matched"))), (a_eq_x(2), action_assign!(key: "b", value: Value::from_str("not matched")))], otherwise: action_assign!(key: "b", value: Value::from_str("matched")))], }}, final_state!{ SF { result: Output::ValueOf(ValueOfBuilder::default().key("b").build().unwrap()), }}, ]}}; let ctx = Context::new(sc); let mut it = Interpreter::new(); let result = it.run(&ctx); assert!(result.is_ok(), "fault: {:?}", result.err().unwrap()); assert_eq!(result.unwrap(), Value::from_str("matched")); }