import { expect, test } from 'vitest';
import { divideOnChainCompatible } from '../src';
import { rationalCeil, rationalFloor } from '../src/types/rational';

test('Division negative 1', () => {
  expect(divideOnChainCompatible(-5n, 3n), 'When negative ceil').toBe(-2n);
});

test('Division negative 2', () => {
  expect(divideOnChainCompatible(5n, -3n), 'When negative ceil').toBe(-2n);
});

test('Division positive 1', () => {
  expect(divideOnChainCompatible(5n, 3n), 'When positive floor').toBe(1n);
});

test('Division positive 2', () => {
  expect(divideOnChainCompatible(-5n, -3n), 'When positive floor').toBe(1n);
});

test('Floor rational', () => {
  expect(rationalFloor({ numerator: 2n, denominator: 3n })).toBe(0n);
  expect(rationalFloor({ numerator: 5n, denominator: 2n })).toBe(2n);
  expect(rationalFloor({ numerator: 5n, denominator: 3n })).toBe(1n);
  expect(rationalFloor({ numerator: 5n, denominator: 5n })).toBe(1n);
  expect(rationalFloor({ numerator: 5n, denominator: 6n })).toBe(0n);
  expect(rationalFloor({ numerator: 8n, denominator: 3n })).toBe(2n);
  expect(rationalFloor({ numerator: -14n, denominator: 3n })).toBe(-5n);
});

test('Ceil rational', () => {
  expect(rationalCeil({ numerator: 2n, denominator: 3n })).toBe(1n);
  expect(rationalCeil({ numerator: 13n, denominator: 5n })).toBe(3n);
  expect(rationalCeil({ numerator: 15n, denominator: 5n })).toBe(3n);
  expect(rationalCeil({ numerator: 16n, denominator: 5n })).toBe(4n);
  expect(rationalCeil({ numerator: 44n, denominator: 14n })).toBe(4n);
  expect(rationalCeil({ numerator: -3n, denominator: 5n })).toBe(0n);
  expect(rationalCeil({ numerator: -5n, denominator: 5n })).toBe(-1n);
  expect(rationalCeil({ numerator: -14n, denominator: 3n })).toBe(-4n);
  expect(rationalCeil({ numerator: -14n, denominator: 6n })).toBe(-2n);
});
