mod common;
use common::{zero_statement, default_params, make_field_binop, make_word_binop};
use nox::{reduce, Order, Tag, VecTrace, NullCalls, Outcome};
use nebu::Goldilocks;
use zheng::{commit, verify};
const ORDER_SIZE: usize = 1024;
#[test]
fn add_field_full_proof_roundtrip() {
let mut order = Order::<ORDER_SIZE>::new();
let obj = order.atom(Goldilocks::new(0), Tag::Field).unwrap();
let formula = make_field_binop(&mut order, 5, 3, 5);
let mut trace = VecTrace::default();
let outcome = reduce(&mut order, obj, formula, 1000, &NullCalls, &mut trace);
assert!(matches!(outcome, Outcome::Ok(_, _)), "add must succeed");
let stmt = zero_statement();
let proof = commit(&trace, &[], &[], &[], &stmt, &default_params()).unwrap();
verify(&proof, &stmt, &default_params()).expect("add proof must verify");
}
#[test]
fn sub_field_full_proof_roundtrip() {
let mut order = Order::<ORDER_SIZE>::new();
let obj = order.atom(Goldilocks::new(0), Tag::Field).unwrap();
let formula = make_field_binop(&mut order, 6, 10, 3);
let mut trace = VecTrace::default();
let outcome = reduce(&mut order, obj, formula, 1000, &NullCalls, &mut trace);
assert!(matches!(outcome, Outcome::Ok(_, _)), "sub must succeed");
let stmt = zero_statement();
let proof = commit(&trace, &[], &[], &[], &stmt, &default_params()).unwrap();
verify(&proof, &stmt, &default_params()).expect("sub proof must verify");
}
#[test]
fn mul_field_full_proof_roundtrip() {
let mut order = Order::<ORDER_SIZE>::new();
let obj = order.atom(Goldilocks::new(0), Tag::Field).unwrap();
let formula = make_field_binop(&mut order, 7, 6, 7);
let mut trace = VecTrace::default();
let outcome = reduce(&mut order, obj, formula, 1000, &NullCalls, &mut trace);
assert!(matches!(outcome, Outcome::Ok(_, _)), "mul must succeed");
let stmt = zero_statement();
let proof = commit(&trace, &[], &[], &[], &stmt, &default_params()).unwrap();
verify(&proof, &stmt, &default_params()).expect("mul proof must verify");
}
#[test]
fn xor_bitwise_full_proof_roundtrip() {
let mut order = Order::<ORDER_SIZE>::new();
let obj = order.atom(Goldilocks::new(0), Tag::Field).unwrap();
let formula = make_word_binop(&mut order, 11, 0b1100_1010, 0b1010_0101);
let mut trace = VecTrace::default();
let outcome = reduce(&mut order, obj, formula, 5000, &NullCalls, &mut trace);
assert!(matches!(outcome, Outcome::Ok(_, _)), "xor must succeed");
let xor_rows = trace.0.iter().filter(|r| r.r()[0] == 11).count();
assert_eq!(xor_rows, 32, "xor must emit 32 bit rows");
let stmt = zero_statement();
let proof = commit(&trace, &[], &[], &[], &stmt, &default_params()).unwrap();
verify(&proof, &stmt, &default_params()).expect("xor proof must verify");
}