Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix startOf function for isoWeek #23

Merged
merged 12 commits into from
Aug 10, 2020
4 changes: 3 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ Chart._adapters._date.override({

startOf: function(time, unit, weekday) {
if (unit === 'isoWeek') {
return this._create(time).isoWeekday(weekday).valueOf();
weekday = Math.trunc(Math.min(Math.max(0, weekday), 6));
const dateTime = this._create(time);
return dateTime.minus({days: (dateTime.weekday < weekday ? 7 : 0) + dateTime.weekday - weekday}).startOf('day').valueOf();
}
return unit ? this._create(time).startOf(unit).valueOf() : time;
},
Expand Down
45 changes: 45 additions & 0 deletions test/specs/luxon-adapter.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,49 @@ describe('Luxon Adapter', function() {
expect(adapter.format(1559056227321, formats.millisecond)).toEqual('3:10:27.321 PM');
expect(adapter.format(1559056227321, formats.datetime)).toEqual('May 28, 2019, 3:10:27 PM');
});

it('should startOf correctly using isoWeek preset', function() {
const adapter = new _adapters._date();

const dayOfWeekNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
const daysInMonth = DateTime.local().daysInMonth;

for (const dayOfWeek of dayOfWeekNames) {
for (let dayOfMonth=1; dayOfMonth<=daysInMonth; dayOfMonth++) {
const dt = DateTime.fromObject({day: dayOfMonth, hour: 8, minute: 30});
const startOf = adapter.startOf(dt.valueOf(), 'isoWeek', dayOfWeekNames.indexOf(dayOfWeek));
expect(adapter.format(startOf, 'ccc')).toEqual(dayOfWeek);
expect(startOf.day).not.toBeGreaterThan(dt.day);
}
}

for (let dayOfMonth=1; dayOfMonth<=daysInMonth; dayOfMonth++) {
const dt = DateTime.fromObject({day: dayOfMonth, hour: 8, minute: 30});
const startOf = adapter.startOf(dt.valueOf(), 'isoWeek', false);
expect(adapter.format(startOf, 'ccc')).toEqual('Sun');
expect(startOf.day).not.toBeGreaterThan(dt.day);
}

for (let dayOfMonth=1; dayOfMonth<=daysInMonth; dayOfMonth++) {
const dt = DateTime.fromObject({day: dayOfMonth, hour: 8, minute: 30});
const startOf = adapter.startOf(dt.valueOf(), 'isoWeek', true);
expect(adapter.format(startOf, 'ccc')).toEqual('Mon');
expect(startOf.day).not.toBeGreaterThan(dt.day);
}

for (let dayOfMonth=1; dayOfMonth<=daysInMonth; dayOfMonth++) {
const dt = DateTime.fromObject({day: dayOfMonth, hour: 8, minute: 30});
const startOf = adapter.startOf(dt.valueOf(), 'isoWeek', 100);
expect(adapter.format(startOf, 'ccc')).toEqual('Sat');
expect(startOf.day).not.toBeGreaterThan(dt.day);
}

for (let dayOfMonth=1; dayOfMonth<=daysInMonth; dayOfMonth++) {
const dt = DateTime.fromObject({day: dayOfMonth, hour: 8, minute: 30});
const startOf = adapter.startOf(dt.valueOf(), 'isoWeek', -100);
expect(adapter.format(startOf, 'ccc')).toEqual('Sun');
expect(startOf.day).not.toBeGreaterThan(dt.day);
}

});
});