dusk-cdf 0.5.0

PLONK debugger CDF implementation
Documentation
use std::fmt;

use crate::source::EncodedSource;
use crate::*;
use quickcheck::{quickcheck, Arbitrary, Gen, TestResult};

impl Arbitrary for Scalar {
    fn arbitrary(g: &mut Gen) -> Self {
        let mut bytes = [0u8; 32];

        bytes.iter_mut().for_each(|b| *b = u8::arbitrary(g));

        bytes.into()
    }
}

impl Arbitrary for Config {
    fn arbitrary(g: &mut Gen) -> Self {
        Self {
            zeroed_scalar_values: bool::arbitrary(g),
        }
    }
}

impl Arbitrary for WiredWitnesses {
    fn arbitrary(g: &mut Gen) -> Self {
        Self {
            a: usize::arbitrary(g),
            b: usize::arbitrary(g),
            d: usize::arbitrary(g),
            o: usize::arbitrary(g),
        }
    }
}

impl Arbitrary for Selectors {
    fn arbitrary(g: &mut Gen) -> Self {
        Self {
            qm: Scalar::arbitrary(g),
            ql: Scalar::arbitrary(g),
            qr: Scalar::arbitrary(g),
            qd: Scalar::arbitrary(g),
            qc: Scalar::arbitrary(g),
            qo: Scalar::arbitrary(g),
            pi: Scalar::arbitrary(g),
            qarith: Scalar::arbitrary(g),
            qlogic: Scalar::arbitrary(g),
            qrange: Scalar::arbitrary(g),
            qgroup_variable: Scalar::arbitrary(g),
            qfixed_add: Scalar::arbitrary(g),
        }
    }
}

impl Arbitrary for Preamble {
    fn arbitrary(g: &mut Gen) -> Self {
        Self {
            witnesses: usize::arbitrary(g).min(1),
            constraints: usize::arbitrary(g),
            config: Config::arbitrary(g),
        }
    }
}

impl Arbitrary for Polynomial {
    fn arbitrary(g: &mut Gen) -> Self {
        Self {
            selectors: Selectors::arbitrary(g),
            witnesses: WiredWitnesses::arbitrary(g),
            evaluation: bool::arbitrary(g),
        }
    }
}

impl Arbitrary for EncodedSource {
    fn arbitrary(g: &mut Gen) -> Self {
        Self {
            line: u64::arbitrary(g),
            col: u64::arbitrary(g),
            contents_index: usize::arbitrary(g),
        }
    }
}

#[test]
fn elements() {
    fn prop<T>(len: u16, data: T) -> TestResult
    where
        T: Arbitrary + EncodableElement + DecodableElement + PartialEq + fmt::Debug,
    {
        if 1024 < len {
            return TestResult::discard();
        }

        let len = len as usize;
        let min = T::len(&Default::default());

        if len < min {
            return TestResult::discard();
        }

        if data.validate(&Default::default()).is_err() {
            return TestResult::discard();
        }

        let mut buffer = vec![0u8; len];

        data.to_buffer(&mut Default::default(), &mut buffer);

        match T::try_from_buffer(&DecoderContext::BASE, &buffer) {
            Ok(d) if d == data => (),
            _ => return TestResult::failed(),
        }

        let mut opt = Some(data.clone());
        let len = <Option<T>>::len(&Default::default());

        let mut buffer = vec![0u8; len];

        opt.to_buffer(&mut Default::default(), &mut buffer);

        match <Option<T>>::try_from_buffer(&DecoderContext::BASE, &buffer) {
            Ok(Some(d)) if d == data => (),
            _ => return TestResult::failed(),
        }

        opt.take();

        opt.to_buffer(&mut Default::default(), &mut buffer);
        match <Option<T>>::try_from_buffer(&DecoderContext::BASE, &buffer) {
            Ok(None) => (),
            _ => return TestResult::failed(),
        }

        TestResult::passed()
    }

    quickcheck(prop as fn(_, ()) -> _);
    quickcheck(prop as fn(_, bool) -> _);
    quickcheck(prop as fn(_, u64) -> _);
    quickcheck(prop as fn(_, usize) -> _);
    quickcheck(prop as fn(_, Config) -> _);
    quickcheck(prop as fn(_, Preamble) -> _);
    quickcheck(prop as fn(_, Scalar) -> _);
    quickcheck(prop as fn(_, Config) -> _);
    quickcheck(prop as fn(_, WiredWitnesses) -> _);
    quickcheck(prop as fn(_, Selectors) -> _);
    quickcheck(prop as fn(_, Polynomial) -> _);
    quickcheck(prop as fn(_, EncodedSource) -> _);
}