Skip to content

Commit f483369

Browse files
author
programmiri
committed
Solve exercise meetup
1 parent 7da76e5 commit f483369

File tree

2 files changed

+103
-18
lines changed

2 files changed

+103
-18
lines changed

meetup/meetup.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
const weekdays = [
2+
'Sunday',
3+
'Monday',
4+
'Tuesday',
5+
'Wednesday',
6+
'Thursday',
7+
'Friday',
8+
'Saturday',
9+
];
10+
11+
const teenthDays = [13, 14, 15, 16, 17, 18, 19];
12+
13+
function getWeekday(date) {
14+
return weekdays[date.getDay()];
15+
}
16+
17+
function daysBetween(startDay, endDay) {
18+
const number = weekdays.indexOf(endDay) - weekdays.indexOf(startDay);
19+
if (number < 0) {
20+
return 7 + number;
21+
}
22+
return number;
23+
}
24+
25+
function getXte(year, month, dayName, multiplicator) {
26+
const firstDayOfMonth = getWeekday(new Date(year, month, 1));
27+
const daysFromStartToFirstWeekday = daysBetween(firstDayOfMonth, dayName);
28+
29+
const days = 1 + daysFromStartToFirstWeekday + 7 * multiplicator;
30+
return new Date(year, month, days);
31+
}
32+
33+
function getLast(year, month, dayName) {
34+
const lastDayOfMonth = getWeekday(new Date(year, month + 1, 0));
35+
const daysInMonth = new Date(year, month + 1, 0).getDate();
36+
const daysFromEndToWeekday = daysBetween(dayName, lastDayOfMonth);
37+
38+
const days = daysInMonth - daysFromEndToWeekday;
39+
return new Date(year, month, days);
40+
}
41+
42+
function getTeenth(year, month, dayName) {
43+
const day = teenthDays.filter((num) => {
44+
const weekDayToCheck = getWeekday(new Date(year, month, num));
45+
return dayName === weekDayToCheck;
46+
});
47+
48+
return new Date(year, month, day);
49+
}
50+
51+
const dateCalcMap = [
52+
{ type: '1st', multiplicator: 0, func: getXte },
53+
{ type: '2nd', multiplicator: 1, func: getXte },
54+
{ type: '3rd', multiplicator: 2, func: getXte },
55+
{ type: '4th', multiplicator: 3, func: getXte },
56+
{ type: '5th', multiplicator: 4, func: getXte },
57+
{ type: 'last', multiplicator: 0, func: getLast },
58+
{ type: 'teenth', number: 1, func: getTeenth },
59+
];
60+
61+
export function meetupDay(year, month, dayName, type) {
62+
const currDateCalc = dateCalcMap.find((entry) => entry.type === type);
63+
const meetupDate = currDateCalc.func(
64+
year,
65+
month,
66+
dayName,
67+
currDateCalc.multiplicator
68+
);
69+
if (meetupDate.getMonth() !== month) {
70+
throw new Error();
71+
}
72+
return meetupDate;
73+
}

meetup/meetup.spec.js

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,66 @@ import { meetupDay } from './meetup';
22

33
describe('meetupDay()', () => {
44
test('test monteenth of may 2013', () => {
5-
expect(meetupDay(2013, 4, 'Monday', 'teenth')).toEqual(new Date(2013, 4, 13));
5+
expect(meetupDay(2013, 4, 'Monday', 'teenth')).toEqual(
6+
new Date(2013, 4, 13)
7+
);
68
});
79

8-
xtest('test saturteenth of february 2013', () => {
9-
expect(meetupDay(2013, 1, 'Saturday', 'teenth')).toEqual(new Date(2013, 1, 16));
10+
test('test saturteenth of february 2013', () => {
11+
expect(meetupDay(2013, 1, 'Saturday', 'teenth')).toEqual(
12+
new Date(2013, 1, 16)
13+
);
1014
});
1115

12-
xtest('test first tuesday of may 2013', () => {
16+
test('test first tuesday of may 2013', () => {
1317
expect(meetupDay(2013, 4, 'Tuesday', '1st')).toEqual(new Date(2013, 4, 7));
1418
});
1519

16-
xtest('test second monday of april 2013', () => {
20+
test('test second monday of april 2013', () => {
1721
expect(meetupDay(2013, 3, 'Monday', '2nd')).toEqual(new Date(2013, 3, 8));
1822
});
1923

20-
xtest('test third thursday of september 2013', () => {
21-
expect(meetupDay(2013, 8, 'Thursday', '3rd')).toEqual(new Date(2013, 8, 19));
24+
test('test third thursday of september 2013', () => {
25+
expect(meetupDay(2013, 8, 'Thursday', '3rd')).toEqual(
26+
new Date(2013, 8, 19)
27+
);
2228
});
2329

24-
xtest('test fourth sunday of march 2013', () => {
30+
test('test fourth sunday of march 2013', () => {
2531
expect(meetupDay(2013, 2, 'Sunday', '4th')).toEqual(new Date(2013, 2, 24));
2632
});
2733

28-
xtest('test last thursday of october 2013', () => {
29-
expect(meetupDay(2013, 9, 'Thursday', 'last')).toEqual(new Date(2013, 9, 31));
34+
test('test last thursday of october 2013', () => {
35+
expect(meetupDay(2013, 9, 'Thursday', 'last')).toEqual(
36+
new Date(2013, 9, 31)
37+
);
3038
});
3139

32-
xtest('test last wednesday of february 2012', () => {
33-
expect(meetupDay(2012, 1, 'Wednesday', 'last')).toEqual(new Date(2012, 1, 29));
40+
test('test last wednesday of february 2012', () => {
41+
expect(meetupDay(2012, 1, 'Wednesday', 'last')).toEqual(
42+
new Date(2012, 1, 29)
43+
);
3444
});
3545

36-
xtest('test last wednesday of december 2014', () => {
37-
expect(meetupDay(2014, 11, 'Wednesday', 'last')).toEqual(new Date(2014, 11, 31));
46+
test('test last wednesday of december 2014', () => {
47+
expect(meetupDay(2014, 11, 'Wednesday', 'last')).toEqual(
48+
new Date(2014, 11, 31)
49+
);
3850
});
3951

40-
xtest('test last sunday of only four week february 2015', () => {
52+
test('test last sunday of only four week february 2015', () => {
4153
expect(meetupDay(2015, 1, 'Sunday', 'last')).toEqual(new Date(2015, 1, 22));
4254
});
4355

44-
xtest('test first friday of december 2012', () => {
56+
test('test first friday of december 2012', () => {
4557
expect(meetupDay(2012, 11, 'Friday', '1st')).toEqual(new Date(2012, 11, 7));
4658
});
4759

48-
xtest('test fifth monday of march 2015', () => {
60+
test('test fifth monday of march 2015', () => {
4961
expect(meetupDay(2015, 2, 'Monday', '5th')).toEqual(new Date(2015, 2, 30));
5062
});
5163

52-
xtest('test nonexistent fifth monday of february 2015', () => {
64+
test('test nonexistent fifth monday of february 2015', () => {
5365
expect(() => {
5466
meetupDay(2015, 1, 'Monday', '5th');
5567
}).toThrow();

0 commit comments

Comments
 (0)