Radish alpha
h
rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5
Radicle Heartwood Protocol & Stack
Radicle
Git
heartwood crates radicle src storage refs arbitrary.rs
#![allow(clippy::unwrap_used)]

use qcheck::Arbitrary;

use crate::node::device::Device;

use super::*;

pub fn signed_refs_at<S>(g: &mut qcheck::Gen, root: Oid, signer: &Device<S>) -> SignedRefs
where
    S: crypto::signature::Signer<crypto::Signature>,
{
    let mut refs = Refs::arbitrary(g);
    refs.insert(IDENTITY_ROOT.to_ref_string(), root);

    let mut level = None;

    if bool::arbitrary(g) {
        level = Some(FeatureLevel::Parent);
        let parent = Oid::arbitrary(g);
        refs.insert(SIGREFS_PARENT.to_ref_string(), parent);
    }

    let signature = crypto::signature::Signer::sign(signer, &refs.canonical());
    SignedRefs {
        refs,
        signature,
        id: *signer.node_id(),
        level: level.unwrap_or_else(|| FeatureLevel::arbitrary(g)),
        parent: Arbitrary::arbitrary(g),
        at: Oid::arbitrary(g),
    }
}

impl Arbitrary for Refs {
    fn arbitrary(g: &mut qcheck::Gen) -> Self {
        let names = &[
            "heads/master",
            "heads/feature/1",
            "heads/feature/2",
            "heads/feature/3",
            "rad/id",
            "tags/v1.0",
            "tags/v2.0",
            "notes/1",
        ];

        let mut refs = Self::new();
        for _ in 0..g.size().min(names.len()) {
            if let Some(name) = g.choose(names) {
                let oid = storage::Oid::arbitrary(g);
                let name = git::fmt::RefString::try_from(*name).unwrap();

                refs.insert(name, oid);
            }
        }
        refs
    }
}

impl Arbitrary for RefsAt {
    fn arbitrary(g: &mut qcheck::Gen) -> Self {
        Self {
            remote: PublicKey::arbitrary(g),
            at: Oid::arbitrary(g),
        }
    }
}

impl Arbitrary for FeatureLevel {
    fn arbitrary(g: &mut qcheck::Gen) -> Self {
        *g.choose(&[FeatureLevel::None, FeatureLevel::Root, FeatureLevel::Parent])
            .unwrap()
    }
}