import { add, formatDecimal, multiply, subtract } from '../../common/decimal'; import { decimal } from './decimal'; describe('decimal', () => { it('keeps signed nanos exact without floats', () => { expect(formatDecimal(decimal({ units: 0, nano: -500000000 }))).toBe('-0.5'); expect( formatDecimal( add(decimal({ units: '9007199254740993' }), decimal({ nano: 1 })), ), ).toBe('9007199254740993.000000001'); expect( formatDecimal( subtract(decimal({ units: 1 }), decimal({ nano: 500000000 })), ), ).toBe('0.5'); expect( formatDecimal( multiply(decimal({ units: 2 }), decimal({ nano: 500000000 })), ), ).toBe('1'); }); }); describe('decimal formatting', () => { it.each([ [120000n, 4, '12'], [-120030n, 4, '-12.003'], [1n, 4, '0.0001'], [0n, 4, '0'], ])('preserves value %s at scale %s while trimming only trailing zeros', (value, scale, expected) => { expect(formatDecimal({ value, scale })).toBe(expected); }); it('preserves a long fraction with a trailing zero run', () => { const significant = '1'.repeat(10_000); expect(formatDecimal({ value: BigInt(significant + '0'.repeat(10_000)), scale: 20_000 })).toBe('0.' + significant); }); });