Skip to main content

stack/
stack.rs

1#![allow(dead_code)]
2
3use hegel::TestCase;
4use hegel::generators as gs;
5
6struct IntegerStack {
7    stack: Vec<i32>,
8}
9
10#[hegel::state_machine]
11impl IntegerStack {
12    #[rule]
13    fn push(&mut self, tc: TestCase) {
14        let integers = gs::integers::<i32>;
15        let element = tc.draw(integers());
16        self.stack.push(element);
17    }
18
19    #[rule]
20    fn pop(&mut self, _: TestCase) {
21        self.stack.pop();
22    }
23
24    #[rule]
25    fn pop_push(&mut self, tc: TestCase) {
26        let integers = gs::integers::<i32>;
27        let element = tc.draw(integers());
28        let initial = self.stack.clone();
29        self.stack.push(element);
30        let popped = self.stack.pop().unwrap();
31        assert_eq!(popped, element);
32        assert_eq!(self.stack, initial);
33    }
34
35    #[rule]
36    fn push_pop(&mut self, tc: TestCase) {
37        let initial = self.stack.clone();
38        let element = self.stack.pop();
39        tc.assume(element.is_some());
40        let element = element.unwrap();
41        self.stack.push(element);
42        assert_eq!(self.stack, initial);
43    }
44}
45
46#[hegel::test]
47fn test_integer_stack(tc: TestCase) {
48    let stack = IntegerStack { stack: Vec::new() };
49    hegel::stateful::run(stack, tc);
50}
51
52fn main() {}