diff options
| author | Zog | 2018-03-14 10:08:34 +0100 |
|---|---|---|
| committer | Zog | 2018-03-15 16:56:15 +0100 |
| commit | b2a1d762cb3e7a72f0864e70843342de2566dfdf (patch) | |
| tree | a86a36a3c14b3bf59b8f81141f9954bed3dbfa7a | |
| parent | d3d3c0f40c37d716cfccbf9297bfbdc98c692521 (diff) | |
| download | chouette-core-b2a1d762cb3e7a72f0864e70843342de2566dfdf.tar.bz2 | |
Refs #5956; Implement PurchaseWindow#intersect_periods!
Used in merge to trim dates accroding to Referential metadatas
| -rw-r--r-- | app/models/chouette/purchase_window.rb | 16 | ||||
| -rw-r--r-- | spec/models/chouette/purchase_window_spec.rb | 51 |
2 files changed, 64 insertions, 3 deletions
diff --git a/app/models/chouette/purchase_window.rb b/app/models/chouette/purchase_window.rb index 4c8014780..931f4f3a0 100644 --- a/app/models/chouette/purchase_window.rb +++ b/app/models/chouette/purchase_window.rb @@ -46,8 +46,18 @@ module Chouette ] end - # def checksum_attributes - # end - + def intersect_periods! mask_periods + return unless mask_periods.present? + out = [] + date_ranges.each do |range| + intersecting = mask_periods.select { |p| p.intersect? range } + next unless intersecting.any? + intersecting.each do |p| + range &= p + end + out << range + end + self.update_attribute :date_ranges, out + end end end diff --git a/spec/models/chouette/purchase_window_spec.rb b/spec/models/chouette/purchase_window_spec.rb index 702a44eeb..4d6a4b462 100644 --- a/spec/models/chouette/purchase_window_spec.rb +++ b/spec/models/chouette/purchase_window_spec.rb @@ -24,4 +24,55 @@ RSpec.describe Chouette::PurchaseWindow, :type => :model do end end + describe "intersect_periods!" do + let(:date_ranges){[ + (1.month.from_now).to_date..(1.month.from_now+2.day).to_date, + (2.months.from_now).to_date..(2.months.from_now+2.day).to_date + ]} + let(:purchase_window){ create :purchase_window, referential: referential, date_ranges: date_ranges } + let(:range_bottom){ purchase_window.date_ranges.map(&:first).min } + let(:range_top){ purchase_window.date_ranges.map(&:last).max } + context "with an empty mask" do + let(:mask){ [] } + it "should do nothing" do + date_ranges = purchase_window.date_ranges + purchase_window.intersect_periods! mask + expect(purchase_window.date_ranges).to eq date_ranges + end + end + + context "with an englobbing mask" do + let(:mask){ [ + (range_bottom..range_top) + ] } + it "should do nothing" do + date_ranges = purchase_window.date_ranges + purchase_window.intersect_periods! mask + expect(purchase_window.date_ranges).to eq date_ranges + end + end + + context "with a non-overlapping mask" do + let(:mask){ [ + ((range_top+1.day)..(range_top+2.days)) + ] } + it "should clear range" do + purchase_window.intersect_periods! mask + expect(purchase_window.date_ranges).to eq [] + end + end + + context "with a partially matching mask" do + let(:mask){ [ + (1.month.from_now+1.day).to_date..(2.month.from_now + 1.day).to_date, + ] } + it "should intersct ranges" do + purchase_window.intersect_periods! mask + expect(purchase_window.date_ranges).to eq [ + (1.month.from_now+1.day).to_date..(1.month.from_now+2.day).to_date, + (2.months.from_now).to_date..(2.months.from_now+1.day).to_date + ] + end + end + end end |
