import { describe, it, expect } from 'vitest';
import { sub } from './0x03_SUB.js';
describe('SUB (0x03)', () => {
it('subtracts two numbers', () => {
const frame = createFrame([10n, 5n]);
expect(sub(frame)).toBeNull();
expect(frame.stack).toEqual([5n]);
});
it('handles underflow wrapping', () => {
const frame = createFrame([0n, 1n]);
expect(sub(frame)).toBeNull();
const MAX = (1n << 256n) - 1n;
expect(frame.stack).toEqual([MAX]);
});
it('handles large underflow', () => {
const frame = createFrame([5n, 10n]);
expect(sub(frame)).toBeNull();
const MAX = (1n << 256n) - 1n;
expect(frame.stack).toEqual([MAX - 4n]);
});
it('handles zero subtraction', () => {
const frame = createFrame([42n, 0n]);
expect(sub(frame)).toBeNull();
expect(frame.stack).toEqual([42n]);
});
it('handles self-subtraction', () => {
const frame = createFrame([42n, 42n]);
expect(sub(frame)).toBeNull();
expect(frame.stack).toEqual([0n]);
});
it('returns StackUnderflow with insufficient stack', () => {
const frame = createFrame([5n]);
expect(sub(frame)).toEqual({ type: 'StackUnderflow' });
});
it('consumes correct gas (3)', () => {
const frame = createFrame([10n, 5n], 100n);
expect(sub(frame)).toBeNull();
expect(frame.gasRemaining).toBe(97n);
});
});