assura-types 0.4.3

Type checking for the Assura contract language
Documentation
use super::*;

fn parse_source(src: &str) -> assura_parser::ast::SourceFile {
    let (sf, errs) = assura_parser::parse(src);
    assert!(errs.is_empty(), "parse errors: {errs:?}");
    sf.unwrap()
}

#[test]
fn callback_no_annotation_no_errors() {
    let sf = parse_source(r#"contract Simple { requires { true } }"#);
    assert!(run_callback_reentrancy_checks(&sf).is_empty());
}

#[test]
fn callback_reentrant_emits_a24001() {
    let sf = parse_source(r#"contract G { non_reentrant handler requires { handler > 0 } }"#);
    let errs = run_callback_reentrancy_checks(&sf);
    assert!(errs.iter().any(|e| e.code == "A24001"), "got: {errs:?}");
}

#[test]
fn deadline_no_annotation_no_errors() {
    let sf = parse_source(r#"contract Simple { requires { true } }"#);
    assert!(run_temporal_deadline_checks(&sf).is_empty());
}

#[test]
fn deadline_unbounded_op_emits_a25003() {
    let sf = parse_source(r#"contract T { deadline respond requires { compute > 0 } }"#);
    let errs = run_temporal_deadline_checks(&sf);
    assert!(errs.iter().any(|e| e.code == "A25003"), "got: {errs:?}");
}