diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/forth/vm.rs | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/forth/vm.rs b/src/forth/vm.rs index e5973dd..2305393 100644 --- a/src/forth/vm.rs +++ b/src/forth/vm.rs @@ -112,7 +112,7 @@ pub struct VM { pub ip: InstructionPointer, } -#[derive(Debug)] +#[derive(Debug, PartialEq, Eq)] pub enum RuntimeError { StackUnderflow, } @@ -596,6 +596,16 @@ mod tests { } #[test] + fn opcode_dup_underflow() -> Result<(), RuntimeError> { + let wordlist = wl_for(vec![ + vec![OpCode::Dup], + ]); + let mut vm = VM::new(wordlist); + assert!(vm.run().is_err_and(|e| e == RuntimeError::StackUnderflow)); + Ok(()) + } + + #[test] fn opcode_swap() -> Result<(), RuntimeError> { let wordlist = wl_for(vec![ vec![OpCode::Num(1), OpCode::Num(2), OpCode::Swap], @@ -607,6 +617,16 @@ mod tests { } #[test] + fn opcode_swap_underflow() -> Result<(), RuntimeError> { + let wordlist = wl_for(vec![ + vec![OpCode::Num(1), OpCode::Swap], + ]); + let mut vm = VM::new(wordlist); + assert!(vm.run().is_err_and(|e| e == RuntimeError::StackUnderflow)); + Ok(()) + } + + #[test] fn opcode_rot() -> Result<(), RuntimeError> { let wordlist = wl_for(vec![ vec![OpCode::Num(1), OpCode::Num(2), OpCode::Num(3), OpCode::Rot], @@ -618,6 +638,16 @@ mod tests { } #[test] + fn opcode_rot_underflow() -> Result<(), RuntimeError> { + let wordlist = wl_for(vec![ + vec![OpCode::Num(1), OpCode::Num(2), OpCode::Rot], + ]); + let mut vm = VM::new(wordlist); + assert!(vm.run().is_err_and(|e| e == RuntimeError::StackUnderflow)); + Ok(()) + } + + #[test] fn tif_no_ret() -> Result<(), RuntimeError> { let wordlist = wl_for(vec![ vec![OpCode::Call(1)], |
