use crate::{Effect, Eval, Script};
#[test]
fn empty_script_triggers_out_of_tokens() {
let script = Script::compile("");
let mut eval = Eval::new();
let (effect, _) = eval.run(&script);
assert_eq!(effect, Effect::OutOfOperators);
assert_eq!(eval.operand_stack.to_u32_slice(), &[]);
}
#[test]
fn yield_operator_triggers_the_respective_effect() {
let script = Script::compile("yield");
let mut eval = Eval::new();
let (effect, _) = eval.run(&script);
assert_eq!(effect, Effect::Yield);
assert_eq!(eval.operand_stack.to_u32_slice(), &[]);
}
#[test]
fn active_effect_prevents_evaluation_from_advancing() {
let script = Script::compile("yield 1");
let mut eval = Eval::new();
let (effect, _) = eval.run(&script);
assert_eq!(effect, Effect::Yield);
assert_eq!(eval.operand_stack.to_u32_slice(), &[]);
let (effect, _) = eval.run(&script);
assert_eq!(effect, Effect::Yield);
assert_eq!(eval.operand_stack.to_u32_slice(), &[]);
}
#[test]
fn stack_underflow_triggers_effect() {
let script = Script::compile("1 +");
let mut eval = Eval::new();
let (effect, _) = eval.run(&script);
assert_eq!(effect, Effect::OperandStackUnderflow);
assert_eq!(eval.operand_stack.to_u32_slice(), &[]);
}