import { describe, it, expect } from 'vitest';
import { sdiv } from './0x05_SDIV.js';
describe('SDIV (0x05)', () => {
const MIN_INT = 1n << 255n;
const MAX_UINT = (1n << 256n) - 1n;
const toSigned = (n: bigint) => n < 0n ? (1n << 256n) + n : n;
it('divides positive numbers', () => {
const frame = createFrame([10n, 2n]);
expect(sdiv(frame)).toBeNull();
expect(frame.stack).toEqual([5n]);
});
it('handles negative dividend', () => {
const frame = createFrame([toSigned(-10n), 2n]);
expect(sdiv(frame)).toBeNull();
expect(frame.stack).toEqual([toSigned(-5n)]);
});
it('handles negative divisor', () => {
const frame = createFrame([10n, toSigned(-2n)]);
expect(sdiv(frame)).toBeNull();
expect(frame.stack).toEqual([toSigned(-5n)]);
});
it('handles both negative', () => {
const frame = createFrame([toSigned(-10n), toSigned(-2n)]);
expect(sdiv(frame)).toBeNull();
expect(frame.stack).toEqual([5n]);
});
it('truncates toward zero (positive)', () => {
const frame = createFrame([7n, 2n]);
expect(sdiv(frame)).toBeNull();
expect(frame.stack).toEqual([3n]);
});
it('truncates toward zero (negative)', () => {
const frame = createFrame([toSigned(-7n), 2n]);
expect(sdiv(frame)).toBeNull();
expect(frame.stack).toEqual([toSigned(-3n)]);
});
it('handles MIN_INT / -1 overflow case', () => {
const frame = createFrame([MIN_INT, MAX_UINT]);
expect(sdiv(frame)).toBeNull();
expect(frame.stack).toEqual([MIN_INT]);
});
it('handles division by zero', () => {
const frame = createFrame([toSigned(-10n), 0n]);
expect(sdiv(frame)).toBeNull();
expect(frame.stack).toEqual([0n]);
});
});