Skip to content

Commit 7dc974d

Browse files
committed
add memory tests
1 parent b5729fa commit 7dc974d

File tree

1 file changed

+116
-1
lines changed

1 file changed

+116
-1
lines changed

crates/lean_vm/src/execution/memory.rs

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ impl Memory {
6969
}
7070

7171
/// Gets the current size of allocated memory
72-
pub fn size(&self) -> usize {
72+
pub const fn size(&self) -> usize {
7373
self.0.len()
7474
}
7575

@@ -157,3 +157,118 @@ impl Memory {
157157
(0..len).map(|i| self.get(start + i)).collect()
158158
}
159159
}
160+
161+
#[cfg(test)]
162+
mod tests {
163+
use super::*;
164+
165+
#[test]
166+
fn test_basic_memory_operations() {
167+
let mut memory = Memory::empty();
168+
169+
// Test setting and getting values
170+
memory.set(0, F::ONE).unwrap();
171+
memory.set(5, F::from_usize(42)).unwrap();
172+
173+
assert_eq!(memory.get(0).unwrap(), F::ONE);
174+
assert_eq!(memory.get(5).unwrap(), F::from_usize(42));
175+
176+
// Test undefined memory access
177+
assert!(matches!(memory.get(1), Err(RunnerError::UndefinedMemory)));
178+
}
179+
180+
#[test]
181+
fn test_memory_already_set_error() {
182+
let mut memory = Memory::empty();
183+
184+
memory.set(0, F::ONE).unwrap();
185+
// Setting same value should work
186+
memory.set(0, F::ONE).unwrap();
187+
188+
// Setting different value should fail
189+
assert!(matches!(
190+
memory.set(0, F::ZERO),
191+
Err(RunnerError::MemoryAlreadySet)
192+
));
193+
}
194+
195+
#[test]
196+
fn test_memory_slices() {
197+
let mut memory = Memory::empty();
198+
let values = vec![F::ONE, F::ZERO, F::from_usize(42), F::from_usize(100)];
199+
200+
memory.set_slice(10, &values).unwrap();
201+
let retrieved = memory.get_slice(10, 4).unwrap();
202+
203+
assert_eq!(retrieved, values);
204+
}
205+
206+
#[test]
207+
fn test_memory_initialization_and_utilities() {
208+
let public_data = vec![F::ONE, F::ZERO, F::from_usize(123)];
209+
let memory = Memory::new(public_data.clone());
210+
211+
// All public data should be initialized
212+
for (i, expected) in public_data.iter().enumerate() {
213+
assert!(memory.is_initialized(i));
214+
assert_eq!(memory.get(i).unwrap(), *expected);
215+
}
216+
217+
assert_eq!(memory.size(), 3);
218+
219+
let entries = memory.initialized_entries();
220+
assert_eq!(entries.len(), 3);
221+
assert_eq!(entries[0], (0, F::ONE));
222+
assert_eq!(entries[2], (2, F::from_usize(123)));
223+
}
224+
225+
#[test]
226+
fn test_vectorized_operations() {
227+
let mut memory = Memory::empty();
228+
let vector = [F::ONE; VECTOR_LEN];
229+
230+
memory.set_vector(0, vector).unwrap();
231+
let retrieved = memory.get_vector(0).unwrap();
232+
233+
assert_eq!(retrieved, vector);
234+
235+
// Test vectorized slice
236+
let slice_data = vec![F::from_usize(1); 2 * VECTOR_LEN];
237+
memory.set_vectorized_slice(1, &slice_data).unwrap();
238+
let retrieved_slice = memory.get_vectorized_slice(1, 2).unwrap();
239+
240+
assert_eq!(retrieved_slice, slice_data);
241+
}
242+
243+
#[test]
244+
fn test_extension_field_operations() {
245+
let mut memory = Memory::empty();
246+
247+
// Create a simple extension field element with proper dimension
248+
let mut coeffs = [F::ZERO; DIMENSION];
249+
coeffs[0] = F::ONE;
250+
let ef_value = EF::from_basis_coefficients_slice(&coeffs).unwrap();
251+
252+
memory.set_ef_element(0, ef_value).unwrap();
253+
let retrieved = memory.get_ef_element(0).unwrap();
254+
255+
assert_eq!(retrieved, ef_value);
256+
257+
// Test continuous slice of EF elements
258+
memory.set_ef_element(DIMENSION, ef_value).unwrap();
259+
let ef_slice = memory.get_continuous_slice_of_ef_elements(0, 2).unwrap();
260+
261+
assert_eq!(ef_slice.len(), 2);
262+
assert_eq!(ef_slice[0], ef_value);
263+
assert_eq!(ef_slice[1], ef_value);
264+
}
265+
266+
#[test]
267+
fn test_memory_clear() {
268+
let mut memory = Memory::new(vec![F::ONE, F::ZERO]);
269+
assert_eq!(memory.size(), 2);
270+
271+
memory.clear();
272+
assert_eq!(memory.size(), 0);
273+
}
274+
}

0 commit comments

Comments
 (0)