prikk-store 0.24.0

Prikk storage crate scaffold.
Documentation
use super::*;

#[test]
fn different_node_binary_replacements_are_independent_and_commute() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "a.bin", blob(1), MODE_REGULAR);
    seed_binary(&mut baseline, node(2), "b.bin", blob(2), MODE_REGULAR);
    let left = replace_binary(17, node(1), blob(1), blob(3));
    let right = replace_binary(23, node(2), blob(2), blob(4));

    assert_eq!(
        classify_pair(&baseline, &left, &right),
        PairClass::Independent
    );
    assert_swapped_orders_equal(&baseline, &left, &right);
    assert_eq!(left.op_seq, 17);
    assert_eq!(right.op_seq, 23);
}

#[test]
fn different_node_replace_binary_with_stale_blob_is_conflict_not_independent() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "a.bin", blob(1), MODE_REGULAR);
    seed_binary(&mut baseline, node(2), "b.bin", blob(2), MODE_REGULAR);
    let left = replace_binary(1, node(1), blob(9), blob(3));
    let right = replace_binary(2, node(2), blob(2), blob(4));

    assert_conflict(
        classify_pair(&baseline, &left, &right),
        ConflictWitnessKind::BlobMismatch,
    );
}

#[test]
fn different_node_change_perm_with_stale_mode_is_conflict_not_independent() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "a.bin", blob(1), MODE_REGULAR);
    seed_binary(&mut baseline, node(2), "b.bin", blob(2), MODE_REGULAR);
    let left = change_perm(1, node(1), MODE_EXECUTABLE, MODE_REGULAR);
    let right = replace_binary(2, node(2), blob(2), blob(4));

    assert_conflict(
        classify_pair(&baseline, &left, &right),
        ConflictWitnessKind::ModeMismatch,
    );
}

#[test]
fn different_node_text_edits_are_independent_when_resolver_proves_preimages() {
    let mut baseline = NodeLifecycleState::new();
    let left_old = b"alpha beta gamma";
    let right_old = b"one two three";
    seed_text(&mut baseline, node(1), "left.txt", left_old, MODE_REGULAR);
    seed_text(&mut baseline, node(2), "right.txt", right_old, MODE_REGULAR);
    let text_resolver =
        TestTextResolver::new([(node(1), left_old.to_vec()), (node(2), right_old.to_vec())]);
    let left = edit_text(1, node(1), left_old, b"alpha BETA gamma");
    let right = edit_text(2, node(2), right_old, b"one TWO three");

    assert_eq!(
        classify_pair_with_text_resolver(&baseline, &text_resolver, &left, &right),
        PairClass::Independent
    );
    assert_swapped_orders_equal_with_text(&baseline, &text_resolver, &left, &right);
    assert_evidence_error(
        classify_pair_result(&baseline, &left, &right),
        EvidenceScope::SealedBaselineRequired,
        EvidenceFact::BaselineText,
    );
}

#[test]
fn same_node_mode_and_binary_content_are_independent_when_preimages_match() {
    let mut baseline = NodeLifecycleState::new();
    seed_binary(&mut baseline, node(1), "tool", blob(1), MODE_REGULAR);
    let left = change_perm(4, node(1), MODE_REGULAR, MODE_EXECUTABLE);
    let right = replace_binary(8, node(1), blob(1), blob(2));

    assert_eq!(
        classify_pair(&baseline, &left, &right),
        PairClass::Independent
    );
    assert_swapped_orders_equal(&baseline, &left, &right);
}