pub(super) use super::super::classify::{
classify_pair as classify_pair_result,
classify_pair_with_text_resolver as classify_pair_with_text_resolver_result,
};
pub(super) use super::super::commutation::{
check_confluence as check_confluence_result, commute_pair as commute_pair_result,
};
pub(super) use super::super::evidence::StorePatchAlgebraEvidence;
pub(super) use super::super::evidence_types::{
Evidence, EvidenceError, EvidenceFact, EvidenceScope, PatchAlgebraEvidence,
};
pub(super) use super::super::facts::path_effects;
pub(super) use super::super::report::{
MergeEvidenceItem, MergeEvidenceOperationKind, MergeEvidenceOutcome, MergeEvidenceProofPhase,
MergeEvidenceReasonCode, MergeEvidenceScope, MergeEvidenceSide, analyze_merge_evidence,
analyze_pair_merge_evidence, pair_class_report,
};
pub(super) use super::super::types::{
CommutationResult, ConflictWitness, ConflictWitnessKind, ConfluenceResult,
ConfluenceWitnessKind, PairClass, RequiredOrder, UnknownReason,
};
pub(super) use crate::node_lifecycle::NodeLifecycleState;
pub(super) use crate::patch_replay::decode::DecodedOperationKind;
pub(super) use prikk_object::{BlobKind, NodeKind, ObjectId, ObjectType};
pub(super) use std::collections::BTreeMap;
use crate::patch_replay::decode::DecodedPatchOperation;
use prikk_object::NodeId;
pub(super) const MODE_REGULAR: u32 = 0o100644;
pub(super) const MODE_EXECUTABLE: u32 = 0o100755;
pub(super) struct TestTextResolver {
pub(super) texts: BTreeMap<NodeId, Vec<u8>>,
blobs: BTreeMap<ObjectId, (BlobKind, Vec<u8>)>,
blob_kind_overrides: BTreeMap<ObjectId, Evidence<BlobKind>>,
}
impl TestTextResolver {
pub(super) fn empty() -> Self {
Self {
texts: BTreeMap::new(),
blobs: BTreeMap::new(),
blob_kind_overrides: BTreeMap::new(),
}
}
pub(super) fn new(entries: impl IntoIterator<Item = (NodeId, Vec<u8>)>) -> Self {
Self {
texts: entries.into_iter().collect(),
blobs: BTreeMap::new(),
blob_kind_overrides: BTreeMap::new(),
}
}
pub(super) fn with_blob(mut self, blob_id: ObjectId, kind: BlobKind, content: Vec<u8>) -> Self {
self.blobs.insert(blob_id, (kind, content));
self
}
pub(super) fn with_blob_kind_evidence(
mut self,
blob_id: ObjectId,
evidence: Evidence<BlobKind>,
) -> Self {
self.blob_kind_overrides.insert(blob_id, evidence);
self
}
}
impl PatchAlgebraEvidence for TestTextResolver {
fn baseline_text(
&self,
scope: EvidenceScope,
node_id: NodeId,
blob_id: ObjectId,
) -> Evidence<Vec<u8>> {
self.texts
.get(&node_id)
.cloned()
.map(Evidence::Known)
.unwrap_or(Evidence::Missing {
scope,
fact: EvidenceFact::BaselineText,
object_id: Some(blob_id),
node_id: Some(node_id),
})
}
fn blob_kind(&self, scope: EvidenceScope, blob_id: ObjectId) -> Evidence<BlobKind> {
if let Some(evidence) = self.blob_kind_overrides.get(&blob_id) {
return evidence.clone();
}
self.blobs
.get(&blob_id)
.map(|(kind, _)| Evidence::Known(*kind))
.unwrap_or(Evidence::Missing {
scope,
fact: EvidenceFact::BlobKind,
object_id: Some(blob_id),
node_id: None,
})
}
fn blob_content(
&self,
scope: EvidenceScope,
blob_id: ObjectId,
) -> Evidence<(BlobKind, Vec<u8>)> {
self.blobs
.get(&blob_id)
.cloned()
.map(Evidence::Known)
.unwrap_or(Evidence::Missing {
scope,
fact: EvidenceFact::BlobBytes,
object_id: Some(blob_id),
node_id: None,
})
}
}
pub(super) fn classify_pair(
baseline: &NodeLifecycleState,
left: &DecodedPatchOperation,
right: &DecodedPatchOperation,
) -> PairClass {
classify_pair_result(baseline, left, right).expect("classification evidence")
}
pub(super) fn classify_pair_with_text_resolver(
baseline: &NodeLifecycleState,
evidence: &TestTextResolver,
left: &DecodedPatchOperation,
right: &DecodedPatchOperation,
) -> PairClass {
classify_pair_with_text_resolver_result(baseline, evidence, left, right)
.expect("classification evidence")
}