diff options
| author | Brian Cully <bjc@spork.org> | 2025-08-25 15:09:04 -0400 |
|---|---|---|
| committer | Brian Cully <bjc@spork.org> | 2025-08-25 15:09:04 -0400 |
| commit | 180296dc6f489828a86bbd9b9b87010584cbd37b (patch) | |
| tree | 08f740f820734d9a2b4b55e53abba5511e502b12 /src/forth/vm.rs | |
| parent | 091b7cc7d748624b455be2a4579a6870e94cac09 (diff) | |
| download | automathon-180296dc6f489828a86bbd9b9b87010584cbd37b.tar.gz automathon-180296dc6f489828a86bbd9b9b87010584cbd37b.zip | |
some underflow tests
Diffstat (limited to 'src/forth/vm.rs')
| -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)], |
