'use strict';

import * as helpers from './helpers';
import 'should';

describe('helpers library', () => {

  /**
   * @test {delay}
   */
  describe('delay', () => {

    /**
     * @test {delay}
     */
    it('should allow to cancel the delay', async () => {
      let promise = helpers.delay(1000 * 60 * 60 * 24);
      promise.canceled.should.be.false();
      promise.cancel();
      promise.canceled.should.be.true();
      await promise;
    });

  });

  /**
   * @test {createHandlePromise}
   */
  describe('createHandlePromise', () => {

    /**
     * @test {createHandlePromise}
     */
    it('should timeout promise', async () => {
      for (let i = 0; i < 10; ++i) {
        let promise = helpers.createHandlePromise().timeout(1, 'test');
        await helpers.delay(2);
        await helpers.delay(2);
        try {
          await promise;
          throw new Error('assert');
        } catch (err) {
          err.name.should.equal('TimeoutError');
        }
      }
    });

  });

  /**
   * @test {helpers#expBackoffDelay}
   */
  describe('expBackoffDelay', () => {

    /**
     * @test {helpers#expBackoffDelay}
     */
    it('should return exponential backoff delay with start time = 1', () => {
      helpers.expBackoffDelay(0, 1, 20).should.equal(0);
      helpers.expBackoffDelay(1, 1, 20).should.equal(1);
      helpers.expBackoffDelay(2, 1, 20).should.equal(2);
      helpers.expBackoffDelay(3, 1, 20).should.equal(4);
      helpers.expBackoffDelay(4, 1, 20).should.equal(8);
      helpers.expBackoffDelay(5, 1, 20).should.equal(16);
      helpers.expBackoffDelay(6, 1, 20).should.equal(20);
    });

    /**
     * @test {helpers#expBackoffDelay}
     */
    it('should return exponential backoff delay with start time = 5', () => {
      helpers.expBackoffDelay(0, 5, 45).should.equal(0);
      helpers.expBackoffDelay(1, 5, 45).should.equal(5);
      helpers.expBackoffDelay(2, 5, 45).should.equal(10);
      helpers.expBackoffDelay(3, 5, 45).should.equal(20);
      helpers.expBackoffDelay(4, 5, 45).should.equal(40);
      helpers.expBackoffDelay(5, 5, 45).should.equal(45);
    });

  });

});
