diff --git a/Management.Test/Features/CalendarMonthTests.cs b/Management.Test/Features/CalendarMonthTests.cs new file mode 100644 index 0000000..439aa80 --- /dev/null +++ b/Management.Test/Features/CalendarMonthTests.cs @@ -0,0 +1,45 @@ +public class CalendarMonthTests +{ + [Test] + public void TestCalendarMonthCanGetFirstWeek() + { + var month = new CalendarMonth(2023, 2); + + int?[] expectedFirstWeek = new int?[] { + null, null, null, 1, 2, 3, 4 + }; + + month.Weeks.First().Should().BeEquivalentTo(expectedFirstWeek); + } + + [Test] + public void TestCanGetAnotherMonthsFirstWeek() + { + var month = new CalendarMonth(2023, 4); + + int?[] expectedFirstWeek = new int?[] { + null, null, null, null, null, null, 1 + }; + + month.Weeks.First().Should().BeEquivalentTo(expectedFirstWeek); + } + + [Test] + public void TestCorrectNumberOfWeeks() + { + var month = new CalendarMonth(2023, 4); + + month.Weeks.Count().Should().Be(6); + } + + [Test] + public void TestLastWeekIsCorrect() + { + var month = new CalendarMonth(2023, 4); + int?[] expectedLastWeek = new int?[] { + 30, null, null, null, null, null, null, + }; + + month.Weeks.Last().Should().BeEquivalentTo(expectedLastWeek); + } +} \ No newline at end of file diff --git a/Management.Test/Features/SemesterPlannerTests.cs b/Management.Test/Features/SemesterPlannerTests.cs index 50fe494..7f05b54 100644 --- a/Management.Test/Features/SemesterPlannerTests.cs +++ b/Management.Test/Features/SemesterPlannerTests.cs @@ -33,6 +33,7 @@ public class SemesterPlannerTests semester.Months.Count().Should().Be(2); } + [Test] public void TestNewPlannerHandlesTermsThatWrapYears() { @@ -47,4 +48,5 @@ public class SemesterPlannerTests semester.Months.Count().Should().Be(2); } + } \ No newline at end of file diff --git a/Management/Features/Calendar/CalendarMonth.cs b/Management/Features/Calendar/CalendarMonth.cs index a6b29c2..d71c8c4 100644 --- a/Management/Features/Calendar/CalendarMonth.cs +++ b/Management/Features/Calendar/CalendarMonth.cs @@ -1,4 +1,83 @@ public class CalendarMonth { - + private DateOnly firstDay { get; } + private int year { get => firstDay.Year; } + private int month { get => firstDay.Month; } + public IEnumerable> Weeks + { + get => + DaysByWeek.Select( + week => week.Select(d => d?.Day) + ); + + } + + public IEnumerable> DaysByWeek + { + get + { + var weeks = new List>(); + var weeksInMonth = WeeksInMonth(year, month); + var daysInMonth = DateTime.DaysInMonth(year, month); + + var firstDayOfMonth = new DateTime(year, month, 1).DayOfWeek; + + var currentDay = 1; + for (int i = 0; i < weeksInMonth; i++) + { + var thisWeek = new List(); + if (i == 0 && firstDayOfMonth != DayOfWeek.Sunday) + { + for (int j = 0; j < 7; j++) + { + if (j < (int)firstDayOfMonth) + { + thisWeek.Add(null); + } + else + { + thisWeek.Add(new DateTime(year, month, currentDay)); + currentDay++; + } + } + } + else + { + for (int j = 0; j < 7; j++) + { + if (currentDay <= daysInMonth) + { + thisWeek.Add(new DateTime(year, month, currentDay)); + currentDay++; + } + else + { + thisWeek.Add(null); + } + } + } + weeks.Add(thisWeek); + } + return weeks; + } + } + + public static int WeeksInMonth(int year, int month) + { + var firstDayOfMonth = new DateTime(year, month, 1).DayOfWeek; + var daysInMonth = DateTime.DaysInMonth(year, month); + var longDaysInMonth = daysInMonth + (int)(firstDayOfMonth); + var weeks = longDaysInMonth / 7; + if ((longDaysInMonth % 7) > 0) + { + weeks += 1; + } + return weeks; + } + + public CalendarMonth(int year, int month) + { + firstDay = new DateOnly(year, month, 1); + + } } \ No newline at end of file diff --git a/Management/Features/Calendar/SemesterPlanner.cs b/Management/Features/Calendar/SemesterPlanner.cs index af801a4..2ee45eb 100644 --- a/Management/Features/Calendar/SemesterPlanner.cs +++ b/Management/Features/Calendar/SemesterPlanner.cs @@ -5,11 +5,11 @@ public class SemesterPlanner public IEnumerable Months { get; } public SemesterPlanner(EnrollmentTermModel canvasTerm) { - var monthsInTerm = - 1 + ((canvasTerm.EndAt?.Year - canvasTerm.StartAt?.Year) * 12) + var monthsInTerm = + 1 + ((canvasTerm.EndAt?.Year - canvasTerm.StartAt?.Year) * 12) + 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()); + Months = Enumerable.Range(0, monthsInTerm).Select(_ => new CalendarMonth(2022, 1)); } } \ No newline at end of file