use super::{
build_trace_from_ops, rand_array, Felt, FieldElement, Operation, Trace, NUM_RAND_ROWS, ONE,
ZERO,
};
use crate::stack::OverflowTableRow;
use alloc::vec::Vec;
use miden_air::trace::{AUX_TRACE_RAND_ELEMENTS, STACK_AUX_TRACE_OFFSET};
const P1_COL_IDX: usize = STACK_AUX_TRACE_OFFSET;
const TWO: Felt = Felt::new(2);
#[test]
#[allow(clippy::needless_range_loop)]
fn p1_trace() {
let ops = vec![
Operation::U32add, Operation::Pad, Operation::Pad, Operation::U32add, Operation::Drop, Operation::Pad, Operation::Drop, Operation::Drop, Operation::Drop, Operation::Pad, Operation::Drop, ];
let init_stack = (1..17).collect::<Vec<_>>();
let mut trace = build_trace_from_ops(ops, &init_stack);
let alphas = rand_array::<Felt, AUX_TRACE_RAND_ELEMENTS>();
let aux_columns = trace.build_aux_segment(&[], &alphas).unwrap();
let p1 = aux_columns.get_column(P1_COL_IDX);
let row_values = [
OverflowTableRow::new(Felt::new(2), ONE, ZERO).to_value(&alphas),
OverflowTableRow::new(Felt::new(3), TWO, TWO).to_value(&alphas),
OverflowTableRow::new(Felt::new(6), TWO, TWO).to_value(&alphas),
OverflowTableRow::new(Felt::new(10), ZERO, ZERO).to_value(&alphas),
];
let mut expected_value = ONE;
assert_eq!(expected_value, p1[0]);
assert_eq!(expected_value, p1[1]);
assert_eq!(expected_value, p1[2]);
expected_value *= row_values[0];
assert_eq!(expected_value, p1[3]);
expected_value *= row_values[1];
assert_eq!(expected_value, p1[4]);
assert_eq!(expected_value, p1[5]);
expected_value *= row_values[1].inv();
assert_eq!(expected_value, p1[6]);
expected_value *= row_values[2];
assert_eq!(expected_value, p1[7]);
expected_value *= row_values[2].inv();
assert_eq!(expected_value, p1[8]);
expected_value *= row_values[0].inv();
assert_eq!(expected_value, p1[9]);
assert_eq!(expected_value, ONE);
assert_eq!(expected_value, p1[10]);
expected_value *= row_values[3];
assert_eq!(expected_value, p1[11]);
expected_value *= row_values[3].inv();
assert_eq!(expected_value, p1[12]);
assert_eq!(expected_value, ONE);
for i in 13..(p1.len() - NUM_RAND_ROWS) {
assert_eq!(ONE, p1[i]);
}
}