import { describe, it, expect } from 'vitest';
import { handler_0xf3_RETURN } from './0xf3_RETURN.js';
describe('RETURN (0xf3)', () => {
it('returns data from memory', () => {
const memory = Bytes64();
memory[0] = 0x42;
memory[1] = 0x43;
const frame = createFrame({
stack: [2n, 0n],
memory,
gasRemaining: 1000n,
});
const err = handler_0xf3_RETURN(frame);
expect(err).toBeNull();
expect(frame.stopped).toBe(true);
expect(frame.output).toEqual(new Uint8Array([0x42, 0x43]));
});
it('handles zero-length return', () => {
const frame = createFrame({
stack: [0n, 0n],
gasRemaining: 1000n,
});
handler_0xf3_RETURN(frame);
expect(frame.stopped).toBe(true);
expect(frame.output).toBeUndefined();
});
it('charges memory expansion gas', () => {
const frame = createFrame({
stack: [32n, 0n],
memorySize: 0,
gasRemaining: 1000n,
});
handler_0xf3_RETURN(frame);
expect(frame.gasRemaining).toBeLessThan(1000n);
});
it('rejects out of bounds offset', () => {
const frame = createFrame({
stack: [1n, 0x100000000n],
});
expect(handler_0xf3_RETURN(frame)).toEqual({ type: 'OutOfBounds' });
});
it('rejects overflow', () => {
const frame = createFrame({
stack: [100n, 0xffffffffn],
});
expect(handler_0xf3_RETURN(frame)).toEqual({ type: 'OutOfBounds' });
});
});