Skip to content

Instantly share code, notes, and snippets.

@csgavino
Last active August 29, 2015 14:05
Show Gist options
  • Save csgavino/5509b74729e28cac1df3 to your computer and use it in GitHub Desktop.
Save csgavino/5509b74729e28cac1df3 to your computer and use it in GitHub Desktop.
Calendar Kata in JavaScript.
module.exports = Calendar;
function Calendar(year, month, startOn) {
var year = year;
var month = month;
var startOn = startOn || 0;
var date = new Date(year, month - 1, 1);
function title() {
return ' ' + months()[date.getMonth()] + ' ' + date.getFullYear();
}
function months() {
return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',
'October', 'November', 'December'];
}
function header() {
var dD = daysDays().slice(startOn, startOn+7);
return ' ' + dD.join(' ');
}
function daysDays() {
return daysOfWeek().concat(daysOfWeek());
}
function daysOfWeek() {
return ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
}
function days() {
var noSpaces = (7 + date.getDay() - startOn) % 7;
var offsettedDays = offsetDaysWithSpaces(daysThisMonth(), noSpaces);
offsettedDays = offsettedDays.map(function(day) {
return fillSpaces(day, 4);
})
var actualDays = daysToWeeks(offsettedDays);
return actualDays.join('\n');
}
function daysThisMonth() {
var lastDayOfMonth = new Date(year, month, 0);
return buildOutput(1, lastDayOfMonth.getDate() + 1, function(day) {
return day;
});
}
function offsetDaysWithSpaces(days, offset) {
return buildOutput(0, offset, function(offset) {
return ' ';
}).concat(days);
}
function daysToWeeks(days) {
return buildOutput(0, Math.ceil(days.length / 7), function(week) {
var daysThisWeek = week * 7;
return days.slice(daysThisWeek, daysThisWeek + 7).join('');
});
}
function fillSpaces(input, spacesCount) {
var start = String(input).length;
return buildOutput(start, spacesCount, function() {
return ' ';
}).concat(input).join('')
}
function buildOutput(start, end, fn) {
var output = [], result;
for (var i = start; i < end; i++) {
result = fn.call(this, i);
output.push(result);
}
return output;
}
this.toString = function() {
return [
title(),
header(),
days()
].join('\n');
}
}
describe('Calendar', function() {
it('July 2014', function() {
var calendar = new Calendar(2014, 7)
var july = " July 2014\n" +
" Sun Mon Tue Wed Thu Fri Sat\n" +
" 1 2 3 4 5\n" +
" 6 7 8 9 10 11 12\n" +
" 13 14 15 16 17 18 19\n" +
" 20 21 22 23 24 25 26\n" +
" 27 28 29 30 31"
expect(calendar.toString()).toEqual(july)
})
it('August 2014', function() {
var calendar = new Calendar(2014, 8)
var august = " August 2014\n" +
" Sun Mon Tue Wed Thu Fri Sat\n" +
" 1 2\n" +
" 3 4 5 6 7 8 9\n" +
" 10 11 12 13 14 15 16\n" +
" 17 18 19 20 21 22 23\n" +
" 24 25 26 27 28 29 30\n" +
" 31"
expect(calendar.toString()).toEqual(august)
})
it('Feb 2008', function() {
var calendar = new Calendar(2008, 2, 3)
var feb = " February 2008\n" +
" Wed Thu Fri Sat Sun Mon Tue\n" +
" 1 2 3 4 5\n" +
" 6 7 8 9 10 11 12\n" +
" 13 14 15 16 17 18 19\n" +
" 20 21 22 23 24 25 26\n" +
" 27 28 29"
expect(calendar.toString()).toEqual(feb)
})
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment