1
use conjure_cp_essence_parser::diagnostics::diagnostics_api::get_diagnostics;
2
use conjure_cp_essence_parser::diagnostics::error_detection::collect_errors::check_diagnostic;
3
use conjure_cp_essence_parser::util::get_tree;
4

            
5
#[test]
6
1
fn detects_undefined_variable() {
7
1
    let source = "find x: int(1..10)\nsuch that x = y";
8
    // y is undefined
9
1
    let (cst, _) = get_tree(&source).unwrap();
10
1
    let diagnostics = get_diagnostics(&source, &cst);
11

            
12
1
    assert_eq!(
13
1
        diagnostics.len(),
14
1
        1,
15
        "Expected exactly one diagnostic for undefined variable"
16
    );
17

            
18
1
    let diag = &diagnostics[0];
19

            
20
1
    check_diagnostic(diag, 1, 14, 1, 15, "The identifier 'y' is not defined");
21
1
}
22

            
23
#[test]
24
1
fn no_errors_for_valid_code() {
25
1
    let source = "find x, y: int(1..10)\nsuch that x + y = 10";
26
1
    let (cst, _) = get_tree(&source).unwrap();
27

            
28
1
    let diagnostics = get_diagnostics(&source, &cst);
29

            
30
    // should have no diagnostics
31
1
    assert_eq!(
32
1
        diagnostics.len(),
33
1
        0,
34
        "Expected no diagnostics for valid code, got: {:?}",
35
        diagnostics
36
    );
37
1
}
38

            
39
#[test]
40
1
fn range_points_to_error_location() {
41
1
    let source = "find x: int(1..10)\nsuch that x = undefined_var";
42
1
    let (cst, _) = get_tree(&source).unwrap();
43

            
44
1
    let diagnostics = get_diagnostics(&source, &cst);
45

            
46
1
    assert_eq!(
47
1
        diagnostics.len(),
48
1
        1,
49
        "Expected exactly one diagnostic for undefined variable"
50
    );
51

            
52
1
    let diag = &diagnostics[0];
53

            
54
1
    check_diagnostic(
55
1
        diag,
56
1
        1,
57
1
        14,
58
1
        1,
59
1
        27,
60
1
        "The identifier 'undefined_var' is not defined",
61
1
    );
62
1
}
63

            
64
#[test]
65
1
fn domain_start_greater_than_end_is_empty() {
66
1
    let source = "find x: int(10..1)";
67
1
    let (cst, _) = get_tree(&source).unwrap();
68

            
69
1
    let diagnostics = get_diagnostics(&source, &cst);
70

            
71
1
    assert_eq!(
72
1
        diagnostics.len(),
73
1
        0,
74
        "Expected reversed integer ranges to be accepted as empty domains"
75
    );
76
1
}