perl_test_generators/code/
statements.rs1use proptest::prelude::*;
2use proptest::strategy::BoxedStrategy;
3
4use super::expressions::simple_expression;
5use super::identifiers::scalar_variable;
6
7fn simple_statement_with_depth(depth: u32) -> BoxedStrategy<String> {
8 let var = scalar_variable().boxed();
9 let expr = simple_expression();
10 let base = prop_oneof![
11 var.clone().prop_map(|name| format!("my {name};")),
12 (var.clone(), expr.clone()).prop_map(|(name, value)| format!("my {name} = {value};")),
13 (var.clone(), expr.clone()).prop_map(|(name, value)| format!("{name} = {value};")),
14 expr.clone().prop_map(|value| format!("print {value};")),
15 ];
16
17 if depth == 0 {
18 return base.boxed();
19 }
20
21 prop_oneof![
22 base,
23 (expr, simple_statement_with_depth(depth - 1))
24 .prop_map(|(condition, body)| format!("if ({condition}) {{ {body} }}")),
25 ]
26 .boxed()
27}
28
29pub fn simple_statement() -> BoxedStrategy<String> {
31 simple_statement_with_depth(2)
32}
33
34pub fn simple_program() -> impl Strategy<Value = String> {
36 prop::collection::vec(simple_statement(), 0..=8_usize)
37 .prop_map(|statements| statements.join("\n"))
38}