summaryrefslogtreecommitdiff
path: root/date-fns/src/getOverlappingDaysInIntervals/test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'date-fns/src/getOverlappingDaysInIntervals/test.ts')
-rw-r--r--date-fns/src/getOverlappingDaysInIntervals/test.ts240
1 files changed, 240 insertions, 0 deletions
diff --git a/date-fns/src/getOverlappingDaysInIntervals/test.ts b/date-fns/src/getOverlappingDaysInIntervals/test.ts
new file mode 100644
index 0000000..b39672f
--- /dev/null
+++ b/date-fns/src/getOverlappingDaysInIntervals/test.ts
@@ -0,0 +1,240 @@
+// @flow
+/* eslint-env mocha */
+
+import assert from 'power-assert'
+import getOverlappingDaysInIntervals from '.'
+
+describe('getOverlappingDaysInIntervals', function() {
+ const initialIntervalStart = new Date(2016, 10, 10, 13, 0, 0)
+ const initialIntervalEnd = new Date(2016, 11, 3, 15, 0, 0)
+
+ describe("when the time intervals don't overlap", function() {
+ it('returns 0 for a valid non overlapping interval before another interval', function() {
+ const earlierIntervalStart = new Date(2016, 9, 25)
+ const earlierIntervalEnd = new Date(2016, 10, 9)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: earlierIntervalStart, end: earlierIntervalEnd }
+ )
+ assert(numOverlappingDays === 0)
+ })
+
+ it('returns 0 for a valid non overlapping interval after another interval', function() {
+ const laterIntervalStart = new Date(2016, 11, 4)
+ const laterIntervalEnd = new Date(2016, 11, 9)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: laterIntervalStart, end: laterIntervalEnd }
+ )
+ assert(numOverlappingDays === 0)
+ })
+
+ it('returns 0 for a non overlapping same-day interval', function() {
+ const sameDayIntervalStart = new Date(2016, 11, 4, 9, 0, 0)
+ const sameDayIntervalEnd = new Date(2016, 11, 4, 18, 0, 0)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: sameDayIntervalStart, end: sameDayIntervalEnd }
+ )
+ assert(numOverlappingDays === 0)
+ })
+
+ it('returns 0 for an interval differing by a few hours', function() {
+ const oneDayOverlappingIntervalStart = new Date(2016, 11, 3, 18, 0, 0)
+ const oneDayOverlappingIntervalEnd = new Date(2016, 11, 14, 13, 0, 0)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ {
+ start: oneDayOverlappingIntervalStart,
+ end: oneDayOverlappingIntervalEnd
+ }
+ )
+ assert(numOverlappingDays === 0)
+ })
+
+ it("returns 0 for an interval with the same startDateTime as the initial time intervals's endDateTime", function() {
+ const oneDayOverlapIntervalStart = new Date(2016, 11, 3, 15, 0, 0)
+ const oneDayOverlapIntervalEnd = new Date(2016, 11, 14, 13, 0, 0)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: oneDayOverlapIntervalStart, end: oneDayOverlapIntervalEnd }
+ )
+ assert(numOverlappingDays === 0)
+ })
+
+ it("returns 0 for an interval with the same endDateTime as the initial time interval's startDateTime", function() {
+ const oneDayOverlapIntervalStart = new Date(2016, 10, 3, 15, 0, 0)
+ const oneDayOverlapIntervalEnd = new Date(2016, 10, 10, 13, 0, 0)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: oneDayOverlapIntervalStart, end: oneDayOverlapIntervalEnd }
+ )
+ assert(numOverlappingDays === 0)
+ })
+ })
+
+ describe('when the time intervals overlap', function() {
+ it('rounds up the result to include each started overlapping day', function() {
+ const includedIntervalStart = new Date(2016, 10, 14, 9, 0, 0)
+ const includedIntervalEnd = new Date(2016, 10, 15, 18, 0, 0)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: includedIntervalStart, end: includedIntervalEnd }
+ )
+ assert(numOverlappingDays === 2)
+ })
+
+ it('returns the correct value for an interval included within another interval', function() {
+ const includedIntervalStart = new Date(2016, 10, 14)
+ const includedIntervalEnd = new Date(2016, 10, 15)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: includedIntervalStart, end: includedIntervalEnd }
+ )
+ assert(numOverlappingDays === 1)
+ })
+
+ it('returns the correct value for an interval overlapping at the end', function() {
+ const endOverlappingIntervalStart = new Date(2016, 10, 5)
+ const endOverlappingIntervalEnd = new Date(2016, 10, 14)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: endOverlappingIntervalStart, end: endOverlappingIntervalEnd }
+ )
+ assert(numOverlappingDays === 4)
+ })
+
+ it('returns the correct value for an interval overlapping at the beginning', function() {
+ const startOverlappingIntervalStart = new Date(2016, 10, 20)
+ const startOverlappingIntervalEnd = new Date(2016, 11, 14)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ {
+ start: startOverlappingIntervalStart,
+ end: startOverlappingIntervalEnd
+ }
+ )
+ assert(numOverlappingDays === 14)
+ })
+
+ it('returns the correct value for an interval including another interval', function() {
+ const includingIntervalStart = new Date(2016, 10, 5)
+ const includingIntervalEnd = new Date(2016, 11, 15)
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: includingIntervalStart, end: includingIntervalEnd }
+ )
+ assert(numOverlappingDays === 24)
+ })
+ })
+
+ it('accepts a timestamp', function() {
+ const initialIntervalStart = new Date(2016, 10, 10, 13, 0, 0).getTime()
+ const initialIntervalEnd = new Date(2016, 11, 3, 15, 0, 0).getTime()
+
+ const endOverlappingIntervalStart = new Date(2016, 10, 5).getTime()
+ const endOverlappingIntervalEnd = new Date(2016, 10, 14).getTime()
+
+ const numOverlappingDays = getOverlappingDaysInIntervals(
+ { start: initialIntervalStart, end: initialIntervalEnd },
+ { start: endOverlappingIntervalStart, end: endOverlappingIntervalEnd }
+ )
+ assert(numOverlappingDays === 4)
+ })
+
+ it('throws an exception if the start date of the initial time interval is after the end date', function() {
+ const block = getOverlappingDaysInIntervals.bind(
+ null,
+ { start: new Date(2016, 10, 7), end: new Date(2016, 10, 3) },
+ { start: new Date(2016, 10, 5), end: new Date(2016, 10, 15) }
+ )
+ assert.throws(block, RangeError)
+ })
+
+ it('throws an exception if the start date of the compared time interval is after the end date', function() {
+ const block = getOverlappingDaysInIntervals.bind(
+ null,
+ { start: new Date(2016, 10, 3), end: new Date(2016, 10, 7) },
+ { start: new Date(2016, 10, 15), end: new Date(2016, 10, 5) }
+ )
+ assert.throws(block, RangeError)
+ })
+
+ it('throws an exception if the initial interval is undefined', function() {
+ const block = getOverlappingDaysInIntervals.bind(
+ null,
+ // $ExpectedMistake
+ //@ts-expect-error
+ undefined,
+ { start: new Date(2016, 10, 5), end: new Date(2016, 10, 15) }
+ )
+ assert.throws(block, RangeError)
+ })
+
+ it('throws an exception if the compared interval is undefined', function() {
+ const block = getOverlappingDaysInIntervals.bind(
+ null,
+ { start: new Date(2016, 10, 3), end: new Date(2016, 10, 7) },
+ // $ExpectedMistake
+ //@ts-expect-error
+ undefined
+ )
+ assert.throws(block, RangeError)
+ })
+
+ describe('one of the dates is `Invalid Date`', function() {
+ it('throws an exception if the start date of the initial time interval is `Invalid Date`', function() {
+ const block = getOverlappingDaysInIntervals.bind(
+ null,
+ { start: new Date(NaN), end: new Date(2016, 10, 3) },
+ { start: new Date(2016, 10, 5), end: new Date(2016, 10, 15) }
+ )
+ assert.throws(block, RangeError)
+ })
+
+ it('throws an exception if the end date of the initial time interval is `Invalid Date`', function() {
+ const block = getOverlappingDaysInIntervals.bind(
+ null,
+ { start: new Date(2016, 10, 3), end: new Date(NaN) },
+ { start: new Date(2016, 10, 5), end: new Date(2016, 10, 15) }
+ )
+ assert.throws(block, RangeError)
+ })
+
+ it('throws an exception if the start date of the compared time interval is `Invalid Date`', function() {
+ const block = getOverlappingDaysInIntervals.bind(
+ null,
+ { start: new Date(2016, 10, 3), end: new Date(2016, 10, 7) },
+ { start: new Date(NaN), end: new Date(2016, 10, 5) }
+ )
+ assert.throws(block, RangeError)
+ })
+
+ it('throws an exception if the end date of the compared time interval is `Invalid Date`', function() {
+ const block = getOverlappingDaysInIntervals.bind(
+ null,
+ { start: new Date(2016, 10, 3), end: new Date(2016, 10, 7) },
+ { start: new Date(2016, 10, 5), end: new Date(NaN) }
+ )
+ assert.throws(block, RangeError)
+ })
+ })
+
+ it('throws TypeError exception if passed less than 2 arguments', function() {
+ assert.throws(getOverlappingDaysInIntervals.bind(null), TypeError)
+ // $ExpectedMistake
+ //@ts-expect-error
+ assert.throws(getOverlappingDaysInIntervals.bind(null, 1), TypeError)
+ })
+})