import { describe, it, expect } from 'vitest';
import { handle as LT } from './0x10_LT.js';
describe('LT (0x10)', () => {
it('returns 1 when a < b', () => {
const frame = createFrame([10n, 20n]);
expect(LT(frame)).toBeNull();
expect(frame.stack).toEqual([1n]);
expect(frame.pc).toBe(1);
expect(frame.gasRemaining).toBe(997n);
});
it('returns 0 when a >= b (equal)', () => {
const frame = createFrame([20n, 20n]);
expect(LT(frame)).toBeNull();
expect(frame.stack).toEqual([0n]);
});
it('returns 0 when a > b', () => {
const frame = createFrame([30n, 20n]);
expect(LT(frame)).toBeNull();
expect(frame.stack).toEqual([0n]);
});
it('handles 0 < 1', () => {
const frame = createFrame([0n, 1n]);
expect(LT(frame)).toBeNull();
expect(frame.stack).toEqual([1n]);
});
it('handles max uint256 values', () => {
const MAX = (1n << 256n) - 1n;
const frame = createFrame([MAX - 1n, MAX]);
expect(LT(frame)).toBeNull();
expect(frame.stack).toEqual([1n]);
});
it('treats all values as unsigned', () => {
// 2^255 is large positive as unsigned
const SIGN_BIT = 1n << 255n;
const frame = createFrame([1n, SIGN_BIT]);
expect(LT(frame)).toBeNull();
expect(frame.stack).toEqual([1n]); // 1 < 2^255
});
it('returns StackUnderflow with insufficient stack', () => {
const frame = createFrame([10n]);
expect(LT(frame)).toEqual({ type: 'StackUnderflow' });
});
it('returns OutOfGas when insufficient gas', () => {
const frame = createFrame([10n, 20n], 2n);
expect(LT(frame)).toEqual({ type: 'OutOfGas' });
});
it('preserves stack below compared values', () => {
const frame = createFrame([100n, 200n, 10n, 20n]);
expect(LT(frame)).toBeNull();
expect(frame.stack).toEqual([100n, 200n, 1n]);
});
});