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

Weekday fixes #49

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions MTDates/NSDate+MTDates.m
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,8 @@ - (NSInteger)mt_weekdayOfWeek
NSInteger weekdayOfWeek = [[NSDate mt_calendar] ordinalityOfUnit:NSCalendarUnitWeekday
inUnit:NSCalendarUnitWeekOfYear
forDate:self];
[[NSDate sharedRecursiveLock] unlock];
weekdayOfWeek = (weekdayOfWeek + [[NSDate mt_calendar] firstWeekday] - 1) % 7;
[[NSDate sharedRecursiveLock] unlock];
return weekdayOfWeek;
}

Expand Down Expand Up @@ -691,9 +692,16 @@ - (NSDate *)mt_startOfPreviousWeek

- (NSDate *)mt_startOfCurrentWeek
{
[[NSDate sharedRecursiveLock] lock];
[[NSDate sharedRecursiveLock] lock];
NSInteger weekday = [self mt_weekdayOfWeek];
NSDate *date = [self mt_dateDaysAfter:-(weekday - 1)];
NSInteger firstWeekday = [NSDate mt_calendar].firstWeekday;
NSDate *date;
if (firstWeekday > weekday) {
date = [self mt_dateDaysBefore:7 - (firstWeekday - weekday)];
}
else {
date = [self mt_dateDaysBefore:weekday - firstWeekday];
}
NSDate *startOfCurrentWeek = [NSDate mt_dateFromYear:[date mt_year]
month:[date mt_monthOfYear]
day:[date mt_dayOfMonth]
Expand Down
101 changes: 100 additions & 1 deletion MTDatesTests/MTDatesTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,32 @@ - (void)test_weekdayOfWeek
XCTAssertEqual([date mt_weekdayOfWeek], 6);
}

- (void)test_weekdayOfWeekRemainsTheSameInSpiteOfFirstDayOfAWeek
{
NSDate *date = [_formatter dateFromString:@"10/09/2014 05:00am"]; // Thursday

[NSDate mt_setFirstDayOfWeek:1];
XCTAssertEqual([date mt_weekdayOfWeek], 5);

[NSDate mt_setFirstDayOfWeek:2];
XCTAssertEqual([date mt_weekdayOfWeek], 5);

[NSDate mt_setFirstDayOfWeek:3];
XCTAssertEqual([date mt_weekdayOfWeek], 5);

[NSDate mt_setFirstDayOfWeek:4];
XCTAssertEqual([date mt_weekdayOfWeek], 5);

[NSDate mt_setFirstDayOfWeek:5];
XCTAssertEqual([date mt_weekdayOfWeek], 5);

[NSDate mt_setFirstDayOfWeek:6];
XCTAssertEqual([date mt_weekdayOfWeek], 5);

[NSDate mt_setFirstDayOfWeek:7];
XCTAssertEqual([date mt_weekdayOfWeek], 5);
}

- (void)test_monthOfYear
{
NSDate *date = [_formatter dateFromString:@"07/11/1986 11:29am"];
Expand Down Expand Up @@ -1039,29 +1065,102 @@ - (void)test_toTimeZone

- (void)test_firstDayOfWeek
{
NSDate *date = [_formatter dateFromString:@"07/11/1986 09:23am"];
/*
* August 2012
* Su Mo Tu We Th Fr Sa
* 1 2 3 4
* 5 6 7 8 9 10 11
* 12 13 14 15 16 17 18
* 19 20 21 22 23 24 25
* 26 27 28 29 30 31
*/

NSDate *date = [_formatter dateFromString:@"08/20/2012 09:23am"];

[NSDate mt_setFirstDayOfWeek:1];
XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Sun");
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually such tests doesn't seem to be right to me... If mt_startOfCurrentWeek returns a date from wrong week (i.e. from the next week), then the test still passes because it just compared just names of the days. Maybe we should remove them and to leave only updated tests...

XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:19]);

[NSDate mt_setFirstDayOfWeek:2];
XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Mon");
XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:20]);

[NSDate mt_setFirstDayOfWeek:3];
XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Tue");
XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:14]);

[NSDate mt_setFirstDayOfWeek:4];
XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Wed");
XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:15]);

[NSDate mt_setFirstDayOfWeek:5];
XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Thu");
XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:16]);

[NSDate mt_setFirstDayOfWeek:6];
XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Fri");
XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:17]);

[NSDate mt_setFirstDayOfWeek:7];
XCTAssertEqualObjects([[date mt_startOfCurrentWeek] mt_stringFromDateWithShortWeekdayTitle], @"Sat");
XCTAssertEqualObjects([date mt_startOfCurrentWeek], [NSDate mt_dateFromYear:2012 month:8 day:18]);

[NSDate mt_setFirstDayOfWeek:1];
}

- (void)test_firstDayOfWeek2
{
NSDate *date = [_formatter dateFromString:@"07/11/1986 09:23am"];

[NSDate mt_setFirstDayOfWeek:1];
XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year]
week:[date mt_weekOfYear]
weekday:[date mt_weekdayOfWeek]
hour:[date mt_hourOfDay]
minute:[date mt_minuteOfHour]], date);

[NSDate mt_setFirstDayOfWeek:2];
XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year]
week:[date mt_weekOfYear]
weekday:[date mt_weekdayOfWeek]
hour:[date mt_hourOfDay]
minute:[date mt_minuteOfHour]], date);

[NSDate mt_setFirstDayOfWeek:3];
XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year]
week:[date mt_weekOfYear]
weekday:[date mt_weekdayOfWeek]
hour:[date mt_hourOfDay]
minute:[date mt_minuteOfHour]], date);

[NSDate mt_setFirstDayOfWeek:4];
XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year]
week:[date mt_weekOfYear]
weekday:[date mt_weekdayOfWeek]
hour:[date mt_hourOfDay]
minute:[date mt_minuteOfHour]], date);

[NSDate mt_setFirstDayOfWeek:5];
XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year]
week:[date mt_weekOfYear]
weekday:[date mt_weekdayOfWeek]
hour:[date mt_hourOfDay]
minute:[date mt_minuteOfHour]], date);

[NSDate mt_setFirstDayOfWeek:6];
XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year]
week:[date mt_weekOfYear]
weekday:[date mt_weekdayOfWeek]
hour:[date mt_hourOfDay]
minute:[date mt_minuteOfHour]], date);

[NSDate mt_setFirstDayOfWeek:7];
XCTAssertEqualObjects([NSDate mt_dateFromYear:[date mt_year]
week:[date mt_weekOfYear]
weekday:[date mt_weekdayOfWeek]
hour:[date mt_hourOfDay]
minute:[date mt_minuteOfHour]], date);

[NSDate mt_setFirstDayOfWeek:1];
}

Expand Down