essential-check 0.15.0

Core logic related to validating Essential state transitions.
Documentation
use essential_check::predicate::{self, InvalidPredicate};
use essential_types::{
    predicate::{Node, Predicate},
    ContentAddress,
};
use util::{empty_predicate, random_keypair};

pub mod util;

#[test]
fn signed_contract_one_empty_predicate() {
    let (sk, _pk) = random_keypair([0; 32]);
    let signed = essential_sign::contract::sign(vec![empty_predicate()].into(), &sk);
    predicate::check_signed_contract(&signed).unwrap();
}

#[test]
fn invalid_signature() {
    let (sk, _pk) = random_keypair([0; 32]);
    let mut signed = essential_sign::contract::sign(vec![empty_predicate()].into(), &sk);
    signed.signature.0 = [0; 64];
    assert!(matches!(
        predicate::check_signed_contract(&signed).unwrap_err(),
        predicate::InvalidSignedContract::Signature(_),
    ));
}

#[test]
fn too_many_predicates() {
    let predicates: Vec<_> = vec![empty_predicate(); predicate::MAX_PREDICATES + 1];
    let (sk, _pk) = random_keypair([0; 32]);
    let signed = essential_sign::contract::sign(predicates.into(), &sk);
    assert!(matches!(
        predicate::check_signed_contract(&signed).unwrap_err(),
        predicate::InvalidSignedContract::Set(predicate::InvalidContract::TooManyPredicates(n))
            if n == predicate::MAX_PREDICATES + 1
    ));
}

#[test]
fn too_many_nodes() {
    let mut predicate = empty_predicate();
    predicate.nodes = vec![
        Node {
            edge_start: 0,
            program_address: ContentAddress([0; 32]),
        };
        usize::from(Predicate::MAX_NODES) + 1
    ];
    assert!(matches!(
        predicate::check(&predicate).unwrap_err(),
        InvalidPredicate::TooManyNodes(n)
            if n == usize::from(Predicate::MAX_NODES) + 1
    ));
}

#[test]
fn too_many_edges() {
    let mut predicate = empty_predicate();
    predicate.edges = vec![0; usize::from(Predicate::MAX_EDGES) + 1];
    assert!(matches!(
        predicate::check(&predicate).unwrap_err(),
        InvalidPredicate::TooManyEdges(n)
            if n == usize::from(Predicate::MAX_EDGES) + 1
    ));
}