import { describe, it, expect } from 'vitest';
import { handle as ISZERO } from './0x15_ISZERO.js';
describe('ISZERO (0x15)', () => {
it('returns 1 when value is zero', () => {
const frame = createFrame([0n]);
expect(ISZERO(frame)).toBeNull();
expect(frame.stack).toEqual([1n]);
expect(frame.pc).toBe(1);
expect(frame.gasRemaining).toBe(997n);
});
it('returns 0 when value is non-zero', () => {
const frame = createFrame([42n]);
expect(ISZERO(frame)).toBeNull();
expect(frame.stack).toEqual([0n]);
});
it('returns 0 for 1', () => {
const frame = createFrame([1n]);
expect(ISZERO(frame)).toBeNull();
expect(frame.stack).toEqual([0n]);
});
it('returns 0 for max uint256', () => {
const MAX = (1n << 256n) - 1n;
const frame = createFrame([MAX]);
expect(ISZERO(frame)).toBeNull();
expect(frame.stack).toEqual([0n]);
});
it('implements boolean NOT', () => {
// NOT true (1) = false (0)
const frame1 = createFrame([1n]);
expect(ISZERO(frame1)).toBeNull();
expect(frame1.stack).toEqual([0n]);
// NOT false (0) = true (1)
const frame2 = createFrame([0n]);
expect(ISZERO(frame2)).toBeNull();
expect(frame2.stack).toEqual([1n]);
});
it('returns StackUnderflow with empty stack', () => {
const frame = createFrame([]);
expect(ISZERO(frame)).toEqual({ type: 'StackUnderflow' });
});
it('returns OutOfGas when insufficient gas', () => {
const frame = createFrame([0n], 2n);
expect(ISZERO(frame)).toEqual({ type: 'OutOfGas' });
});
it('preserves stack below checked value', () => {
const frame = createFrame([100n, 200n, 0n]);
expect(ISZERO(frame)).toBeNull();
expect(frame.stack).toEqual([100n, 200n, 1n]);
});
});