1
// There are three letter x, y, and z, which are each integers between 1 and 3 inclusive, where x + y = z
2

            
3
use minion_sys::ast::{Constant, Constraint, Model, Var, VarDomain};
4
use minion_sys::error::MinionError;
5

            
6
#[test]
7
#[allow(clippy::panic_in_result_fn)]
8
1
fn test_table_constraint() -> Result<(), MinionError> {
9
1
    let mut model = Model::new();
10

            
11
    // Declares variables (x, y, z), explicitly setting the integers to be between 1 and 3
12
1
    model
13
1
        .named_variables
14
1
        .add_var(String::from("x"), VarDomain::Discrete(1, 3));
15
1
    model
16
1
        .named_variables
17
1
        .add_var(String::from("y"), VarDomain::Discrete(1, 3));
18
1
    model
19
1
        .named_variables
20
1
        .add_var(String::from("z"), VarDomain::Discrete(1, 3));
21

            
22
    // Defines the table data (a list of tuples)
23
1
    let table_data = vec![
24
1
        vec![
25
1
            Constant::Integer(1),
26
1
            Constant::Integer(1),
27
1
            Constant::Integer(2),
28
        ],
29
1
        vec![
30
1
            Constant::Integer(1),
31
1
            Constant::Integer(2),
32
1
            Constant::Integer(3),
33
        ],
34
1
        vec![
35
1
            Constant::Integer(2),
36
1
            Constant::Integer(1),
37
1
            Constant::Integer(3),
38
        ],
39
    ];
40
    // Builds the Table constraint
41
1
    let vars = vec![
42
1
        Var::NameRef(String::from("x")),
43
1
        Var::NameRef(String::from("y")),
44
1
        Var::NameRef(String::from("z")),
45
    ];
46

            
47
1
    model.constraints.push(Constraint::Table(vars, table_data));
48

            
49
    // Runs the solver via the Minion interface
50
1
    let mut sols_counter = 0u32;
51
1
    let solver_ctx = minion_sys::run_minion(
52
1
        model,
53
3
        Box::new(|_| {
54
3
            sols_counter += 1;
55
3
            true
56
3
        }),
57
    )?;
58

            
59
    // Asserts that we found exactly 3 solutions (one for each row in the table)
60
1
    assert_eq!(sols_counter, 3);
61
1
    assert_ne!(solver_ctx.get_from_table("Nodes".into()), None);
62
1
    Ok(())
63
1
}