summaryrefslogtreecommitdiffstats
path: root/src/forth/vm.rs
diff options
context:
space:
mode:
authorBrian Cully <bjc@spork.org>2025-08-25 15:09:04 -0400
committerBrian Cully <bjc@spork.org>2025-08-25 15:09:04 -0400
commit180296dc6f489828a86bbd9b9b87010584cbd37b (patch)
tree08f740f820734d9a2b4b55e53abba5511e502b12 /src/forth/vm.rs
parent091b7cc7d748624b455be2a4579a6870e94cac09 (diff)
downloadautomathon-180296dc6f489828a86bbd9b9b87010584cbd37b.tar.gz
automathon-180296dc6f489828a86bbd9b9b87010584cbd37b.zip
some underflow tests
Diffstat (limited to 'src/forth/vm.rs')
-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)],