use crate::depot::types::OperatorFamily;
use crate::descriptor::{ClaimRef, MutationPointRef};
use crate::identity::{ContentAddress, DomainTag, IdentityProfileVersion};
use crate::muterprater::{ActivationSite, ActiveSelection, AlternativeId};
use crate::report::{Fingerprint, ForeignText, TrialFinding, TrialId};
#[path = "type_guard.rs"]
mod guard;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum BaselineAxis {
Qualified,
Failed,
NotRun,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MaterializationAxis {
Built,
Unviable,
ToolFailed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ActivationAxis {
Observed,
NotObserved,
UnobservableUnderBackend,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ExecutionAxis {
Completed,
NotExecuted,
TimedOut,
Crashed,
InfrastructureFailed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MutationVerdict {
Killed,
Survived,
Inconclusive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum EquivalenceAxis {
NotAssessed,
ProvenInScope,
Refuted,
Inconclusive,
}
pub const MUTATION_TARGET_TAG: DomainTag =
DomainTag::declared("mutation-target", IdentityProfileVersion::declared(1));
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct SourceCoordinate {
file: String,
line: u32,
column: u32,
}
#[must_use = "a refusal is the reason a coordinate was not read"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CoordinateRefusal {
EmptyFile,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct MutantId(ContentAddress);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MutationIdentity {
External(MutantId),
Interpreted {
point: MutationPointRef,
alternative: AlternativeId,
},
CompiledProjection {
point: MutationPointRef,
alternative: AlternativeId,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum MutationSite {
Reported(SourceCoordinate),
Declared(ActivationSite),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct OperatorFamilyRef(OperatorFamily);
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum FamilyAttribution {
Declared(OperatorFamilyRef),
OutsideTheBank,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MappingPosture {
Mapped(ClaimRef),
OwnerUnmapped,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MutationTarget {
identity: MutationIdentity,
family: FamilyAttribution,
site: MutationSite,
owner: MappingPosture,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ActivationEvidence {
selection: ActiveSelection,
witness: TrialId,
firings: u32,
}
#[must_use = "a dud plant is a finding, never a silent pass"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct DudPlant {
selection: ActiveSelection,
witness: TrialId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ActivationDisposition {
Observed(ActivationEvidence),
NotObserved,
UnobservableUnderBackend,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct DemonstratedRejection {
trial: TrialId,
finding: TrialFinding,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum IntendedRejection {
Demonstrated(DemonstratedRejection),
ReportedByBackend {
stated: ForeignText,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum RejectionIdentity {
Fingerprinted(Fingerprint),
Unfingerprinted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum InconclusiveCause {
BaselineNotQualified,
NotMaterialized,
NotActivated,
WitnessIncomplete,
UnobservableAndUnrejected,
ProvenEquivalentInScope,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum MutationOutcome {
Killed(IntendedRejection),
Survived,
Inconclusive(InconclusiveCause),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MutationReport {
target: MutationTarget,
baseline: BaselineAxis,
materialization: MaterializationAxis,
activation: ActivationDisposition,
execution: ExecutionAxis,
outcome: MutationOutcome,
equivalence: EquivalenceAxis,
}
#[must_use = "a refusal is the reason a kill was not minted"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum KillRefusal {
BaselineNotQualified(BaselineAxis),
NotMaterialized(MaterializationAxis),
ActivationNotObserved,
WitnessDidNotComplete(ExecutionAxis),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MutationCensus {
killed: u32,
survived: u32,
inconclusive: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct BaselineQualification {
axis: BaselineAxis,
}
#[must_use = "a refusal is the reason a baseline did not qualify"]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum BaselinePrecondition {
BaselineFailed,
BaselineNotRun,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MutationRun {
baseline: BaselineQualification,
reports: Vec<MutationReport>,
census: MutationCensus,
}