import { describe, it, expect } from 'vitest';
import { byte } from './byte.js';
describe('BYTE (0x1a)', () => {
it('extracts MSB (byte 0)', () => {
const value = 0xFF00000000000000000000000000000000000000000000000000000000000000n;
const frame = createFrame({ stack: [0n, value] });
expect(byte(frame)).toBeNull();
expect(frame.stack[0]).toBe(0xFFn);
});
it('extracts LSB (byte 31)', () => {
const value = 0x00000000000000000000000000000000000000000000000000000000000000FFn;
const frame = createFrame({ stack: [31n, value] });
expect(byte(frame)).toBeNull();
expect(frame.stack[0]).toBe(0xFFn);
});
it('extracts middle byte', () => {
const value = 0x000000000000000000000000000000AB00000000000000000000000000000000n;
const frame = createFrame({ stack: [15n, value] });
expect(byte(frame)).toBeNull();
expect(frame.stack[0]).toBe(0xABn);
});
it('returns 0 for index >= 32', () => {
const value = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFn;
const frame = createFrame({ stack: [32n, value] });
expect(byte(frame)).toBeNull();
expect(frame.stack[0]).toBe(0n);
});
it('returns 0 for large index', () => {
const value = 0x123456n;
const frame = createFrame({ stack: [1000n, value] });
expect(byte(frame)).toBeNull();
expect(frame.stack[0]).toBe(0n);
});
it('extracts from zero value', () => {
const frame = createFrame({ stack: [15n, 0n] });
expect(byte(frame)).toBeNull();
expect(frame.stack[0]).toBe(0n);
});
it('extracts all bytes from MAX value', () => {
const MAX = (1n << 256n) - 1n;
for (let i = 0; i < 32; i++) {
const frame = createFrame({ stack: [BigInt(i), MAX] });
expect(byte(frame)).toBeNull();
expect(frame.stack[0]).toBe(0xFFn);
}
});
it('returns StackUnderflow with insufficient stack', () => {
const frame = createFrame({ stack: [5n] });
expect(byte(frame)).toEqual({ type: 'StackUnderflow' });
});
it('returns OutOfGas when insufficient gas', () => {
const frame = createFrame({ stack: [5n, 0x123n], gasRemaining: 2n });
expect(byte(frame)).toEqual({ type: 'OutOfGas' });
});
});