1
#![allow(unused)]
2

            
3
use conjure_cp::settings::{Parser, QuantifiedExpander, Rewriter, SolverFamily};
4
use serde::Deserialize;
5
use std::str::FromStr;
6

            
7
7308
fn parse_values<T>(values: &[String]) -> Result<Vec<T>, String>
8
7308
where
9
7308
    T: FromStr<Err = String>,
10
{
11
8564
    values.iter().map(|value| value.parse()).collect()
12
7308
}
13

            
14
3548
fn deserialize_string_or_vec<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
15
3548
where
16
3548
    D: serde::Deserializer<'de>,
17
{
18
    #[derive(Deserialize)]
19
    #[serde(untagged)]
20
    enum StringOrVec {
21
        String(String),
22
        Vec(Vec<String>),
23
    }
24

            
25
3548
    Ok(match StringOrVec::deserialize(deserializer)? {
26
20
        StringOrVec::String(s) => vec![s],
27
3528
        StringOrVec::Vec(v) => v,
28
    })
29
3548
}
30

            
31
1890
fn default_true() -> bool {
32
1890
    true
33
1890
}
34

            
35
4048
fn default_minion_discrete_threshold() -> usize {
36
4048
    conjure_cp::settings::DEFAULT_MINION_DISCRETE_THRESHOLD
37
4048
}
38

            
39
#[derive(Deserialize, Debug)]
40
#[serde(default)]
41
#[serde(deny_unknown_fields)]
42
pub struct TestConfig {
43
    #[serde(
44
        default,
45
        rename = "parser",
46
        deserialize_with = "deserialize_string_or_vec"
47
    )]
48
    pub parser: Vec<String>, // Stage 1a: list of parsers (tree-sitter or via-conjure)
49

            
50
    #[serde(
51
        default,
52
        rename = "rewriter",
53
        deserialize_with = "deserialize_string_or_vec"
54
    )]
55
    pub rewriter: Vec<String>,
56
    #[serde(
57
        default,
58
        rename = "comprehension-expander",
59
        deserialize_with = "deserialize_string_or_vec"
60
    )]
61
    pub comprehension_expander: Vec<String>,
62
    #[serde(
63
        default,
64
        rename = "solver",
65
        deserialize_with = "deserialize_string_or_vec"
66
    )]
67
    pub solver: Vec<String>,
68

            
69
    #[serde(
70
        default = "default_minion_discrete_threshold",
71
        rename = "minion-discrete-threshold"
72
    )]
73
    pub minion_discrete_threshold: usize,
74

            
75
    #[serde(default = "default_true", rename = "validate-with-conjure")]
76
    pub validate_with_conjure: bool,
77
}
78

            
79
impl Default for TestConfig {
80
2130
    fn default() -> Self {
81
2130
        Self {
82
2130
            parser: vec!["tree-sitter".to_string(), "via-conjure".to_string()],
83
2130
            rewriter: vec!["naive".to_string()],
84
2130
            comprehension_expander: vec![
85
2130
                "native".to_string(),
86
2130
                "via-solver".to_string(),
87
2130
                "via-solver-ac".to_string(),
88
2130
            ],
89
2130
            solver: {
90
2130
                let mut solvers = vec![
91
2130
                    "minion".to_string(),
92
2130
                    "sat-log".to_string(),
93
2130
                    "sat-direct".to_string(),
94
2130
                    "sat-order".to_string(),
95
2130
                ];
96
2130

            
97
2130
                {
98
2130
                    solvers.extend([
99
2130
                        "smt".to_string(),
100
2130
                        "smt-lia-arrays-nodiscrete".to_string(),
101
2130
                        "smt-lia-atomic".to_string(),
102
2130
                        "smt-lia-atomic-nodiscrete".to_string(),
103
2130
                        "smt-bv-arrays".to_string(),
104
2130
                        "smt-bv-arrays-nodiscrete".to_string(),
105
2130
                        "smt-bv-atomic".to_string(),
106
2130
                        "smt-bv-atomic-nodiscrete".to_string(),
107
2130
                    ]);
108
2130
                }
109
2130
                solvers
110
2130
            },
111
2130
            minion_discrete_threshold: default_minion_discrete_threshold(),
112
2130
            validate_with_conjure: true,
113
2130
        }
114
2130
    }
115
}
116

            
117
impl TestConfig {
118
2130
    pub fn configured_parsers(&self) -> Result<Vec<Parser>, String> {
119
2130
        parse_values(&self.parser)
120
2130
    }
121

            
122
1726
    pub fn configured_rewriters(&self) -> Result<Vec<Rewriter>, String> {
123
1726
        if self.rewriter.is_empty() {
124
            return Err("setting 'rewriter' has no values".to_string());
125
1726
        }
126

            
127
1726
        parse_values(&self.rewriter)
128
1726
    }
129

            
130
1726
    pub fn configured_comprehension_expanders(&self) -> Result<Vec<QuantifiedExpander>, String> {
131
1726
        let values = if self.comprehension_expander.is_empty() {
132
            vec!["native".to_string()]
133
        } else {
134
1726
            self.comprehension_expander.clone()
135
        };
136

            
137
1726
        parse_values(&values)
138
1726
    }
139

            
140
1726
    pub fn configured_solvers(&self) -> Result<Vec<SolverFamily>, String> {
141
1726
        parse_values(&self.solver)
142
1726
    }
143

            
144
    pub fn uses_smt_solver(&self) -> bool {
145
        self.solver
146
            .iter()
147
            .any(|solver| solver == "smt" || solver.starts_with("smt-"))
148
    }
149
}