import { describe, it, expect } from 'vitest';
import { mstore8 } from './0x53_MSTORE8.js';
describe('MSTORE8 (0x53)', () => {
it('writes least significant byte', () => {
const frame = createFrame();
frame.stack.push(0x42n);
frame.stack.push(0n);
expect(mstore8(frame)).toBeNull();
expect(frame.stack.length).toBe(0);
expect(frame.memory.get(0)).toBe(0x42);
expect(frame.pc).toBe(1);
});
it('truncates multi-byte values', () => {
const frame = createFrame();
const value = 0x123456789ABCDEFn;
frame.stack.push(value);
frame.stack.push(0n);
mstore8(frame);
// Only lowest byte (0xEF) written
expect(frame.memory.get(0)).toBe(0xEF);
});
it('writes zero byte', () => {
const frame = createFrame();
frame.memory.set(0, 0x99);
frame.stack.push(0n);
frame.stack.push(0n);
mstore8(frame);
expect(frame.memory.get(0)).toBe(0);
});
it('writes at non-zero offset', () => {
const frame = createFrame();
frame.stack.push(0xABn);
frame.stack.push(10n);
mstore8(frame);
expect(frame.memory.get(10)).toBe(0xAB);
expect(frame.memory.has(5)).toBe(false);
});
it('expands to word boundary', () => {
const frame = createFrame();
frame.stack.push(0x99n);
frame.stack.push(32n);
mstore8(frame);
// Writes at byte 32, expands to 2 words (64 bytes)
expect(frame.memorySize).toBe(64);
});
it('preserves adjacent bytes', () => {
const frame = createFrame();
frame.memory.set(10, 0xAA);
frame.memory.set(12, 0xBB);
frame.stack.push(0xCCn);
frame.stack.push(11n);
mstore8(frame);
expect(frame.memory.get(10)).toBe(0xAA);
expect(frame.memory.get(11)).toBe(0xCC);
expect(frame.memory.get(12)).toBe(0xBB);
});
it('returns OutOfGas when insufficient', () => {
const frame = createFrame({ gasRemaining: 2n });
frame.stack.push(0x33n);
frame.stack.push(0n);
expect(mstore8(frame)).toEqual({ type: "OutOfGas" });
});
it('returns StackUnderflow when insufficient stack', () => {
const frame = createFrame();
frame.stack.push(0n);
expect(mstore8(frame)).toEqual({ type: "StackUnderflow" });
});
it('handles all byte values 0x00-0xFF', () => {
const frame = createFrame();
for (let byte = 0; byte <= 0xFF; byte++) {
frame.stack.push(BigInt(byte));
frame.stack.push(BigInt(byte));
mstore8(frame);
expect(frame.memory.get(byte)).toBe(byte);
}
});
});