fix #1002. every nth week was off by one week for recurring weekly todos. Thanks Thomas for spotting this.

Updated the wrong test too.
This commit is contained in:
Reinier Balt 2010-05-02 18:16:29 +02:00
parent 8bc3a484b2
commit 5c25e4569e
3 changed files with 13 additions and 9 deletions

View file

@ -61,7 +61,7 @@ class RecurringTodo < ActiveRecord::Base
errors.add_to_base("Every other nth week may not be empty for recurrence setting") errors.add_to_base("Every other nth week may not be empty for recurrence setting")
end end
something_set = false something_set = false
%w{sunday monday tuesday wednesday thursday friday}.each do |day| %w{sunday monday tuesday wednesday thursday friday saturday}.each do |day|
something_set ||= self.send("on_#{day}") something_set ||= self.send("on_#{day}")
end end
errors.add_to_base("You must specify at least one day on which the todo recurs") if !something_set errors.add_to_base("You must specify at least one day on which the todo recurs") if !something_set
@ -406,9 +406,9 @@ class RecurringTodo < ActiveRecord::Base
end end
def recurrence_pattern def recurrence_pattern
return "invalid repeat pattern" if every_other1.nil?
case recurring_period case recurring_period
when 'daily' when 'daily'
return "invalid repeat pattern" if every_other1.nil?
if only_work_days if only_work_days
return "on work days" return "on work days"
else else
@ -419,21 +419,19 @@ class RecurringTodo < ActiveRecord::Base
end end
end end
when 'weekly' when 'weekly'
return "invalid repeat pattern" if every_other1.nil?
if every_other1 > 1 if every_other1 > 1
return "every #{every_other1} weeks" return "every #{every_other1} weeks"
else else
return 'weekly' return 'weekly'
end end
when 'monthly' when 'monthly'
return "invalid repeat pattern" if every_other1.nil? || every_other2.nil? return "invalid repeat pattern" if every_other2.nil?
if self.recurrence_selector == 0 if self.recurrence_selector == 0
return "every #{self.every_other2} month#{self.every_other2>1?'s':''} on day #{self.every_other1}" return "every #{self.every_other2} month#{self.every_other2>1?'s':''} on day #{self.every_other1}"
else else
return "every #{self.xth} #{self.day_of_week} of every #{self.every_other2} month#{self.every_other2>1?'s':''}" return "every #{self.xth} #{self.day_of_week} of every #{self.every_other2} month#{self.every_other2>1?'s':''}"
end end
when 'yearly' when 'yearly'
return "invalid repeat pattern" if every_other1.nil?
if self.recurrence_selector == 0 if self.recurrence_selector == 0
return "every year on #{self.month_of_year} #{self.every_other1}" return "every year on #{self.month_of_year} #{self.every_other1}"
else else
@ -553,8 +551,8 @@ class RecurringTodo < ActiveRecord::Base
start = previous + 1.day start = previous + 1.day
if start.wday() == 0 if start.wday() == 0
# we went to a new week , go to the nth next week and find first match # we went to a new week , go to the nth next week and find first match
# that week # that week. Note that we already went into the next week, so -1
start += self.every_other1.week start += (self.every_other1-1).week
end end
unless self.start_from.nil? unless self.start_from.nil?
# check if the start_from date is later than previous. If so, use # check if the start_from date is later than previous. If so, use

View file

@ -64,7 +64,7 @@ call_bill_gates_every_workday:
show_from_delta: ~ show_from_delta: ~
recurring_period: daily recurring_period: daily
recurrence_selector: ~ recurrence_selector: ~
every_other1: ~ every_other1: 1
every_other2: ~ every_other2: ~
every_other3: ~ every_other3: ~
every_day: ~ every_day: ~

View file

@ -124,7 +124,9 @@ class RecurringTodoTest < ActiveSupport::TestCase
due_date = @weekly_every_day.get_due_date(@sunday) due_date = @weekly_every_day.get_due_date(@sunday)
assert_equal @monday, due_date assert_equal @monday, due_date
# saturday is last day in week, so the next date should be sunday + n_weeks # saturday is last day in week, so the next date should be sunday + n-1 weeks
# n-1 because sunday is already in the next week
@weekly_every_day.every_other1 = 3
due_date = @weekly_every_day.get_due_date(@saturday) due_date = @weekly_every_day.get_due_date(@saturday)
assert_equal @sunday + 2.weeks, due_date assert_equal @sunday + 2.weeks, due_date
@ -141,6 +143,10 @@ class RecurringTodoTest < ActiveSupport::TestCase
assert_equal @wednesday, due_date assert_equal @wednesday, due_date
due_date = @weekly_every_day.get_due_date(@wednesday) due_date = @weekly_every_day.get_due_date(@wednesday)
assert_equal @tuesday+1.week, due_date assert_equal @tuesday+1.week, due_date
@weekly_every_day.every_day = ' s'
due_date = @weekly_every_day.get_due_date(@sunday)
assert_equal @saturday+1.week, due_date
end end
def test_monthly_pattern def test_monthly_pattern