use dusk_plonk::prelude::*;
use ff::Field;
use rand::rngs::StdRng;
use rand::SeedableRng;
mod common;
use common::{check_satisfied_circuit, check_unsatisfied_circuit};
#[test]
fn component_boolean() {
pub struct TestCircuit {
bit: BlsScalar,
}
impl TestCircuit {
pub fn new(bit: BlsScalar) -> Self {
Self { bit }
}
}
impl Default for TestCircuit {
fn default() -> Self {
Self::new(0u64.into())
}
}
impl Circuit for TestCircuit {
fn circuit(&self, composer: &mut Composer) -> Result<(), Error> {
let w_bit = composer.append_witness(self.bit);
composer.component_boolean(w_bit);
Ok(())
}
}
let label = b"component_boolean";
let mut rng = StdRng::seed_from_u64(0xfade);
let capacity = 1 << 4;
let pp = PublicParameters::setup(capacity, &mut rng)
.expect("Creation of public parameter shouldn't fail");
let (prover, verifier) = Compiler::compile::<TestCircuit>(&pp, label)
.expect("Circuit should compile");
let pi = vec![];
let msg = "Default circuit verification should pass";
let circuit = TestCircuit::default();
check_satisfied_circuit(&prover, &verifier, &pi, &circuit, &mut rng, &msg);
let msg = "Circuit with bit = 1 should pass";
let bit = BlsScalar::one();
let circuit = TestCircuit::new(bit);
check_satisfied_circuit(&prover, &verifier, &pi, &circuit, &mut rng, &msg);
let msg = "Circuit with bit = 0 should pass";
let bit = BlsScalar::zero();
let circuit = TestCircuit::new(bit);
check_satisfied_circuit(&prover, &verifier, &pi, &circuit, &mut rng, &msg);
let msg = "Circuit with bit = -0 should pass";
let bit = -BlsScalar::zero();
let circuit = TestCircuit::new(bit);
check_satisfied_circuit(&prover, &verifier, &pi, &circuit, &mut rng, &msg);
let msg = "Circuit with bit = -1 shouldn't pass";
let bit = -BlsScalar::one();
let circuit = TestCircuit::new(bit);
check_unsatisfied_circuit(&prover, &circuit, &mut rng, msg);
let msg = "Circuit with bit = -1 shouldn't pass";
let bit = BlsScalar::random(&mut rng);
let circuit = TestCircuit::new(bit);
check_unsatisfied_circuit(&prover, &circuit, &mut rng, msg);
}