Skip to main content

perl_test_generators/code/
statements.rs

1use 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
29/// Generate a simple statement that should be valid Perl syntax.
30pub fn simple_statement() -> BoxedStrategy<String> {
31    simple_statement_with_depth(2)
32}
33
34/// Generate a small Perl program made from conservative statement forms.
35pub fn simple_program() -> impl Strategy<Value = String> {
36    prop::collection::vec(simple_statement(), 0..=8_usize)
37        .prop_map(|statements| statements.join("\n"))
38}