use crate::descriptor::{CheckRef, ClaimRef, NameRefusal, RevisionBinding};
use crate::muterprater::{
CompiledProjectionPressure, CompiledSuitePressure, DudPlant, EvaluationCallRefusal,
EvaluationDirective, EvaluationFamilyRef, EvaluationSurface, EvaluationSurfaceId,
MutationReport, SelectionRefusal,
};
use crate::properties::{Equivalence, SharedSubstrate, SubstrateRefusal};
use crate::report::{TrialConclusion, TrialReport};
use crate::runner::{ReportRecordingRefusal, TrialBinding};
#[path = "type_guard.rs"]
mod guard;
#[must_use = "a refusal is the reason a parity suite was not declared"]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ParityRefusal {
NameNotParsed(NameRefusal),
SubstrateNotDeclared(SubstrateRefusal),
}
pub type ProductionCall<Input, Meaning> = fn(&Input) -> Meaning;
pub type EvaluationCall<Input, Meaning> =
for<'surface> fn(
&Input,
EvaluationDirective<'surface>,
) -> Result<EvaluationObservation<Meaning>, EvaluationCallRefusal>;
pub type MeaningCheck<Meaning> = fn(&Meaning) -> TrialConclusion;
pub struct EvaluationObservation<Meaning> {
meaning: Meaning,
firings: u32,
}
pub struct ProductionBinding<Input, Meaning> {
family: EvaluationFamilyRef,
revision: RevisionBinding,
call: ProductionCall<Input, Meaning>,
}
pub struct EvaluationBinding<Input, Meaning> {
family: EvaluationFamilyRef,
revision: RevisionBinding,
surface: EvaluationSurfaceId,
call: EvaluationCall<Input, Meaning>,
}
pub struct EvaluationPair<Input, Meaning> {
production: ProductionBinding<Input, Meaning>,
evaluation: EvaluationBinding<Input, Meaning>,
same: Equivalence<Meaning>,
}
#[must_use = "a refusal is the reason an evaluation pair was not built"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum EvaluationPairRefusal {
FamilyMismatch {
production: EvaluationFamilyRef,
evaluation: EvaluationFamilyRef,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct EvaluationPairStanding {
family: EvaluationFamilyRef,
production_revision: RevisionBinding,
evaluation_revision: RevisionBinding,
surface: EvaluationSurfaceId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EvaluationPairStandingMismatch {
Family {
expected: EvaluationFamilyRef,
found: EvaluationFamilyRef,
},
ProductionRevision {
expected: RevisionBinding,
found: RevisionBinding,
},
EvaluationRevision {
expected: RevisionBinding,
found: RevisionBinding,
},
Surface {
expected: EvaluationSurfaceId,
found: EvaluationSurfaceId,
},
StandingChanged,
}
pub struct MutationWitness<Meaning> {
binding: TrialBinding,
check: MeaningCheck<Meaning>,
}
#[must_use = "a refusal is the reason a mutation witness was not bound"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MutationWitnessRefusal {
CheckMismatch {
expected: CheckRef,
found: CheckRef,
},
}
pub struct NoMutationResults<Meaning> {
production: Meaning,
evaluation: Meaning,
evaluation_firings: u32,
}
pub(in crate::muterprater) struct NoMutationReports {
production: TrialReport,
evaluation: TrialReport,
}
pub struct NoMutationParityReading<'pair, 'input, Input, Meaning> {
pair: &'pair EvaluationPair<Input, Meaning>,
witness: MutationWitness<Meaning>,
input: &'input Input,
results: NoMutationResults<Meaning>,
substrate: SharedSubstrate,
conclusion: TrialConclusion,
reports: NoMutationReports,
}
#[must_use = "a refusal is the reason no no-mutation reading was recorded"]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum NoMutationObservationRefusal {
Substrate(ParityRefusal),
EvaluationCall(EvaluationCallRefusal),
ProductionReport(ReportRecordingRefusal),
EvaluationReport(ReportRecordingRefusal),
}
#[must_use = "a refusal is the reason no-mutation parity did not qualify"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ParityQualificationRefusal {
ProductionDidNotQualify,
EvaluationDidNotQualify,
NoMutationActivated {
firings: u32,
},
MeaningsDisagreed,
}
pub struct NoMutationParityQualification<'pair, 'input, Input, Meaning> {
reading: NoMutationParityReading<'pair, 'input, Input, Meaning>,
}
pub struct RejectedNoMutationParity<'pair, 'input, Input, Meaning> {
cause: ParityQualificationRefusal,
reading: NoMutationParityReading<'pair, 'input, Input, Meaning>,
}
pub enum NoMutationParityStanding<'pair, 'input, Input, Meaning> {
Qualified(NoMutationParityQualification<'pair, 'input, Input, Meaning>),
Rejected(RejectedNoMutationParity<'pair, 'input, Input, Meaning>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MissingTrustEvidence {
CompiledSuitePressure,
CompiledProjectionPressure,
ProjectionPressureForAnotherSurface,
}
pub struct InterpretedTrust<'surface, 'suite, 'projection, 'parity, 'pair, 'input, Input, Meaning> {
surface: &'surface EvaluationSurface,
suite: &'suite CompiledSuitePressure,
projection: &'projection CompiledProjectionPressure<'parity, 'pair, 'input, Input, Meaning>,
}
pub enum InterpreterAvailability<
'surface,
'suite,
'projection,
'parity,
'pair,
'input,
Input,
Meaning,
> {
Available(
InterpretedTrust<'surface, 'suite, 'projection, 'parity, 'pair, 'input, Input, Meaning>,
),
NoConformingSurface,
TrustNotOpened {
missing: MissingTrustEvidence,
},
}
pub struct InterpretedMutationEvidence<
'surface,
'suite,
'projection,
'parity,
'pair,
'input,
Input,
Meaning,
> {
trust: InterpretedTrust<'surface, 'suite, 'projection, 'parity, 'pair, 'input, Input, Meaning>,
meaning: Meaning,
report: TrialReport,
mutation: MutationReport,
}
#[must_use = "a refusal is the reason interpreted mutation evidence was not built"]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum InterpretedExecutionRefusal {
InvocationForAnotherExecution,
Selection(SelectionRefusal),
WitnessForAnotherClaim {
expected: ClaimRef,
found: ClaimRef,
},
EvaluationCall(EvaluationCallRefusal),
DudPlant(Box<DudPlant>),
Report(ReportRecordingRefusal),
}
pub const MUTERPRATER_NAMESPACE: &str = "muterprater";
pub const PARITY_DECLARATION_SUBSTRATE: &str = "one-declaration";
pub const PARITY_RENDERING_SUBSTRATE: &str = "rendering-engine";
pub const NO_MUTATION_PAIRING: &str = "no-mutation-parity";