summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/forth/vm.rs32
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)],