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() {}