uni_core/primitives/
drop.rs1use crate::interpreter::Interpreter;
4use crate::value::RuntimeError;
5
6pub fn drop_builtin(interp: &mut Interpreter) -> Result<(), RuntimeError> {
9 interp.pop()?;
12 Ok(())
13}
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18 use crate::value::Value;
19
20 fn setup_interpreter() -> Interpreter {
21 Interpreter::new()
22 }
23
24 #[test]
25 fn test_drop_builtin() {
26 let mut interp = setup_interpreter();
27
28 interp.push(Value::Number(42.0));
30 interp.push(Value::Number(17.0));
31 drop_builtin(&mut interp).unwrap();
32
33 let result = interp.pop().unwrap();
35 assert!(matches!(result, Value::Number(n) if n == 42.0));
36
37 let empty_result = interp.pop();
39 assert!(matches!(empty_result, Err(RuntimeError::StackUnderflow)));
40 }
41
42 #[test]
43 fn test_drop_builtin_various_types() {
44 let mut interp = setup_interpreter();
45
46 interp.push(Value::Number(1.0));
48 interp.push(Value::String("drop me".into()));
49 drop_builtin(&mut interp).unwrap();
50 let result = interp.pop().unwrap();
51 assert!(matches!(result, Value::Number(n) if n == 1.0));
52
53 interp.push(Value::Boolean(true));
54 interp.push(Value::Null);
55 drop_builtin(&mut interp).unwrap();
56 let result = interp.pop().unwrap();
57 assert!(matches!(result, Value::Boolean(true)));
58
59 let keep_atom = interp.intern_atom("keep");
60 interp.push(Value::Atom(keep_atom));
61 interp.push(Value::Nil);
62 drop_builtin(&mut interp).unwrap();
63 let result = interp.pop().unwrap();
64 if let Value::Atom(atom) = result {
65 assert_eq!(&*atom, "keep");
66 } else {
67 panic!("Expected atom");
68 }
69 }
70
71 #[test]
72 fn test_drop_builtin_stack_underflow() {
73 let mut interp = setup_interpreter();
74
75 let result = drop_builtin(&mut interp);
77 assert!(matches!(result, Err(RuntimeError::StackUnderflow)));
78 }
79}