Skip to content

Commit

Permalink
Calendar::Semester completed and tested
Browse files Browse the repository at this point in the history
  • Loading branch information
gsinclair committed Feb 4, 2012
1 parent a5d18ea commit 8838403
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 18 deletions.
3 changes: 3 additions & 0 deletions doc/devel-log/2012-01-31-calendar-continued.markdown
Expand Up @@ -22,3 +22,6 @@ though.
When that's done, I can implement Lessons, or Database#lessons\_for\_date, or
however I want to do it. Still mulling over options for organising that future
code.

(4 Feb) Calendar::Semester is now tested pretty well. Another bug was found and
fixed. Commit time, and I'll look at Calendar#schoolday next.
22 changes: 10 additions & 12 deletions lib/school_record/calendar.rb
Expand Up @@ -49,9 +49,10 @@ def include?(date)
# Returns nil if the resulting date is not in the term.
def date(args)
week, day = args[:week], args[:day]
unless day and week and week.in? @weeks and day.in? (1..5)
unless week and day and week > 0 and day.in? (1..5)
sr_int "Invalid argument: #{args.inspect}"
end
return nil unless week.in? @weeks
date = monday_of_first_week + (week-1)*7 + (day-1)
if self.include? date then date else nil end
end
Expand Down Expand Up @@ -105,14 +106,15 @@ def include?(date)
# date(week: 13, day: 5)
def date(args)
week, day = args[:week], args[:day]
unless day and week and week.in? (1..number_of_weeks) and day.in? (1..5)
unless week and day and week > 0 and day.in? (1..5)
sr_int "Invalid argument: #{args.inspect}"
end
return nil unless week.in? (1..number_of_weeks)
t1weeks, t2weeks = weeks_map # [ (1..10), (11..19) ]
if week.in? t1weeks
@t1.date week: week, day: day
elsif week.in? t2weeks
@t2.date week: (@t1.number_of_weeks + week), day: day
@t2.date week: (week - @t1.number_of_weeks), day: day
else
sr_int "Can't handle case of week == #{week}"
end
Expand All @@ -122,15 +124,11 @@ def date(args)
# Returns nil if the given date is not in this term.
def week_and_day(date)
if not self.include? date
return nil
elsif (week_and_day = @t1.week_and_day(date))
return week_and_day
elsif (week_and_day = @t2.week_and_day(date))
weekm day = week_and_day
week += @t1.number_of_weeks
return [week, day]
else
sr_int "Impossible case (date == #{date})"
nil
elsif _ = (week, day = @t1.week_and_day(date))
[week, day]
elsif _= (week, day = @t2.week_and_day(date))
[week + @t1.number_of_weeks, day]
end
end

Expand Down
60 changes: 54 additions & 6 deletions test/calendar.rb
Expand Up @@ -51,10 +51,16 @@
Eq @term.date(week: 8, day: 5), d('2012-06-15')
D "Raises error on invalid input" do
E(SR::SRInternalError) { @term.date(week: -3, day: 4) }
E(SR::SRInternalError) { @term.date(week: 11, day: 4) }
E(SR::SRInternalError) { @term.date(week: 6, day: 0) }
E(SR::SRInternalError) { @term.date(week: 6, day: 6) }
E(SR::SRInternalError) { @term.date(week: 10, day: 2) }
E(SR::SRInternalError) { @term.date(day: 3) }
E(SR::SRInternalError) { @term.date(week: 3) }
E(SR::SRInternalError) { @term.date(foo: 5, bar: 'x') }
E(SR::SRInternalError) { @term.date({}) }
end
D "Returns nil if week is not in term" do
N @term.date(week: 11, day: 4)
N @term.date(week: 10, day: 2)
end
end

Expand Down Expand Up @@ -141,13 +147,54 @@
Eq @sem.number_of_weeks, 19
end
D "#date(week: 7, day: 2) etc." do
Eq @sem.date(week: 7, day: 2), d('2012-08-28')
Eq @sem.date(week: 8, day: 3), d('2012-09-05')
Eq @sem.date(week: 9, day: 4), d('2012-09-13')
Eq @sem.date(week: 10, day: 4), d('2012-09-20') # Last day of term 3
Eq @sem.date(week: 10, day: 5), nil # Fri 10B not included in term
Eq @sem.date(week: 11, day: 1), nil # Mon 11A not included in term
Eq @sem.date(week: 11, day: 2), d('2012-10-09') # First day of term 4
Eq @sem.date(week: 12, day: 3), d('2012-10-17')
Eq @sem.date(week: 13, day: 4), d('2012-10-25')
Eq @sem.date(week: 14, day: 5), d('2012-11-02')
Eq @sem.date(week: 15, day: 1), d('2012-11-05')
Eq @sem.date(week: 16, day: 2), d('2012-11-13')
Eq @sem.date(week: 17, day: 3), d('2012-11-21')
Eq @sem.date(week: 18, day: 4), d('2012-11-29')
Eq @sem.date(week: 19, day: 5), d('2012-12-07') # Last day of term 4
Eq @sem.date(week: 20, day: 1), nil # There is no week 20
D "Handles the irregular start and end of term" do
# Already tested, but it's good to have the description.
Eq @sem.date(week: 10, day: 5), nil
end
end
D "#week_and_day" do
Eq @sem.week_and_day('2012-07-16'), [1,1]
Eq @sem.week_and_day('2012-07-24'), [2,2]
Eq @sem.week_and_day('2012-08-01'), [3,3]
Eq @sem.week_and_day('2012-09-12'), [9,3]
Eq @sem.week_and_day('2012-09-20'), [10,4] # Last day term 3
Eq @sem.week_and_day('2012-10-09'), [11,2] # First day term 4
Eq @sem.week_and_day('2012-10-18'), [12,4]
Eq @sem.week_and_day('2012-10-25'), [13,4]
Eq @sem.week_and_day('2012-10-25'), [13,4]
Eq @sem.week_and_day('2012-11-02'), [14,5]
Eq @sem.week_and_day('2012-11-05'), [15,1]
Eq @sem.week_and_day('2012-11-13'), [16,2]
Eq @sem.week_and_day('2012-11-21'), [17,3]
Eq @sem.week_and_day('2012-11-29'), [18,4]
Eq @sem.week_and_day('2012-12-05'), [19,3]
Eq @sem.week_and_day('2012-12-06'), [19,4]
Eq @sem.week_and_day('2012-12-07'), [19,5]
D "Returns nil if date is not in semester" do
N @sem.week_and_day('2012-09-21') # Term ends Thu 20
N @sem.week_and_day('2012-10-08') # Term begins Tue 09
N @sem.week_and_day('2012-09-26') # In the holidays between terms
N @sem.week_and_day('2012-04-09') # Way before this semester
N @sem.week_and_day('2012-12-25') # Way after this semester
end
end
end
end # Calendar::Semester

xD "Calendar#schoolday" do
D.<< {
Expand All @@ -165,8 +212,8 @@
Eq @cal.schoolday("today").date, Date.new(2012, 3, 7)
end
D "yesterday" do
Eq @cal.schoolday("tomorrow").sem_date(true), "Sem1 Tue 7A"
Eq @cal.schoolday("tomorrow").date, Date.new(2012, 3, 6)
Eq @cal.schoolday("yesterday").sem_date(true), "Sem1 Tue 7A"
Eq @cal.schoolday("yesterday").date, Date.new(2012, 3, 6)
end
D "12B Thu (and Thu 12B)" do
Eq @cal.schoolday("12B Thu").sem_date(true), "Sem1 Thu 12B"
Expand All @@ -189,6 +236,7 @@
end
D "nil for days that are not school days" do
N @cal.schoolday("Sunday")
N @cal.schoolday("2012-01-23")
N @cal.schoolday("2012-01-23") # In the long holidays
# Also test dates like staff days, public holidays, speech day
end
end

0 comments on commit 8838403

Please sign in to comment.