1
#![allow(unused)]
2

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

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

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

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

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

            
35
1396
fn default_minion_discrete_threshold() -> usize {
36
1396
    conjure_cp::settings::DEFAULT_MINION_DISCRETE_THRESHOLD
37
1396
}
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
740
    fn default() -> Self {
81
740
        Self {
82
740
            parser: vec!["tree-sitter".to_string(), "via-conjure".to_string()],
83
740
            rewriter: vec!["naive".to_string()],
84
740
            comprehension_expander: vec![
85
740
                "native".to_string(),
86
740
                "via-solver".to_string(),
87
740
                "via-solver-ac".to_string(),
88
740
            ],
89
740
            solver: {
90
740
                let mut solvers = vec![
91
740
                    "minion".to_string(),
92
740
                    "sat-log".to_string(),
93
740
                    "sat-direct".to_string(),
94
740
                    "sat-order".to_string(),
95
740
                ];
96
740

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

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

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

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

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

            
137
572
        parse_values(&values)
138
572
    }
139

            
140
572
    pub fn configured_solvers(&self) -> Result<Vec<SolverFamily>, String> {
141
572
        parse_values(&self.solver)
142
572
    }
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
}