diff options
| author | Alban Peignier | 2017-12-27 21:27:03 +0100 | 
|---|---|---|
| committer | Alban Peignier | 2018-01-05 10:23:29 +0100 | 
| commit | 8dada2909f01e4e8fe1eb85e88b7ac4562446521 (patch) | |
| tree | 865f3676ae734526514dd399b42483c70a13a7d0 | |
| parent | e753538fbff071f146fbf93dc0dfced5e6405684 (diff) | |
| download | chouette-core-8dada2909f01e4e8fe1eb85e88b7ac4562446521.tar.bz2 | |
Add TimeTable##intersect_periods! to remove given periods. Refs #5299
| -rw-r--r-- | app/models/chouette/time_table.rb | 21 | ||||
| -rw-r--r-- | spec/models/chouette/time_table_spec.rb | 44 | 
2 files changed, 65 insertions, 0 deletions
| diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index 74c20f061..a43ded6e1 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -569,5 +569,26 @@ module Chouette        tt.comment      = I18n.t("activerecord.copy", :name => self.comment)        tt      end + +    def intersect_periods!(mask_periods) +      dates.each do |date| +        unless mask_periods.any? { |p| p.include? date } +          dates.delete date +        end +      end + +      periods.each do |period| +        mask_periods_with_common_part = mask_periods.select { |p| p.intersect? period.range } + +        if mask_periods_with_common_part.empty? +          self.periods.delete period +        else +          mask_periods_with_common_part.each do |mask_period| +            intersection = (mask_period & period.range) +            period.period_start, period.period_end = intersection.begin, intersection.end +          end +        end +      end +    end    end  end diff --git a/spec/models/chouette/time_table_spec.rb b/spec/models/chouette/time_table_spec.rb index 677308fc8..8f50bd1d5 100644 --- a/spec/models/chouette/time_table_spec.rb +++ b/spec/models/chouette/time_table_spec.rb @@ -1187,4 +1187,48 @@ end          expect(subject.tag_list.size).to eq(2)        end    end + +  describe "#intersect_periods!" do +    let(:time_table) { Chouette::TimeTable.new } +    let(:periods) do +      [ +        Date.new(2018, 1, 1)..Date.new(2018, 2, 1), +      ] +    end + +    it "remove a date not included in given periods" do +      time_table.dates.build date: Date.new(2017,12,31) +      time_table.intersect_periods! periods +      expect(time_table.dates).to be_empty +    end + +    it "keep a date included in given periods" do +      time_table.dates.build date: Date.new(2018,1,15) +      expect{time_table.intersect_periods! periods}.to_not change(time_table, :dates) +    end + +    it "remove a period not included in given periods" do +      time_table.periods.build period_start: Date.new(2017,12,1), period_end: Date.new(2017,12,31) +      time_table.intersect_periods! periods +      expect(time_table.periods).to be_empty +    end + +    it "modify a start period if not included in given periods" do +      period = time_table.periods.build period_start: Date.new(2017,12,1), period_end: Date.new(2018,1,15) +      time_table.intersect_periods! periods +      expect(period.period_start).to eq(Date.new(2018, 1, 1)) +    end + +    it "modify a end period if not included in given periods" do +      period = time_table.periods.build period_start: Date.new(2018,1,15), period_end: Date.new(2018,3,1) +      time_table.intersect_periods! periods +      expect(period.period_end).to eq(Date.new(2018, 2, 1)) +    end + +    it "keep a period included in given periods" do +      time_table.periods.build period_start: Date.new(2018,1,10), period_end: Date.new(2018,1,20) +      expect{time_table.intersect_periods! periods}.to_not change(time_table, :periods) +    end + +  end  end | 
