diff options
| author | Alban Peignier | 2018-01-05 09:12:07 +0100 | 
|---|---|---|
| committer | Alban Peignier | 2018-01-05 10:23:29 +0100 | 
| commit | f2fb3bedf3eec870b872842f53b456f08915c3ba (patch) | |
| tree | 8d95d431f29e73e52010d4e4c63ac08fd9c7d37c | |
| parent | e1b3f15bfd3559676b05487dca400a3da43fa126 (diff) | |
| download | chouette-core-f2fb3bedf3eec870b872842f53b456f08915c3ba.tar.bz2 | |
Add TimeTable#remove_periods! and #empty. Refs #5299
| -rw-r--r-- | app/models/chouette/time_table.rb | 32 | ||||
| -rw-r--r-- | spec/models/chouette/time_table_spec.rb | 51 | 
2 files changed, 82 insertions, 1 deletions
| diff --git a/app/models/chouette/time_table.rb b/app/models/chouette/time_table.rb index a43ded6e1..db97dd2fa 100644 --- a/app/models/chouette/time_table.rb +++ b/app/models/chouette/time_table.rb @@ -572,7 +572,7 @@ module Chouette      def intersect_periods!(mask_periods)        dates.each do |date| -        unless mask_periods.any? { |p| p.include? date } +        unless mask_periods.any? { |p| p.include? date.date }            dates.delete date          end        end @@ -590,5 +590,35 @@ module Chouette          end        end      end + +    def remove_periods!(removed_periods) +      dates.each do |date| +        if removed_periods.any? { |p| p.include? date.date } +          dates.delete date +        end +      end + +      periods.each do |period| +        modified_ranges = removed_periods.inject([period.range]) do |period_ranges, removed_period| +          period_ranges.map { |p| p.remove removed_period }.flatten +        end + +        unless modified_ranges.empty? +          modified_ranges.each_with_index do |modified_range, index| +            new_period = index == 0 ? period : periods.build + +            new_period.period_start, new_period.period_end = +                                     modified_range.min, modified_range.max +          end +        else +          periods.delete period +        end +      end +    end + +    def empty? +      dates.empty? && periods.empty? +    end +    end  end diff --git a/spec/models/chouette/time_table_spec.rb b/spec/models/chouette/time_table_spec.rb index 8f50bd1d5..23f26395e 100644 --- a/spec/models/chouette/time_table_spec.rb +++ b/spec/models/chouette/time_table_spec.rb @@ -1231,4 +1231,55 @@ end      end    end + +  describe "#remove_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 included in given periods" do +      time_table.dates.build date: Date.new(2018,1,15) +      time_table.remove_periods! periods +      expect(time_table.dates).to be_empty +    end + +    it "keep a date not included in given periods" do +      time_table.dates.build date: Date.new(2017,12,31) +      expect{time_table.remove_periods! periods}.to_not change(time_table, :dates) +    end + +    it "modify a end period if 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.remove_periods! periods +      expect(period.period_end).to eq(Date.new(2017, 12, 31)) +    end + +    it "modify a start period if 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.remove_periods! periods +      expect(period.period_start).to eq(Date.new(2018, 2, 2)) +    end + +    it "remove 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) +      time_table.remove_periods! periods +      expect(time_table.periods).to be_empty +    end + +    it "split a period including a given period" do +      time_table.periods.build period_start: Date.new(2017,12,1), period_end: Date.new(2018,3,1) +      time_table.remove_periods! periods + +      expected_ranges = [ +        Date.new(2017,12,1)..Date.new(2017,12,31), +        Date.new(2018,2,2)..Date.new(2017,3,1) +      ] +      expect(time_table.periods.map(&:range)).to eq(expected_ranges) +    end + +  end +  end | 
