Skip to content

Commit

Permalink
Make durations preserve keys across operations
Browse files Browse the repository at this point in the history
  • Loading branch information
icambron committed Sep 28, 2018
1 parent 6b17d70 commit cfa3f99
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 19 deletions.
5 changes: 2 additions & 3 deletions src/duration.js
Expand Up @@ -454,9 +454,8 @@ export default class Duration {
result = {};

for (const k of orderedUnits) {
const val = dur.get(k) + this.get(k);
if (val !== 0) {
result[k] = val;
if (dur.values.hasOwnProperty(k) || this.values.hasOwnProperty(k)) {
result[k] = dur.get(k) + this.get(k);
}
}

Expand Down
4 changes: 1 addition & 3 deletions src/impl/diff.js
Expand Up @@ -42,9 +42,7 @@ function highOrderDiffs(cursor, later, units) {
cursor = highWater;
}

if (delta > 0) {
results[unit] = delta;
}
results[unit] = delta;
}
}

Expand Down
25 changes: 12 additions & 13 deletions test/datetime/diff.test.js
Expand Up @@ -18,7 +18,7 @@ test('DateTime#diff defaults to milliseconds', () => {
});

test('DateTime#diff makes simple diffs', () => {
expect(diffObjs({ year: 2017 }, { year: 2017 }, 'years')).toEqual({});
expect(diffObjs({ year: 2017 }, { year: 2017 }, 'years')).toEqual({ years: 0 });

expect(diffObjs({ year: 2017 }, { year: 2016 }, 'years')).toEqual({
years: 1
Expand Down Expand Up @@ -102,14 +102,6 @@ test('DateTime#diff accepts multiple units', () => {
'days'
])
).toEqual({ years: 5, days: 363 });

expect(
diffObjs({ year: 2015, month: 3, day: 14 }, { year: 2009, month: 3, day: 16 }, [
'years',
'days',
'hours'
])
).toEqual({ years: 5, days: 363 });
});

test('DateTime#diff handles unmatched units', () => {
Expand All @@ -119,23 +111,30 @@ test('DateTime#diff handles unmatched units', () => {
{ year: 2017, month: 6, day: 1, hour: 22 },
['weeks', 'days', 'hours']
)
).toEqual({ days: 5, hours: 23 });
).toEqual({ weeks: 0, days: 5, hours: 23 });

expect(
diffObjs(
{ year: 2017, month: 6, day: 27, hour: 21 },
{ year: 2017, month: 6, day: 26, hour: 22 },
['days', 'hours']
)
).toEqual({ hours: 23 });
).toEqual({ days: 0, hours: 23 });

expect(
diffObjs(
{ year: 2017, month: 6, day: 7, hour: 21 },
{ year: 2017, month: 6, day: 1, hour: 22 },
['weeks', 'hours']
)
).toEqual({ hours: 23 + 5 * 24 });
).toEqual({ weeks: 0, hours: 23 + 5 * 24 });
});

test('DateTime#diff sets all its units to 0 if the duration is empty', () => {
const t = DateTime.fromObject({ year: 2018, month: 11, day: 5, hour: 0 });
expect(t.diff(t).toObject()).toEqual({ milliseconds: 0 });
expect(t.diff(t, 'hours').toObject()).toEqual({ hours: 0 });
expect(t.diff(t, 'days').toObject()).toEqual({ days: 0 });
});

test('DateTime#diff puts fractional parts in the lowest order unit', () => {
Expand Down Expand Up @@ -164,7 +163,7 @@ test('DateTime#diff is calendary for years, months, day', () => {
'years',
'days'
])
).toEqual({ years: 6 });
).toEqual({ years: 6, days: 0 });

expect(
diffObjs({ year: 2016, month: 3, day: 14 }, { year: 2010, month: 3, day: 16 }, [
Expand Down
8 changes: 8 additions & 0 deletions test/duration/math.test.js
Expand Up @@ -52,6 +52,14 @@ test('Duration#plus maintains invalidity', () => {
expect(dur.invalidReason).toBe('because');
});

test('Duration#plus results in the superset of units', () => {
let dur = Duration.fromObject({ hours: 1, minutes: 0 }).plus({ seconds: 3, milliseconds: 0 });
expect(dur.toObject()).toEqual({ hours: 1, minutes: 0, seconds: 3, milliseconds: 0 });

dur = Duration.fromObject({ hours: 1, minutes: 0 }).plus({ });
expect(dur.toObject()).toEqual({ hours: 1, minutes: 0 });
});

//------
// #minus()
//------
Expand Down

0 comments on commit cfa3f99

Please sign in to comment.