Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /