diff options
| author | Xinhui | 2017-06-29 17:05:39 +0200 |
|---|---|---|
| committer | Xinhui | 2017-06-29 17:05:44 +0200 |
| commit | e32e370ece3fa78efc8cce97e3ea827b01bfe7d1 (patch) | |
| tree | 3cab5fd896872b101e5062e93e33ec902ac83aa2 | |
| parent | 0b5fd40778b04ed62a9e881a7eb2f2948c80d627 (diff) | |
| download | chouette-core-e32e370ece3fa78efc8cce97e3ea827b01bfe7d1.tar.bz2 | |
Refactoring time_table#intersect -m Refs
| -rw-r--r-- | app/models/chouette/time_table.rb | 19 | ||||
| -rw-r--r-- | spec/models/chouette/time_table_spec.rb | 164 |
2 files changed, 94 insertions, 89 deletions
diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index c566452f4..cb1d0c5da 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -496,16 +496,25 @@ class Chouette::TimeTable < Chouette::TridentActiveRecord self.convert_continuous_dates_to_periods end + def included_days_in_dates_and_periods + in_day = self.dates.select {|d| d.in_out }.map(&:date) + out_day = self.dates.select {|d| !d.in_out }.map(&:date) + + in_periods = self.periods.map{|p| (p.period_start..p.period_end).to_a }.flatten + days = in_periods + in_day + days -= out_day + days + end + # remove dates form tt which aren't in another_tt def intersect!(another_tt) transaction do - - # transform tt as effective dates and get common ones - days = another_tt.intersects(self.effective_days) & self.intersects(another_tt.effective_days) + days = self.included_days_in_dates_and_periods & another_tt.included_days_in_dates_and_periods self.dates.clear - days.each {|d| self.dates << Chouette::TimeTableDate.new( :date =>d, :in_out => true)} self.periods.clear - self.dates.to_a.sort! { |a,b| a.date <=> b.date} + days.sort.each do |d| + self.dates << Chouette::TimeTableDate.new(:date => d, :in_out => true) + end self.save! end self.convert_continuous_dates_to_periods diff --git a/spec/models/chouette/time_table_spec.rb b/spec/models/chouette/time_table_spec.rb index 76c5def5c..536de873a 100644 --- a/spec/models/chouette/time_table_spec.rb +++ b/spec/models/chouette/time_table_spec.rb @@ -72,6 +72,86 @@ describe Chouette::TimeTable, :type => :model do end end + describe '#intersect! with time_table' do + let(:another_tt) { create(:time_table) } + + context 'dates' do + # Clear periods as we are testing dates + before do + subject.periods.clear + another_tt.periods.clear + end + + it 'should keep common dates' do + days = subject.dates.map(&:date) + subject.intersect!(another_tt) + expect(subject.included_days_in_dates_and_periods).to include(*days) + end + + it 'should not keep dates who are not in common' do + # Add 1 year interval, to make sur we have not dates in common + another_tt.dates.map{|d| d.date = d.date + 1.year } + subject.intersect!(another_tt) + + expect(subject.reload.dates).to be_empty + end + end + + context 'periods' do + let(:another_tt_periods_to_range) { another_tt.periods.map{|p| p.period_start..p.period_end } } + # Clear dates as we are testing periods + before do + subject.dates.clear + another_tt.dates.clear + end + + def create_time_table_periode time_table, start_date, end_date + create(:time_table_period, time_table: time_table, :period_start => start_date, :period_end => end_date) + end + + it 'should keep common dates in periods' do + subject.intersect!(another_tt) + expect(subject_periods_to_range).to include(*another_tt_periods_to_range) + end + + it 'should build new period with common dates in periods' do + subject.periods.clear + another_tt.periods.clear + + subject.periods << create_time_table_periode(subject, Date.today, Date.today + 10.day) + another_tt.periods << create_time_table_periode(another_tt, Date.tomorrow, Date.today + 3.day) + + subject.intersect!(another_tt) + expected_range = Date.tomorrow..Date.today + 3.day + + expect(subject_periods_to_range).to include(expected_range) + expect(subject.periods.count).to eq 1 + end + + it 'should not keep dates in periods who are not in common' do + another_tt.periods.map do |p| + p.period_start = p.period_start + 1.year + p.period_end = p.period_end + 1.year + end + + subject.intersect!(another_tt) + expect(subject.periods).to be_empty + end + + context 'with calendar' do + let(:period_start) { subject.periods[0].period_start } + let(:period_end) { subject.periods[0].period_end } + let(:another_tt) { create(:calendar, date_ranges: [period_start..period_end]).convert_to_time_table } + + it 'should keep common dates in periods' do + subject.intersect!(another_tt) + expect(subject.reload.periods.count).to eq 1 + expect(subject_periods_to_range).to include(*another_tt_periods_to_range) + end + end + end + end + describe "actualize" do let(:calendar) { create(:calendar) } let(:int_day_types) { 508 } @@ -1037,90 +1117,6 @@ end end end - describe "#intersect!" do - context "timetables have periods with common day_types " do - before do - subject.periods.clear - subject.dates.clear - subject.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,8,1), :period_end => Date.new(2014,8,6)) - subject.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,6,30), :period_end => Date.new(2014,7,20)) - subject.dates << Chouette::TimeTableDate.new( :date => Date.new(2014,7,16), :in_out => true) - subject.int_day_types = 4|16|32|128 - another_tt = create(:time_table , :int_day_types => (4|16|64|128) ) - another_tt.periods.clear - another_tt.dates.clear - another_tt.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,8,6), :period_end => Date.new(2014,8,12)) - another_tt.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,7,15), :period_end => Date.new(2014,7,25)) - subject.intersect! another_tt - subject.reload - end - it "should have no period" do - expect(subject.periods.size).to eq(0) - end - it "should have date all common days" do - expect(subject.dates.size).to eq(3) - expect(subject.dates[0].date).to eq(Date.new(2014,7,16)) - expect(subject.dates[1].date).to eq(Date.new(2014,7,19)) - expect(subject.dates[2].date).to eq(Date.new(2014,8,6)) - end - end - context "timetables have periods or dates " do - before do - subject.periods.clear - subject.dates.clear - subject.dates << Chouette::TimeTableDate.new( :date => Date.new(2014,7,16), :in_out => true) - subject.dates << Chouette::TimeTableDate.new( :date => Date.new(2014,7,17), :in_out => true) - subject.dates << Chouette::TimeTableDate.new( :date => Date.new(2014,7,18), :in_out => true) - subject.dates << Chouette::TimeTableDate.new( :date => Date.new(2014,7,19), :in_out => true) - subject.dates << Chouette::TimeTableDate.new( :date => Date.new(2014,7,20), :in_out => true) - subject.int_day_types = 0 - another_tt = create(:time_table , :int_day_types => (4|16|64|128) ) - another_tt.periods.clear - another_tt.dates.clear - another_tt.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,8,6), :period_end => Date.new(2014,8,12)) - another_tt.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,7,17), :period_end => Date.new(2014,7,25)) - subject.intersect! another_tt - subject.reload - end - it "should have 0 period" do - expect(subject.periods.size).to eq(0) - end - it "should not modify day_types" do - expect(subject.int_day_types).to eq(0) - end - it "should have date reduced for period" do - expect(subject.dates.size).to eq(2) - expect(subject.dates[0].date).to eq(Date.new(2014,7,18)) - expect(subject.dates[1].date).to eq(Date.new(2014,7,19)) - end - end - context "with only periods : intersect timetable have no one day period" do - before do - subject.periods.clear - subject.dates.clear - subject.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,8,1), :period_end => Date.new(2014,8,6)) - subject.int_day_types = 4|8|16 - another_tt = create(:time_table , :int_day_types => (4|8|16) ) - another_tt.periods.clear - another_tt.dates.clear - another_tt.periods << Chouette::TimeTablePeriod.new(:period_start => Date.new(2014,8,6), :period_end => Date.new(2014,8,12)) - subject.intersect! another_tt - subject.reload - end - it "should have 0 result periods" do - expect(subject.periods.size).to eq(0) - end - it "should not modify day_types" do - expect(subject.int_day_types).to eq(4|8|16) - end - it "should have 1 date " do - expect(subject.dates.size).to eq(1) - expect(subject.dates[0].date).to eq(Date.new(2014,8,6)) - end - end - - end - describe "#disjoin!" do context "timetables have periods with common day_types " do before do |
