use alloc::{string::String, vec::Vec};
use std::collections::BTreeSet;
use miden_core::{Felt, operations::Operation, serde::Deserializable};
use super::{ALL_OPERATIONS, OpHistogram};
#[test]
fn all_operations_covers_every_valid_opcode() {
let valid: BTreeSet<u8> = (0u8..=u8::MAX)
.filter(|&op| Operation::read_from_bytes(&[op, 0, 0, 0, 0, 0, 0, 0, 0]).is_ok())
.collect();
let ours: BTreeSet<u8> = ALL_OPERATIONS.iter().map(|op| op.op_code()).collect();
let missing_in_ours: Vec<String> = valid
.difference(&ours)
.map(|&op| {
format!(
"{}",
Operation::read_from_bytes(&[op, 0, 0, 0, 0, 0, 0, 0, 0])
.expect("valid opcode deserializes to an Operation")
)
})
.collect();
if !missing_in_ours.is_empty() {
panic!(
"ALL_OPERATIONS is out of sync with miden-core's Operation enum.\n missing from \
ALL_OPERATIONS (add these): {missing_in_ours:?}"
);
}
}
#[test]
fn sorted_counts_orders_by_count_desc_then_opcode() {
let mut hist = OpHistogram::default();
hist.record(Operation::Add);
hist.record(Operation::Add);
hist.record(Operation::Noop);
hist.record(Operation::Eq);
let (ops, counts): (Vec<Operation>, Vec<u64>) = hist.sorted_counts().into_iter().unzip();
assert_eq!(ops[0], Operation::Add);
assert_eq!(counts[0], 2);
assert_eq!(counts[1], 1);
assert_eq!(counts[2], 1);
assert!(ops[1].op_code() < ops[2].op_code());
assert_eq!(hist.total_cycles(), 4);
}
#[test]
fn sorted_counts_excludes_unrecorded_operations() {
let hist = OpHistogram::default();
assert!(hist.sorted_counts().is_empty());
assert_eq!(hist.total_cycles(), 0);
}
#[test]
fn op_histogram_omits_payload_from_mnemonic() {
let mut hist = OpHistogram::default();
hist.record(Operation::Push(Felt::ZERO));
hist.record(Operation::Assert(Felt::ZERO));
hist.record(Operation::MpVerify(Felt::ZERO));
hist.record(Operation::U32assert2(Felt::ZERO));
let report = hist.report();
assert!(
!report.contains("(0)"),
"report must not contain placeholder payloads: {report}"
);
for mnemonic in ["push", "assert", "mpverify", "u32assert2"] {
assert!(report.contains(mnemonic), "report missing `{mnemonic}`: {report}");
}
}