summaryrefslogtreecommitdiff
path: root/date-fns/src/differenceInYears/test.ts
blob: 60a38663a0e04a44f8feb6fc9de63cd5df7580cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* eslint-env mocha */

import assert from 'power-assert'
import differenceInYears from '.'

describe('differenceInYears', function () {
  it('returns the number of full years between the given dates', function () {
    const result = differenceInYears(
      new Date(2012, 6 /* Jul */, 2, 18, 0),
      new Date(2011, 6 /* Jul */, 2, 6, 0)
    )
    assert(result === 1)
  })

  it('returns a negative number if the time value of the first date is smaller', function () {
    const result = differenceInYears(
      new Date(2011, 6 /* Jul */, 2, 6, 0),
      new Date(2012, 6 /* Jul */, 2, 18, 0)
    )
    assert(result === -1)
  })

  it('accepts timestamps', function () {
    const result = differenceInYears(
      new Date(2014, 6 /* Jul */, 2).getTime(),
      new Date(2010, 6 /* Jul */, 2).getTime()
    )
    assert(result === 4)
  })

  describe('leap days', function () {
    it('supports past dates with right side after leap day', () => {
      const result = differenceInYears(
        new Date(2004, 1 /* Feb */, 29, 0, 0),
        new Date(2002, 2 /* Mar */, 1, 0, 0)
      )
      assert(result === 1)
    })

    it('supports past dates with right side before leap day', () => {
      const result = differenceInYears(
        new Date(2004, 1 /* Feb */, 29, 0, 0),
        new Date(2002, 1 /* Feb */, 28, 0, 0)
      )
      assert(result === 2)
    })

    it('supports future dates', () => {
      const result = differenceInYears(
        new Date(2004, 1 /* Feb */, 29, 0, 0),
        new Date(2006, 2 /* Mar */, 1, 0, 0)
      )
      assert(result === -2)
    })

    it('supports equal dates of same year', () => {
      const result = differenceInYears(
        new Date(2004, 1 /* Feb */, 29, 0, 0),
        new Date(2004, 1 /* Feb */, 29, 0, 0)
      )
      assert(result === 0)
    })

    it('supports equal dates of different years', () => {
      const result = differenceInYears(
        new Date(2008, 1 /* Feb */, 29, 0, 0),
        new Date(2004, 1 /* Feb */, 29, 0, 0)
      )
      assert(result === 4)
    })
  })

  describe('edge cases', function () {
    it('the difference is less than a year, but the given dates are in different calendar years', function () {
      const result = differenceInYears(
        new Date(2015, 0 /* Jan */, 1),
        new Date(2014, 11 /* Dec */, 31)
      )
      assert(result === 0)
    })

    it('the same for the swapped dates', function () {
      const result = differenceInYears(
        new Date(2014, 11 /* Dec */, 31),
        new Date(2015, 0 /* Jan */, 1)
      )
      assert(result === 0)
    })

    it('the days and months of the given dates are the same', function () {
      const result = differenceInYears(
        new Date(2014, 8 /* Sep */, 5),
        new Date(2012, 8 /* Sep */, 5)
      )
      assert(result === 2)
    })

    it('the given dates are the same', function () {
      const result = differenceInYears(
        new Date(2014, 8 /* Sep */, 5, 0, 0),
        new Date(2014, 8 /* Sep */, 5, 0, 0)
      )
      assert(result === 0)
    })

    it('does not return -0 when the given dates are the same', () => {
      function isNegativeZero(x: number): boolean {
        return x === 0 && 1 / x < 0
      }

      const result = differenceInYears(
        new Date(2014, 8 /* Sep */, 5, 0, 0),
        new Date(2014, 8 /* Sep */, 5, 0, 0)
      )

      const resultIsNegative = isNegativeZero(result)
      assert(resultIsNegative === false)
    })
  })

  it('returns NaN if the first date is `Invalid Date`', function () {
    const result = differenceInYears(
      new Date(NaN),
      new Date(2017, 0 /* Jan */, 1)
    )
    assert(isNaN(result))
  })

  it('returns NaN if the second date is `Invalid Date`', function () {
    const result = differenceInYears(
      new Date(2017, 0 /* Jan */, 1),
      new Date(NaN)
    )
    assert(isNaN(result))
  })

  it('returns NaN if the both dates are `Invalid Date`', function () {
    const result = differenceInYears(new Date(NaN), new Date(NaN))
    assert(isNaN(result))
  })

  it('throws TypeError exception if passed less than 2 arguments', function () {
    assert.throws(differenceInYears.bind(null), TypeError)
    assert.throws(differenceInYears.bind(null, 1), TypeError)
  })
})