use crate::descriptor::NamespacedName;
use crate::generate::GeneratedSequences;
use crate::report::{FindingCause, TrialConclusion};
use core::cmp::Ordering;
use std::collections::BTreeSet;
#[path = "type_guard.rs"]
mod guard;
const CAUSE_FAMILY: &str = "macroonz.properties";
pub type Check<Input> = fn(&Input) -> TrialConclusion;
pub type Road<Domain, Image> = fn(&Domain) -> Image;
pub type Measure<Value, Quantity> = fn(&Value) -> Quantity;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Agreement {
Agrees,
Differs,
}
pub type Equivalence<Value> = fn(&Value, &Value) -> Agreement;
pub type Order<Value> = fn(&Value, &Value) -> Ordering;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Holding {
Holds,
Fails,
}
pub type StatePredicate<State> = fn(&State) -> Holding;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PoisonResponse {
Refused,
Answered,
}
pub type ResponseReading<Response> = fn(&Response) -> PoisonResponse;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SubstrateRef(NamespacedName);
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SubstrateRoster {
standing: BTreeSet<SubstrateRef>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SharedSubstrate {
DeclaredIndependent,
Standing(SubstrateRoster),
}
#[must_use = "a refusal is the reason a shared substrate was not declared"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SubstrateRefusal {
EmptyRoster,
DuplicateSubstrate(SubstrateRef),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum RoadPairing {
FusedVersusSeparate,
LiveVersusReplayed,
Declared(NamespacedName),
}
pub struct ParitySuite<Input, Meaning> {
pairing: RoadPairing,
left: Road<Input, Meaning>,
right: Road<Input, Meaning>,
same: Equivalence<Meaning>,
substrate: SharedSubstrate,
}
pub struct ParityReading<'suite, 'input, Input, Meaning> {
suite: &'suite ParitySuite<Input, Meaning>,
input: &'input Input,
left: Meaning,
right: Meaning,
conclusion: TrialConclusion,
}
pub enum TemporalDemand<State> {
Always(StatePredicate<State>),
Never(StatePredicate<State>),
Eventually(StatePredicate<State>),
OnceHoldingAlwaysHolding(StatePredicate<State>),
NeverDecreases(Order<State>),
}
pub struct TemporalClaim<State> {
cause: FindingCause,
demand: TemporalDemand<State>,
}
pub struct TransitionContract<State, Command> {
opening: fn() -> State,
apply: fn(&State, &Command) -> State,
claims: Vec<TemporalClaim<State>>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum TemporalDriveStanding {
Concluded(TrialConclusion),
Incomplete,
}
pub struct TemporalDriveReading<Command> {
generated: GeneratedSequences<Command>,
evaluated: usize,
standing: TemporalDriveStanding,
}
#[must_use = "a refusal is the reason a transition contract was not built"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ContractRefusal {
NoClaimDeclared,
}
pub struct ComposedRoads<Entry, Middle, Exit> {
first: Road<Entry, Middle>,
second: Road<Middle, Exit>,
same: Equivalence<Exit>,
}
pub const ROUNDTRIP_DISAGREEMENT: FindingCause = FindingCause::named(CAUSE_FAMILY, "roundtrip");
pub const IDEMPOTENCE_DISAGREEMENT: FindingCause = FindingCause::named(CAUSE_FAMILY, "idempotence");
pub const CONSERVATION_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "conservation");
pub const MONOTONICITY_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "monotonicity");
pub const PERMUTATION_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "permutation-insensitivity");
pub const DETERMINISM_DISAGREEMENT: FindingCause = FindingCause::named(CAUSE_FAMILY, "determinism");
pub const AMBIENT_PATHWAY_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "ambient-pathway-invariance");
pub const FUSED_VERSUS_SEPARATE_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "parity-fused-versus-separate");
pub const LIVE_VERSUS_REPLAYED_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "parity-live-versus-replayed");
pub const COMPOSED_RETURN_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "composition-return");
pub const COMPOSED_IDEMPOTENCE_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "composition-idempotence");
pub const COMPOSED_DETERMINISM_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "composition-determinism");
pub const COMPOSED_CONSERVATION_DISAGREEMENT: FindingCause =
FindingCause::named(CAUSE_FAMILY, "composition-conservation");
pub const FAIL_CLOSED_ANSWERED: FindingCause = FindingCause::named(CAUSE_FAMILY, "fail-closed");
pub const LAWFUL_TWIN_REFUSED: FindingCause = FindingCause::named(CAUSE_FAMILY, "lawful-twin");
pub const ANSWER_EXPECTED: FindingCause = FindingCause::named(CAUSE_FAMILY, "answer-expected");
pub const REFUSAL_EXPECTED: FindingCause = FindingCause::named(CAUSE_FAMILY, "refusal-expected");
pub const NO_SEQUENCE_DRIVEN: FindingCause =
FindingCause::named(CAUSE_FAMILY, "no-sequence-driven");
pub const ALWAYS_BROKEN: FindingCause = FindingCause::named(CAUSE_FAMILY, "temporal-always");
pub const NEVER_BROKEN: FindingCause = FindingCause::named(CAUSE_FAMILY, "temporal-never");
pub const EVENTUALLY_UNREACHED: FindingCause =
FindingCause::named(CAUSE_FAMILY, "temporal-eventually");
pub const LATCH_BROKEN: FindingCause = FindingCause::named(CAUSE_FAMILY, "temporal-latch");
pub const ORDER_DECREASED: FindingCause = FindingCause::named(CAUSE_FAMILY, "temporal-order");