Skip to content

Commit 30f126f

Browse files
committed
Bug fix
fix bug: The Recurrence.Weekly enumerator starts with wrong date #8
1 parent 6306d6b commit 30f126f

File tree

3 files changed

+52
-26
lines changed

3 files changed

+52
-26
lines changed

src/DateRecurrenceR/Core/WeekDays.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ namespace DateRecurrenceR.Core;
33
/// <summary>
44
/// Represents weekdays for one week.
55
/// </summary>
6-
public struct WeekDays
6+
public readonly struct WeekDays
77
{
88
#if NET8_0_OR_GREATER
99
private readonly WeekDaysArray _ds;
@@ -98,17 +98,13 @@ public WeekDays(DayOfWeek day1,
9898
DayOfWeek day6,
9999
DayOfWeek day7)
100100
{
101-
MinDay = (DayOfWeek) DaysInWeek;
102-
103101
_ds[(int) day1] = true;
104102
_ds[(int) day2] = true;
105103
_ds[(int) day3] = true;
106104
_ds[(int) day4] = true;
107105
_ds[(int) day5] = true;
108106
_ds[(int) day6] = true;
109107
_ds[(int) day7] = true;
110-
111-
UpdateMinDay();
112108
}
113109

114110
#if NET8_0_OR_GREATER
@@ -118,11 +114,7 @@ public WeekDays(DayOfWeek day1,
118114
/// <param name="daysArray"><see cref="WeekDaysArray" /></param>
119115
public WeekDays(WeekDaysArray daysArray)
120116
{
121-
MinDay = (DayOfWeek) DaysInWeek;
122-
123117
_ds = daysArray;
124-
125-
UpdateMinDay();
126118
}
127119
#endif
128120

@@ -144,37 +136,45 @@ public WeekDays(bool isSunday,
144136
bool isFriday,
145137
bool isSaturday)
146138
{
147-
MinDay = (DayOfWeek) DaysInWeek;
148-
149139
_ds[0] = isSunday;
150140
_ds[1] = isMonday;
151141
_ds[2] = isTuesday;
152142
_ds[3] = isWednesday;
153143
_ds[4] = isThursday;
154144
_ds[5] = isFriday;
155145
_ds[6] = isSaturday;
156-
157-
UpdateMinDay();
158146
}
159147

160148
/// <summary>
161149
/// Returns a minimal defined day of the week.
162150
/// </summary>
163-
public DayOfWeek MinDay { get; private set; }
151+
public DayOfWeek GetMinByFirstDayOfWeek(DayOfWeek firstDayOfWeek)
152+
{
153+
var shift = (7 + (int) firstDayOfWeek) % 7;
154+
if (_ds[shift]) return (DayOfWeek) shift;
155+
156+
shift = (7 + (int) firstDayOfWeek + 1) % 7;
157+
if (_ds[shift]) return (DayOfWeek) shift;
158+
159+
shift = (7 + (int) firstDayOfWeek + 2) % 7;
160+
if (_ds[shift]) return (DayOfWeek) shift;
161+
162+
shift = (7 + (int) firstDayOfWeek + 3) % 7;
163+
if (_ds[shift]) return (DayOfWeek) shift;
164+
165+
shift = (7 + (int) firstDayOfWeek + 4) % 7;
166+
if (_ds[shift]) return (DayOfWeek) shift;
167+
168+
shift = (7 + (int) firstDayOfWeek + 5) % 7;
169+
if (_ds[shift]) return (DayOfWeek) shift;
170+
171+
shift = (7 + (int) firstDayOfWeek + 6) % 7;
172+
return (DayOfWeek) shift;
173+
}
164174

165175
/// <summary>
166176
/// Returns whether the day of the week has been defined.
167177
/// </summary>
168178
/// <param name="dayOfWeek"></param>
169179
public bool this[DayOfWeek dayOfWeek] => _ds[(int) dayOfWeek];
170-
171-
private void UpdateMinDay()
172-
{
173-
for (var i = 0; i < DaysInWeek; i++)
174-
{
175-
if (!_ds[i]) continue;
176-
MinDay = (DayOfWeek) i;
177-
break;
178-
}
179-
}
180180
}

src/DateRecurrenceR/Helpers/WeeklyRecurrenceHelper.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public static WeeklyHash GetPatternHash(WeekDays weekDays, int interval)
1111

1212
var increment = DaysInWeek * (interval - 1) + 1;
1313

14-
var weekDayIndex = ((int) weekDays.MinDay + 6) % DaysInWeek;
14+
var weekDayIndex = ((int) weekDays.GetMinByFirstDayOfWeek(0) + 6) % DaysInWeek;
1515

1616
for (var i = DaysInWeek; i > 0; i--)
1717
{
@@ -124,7 +124,8 @@ public static bool TryGetStartDate(DateOnly beginDate,
124124
int interval,
125125
out DateOnly startDate)
126126
{
127-
if (!DateHelper.TryGetDateOfDayOfWeek(beginDate, weekDays.MinDay, firstDayOfWeek, out startDate))
127+
// if (!DateHelper.TryGetDateOfDayOfWeek(beginDate, weekDays.MinDay, firstDayOfWeek, out startDate))
128+
if (!DateHelper.TryGetDateOfDayOfWeek(beginDate, weekDays.GetMinByFirstDayOfWeek(firstDayOfWeek), firstDayOfWeek, out startDate))
128129
{
129130
startDate = default;
130131
return false;

test/DateRecurrenceR.Tests.Unit/Helpers/WeeklyRecurrenceHelperTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,31 @@ public void Method_TryGetStartDate_returns_Result_eq_FromDate()
131131
startDate.Should().Be(fromDate);
132132
}
133133

134+
[Fact]
135+
public void Method_TryGetStartDate_returns_Result_eq_FromDate_2()
136+
{
137+
// Arrange
138+
var beginDate = new DateOnly(1, 1, 8);
139+
var fromDate = beginDate;
140+
var firstDayOfWeek = DayOfWeek.Monday;
141+
var weekDays = new WeekDays(DayOfWeek.Sunday, DayOfWeek.Monday);
142+
var interval = 1;
143+
var patternHash = WeeklyRecurrenceHelper.GetPatternHash(weekDays, interval);
144+
145+
// Act
146+
WeeklyRecurrenceHelper.TryGetStartDate(
147+
beginDate,
148+
fromDate,
149+
patternHash,
150+
weekDays,
151+
firstDayOfWeek,
152+
interval,
153+
out var startDate);
154+
155+
//Assert
156+
startDate.Should().Be(fromDate);
157+
}
158+
134159
[Fact]
135160
public void Method_GetPatternHash_returns_correct_hash_for_one_day()
136161
{

0 commit comments

Comments
 (0)