import {
  isCurrency,
  format,
  add,
  subtract,
  multiply,
  divide,
  distribute,
} from '../../src/utils/precision'

describe('precision', () => {
  it('check value is currency object', () => {
    expect(isCurrency(1)).toBeFalsy()
    expect(isCurrency('1')).toBeFalsy()
    expect(isCurrency({})).toBeFalsy()
    expect(isCurrency({ s: 1 })).toBeFalsy()
    expect(isCurrency(add(1, 1))).toBeTruthy()
  })

  it('format value', () => {
    expect(format(1)).toBe(1)
    expect(
      format(1.1, {
        type: 'number',
      }),
    ).toBe(1.1)
    expect(
      format(1.11, {
        type: 'string',
        precision: 2,
      }),
    ).toBe('1.11')
    expect(format(add(1, 1))).toBe(2)
    expect(format(add(0.1, 0.2))).toBe(0.3)
  })

  it('add value', () => {
    expect(format(add(1, 1))).toBe(2)
    expect(format(add(0.1, 0.2))).toBe(0.3)
    expect(format(add(0.1, 0.2, 0.3))).toBe(0.6)
    expect(format(add(0.1, 0.2, 0.3, 0.4))).toBe(1)
    expect(format(add(0.1, 0.2, 0.3, 0.4, 0.5))).toBe(1.5)
  })

  it('subtract value', () => {
    expect(format(subtract(1, 1))).toBe(0)
    expect(format(subtract(0.3, 0.2))).toBe(0.1)
    expect(format(subtract(0.6, 0.3, 0.2))).toBe(0.1)
    expect(format(subtract(1, 0.5, 0.4, 0.3, 0.2))).toBe(-0.4)
  })

  it('multiply value', () => {
    expect(format(multiply(1, 1))).toBe(1)
    expect(format(multiply(0.1, 0.2))).toBe(0.02)
    expect(format(multiply(0.1, 0.2, 0.3))).toBe(0.006)
    expect(format(multiply(0.1, 0.2, 0.3, 0.4))).toBe(0.0024)
    expect(format(multiply(0.1, 0.2, 0.3, 0.4, 0.5))).toBe(0.0012)
  })

  it('divide value', () => {
    expect(format(divide(1, 1))).toBe(1)
    expect(format(divide(0.1, 0.2))).toBe(0.5)
    expect(
      format(divide(0.1, 0.2, 0.3), {
        precision: 2,
      }),
    ).toBe(1.67)
  })

  it('distribute value', () => {
    expect(distribute(1, 1)).toEqual([1])
    expect(distribute(1, 0)).toEqual([1])
    expect(distribute(0, 3)).toEqual([0, 0, 0])
    expect(distribute(10, 3)).toEqual([3.33333334, 3.33333333, 3.33333333])
    expect(
      distribute(20, 3, {
        precision: 4,
      }),
    ).toEqual([6.6667, 6.6667, 6.6666])
    expect(distribute(add(20, 1), 3)).toEqual([7, 7, 7])
  })
})