Skip to content

Commit 0f5c71a

Browse files
committed
fix interval use with bysetpos
1 parent c70d7f6 commit 0f5c71a

3 files changed

Lines changed: 52 additions & 4 deletions

File tree

lib/ice_cube/validations/monthly_by_set_pos.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ def dst_adjust?
3131
true
3232
end
3333

34-
def validate(step_time, schedule)
34+
def validate(step_time, start_time)
3535
start_of_month = step_time.beginning_of_month
3636
end_of_month = step_time.end_of_month
3737

38-
new_schedule = IceCube::Schedule.new(step_time - 1.month) do |s|
38+
# Needs to start on the first day of the month
39+
new_schedule = IceCube::Schedule.new(start_of_month.change(hour: step_time.hour, min: step_time.min, sec: step_time.sec)) do |s|
3940
s.add_recurrence_rule(IceCube::Rule.from_hash(rule.to_hash.except(:by_set_pos, :count, :until)))
4041
end
4142

lib/ice_cube/validations/yearly_by_set_pos.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ def dst_adjust?
3333
true
3434
end
3535

36-
def validate(step_time, schedule)
36+
def validate(step_time, start_time)
3737
start_of_year = step_time.beginning_of_year
3838
end_of_year = step_time.end_of_year
3939

40-
new_schedule = IceCube::Schedule.new(step_time - 1.year) do |s|
40+
# Needs to start on the first day of the year
41+
new_schedule = IceCube::Schedule.new(start_of_year.change(hour: step_time.hour, min: step_time.min, sec: step_time.sec)) do |s|
4142
s.add_recurrence_rule(IceCube::Rule.from_hash(rule.to_hash.except(:by_set_pos, :count, :until)))
4243
end
4344

spec/examples/by_set_pos_spec.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ module IceCube
1313
Time.new(2015,9,23,12,0,0)
1414
])
1515
end
16+
17+
it 'should work with intervals' do
18+
schedule = IceCube::Schedule.from_ical "RRULE:FREQ=MONTHLY;COUNT=4;BYDAY=WE;BYSETPOS=4;INTERVAL=2"
19+
schedule.start_time = Time.new(2015, 5, 28, 12, 0, 0)
20+
expect(schedule.occurrences_between(Time.new(2015, 01, 01), Time.new(2017, 01, 01))).
21+
to eq([
22+
Time.new(2015,7,22,12,0,0),
23+
Time.new(2015,9,23,12,0,0),
24+
Time.new(2015,11,25,12,0,0),
25+
Time.new(2016,1,27,12,0,0),
26+
])
27+
end
1628
end
1729

1830
describe YearlyRule, 'BYSETPOS' do
@@ -25,5 +37,39 @@ module IceCube
2537
Time.new(2016, 7, 31)
2638
])
2739
end
40+
41+
it 'should work with intervals' do
42+
schedule = IceCube::Schedule.from_ical "RRULE:FREQ=YEARLY;BYMONTH=7;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYSETPOS=-1;INTERVAL=2"
43+
schedule.start_time = Time.new(1966,7,5)
44+
expect(schedule.occurrences_between(Time.new(2015, 01, 01), Time.new(2023, 01, 01))).
45+
to eq([
46+
Time.new(2016, 7, 31),
47+
Time.new(2018, 7, 31),
48+
Time.new(2020, 7, 31),
49+
Time.new(2022, 7, 31),
50+
])
51+
end
52+
53+
it 'should work with counts' do
54+
schedule = IceCube::Schedule.from_ical "RRULE:FREQ=YEARLY;BYMONTH=7;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYSETPOS=-1;COUNT=3"
55+
schedule.start_time = Time.new(2016,1,1)
56+
expect(schedule.occurrences_between(Time.new(2016, 01, 01), Time.new(2050, 01, 01))).
57+
to eq([
58+
Time.new(2016, 7, 31),
59+
Time.new(2017, 7, 31),
60+
Time.new(2018, 7, 31),
61+
])
62+
end
63+
64+
it 'should work with counts and intervals' do
65+
schedule = IceCube::Schedule.from_ical "RRULE:FREQ=YEARLY;BYMONTH=7;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYSETPOS=-1;COUNT=3;INTERVAL=2"
66+
schedule.start_time = Time.new(2016,1,1)
67+
expect(schedule.occurrences_between(Time.new(2016, 01, 01), Time.new(2050, 01, 01))).
68+
to eq([
69+
Time.new(2016, 7, 31),
70+
Time.new(2018, 7, 31),
71+
Time.new(2020, 7, 31),
72+
])
73+
end
2874
end
2975
end

0 commit comments

Comments
 (0)