mod common;
use common::{bbg_object_from_state, default_params, make_look_formula, seeded_bbg_state,
zero_statement};
use nox::{reduce, Order, VecTrace, Outcome};
use bbg::{ProofLookProvider, collect_look_openings, verify_opening};
use zheng::{commit, verify};
const ORDER_SIZE: usize = 1024;
#[test]
fn look_time_dimension_full_proof_roundtrip() {
let state = seeded_bbg_state();
let prov = ProofLookProvider::new(&state);
let mut order = Order::<ORDER_SIZE>::new();
let obj = bbg_object_from_state(&mut order, &state);
let formula = make_look_formula(&mut order, 8, 0);
let mut trace = VecTrace::default();
let outcome = reduce(&mut order, obj, formula, 1000, &prov, &mut trace);
assert!(matches!(outcome, Outcome::Ok(_, _)), "look must succeed");
let look_openings = prov.take_look_openings();
assert_eq!(look_openings.len(), 1);
let stmt = zero_statement();
let proof = commit(&trace, &[], &[], &look_openings, &stmt, &default_params()).unwrap();
verify(&proof, &stmt, &default_params()).expect("Time look proof must verify");
}
#[test]
fn look_neurons_dimension_full_proof_roundtrip() {
let mut key = [0u8; 32];
key[..8].copy_from_slice(&42u64.to_le_bytes());
let mut state = bbg::BbgState::new();
state.neurons.insert(key, bbg::types::NeuronRecord { focus: 1_000, karma: 0, stake: 0 });
let prov = ProofLookProvider::new(&state);
let mut order = Order::<ORDER_SIZE>::new();
let obj = bbg_object_from_state(&mut order, &state);
let formula = make_look_formula(&mut order, 3, 42);
let mut trace = VecTrace::default();
let outcome = reduce(&mut order, obj, formula, 1000, &prov, &mut trace);
assert!(matches!(outcome, Outcome::Ok(_, _)), "neuron look must succeed");
let look_openings = prov.take_look_openings();
assert_eq!(look_openings.len(), 1);
let stmt = zero_statement();
let proof = commit(&trace, &[], &[], &look_openings, &stmt, &default_params()).unwrap();
verify(&proof, &stmt, &default_params()).expect("Neurons look proof must verify");
}
#[test]
fn look_provider_and_collect_openings_both_verify() {
let state = seeded_bbg_state();
let prov = ProofLookProvider::new(&state);
let mut order = Order::<ORDER_SIZE>::new();
let obj = bbg_object_from_state(&mut order, &state);
let formula = make_look_formula(&mut order, 8, 0);
let mut trace = VecTrace::default();
reduce(&mut order, obj, formula, 1000, &prov, &mut trace);
let prov_openings = prov.take_look_openings();
assert_eq!(prov_openings.len(), 1);
assert!(verify_opening(&prov_openings[0]), "provider opening must be valid");
let col_openings = collect_look_openings(&state, &trace.0);
assert_eq!(col_openings.len(), 1);
assert!(verify_opening(&col_openings[0]), "collected opening must be valid");
assert_eq!(
prov_openings[0].bbg_root, col_openings[0].bbg_root,
"both paths must record the same BBG root limbs",
);
let stmt = zero_statement();
let params = default_params();
let proof_prov = commit(&trace, &[], &[], &prov_openings, &stmt, ¶ms).unwrap();
verify(&proof_prov, &stmt, ¶ms).expect("provider-path proof must verify");
let proof_col = commit(&trace, &[], &[], &col_openings, &stmt, ¶ms).unwrap();
verify(&proof_col, &stmt, ¶ms).expect("collect-path proof must verify");
}