import { describe, it, expect } from 'vitest';
import { mstore } from './0x52_MSTORE.js';
describe('MSTORE (0x52)', () => {
it('writes 32 bytes to memory at offset 0', () => {
const frame = createFrame();
const value = 0x0102030405...n;
frame.stack.push(value);
frame.stack.push(0n);
expect(mstore(frame)).toBeNull();
expect(frame.stack.length).toBe(0);
expect(frame.memory.get(0)).toBe(0x01);
expect(frame.memory.get(31)).toBe(0x20);
expect(frame.pc).toBe(1);
});
it('writes zero to clear memory', () => {
const frame = createFrame();
// Pre-populate
for (let i = 0; i < 32; i++) {
frame.memory.set(i, 0xFF);
}
frame.stack.push(0n);
frame.stack.push(0n);
mstore(frame);
for (let i = 0; i < 32; i++) {
expect(frame.memory.get(i)).toBe(0);
}
});
it('expands memory to word boundary', () => {
const frame = createFrame();
frame.stack.push(0xABn);
frame.stack.push(1n);
mstore(frame);
expect(frame.memorySize).toBe(64);
});
it('overwrites existing memory', () => {
const frame = createFrame();
frame.stack.push(0xAAAAn);
frame.stack.push(0n);
mstore(frame);
frame.stack.push(0xBBBBn);
frame.stack.push(0n);
mstore(frame);
expect(frame.memory.get(31)).toBe(0xBB);
});
it('returns OutOfGas when insufficient', () => {
const frame = createFrame({ gasRemaining: 2n });
frame.stack.push(0xFFn);
frame.stack.push(0n);
expect(mstore(frame)).toEqual({ type: "OutOfGas" });
});
it('returns StackUnderflow when insufficient stack', () => {
const frame = createFrame();
frame.stack.push(0n);
expect(mstore(frame)).toEqual({ type: "StackUnderflow" });
});
});