term month generation is correct

This commit is contained in:
2023-01-04 23:11:44 -07:00
parent 19ef3e2cd7
commit 159313cbca
3 changed files with 58 additions and 15 deletions

View File

@@ -49,4 +49,39 @@ public class SemesterPlannerTests
semester.Months.Count().Should().Be(2); semester.Months.Count().Should().Be(2);
} }
[Test]
public void TestSemesterGetsCorrectMonths()
{
var canvasTerm = new EnrollmentTermModel(
Id: 1,
Name: "one",
StartAt: new DateTime(2022, 1, 1),
EndAt: new DateTime(2022, 2, 1)
);
var semester = new SemesterPlanner(canvasTerm);
semester.Months.First().Month.Should().Be(1);
semester.Months.Last().Month.Should().Be(2);
}
[Test]
public void TestMonthsCanWrapYears()
{
var canvasTerm = new EnrollmentTermModel(
Id: 1,
Name: "one",
StartAt: new DateTime(2022, 12, 1),
EndAt: new DateTime(2023, 1, 1)
);
var semester = new SemesterPlanner(canvasTerm);
semester.Months.First().Month.Should().Be(12);
semester.Months.First().Year.Should().Be(2022);
semester.Months.Last().Month.Should().Be(1);
semester.Months.Last().Year.Should().Be(2023);
}
} }

View File

@@ -1,8 +1,7 @@
public class CalendarMonth public class CalendarMonth
{ {
private DateOnly firstDay { get; } public int Year { get; }
private int year { get => firstDay.Year; } public int Month { get; }
private int month { get => firstDay.Month; }
public IEnumerable<IEnumerable<int?>> Weeks public IEnumerable<IEnumerable<int?>> Weeks
{ {
get => get =>
@@ -17,10 +16,10 @@ public class CalendarMonth
get get
{ {
var weeks = new List<List<DateTime?>>(); var weeks = new List<List<DateTime?>>();
var weeksInMonth = WeeksInMonth(year, month); var weeksInMonth = WeeksInMonth(Year, Month);
var daysInMonth = DateTime.DaysInMonth(year, month); var daysInMonth = DateTime.DaysInMonth(Year, Month);
var firstDayOfMonth = new DateTime(year, month, 1).DayOfWeek; var firstDayOfMonth = new DateTime(Year, Month, 1).DayOfWeek;
var currentDay = 1; var currentDay = 1;
for (int i = 0; i < weeksInMonth; i++) for (int i = 0; i < weeksInMonth; i++)
@@ -36,7 +35,7 @@ public class CalendarMonth
} }
else else
{ {
thisWeek.Add(new DateTime(year, month, currentDay)); thisWeek.Add(new DateTime(Year, Month, currentDay));
currentDay++; currentDay++;
} }
} }
@@ -47,7 +46,7 @@ public class CalendarMonth
{ {
if (currentDay <= daysInMonth) if (currentDay <= daysInMonth)
{ {
thisWeek.Add(new DateTime(year, month, currentDay)); thisWeek.Add(new DateTime(Year, Month, currentDay));
currentDay++; currentDay++;
} }
else else
@@ -77,7 +76,7 @@ public class CalendarMonth
public CalendarMonth(int year, int month) public CalendarMonth(int year, int month)
{ {
firstDay = new DateOnly(year, month, 1); Year = year;
Month = month;
} }
} }

View File

@@ -5,11 +5,20 @@ public class SemesterPlanner
public IEnumerable<CalendarMonth> Months { get; } public IEnumerable<CalendarMonth> Months { get; }
public SemesterPlanner(EnrollmentTermModel canvasTerm) public SemesterPlanner(EnrollmentTermModel canvasTerm)
{ {
var monthsInTerm = var start = canvasTerm.StartAt ?? throw new Exception($"Canvas Term must have a start date. Term: {canvasTerm.Id}");
1 + ((canvasTerm.EndAt?.Year - canvasTerm.StartAt?.Year) * 12) var end = canvasTerm.EndAt ?? throw new Exception($"Canvas Term must have a end date. Term: {canvasTerm.Id}");
+ canvasTerm.EndAt?.Month - canvasTerm.StartAt?.Month
?? throw new Exception($"Canvas Term must have a start and end date. Term: {canvasTerm.Id}, start: {canvasTerm.StartAt}, end: {canvasTerm.EndAt}");
Months = Enumerable.Range(0, monthsInTerm).Select(_ => new CalendarMonth(2022, 1)); var monthsInTerm =
1 + ((end.Year - start.Year) * 12)
+ end.Month - start.Month;
Months = Enumerable
.Range(0, monthsInTerm)
.Select(monthDiff =>
{
var month = ((start.Month + monthDiff - 1) % 12) + 1;
var year = start.Year + ((start.Month + monthDiff - 1) / 12);
return new CalendarMonth(year, month);
});
} }
} }