Skip to content

Commit 005ad49

Browse files
committed
refactor
1 parent 7a9b5db commit 005ad49

File tree

4 files changed

+138
-141
lines changed

4 files changed

+138
-141
lines changed

bee-vm/src/stack/flow_tests.rs

Lines changed: 0 additions & 138 deletions
This file was deleted.

bee-vm/src/stack/mod.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
pub mod executor;
22

3-
#[cfg(test)]
4-
mod flow_tests;
5-
63
#[derive(Debug, Clone, PartialEq)]
74
pub struct Stack {
85
pub elements: Vec<String>,

bee-vm/src/tests/flow_tests.rs

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
use crate::stack::executor::execute_code;
2+
use crate::stack::Stack;
3+
use rstest::rstest;
4+
use secp256k1::Secp256k1;
5+
6+
#[rstest]
7+
#[case(
8+
vec!["2", "3", "OP_ADD"],
9+
vec!["5"],
10+
vec![],
11+
"Basic arithmetic"
12+
)]
13+
#[case(
14+
vec!["1", "2", "3", "OP_DUP", "OP_ROT", "OP_SWAP"],
15+
vec!["1", "3", "2", "3"],
16+
vec![],
17+
"Stack operations"
18+
)]
19+
#[case(
20+
vec!["1", "2", "OP_TOALTSTACK", "3", "OP_FROMALTSTACK"],
21+
vec!["1", "3", "2"],
22+
vec![],
23+
"Alt stack operations"
24+
)]
25+
#[case(
26+
vec!["1", "OP_IF", "2", "OP_ENDIF"],
27+
vec!["2"],
28+
vec![],
29+
"Simple if execution"
30+
)]
31+
#[case(
32+
vec!["0", "OP_IF", "2", "OP_ELSE", "3", "OP_ENDIF"],
33+
vec!["3"],
34+
vec![],
35+
"If-else execution"
36+
)]
37+
#[case(
38+
vec!["1", "OP_IF", "2", "OP_IF", "3", "OP_ENDIF", "4", "OP_ENDIF"],
39+
vec!["3", "4"],
40+
vec![],
41+
"Nested if statements"
42+
)]
43+
#[case(
44+
vec!["1", "OP_IF", "OP_ENDIF"],
45+
vec![],
46+
vec![],
47+
"Empty if block"
48+
)]
49+
#[case(
50+
vec!["1", "OP_IF", "2", "3", "OP_ADD", "OP_ELSE", "5", "OP_ENDIF"],
51+
vec!["5"],
52+
vec![],
53+
"Mixing control flow and arithmetic"
54+
)]
55+
fn test_execute_code_success(
56+
#[case] opcodes: Vec<&str>,
57+
#[case] expected_main: Vec<&str>,
58+
#[case] expected_alt: Vec<&str>,
59+
#[case] test_name: &str,
60+
) -> color_eyre::Result<()> {
61+
let secp = Secp256k1::new();
62+
63+
let opcodes = opcodes.into_iter().map(String::from).collect();
64+
let (main_stack, alt_stack) = execute_code(opcodes, secp)?;
65+
66+
assert_eq!(
67+
main_stack,
68+
Stack::stack_from(vec_str_to_vec_string(expected_main)),
69+
"Failed test: {}",
70+
test_name
71+
);
72+
assert_eq!(
73+
alt_stack,
74+
Stack::stack_from(vec_str_to_vec_string(expected_alt)),
75+
"Failed test: {}",
76+
test_name
77+
);
78+
79+
Ok(())
80+
}
81+
82+
#[rstest]
83+
#[case(vec!["OP_IF"], "Unbalanced if")]
84+
#[case(vec!["OP_ELSE"], "Unbalanced else")]
85+
#[case(vec!["OP_ENDIF"], "Unbalanced endif")]
86+
#[case(vec!["1", "OP_ELSE"], "Else without if")]
87+
#[case(vec!["1", "OP_ENDIF"], "Endif without if")]
88+
#[case(vec!["OP_IF", "1", "OP_ENDIF"], "If without condition")]
89+
#[case(vec!["OP_UNKNOWN"], "Unknown opcode")]
90+
fn test_execute_code_failure(#[case] opcodes: Vec<&str>, #[case] test_name: &str) {
91+
let secp = Secp256k1::new();
92+
93+
let opcodes = opcodes.into_iter().map(String::from).collect();
94+
let result = execute_code(opcodes, secp);
95+
println!(">>> result : {:?}", result);
96+
assert!(result.is_err(), "Expected error for test: {}", test_name);
97+
}
98+
99+
#[rstest]
100+
#[case(
101+
vec!["1", "OP_IF", "2", "OP_IF", "3", "OP_ELSE", "4", "OP_ENDIF", "OP_ELSE", "5", "OP_IF", "6", "OP_ENDIF", "OP_ENDIF"],
102+
vec!["3"],
103+
vec![],
104+
"Complex control flow"
105+
)]
106+
fn test_complex_control_flow(
107+
#[case] opcodes: Vec<&str>,
108+
#[case] expected_main: Vec<&str>,
109+
#[case] expected_alt: Vec<&str>,
110+
#[case] test_name: &str,
111+
) -> color_eyre::Result<()> {
112+
let secp = Secp256k1::new();
113+
114+
let opcodes = opcodes.into_iter().map(String::from).collect();
115+
let (main_stack, alt_stack) = execute_code(opcodes, secp)?;
116+
117+
assert_eq!(
118+
main_stack,
119+
Stack::stack_from(vec_str_to_vec_string(expected_main)),
120+
"Failed test: {}",
121+
test_name
122+
);
123+
assert_eq!(
124+
alt_stack,
125+
Stack::stack_from(vec_str_to_vec_string(expected_alt)),
126+
"Failed test: {}",
127+
test_name
128+
);
129+
130+
Ok(())
131+
}
132+
133+
fn vec_str_to_vec_string(str_vec: Vec<&str>) -> Vec<String> {
134+
str_vec.iter().map(|&s| s.to_string()).collect()
135+
}

bee-vm/src/tests/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
#[cfg(test)]
22
pub mod basic_script_test;
3+
4+
#[cfg(test)]
5+
mod flow_tests;

0 commit comments

Comments
 (0)