use crate::{algorithms::crypto_hash::PoseidonSpongeGadget, AlgebraicSpongeVar, AllocGadget, FieldGadget, FpGadget};
use snarkvm_algorithms::{
crypto_hash::{poseidon::PoseidonSponge, PoseidonDefaultParametersField},
AlgebraicSponge,
};
use snarkvm_curves::bls12_377::Fr;
use snarkvm_r1cs::{ConstraintSystem, TestConstraintSystem};
use snarkvm_utilities::{test_rng, UniformRand};
use std::sync::Arc;
#[test]
fn absorb_test() {
let mut rng = test_rng();
let mut cs = TestConstraintSystem::<Fr>::new();
let absorb: Vec<_> = (0..256).map(|_| Fr::rand(&mut rng)).collect();
let absorb_var: Vec<_> = absorb
.iter()
.enumerate()
.map(|(i, v)| FpGadget::<Fr>::alloc_input(cs.ns(|| format!("alloc input {}", i)), || Ok(*v)).unwrap())
.collect();
let sponge_params = Arc::new(Fr::get_default_poseidon_parameters::<2>(false).unwrap());
let mut native_sponge = PoseidonSponge::with_parameters(&sponge_params);
let mut constraint_sponge = PoseidonSpongeGadget::with_parameters(cs.ns(|| "new sponge"), &sponge_params);
native_sponge.absorb(&absorb);
constraint_sponge.absorb(cs.ns(|| "absorb"), absorb_var.iter()).unwrap();
let native_squeeze = native_sponge.squeeze_field_elements(1);
let constraint_squeeze = constraint_sponge
.squeeze_field_elements(cs.ns(|| "squeeze"), 1)
.unwrap();
assert_eq!(constraint_squeeze[0].get_value().unwrap(), native_squeeze[0]);
assert!(cs.is_satisfied());
}