import { assert } from 'chai'

import ExponentialBackoff from '../src/client/ExponentialBackoff'

describe('ExponentialBackoff', function () {
  it('duration() return value starts with the min value', function () {
    // default: 100ms
    assert.equal(new ExponentialBackoff().duration(), 100)
    assert.equal(new ExponentialBackoff({ min: 100 }).duration(), 100)
    assert.equal(new ExponentialBackoff({ min: 123 }).duration(), 123)
  })

  it('duration() return value increases when called multiple times', function () {
    const backoff = new ExponentialBackoff({ min: 100, max: 1000 })
    assert.strictEqual(backoff.duration(), 100)
    assert.strictEqual(backoff.duration(), 200)
    assert.strictEqual(backoff.duration(), 400)
    assert.strictEqual(backoff.duration(), 800)
  })

  it('duration() never returns greater than the max value', function () {
    const backoff = new ExponentialBackoff({ min: 300, max: 1000 })
    assert.strictEqual(backoff.duration(), 300)
    assert.strictEqual(backoff.duration(), 600)
    assert.strictEqual(backoff.duration(), 1000)
    assert.strictEqual(backoff.duration(), 1000)
  })

  it('reset() will reset the duration() value', function () {
    const backoff = new ExponentialBackoff({ min: 100, max: 1000 })
    assert.strictEqual(backoff.duration(), 100)
    assert.strictEqual(backoff.duration(), 200)
    assert.strictEqual(backoff.duration(), 400)
    backoff.reset()
    assert.strictEqual(backoff.duration(), 100)
    assert.strictEqual(backoff.duration(), 200)
  })
})
