From 97e3f8bbff7891e686cdfba5b57cdd200cb18953 Mon Sep 17 00:00:00 2001 From: Omar Date: Mon, 22 Sep 2025 06:35:31 +0300 Subject: [PATCH] Support virtual repeats for benchmarks (#162) * Support repetitions in the tool * Add support for account allocations * Update the JSON schema * Support virtual repeats --- crates/format/src/case.rs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/crates/format/src/case.rs b/crates/format/src/case.rs index d5397f8..75eca22 100644 --- a/crates/format/src/case.rs +++ b/crates/format/src/case.rs @@ -5,7 +5,7 @@ use revive_dt_common::{macros::define_wrapper_type, types::Mode}; use crate::{ mode::ParsedMode, - steps::{Expected, Step}, + steps::{Expected, RepeatStep, Step}, }; #[derive(Debug, Default, Serialize, Deserialize, Clone, Eq, PartialEq, JsonSchema)] @@ -55,7 +55,6 @@ pub struct Case { } impl Case { - #[allow(irrefutable_let_patterns)] pub fn steps_iterator(&self) -> impl Iterator { let steps_len = self.steps.len(); self.steps @@ -84,6 +83,24 @@ impl Case { }) } + pub fn steps_iterator_for_benchmarks( + &self, + default_repeat_count: usize, + ) -> Box + '_> { + let contains_repeat = self + .steps_iterator() + .any(|step| matches!(&step, Step::Repeat(..))); + if contains_repeat { + Box::new(self.steps_iterator()) as Box<_> + } else { + Box::new(std::iter::once(Step::Repeat(Box::new(RepeatStep { + comment: None, + repeat: default_repeat_count, + steps: self.steps_iterator().collect(), + })))) as Box<_> + } + } + pub fn solc_modes(&self) -> Vec { match &self.modes { Some(modes) => ParsedMode::many_to_modes(modes.iter()).collect(),