1
#![allow(unused)]
2

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

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

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

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

            
31
#[derive(Deserialize, Debug)]
32
#[serde(default)]
33
#[serde(deny_unknown_fields)]
34
pub struct TestConfig {
35
    #[serde(
36
        default,
37
        rename = "parser",
38
        alias = "parsers",
39
        deserialize_with = "deserialize_string_or_vec"
40
    )]
41
    pub parser: Vec<String>, // Stage 1a: list of parsers (tree-sitter or via-conjure)
42

            
43
    #[serde(
44
        default,
45
        rename = "rewriter",
46
        deserialize_with = "deserialize_string_or_vec"
47
    )]
48
    pub rewriter: Vec<String>,
49
    #[serde(
50
        default,
51
        rename = "quantified-expander",
52
        alias = "quantified_expander",
53
        deserialize_with = "deserialize_string_or_vec"
54
    )]
55
    pub quantified_expander: Vec<String>,
56
    #[serde(
57
        default,
58
        rename = "solver",
59
        alias = "solvers",
60
        deserialize_with = "deserialize_string_or_vec"
61
    )]
62
    pub solver: Vec<String>,
63
}
64

            
65
impl Default for TestConfig {
66
1305
    fn default() -> Self {
67
1305
        Self {
68
1305
            parser: vec!["tree-sitter".to_string(), "via-conjure".to_string()],
69
1305
            rewriter: vec!["naive".to_string()],
70
1305
            quantified_expander: vec![
71
1305
                "native".to_string(),
72
1305
                "via-solver".to_string(),
73
1305
                "via-solver-ac".to_string(),
74
1305
            ],
75
1305
            solver: {
76
1305
                let mut solvers = vec![
77
1305
                    "minion".to_string(),
78
1305
                    "sat-log".to_string(),
79
1305
                    "sat-direct".to_string(),
80
1305
                    "sat-order".to_string(),
81
1305
                ];
82
1305
                #[cfg(feature = "smt")]
83
1305
                {
84
1305
                    solvers.extend([
85
1305
                        "smt".to_string(),
86
1305
                        "smt-lia-arrays-nodiscrete".to_string(),
87
1305
                        "smt-lia-atomic".to_string(),
88
1305
                        "smt-lia-atomic-nodiscrete".to_string(),
89
1305
                        "smt-bv-arrays".to_string(),
90
1305
                        "smt-bv-arrays-nodiscrete".to_string(),
91
1305
                        "smt-bv-atomic".to_string(),
92
1305
                        "smt-bv-atomic-nodiscrete".to_string(),
93
1305
                    ]);
94
1305
                }
95
1305
                solvers
96
1305
            },
97
1305
        }
98
1305
    }
99
}
100

            
101
impl TestConfig {
102
261
    pub fn configured_parsers(&self) -> Result<Vec<Parser>, String> {
103
261
        parse_values(&self.parser)
104
261
    }
105

            
106
261
    pub fn configured_rewriters(&self) -> Result<Vec<Rewriter>, String> {
107
261
        if self.rewriter.is_empty() {
108
            return Err("setting 'rewriter' has no values".to_string());
109
261
        }
110

            
111
261
        parse_values(&self.rewriter)
112
261
    }
113

            
114
261
    pub fn configured_quantified_expanders(&self) -> Result<Vec<QuantifiedExpander>, String> {
115
261
        let values = if self.quantified_expander.is_empty() {
116
            vec!["native".to_string()]
117
        } else {
118
261
            self.quantified_expander.clone()
119
        };
120

            
121
261
        parse_values(&values)
122
261
    }
123

            
124
261
    pub fn configured_solvers(&self) -> Result<Vec<SolverFamily>, String> {
125
261
        parse_values(&self.solver)
126
261
    }
127

            
128
    pub fn uses_smt_solver(&self) -> bool {
129
        self.solver
130
            .iter()
131
            .any(|solver| solver == "smt" || solver.starts_with("smt-"))
132
    }
133
}