import { ceil, floor, round } from './number' /** * Successfully tested with INTEGERS equal to 1000 * and DIGITS equal to 3. */ const INTEGERS = 10 const DIGITS = 3 describe('number', () => { describe('round', () => { it('should return the same number when an integer is provided', () => { for (let a = 0; a < 100; a++) { expect(round(1)(a)).toBe(a) } }) it('should work with negative numbers', () => { for (let number = 0; number < 100; number++) { expect(round(1)(-number)).toBe(number === 0 ? 0 : -number) } expect(round(1)(-1.111)).toBe(-1.1) expect(round(1)(-1.999)).toBe(-2) }) it('should work with negative numbers preserving 0 sign', () => { for (let number = 0; number < 100; number++) { expect(round(1, false)(-number)).toBe(-number) } expect(round(1, false)(-1.111)).toBe(-1.1) expect(round(1, false)(-1.999)).toBe(-2) }) describe('given number with 7+ "0" digits', () => { it('should round to a specific digit', () => { expect(round(2)(0.000000123)).toBe(0.0) }) }) describe('given `n` digits', () => { it("shouldn't affect numbers with `n` significant digits", () => { for (let integer = 0; integer < INTEGERS; integer++) { for (let digits = 1; digits <= DIGITS; digits++) { for (let decimal = 0; decimal < Math.pow(10, digits); decimal++) { const number = Number( `${integer}.${`00${decimal}`.slice(-digits)}`, ) expect(round(digits)(number)).toBe(number) expect(round(digits)(-number)).toBe(number === 0 ? 0 : -number) } } } }) it("shouldn't affect numbers with `n` significant digits preserving 0 sign", () => { for (let integer = 0; integer < INTEGERS; integer++) { for (let digits = 1; digits <= DIGITS; digits++) { for (let decimal = 0; decimal < Math.pow(10, digits); decimal++) { const number = Number( `${integer}.${`00${decimal}`.slice(-digits)}`, ) expect(round(digits, false)(number)).toBe(number) expect(round(digits, false)(-number)).toBe(-number) } } } }) }) it('should round to a specific digit', () => { expect(round(2)(1.004)).toBe(1) expect(round(2)(10.004)).toBe(10) expect(round(2)(100.004)).toBe(100) expect(round(2)(1000.004)).toBe(1000) expect(round(2)(10000.004)).toBe(10000) expect(round(2)(100000.004)).toBe(100000) expect(round(2)(1000000.004)).toBe(1000000) expect(round(2)(10000000.004)).toBe(10000000) expect(round(2)(100000000.004)).toBe(100000000) expect(round(2)(1000000000.004)).toBe(1000000000) expect(round(2)(10000000000.004)).toBe(10000000000) expect(round(2)(1.005)).toBe(1.01) expect(round(2)(10.005)).toBe(10.01) expect(round(2)(100.005)).toBe(100.01) expect(round(2)(1000.005)).toBe(1000.01) expect(round(2)(10000.005)).toBe(10000.01) expect(round(2)(100000.005)).toBe(100000.01) expect(round(2)(1000000.005)).toBe(1000000.01) expect(round(2)(10000000.005)).toBe(10000000.01) expect(round(2)(100000000.005)).toBe(100000000.01) expect(round(2)(1000000000.005)).toBe(1000000000.01) expect(round(2)(10000000000.005)).toBe(10000000000.01) expect(round(2)(-1.004)).toBe(-1) expect(round(2)(-10.004)).toBe(-10) expect(round(2)(-100.004)).toBe(-100) expect(round(2)(-1000.004)).toBe(-1000) expect(round(2)(-10000.004)).toBe(-10000) expect(round(2)(-100000.004)).toBe(-100000) expect(round(2)(-1000000.004)).toBe(-1000000) expect(round(2)(-10000000.004)).toBe(-10000000) expect(round(2)(-100000000.004)).toBe(-100000000) expect(round(2)(-1000000000.004)).toBe(-1000000000) expect(round(2)(-10000000000.004)).toBe(-10000000000) expect(round(2)(-1.005)).toBe(-1) expect(round(2)(-10.005)).toBe(-10) expect(round(2)(-100.005)).toBe(-100) expect(round(2)(-1000.005)).toBe(-1000) expect(round(2)(-10000.005)).toBe(-10000) expect(round(2)(-100000.005)).toBe(-100000) expect(round(2)(-1000000.005)).toBe(-1000000) expect(round(2)(-10000000.005)).toBe(-10000000) expect(round(2)(-100000000.005)).toBe(-100000000) expect(round(2)(-1000000000.005)).toBe(-1000000000) expect(round(2)(-10000000000.005)).toBe(-10000000000) expect(round(2)(-1.006)).toBe(-1.01) expect(round(2)(-10.006)).toBe(-10.01) expect(round(2)(-100.006)).toBe(-100.01) expect(round(2)(-1000.006)).toBe(-1000.01) expect(round(2)(-10000.006)).toBe(-10000.01) expect(round(2)(-100000.006)).toBe(-100000.01) expect(round(2)(-1000000.006)).toBe(-1000000.01) expect(round(2)(-10000000.006)).toBe(-10000000.01) expect(round(2)(-100000000.006)).toBe(-100000000.01) expect(round(2)(-1000000000.006)).toBe(-1000000000.01) expect(round(2)(-10000000000.006)).toBe(-10000000000.01) expect(round(2)(1.111)).toBe(1.11) expect(round(2)(1.119)).toBe(1.12) expect(round(2)(1.9)).toBe(1.9) expect(round(2)(1.9999999)).toBe(2) expect(round(2)(1.00000009999)).toBe(1) expect(round(2)(1.0090009999)).toBe(1.01) expect(round(2)(-1.9999999)).toBe(-2) expect(round(2)(-1.00000009999)).toBe(-1) expect(round(2)(-1.0090009999)).toBe(-1.01) expect(round(0)(1.111)).toBe(1) expect(round(0)(1.119)).toBe(1) expect(round(0)(1.9)).toBe(2) expect(round(0)(-1e-10)).toBe(0) expect(round(0)(-0.000001)).toBe(0) expect(round(0)(-0.000000001)).toBe(0) expect(round(0, false)(-1e-10)).toBe(-0) expect(round(0, false)(-0.000001)).toBe(-0) expect(round(0, false)(-0.000000001)).toBe(-0) }) }) describe('floor', () => { it('should round to a specific digit', () => { expect(floor(2)(1.004)).toBe(1) expect(floor(2)(10.004)).toBe(10) expect(floor(2)(100.004)).toBe(100) expect(floor(2)(1000.004)).toBe(1000) expect(floor(2)(10000.004)).toBe(10000) expect(floor(2)(100000.004)).toBe(100000) expect(floor(2)(1000000.004)).toBe(1000000) expect(floor(2)(10000000.004)).toBe(10000000) expect(floor(2)(100000000.004)).toBe(100000000) expect(floor(2)(1000000000.004)).toBe(1000000000) expect(floor(2)(10000000000.004)).toBe(10000000000) expect(floor(2)(1.005)).toBe(1) expect(floor(2)(10.005)).toBe(10) expect(floor(2)(100.005)).toBe(100) expect(floor(2)(1000.005)).toBe(1000) expect(floor(2)(10000.005)).toBe(10000) expect(floor(2)(100000.005)).toBe(100000) expect(floor(2)(1000000.005)).toBe(1000000) expect(floor(2)(10000000.005)).toBe(10000000) expect(floor(2)(100000000.005)).toBe(100000000) expect(floor(2)(1000000000.005)).toBe(1000000000) expect(floor(2)(10000000000.005)).toBe(10000000000) expect(floor(2)(-1.004)).toBe(-1.01) expect(floor(2)(-10.004)).toBe(-10.01) expect(floor(2)(-100.004)).toBe(-100.01) expect(floor(2)(-1000.004)).toBe(-1000.01) expect(floor(2)(-10000.004)).toBe(-10000.01) expect(floor(2)(-100000.004)).toBe(-100000.01) expect(floor(2)(-1000000.004)).toBe(-1000000.01) expect(floor(2)(-10000000.004)).toBe(-10000000.01) expect(floor(2)(-100000000.004)).toBe(-100000000.01) expect(floor(2)(-1000000000.004)).toBe(-1000000000.01) expect(floor(2)(-10000000000.004)).toBe(-10000000000.01) expect(floor(2)(-1.005)).toBe(-1.01) expect(floor(2)(-10.005)).toBe(-10.01) expect(floor(2)(-100.005)).toBe(-100.01) expect(floor(2)(-1000.005)).toBe(-1000.01) expect(floor(2)(-10000.005)).toBe(-10000.01) expect(floor(2)(-100000.005)).toBe(-100000.01) expect(floor(2)(-1000000.005)).toBe(-1000000.01) expect(floor(2)(-10000000.005)).toBe(-10000000.01) expect(floor(2)(-100000000.005)).toBe(-100000000.01) expect(floor(2)(-1000000000.005)).toBe(-1000000000.01) expect(floor(2)(-10000000000.005)).toBe(-10000000000.01) expect(floor(2)(-1.006)).toBe(-1.01) expect(floor(2)(-10.006)).toBe(-10.01) expect(floor(2)(-100.006)).toBe(-100.01) expect(floor(2)(-1000.006)).toBe(-1000.01) expect(floor(2)(-10000.006)).toBe(-10000.01) expect(floor(2)(-100000.006)).toBe(-100000.01) expect(floor(2)(-1000000.006)).toBe(-1000000.01) expect(floor(2)(-10000000.006)).toBe(-10000000.01) expect(floor(2)(-100000000.006)).toBe(-100000000.01) expect(floor(2)(-1000000000.006)).toBe(-1000000000.01) expect(floor(2)(-10000000000.006)).toBe(-10000000000.01) expect(floor(2)(1.111)).toBe(1.11) expect(floor(2)(1.119)).toBe(1.11) expect(floor(2)(1.9)).toBe(1.9) expect(floor(2)(1.9999999)).toBe(1.99) expect(floor(2)(1.00000009999)).toBe(1) expect(floor(2)(1.0090009999)).toBe(1.0) expect(floor(2)(-1.9999999)).toBe(-2) expect(floor(2)(-1.00000009999)).toBe(-1.01) expect(floor(2)(-1.0090009999)).toBe(-1.01) expect(floor(0)(1.111)).toBe(1) expect(floor(0)(1.119)).toBe(1) expect(floor(0)(1.9)).toBe(1) expect(floor(0)(-1e-10)).toBe(-1) expect(floor(0)(-0.000001)).toBe(-1) expect(floor(0)(-0.000000001)).toBe(-1) expect(floor(0, false)(-1e-10)).toBe(-1) expect(floor(0, false)(-0.000001)).toBe(-1) expect(floor(0, false)(-0.000000001)).toBe(-1) }) }) describe('ceil', () => { it('should round to a specific digit', () => { expect(ceil(2)(1.004)).toBe(1.01) expect(ceil(2)(10.004)).toBe(10.01) expect(ceil(2)(100.004)).toBe(100.01) expect(ceil(2)(1000.004)).toBe(1000.01) expect(ceil(2)(10000.004)).toBe(10000.01) expect(ceil(2)(100000.004)).toBe(100000.01) expect(ceil(2)(1000000.004)).toBe(1000000.01) expect(ceil(2)(10000000.004)).toBe(10000000.01) expect(ceil(2)(100000000.004)).toBe(100000000.01) expect(ceil(2)(1000000000.004)).toBe(1000000000.01) expect(ceil(2)(10000000000.004)).toBe(10000000000.01) expect(ceil(2)(1.005)).toBe(1.01) expect(ceil(2)(10.005)).toBe(10.01) expect(ceil(2)(100.005)).toBe(100.01) expect(ceil(2)(1000.005)).toBe(1000.01) expect(ceil(2)(10000.005)).toBe(10000.01) expect(ceil(2)(100000.005)).toBe(100000.01) expect(ceil(2)(1000000.005)).toBe(1000000.01) expect(ceil(2)(10000000.005)).toBe(10000000.01) expect(ceil(2)(100000000.005)).toBe(100000000.01) expect(ceil(2)(1000000000.005)).toBe(1000000000.01) expect(ceil(2)(10000000000.005)).toBe(10000000000.01) expect(ceil(2)(-1.004)).toBe(-1) expect(ceil(2)(-10.004)).toBe(-10) expect(ceil(2)(-100.004)).toBe(-100) expect(ceil(2)(-1000.004)).toBe(-1000) expect(ceil(2)(-10000.004)).toBe(-10000) expect(ceil(2)(-100000.004)).toBe(-100000) expect(ceil(2)(-1000000.004)).toBe(-1000000) expect(ceil(2)(-10000000.004)).toBe(-10000000) expect(ceil(2)(-100000000.004)).toBe(-100000000) expect(ceil(2)(-1000000000.004)).toBe(-1000000000) expect(ceil(2)(-10000000000.004)).toBe(-10000000000) expect(ceil(2)(-1.005)).toBe(-1) expect(ceil(2)(-10.005)).toBe(-10) expect(ceil(2)(-100.005)).toBe(-100) expect(ceil(2)(-1000.005)).toBe(-1000) expect(ceil(2)(-10000.005)).toBe(-10000) expect(ceil(2)(-100000.005)).toBe(-100000) expect(ceil(2)(-1000000.005)).toBe(-1000000) expect(ceil(2)(-10000000.005)).toBe(-10000000) expect(ceil(2)(-100000000.005)).toBe(-100000000) expect(ceil(2)(-1000000000.005)).toBe(-1000000000) expect(ceil(2)(-10000000000.005)).toBe(-10000000000) expect(ceil(2)(-1.006)).toBe(-1) expect(ceil(2)(-10.006)).toBe(-10) expect(ceil(2)(-100.006)).toBe(-100) expect(ceil(2)(-1000.006)).toBe(-1000) expect(ceil(2)(-10000.006)).toBe(-10000) expect(ceil(2)(-100000.006)).toBe(-100000) expect(ceil(2)(-1000000.006)).toBe(-1000000) expect(ceil(2)(-10000000.006)).toBe(-10000000) expect(ceil(2)(-100000000.006)).toBe(-100000000) expect(ceil(2)(-1000000000.006)).toBe(-1000000000) expect(ceil(2)(-10000000000.006)).toBe(-10000000000) expect(ceil(2)(1.111)).toBe(1.12) expect(ceil(2)(1.119)).toBe(1.12) expect(ceil(2)(1.9)).toBe(1.9) expect(ceil(2)(1.9999999)).toBe(2) expect(ceil(2)(1.00000009999)).toBe(1.01) expect(ceil(2)(1.0090009999)).toBe(1.01) expect(ceil(2)(-1.9999999)).toBe(-1.99) expect(ceil(2)(-1.00000009999)).toBe(-1) expect(ceil(2)(-1.0090009999)).toBe(-1) expect(ceil(0)(1.111)).toBe(2) expect(ceil(0)(1.119)).toBe(2) expect(ceil(0)(1.9)).toBe(2) expect(ceil(0)(-1e-10)).toBe(0) expect(ceil(0)(-0.000001)).toBe(0) expect(ceil(0)(-0.0000000001)).toBe(0) expect(ceil(0, false)(-1e-10)).toBe(-0) expect(ceil(0, false)(-0.000001)).toBe(-0) expect(ceil(0, false)(-0.0000000001)).toBe(-0) }) }) })