From 180296dc6f489828a86bbd9b9b87010584cbd37b Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Mon, 25 Aug 2025 15:09:04 -0400 Subject: some underflow tests --- src/forth/vm.rs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'src') 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, } @@ -595,6 +595,16 @@ mod tests { Ok(()) } + #[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![ @@ -606,6 +616,16 @@ mod tests { Ok(()) } + #[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![ @@ -617,6 +637,16 @@ mod tests { Ok(()) } + #[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![ -- cgit v1.3