use super::{
build_trace_from_ops, rand_array, Felt, FieldElement, LookupTableRow, Operation, Trace,
NUM_RAND_ROWS, ONE, ZERO,
};
use crate::stack::OverflowTableRow;
use vm_core::{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(2, ONE, ZERO).to_value(&trace.main_trace, &alphas),
OverflowTableRow::new(3, TWO, TWO).to_value(&trace.main_trace, &alphas),
OverflowTableRow::new(6, TWO, TWO).to_value(&trace.main_trace, &alphas),
OverflowTableRow::new(10, ZERO, ZERO).to_value(&trace.main_trace, &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]);
}
}