1
//! Registration must work across crate boundaries without explicit initialisation.
2
use conjure_cp::representation::{ReprRule, get_repr_by_name, get_repr_rules};
3
use conjure_cp::rule_engine::{get_all_rules, get_rule_by_name, get_rule_set_by_name};
4
use conjure_cp_rules::representation::IntDirect;
5

            
6
mod downstream {
7
    use conjure_cp::ast::{Expression, SymbolTable};
8
    use conjure_cp::rule_engine::{
9
        ApplicationResult, RuleEffect, register_rule, register_rule_set,
10
    };
11

            
12
    register_rule_set!("RegistrationTest");
13

            
14
    #[register_rule("RegistrationTest", 7)]
15
    fn downstream_identity(expr: &Expression, _: &SymbolTable) -> ApplicationResult {
16
        Ok(RuleEffect::pure(expr.clone()))
17
    }
18
}
19

            
20
#[test]
21
1
fn discovers_downstream_rules_and_rule_sets() {
22
1
    let rule = get_rule_by_name("downstream_identity").unwrap();
23
1
    let set = get_rule_set_by_name("RegistrationTest").unwrap();
24
1
    assert_eq!(set.get_rules().get(rule), Some(&7));
25
1
    assert_eq!(
26
1
        get_all_rules()
27
1
            .iter()
28
332
            .filter(|r| r.name == rule.name)
29
            .count(),
30
1
        1
31
    );
32
1
}
33

            
34
#[test]
35
1
fn discovers_representations_from_the_rules_crate() {
36
1
    let repr = get_repr_by_name(IntDirect::NAME).unwrap();
37
1
    assert_eq!(repr.short_name(), IntDirect::SHORT_NAME);
38
1
    assert_eq!(
39
1
        get_repr_rules()
40
37
            .filter(|r| r.name() == IntDirect::NAME)
41
            .count(),
42
1
        1
43
    );
44
1
}