uni_core/primitives/
clear.rs

1// RUST CONCEPT: Modular primitive organization
2// Each primitive gets its own file with implementation and tests
3use crate::interpreter::Interpreter;
4use crate::value::RuntimeError;
5
6// RUST CONCEPT: Clear builtin - removes all items from the stack
7// Usage: clear  (empties the entire stack)
8pub fn clear_builtin(interp: &mut Interpreter) -> Result<(), RuntimeError> {
9    interp.stack.clear();
10    Ok(())
11}
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16    use crate::value::Value;
17
18    fn setup_interpreter() -> Interpreter {
19        Interpreter::new()
20    }
21
22    #[test]
23    fn test_clear_builtin_empty_stack() {
24        let mut interp = setup_interpreter();
25
26        // Clear on empty stack should succeed
27        let result = clear_builtin(&mut interp);
28        assert!(result.is_ok());
29        assert!(interp.stack.is_empty());
30    }
31
32    #[test]
33    fn test_clear_builtin_with_values() {
34        let mut interp = setup_interpreter();
35
36        // Push some values
37        interp.push(Value::Number(1.0));
38        interp.push(Value::Number(2.0));
39        interp.push(Value::Number(3.0));
40
41        assert_eq!(interp.stack.len(), 3);
42
43        // Clear should remove all values
44        let result = clear_builtin(&mut interp);
45        assert!(result.is_ok());
46        assert!(interp.stack.is_empty());
47    }
48
49    #[test]
50    fn test_clear_builtin_multiple_times() {
51        let mut interp = setup_interpreter();
52
53        // Push values
54        interp.push(Value::Number(1.0));
55        interp.push(Value::Number(2.0));
56
57        // Clear
58        clear_builtin(&mut interp).unwrap();
59        assert!(interp.stack.is_empty());
60
61        // Push more values
62        interp.push(Value::Number(3.0));
63        interp.push(Value::Number(4.0));
64
65        // Clear again
66        clear_builtin(&mut interp).unwrap();
67        assert!(interp.stack.is_empty());
68    }
69
70    #[test]
71    fn test_clear_builtin_many_items() {
72        let mut interp = setup_interpreter();
73
74        // Push many values
75        for i in 0..100 {
76            interp.push(Value::Number(i as f64));
77        }
78
79        assert_eq!(interp.stack.len(), 100);
80
81        // Clear should remove all
82        let result = clear_builtin(&mut interp);
83        assert!(result.is_ok());
84        assert!(interp.stack.is_empty());
85    }
86}