text: // @flow
  /* eslint-env mocha */
  
  import assert from 'power-assert'
  import sinon from 'sinon'
  import formatDistanceToNowStrict from '.'
  
  describe('formatDistanceToNowStrict', function () {
    let clock
    beforeEach(() => {
      clock = sinon.useFakeTimers(new Date(1986, 3, 4, 10, 32, 0).getTime())
    })
  
    afterEach(() => {
      clock.restore()
    })
  
    describe('seconds', function () {
      describe('when no unit is set', function () {
        it('0 seconds', function () {
          var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 32, 0))
          assert(result === '0 seconds')
        })
  
        it('5 seconds', function () {
          var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 32, 5))
          assert(result === '5 seconds')
        })
      })
    })
  
    describe('minutes', function () {
      it('1 minute', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 33, 0))
        assert(result === '1 minute')
      })
  
      it('n minutes', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 35, 0))
        assert(result === '3 minutes')
      })
    })
  
    describe('hours', function () {
      it('1 hour', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 11, 32, 0))
        assert(result === '1 hour')
      })
  
      it('n hours', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 13, 32, 0))
        assert(result === '3 hours')
      })
    })
  
    describe('days', function () {
      it('1 day', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 5, 10, 32, 0))
        assert(result === '1 day')
      })
  
      it('n days', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 7, 10, 32, 0))
        assert(result === '3 days')
      })
    })
  
    describe('months', function () {
      it('1 month', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 4, 4, 10, 32, 0))
        assert(result === '1 month')
      })
  
      it('n months', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 6, 4, 10, 32, 0))
        assert(result === '3 months')
      })
    })
  
    describe('years', function () {
      it('1 year', function () {
        var result = formatDistanceToNowStrict(new Date(1987, 3, 4, 10, 32, 0))
        assert(result === '1 year')
      })
  
      it('n years', function () {
        var result = formatDistanceToNowStrict(new Date(1991, 3, 4, 10, 32, 0))
        assert(result === '5 years')
      })
    })
  
    describe('when the unit option is supplied', function () {
      describe('second', function () {
        it('0 seconds', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 32, 0),
            { unit: 'second' }
          )
          assert(result === '0 seconds')
        })
  
        it('5 seconds', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 32, 5),
            { unit: 'second' }
          )
          assert(result === '5 seconds')
        })
  
        it('120 seconds', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 34, 0),
            { unit: 'second' }
          )
          assert(result === '120 seconds')
        })
      })
  
      describe('minute', function () {
        it('0 minutes', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 32, 0),
            { unit: 'minute' }
          )
          assert(result === '0 minutes')
        })
  
        it('5 minutes', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 37, 0),
            { unit: 'minute' }
          )
          assert(result === '5 minutes')
        })
  
        it('120 minutes', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 12, 32, 0),
            { unit: 'minute' }
          )
          assert(result === '120 minutes')
        })
      })
  
      describe('hour', function () {
        it('0 hours', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 32, 0),
            { unit: 'hour' }
          )
          assert(result === '0 hours')
        })
  
        it('5 hours', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 15, 32, 0),
            { unit: 'hour' }
          )
          assert(result === '5 hours')
        })
  
        it('48 hours', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 6, 10, 32, 0),
            { unit: 'hour' }
          )
          assert(result === '48 hours')
        })
      })
  
      describe('day', function () {
        it('0 days', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 32, 0),
            { unit: 'day' }
          )
          assert(result === '0 days')
        })
  
        it('5 days', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 9, 10, 32, 0),
            { unit: 'day' }
          )
          assert(result === '5 days')
        })
  
        it('60 days', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 5, 3, 10, 32, 0),
            { unit: 'day' }
          )
          assert(result === '60 days')
        })
      })
      describe('month', function () {
        it('0 months', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 32, 0),
            { unit: 'month' }
          )
          assert(result === '0 months')
        })
  
        it('5 months', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 7, 4, 10, 32, 0),
            { unit: 'month' }
          )
          assert(result === '4 months')
        })
  
        it('24 months', function () {
          var result = formatDistanceToNowStrict(
            new Date(1988, 3, 4, 10, 32, 0),
            { unit: 'month' }
          )
          assert(result === '24 months')
        })
      })
  
      describe('year', function () {
        it('0 years', function () {
          var result = formatDistanceToNowStrict(
            new Date(1986, 3, 4, 10, 32, 0),
            { unit: 'year' }
          )
          assert(result === '0 years')
        })
  
        it('5 years', function () {
          var result = formatDistanceToNowStrict(
            new Date(1991, 3, 4, 15, 32, 0),
            { unit: 'year' }
          )
          assert(result === '5 years')
        })
      })
    })
  
    it('accepts timestamps', function () {
      var result = formatDistanceToNowStrict(
        new Date(1986, 3, 4, 11, 32, 0).getTime()
      )
      assert(result === '1 hour')
    })
  
    describe('when the addSuffix option is true', function () {
      it('adds a past suffix', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 31, 35), {
          addSuffix: true,
        })
        assert(result === '25 seconds ago')
      })
  
      it('adds a future suffix', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 11, 32, 0), {
          addSuffix: true,
        })
        assert(result === 'in 1 hour')
      })
    })
  
    describe('when the roundingMethod option is supplied', function () {
      it('default is "round"', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 33, 59))
        assert(result === '2 minutes')
      })
  
      it('"floor"', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 33, 59), {
          roundingMethod: 'floor',
        })
        assert(result === '1 minute')
      })
  
      it('"ceil"', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 33, 1), {
          roundingMethod: 'ceil',
        })
        assert(result === '2 minutes')
      })
  
      it('"round" (down)', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 33, 29), {
          roundingMethod: 'round',
        })
        assert(result === '1 minute')
      })
  
      it('"round" (up)', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 3, 4, 10, 33, 30), {
          roundingMethod: 'round',
        })
        assert(result === '2 minutes')
      })
    })
  
    describe('implicit conversion of options', function () {
      it('`options.unit`', function () {
        // eslint-disable-next-line no-new-wrappers
        var unit = new String('year')
  
        var result = formatDistanceToNowStrict(
          new Date(1986, 3, 4, 10, 32, 0),
          // $ExpectedMistake
          { unit: unit }
        )
        assert(result === '0 years')
      })
  
      it('`options.addSuffix`', function () {
        var result = formatDistanceToNowStrict(
          new Date(1986, 3, 4, 10, 31, 35),
          // $ExpectedMistake
          { addSuffix: 1 }
        )
        assert(result === '25 seconds ago')
      })
  
      it('`options.ceil`', function () {
        // eslint-disable-next-line no-new-wrappers
        var roundingMethod = new String('ceil')
  
        var result = formatDistanceToNowStrict(
          new Date(1986, 3, 4, 10, 33, 1),
          // $ExpectedMistake
          { roundingMethod: roundingMethod }
        )
        assert(result === '2 minutes')
      })
    })
  
    describe('custom locale', function () {
      it('can be passed to the function', function () {
        function localizeDistance(token, count, options) {
          assert(token === 'xSeconds')
          assert(count === 15)
          assert(options.addSuffix === true)
          assert(options.comparison < 0)
          return 'It works!'
        }
  
        var customLocale = {
          formatDistance: localizeDistance,
        }
  
        var result = formatDistanceToNowStrict(
          new Date(1986, 3, 4, 10, 31, 45),
          // $ExpectedMistake
          { addSuffix: true, locale: customLocale }
        )
  
        assert(result === 'It works!')
      })
  
      describe('does not contain `formatDistance` property', function () {
        it('throws `RangeError`', function () {
          var customLocale = {}
          var block = formatDistanceToNowStrict.bind(
            null,
            // $ExpectedMistake
            new Date(1986, 3, 4, 10, 37, 0),
            { unit: 'minute', locale: customLocale }
          )
          assert.throws(block, RangeError)
        })
      })
    })
  
    describe('edge cases', function () {
      it('detects unit correctly for short months', function () {
        var result = formatDistanceToNowStrict(new Date(1986, 2 /* Mar */, 7))
        assert(result === '28 days')
      })
    })
  
    it('throws `RangeError` if the date is `Invalid Date`', function () {
      assert.throws(
        formatDistanceToNowStrict.bind(null, new Date(NaN)),
        RangeError
      )
    })
  
    it("throws `RangeError` if `options.roundingMethod` is not 'floor', 'ceil', 'round' or undefined", function () {
      var block = formatDistanceToNowStrict.bind(
        null,
        new Date(1986, 3, 4, 10, 33, 29),
        // $ExpectedMistake
        { roundingMethod: 'foobar' }
      )
      assert.throws(block, RangeError)
    })
  
    it("throws `RangeError` if `options.unit` is not 's', 'm', 'h', 'd', 'M', 'Y' or undefined", function () {
      var block = formatDistanceToNowStrict.bind(
        null,
        new Date(1986, 3, 4, 10, 33, 29),
        // $ExpectedMistake
        { unit: 'foobar' }
      )
      assert.throws(block, RangeError)
    })
  
    it('throws TypeError exception if passed less than 1 arguments', function () {
      assert.throws(formatDistanceToNowStrict.bind(null), TypeError)
    })
  })
  