aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZog2018-03-14 10:08:34 +0100
committerZog2018-03-15 16:56:15 +0100
commitb2a1d762cb3e7a72f0864e70843342de2566dfdf (patch)
treea86a36a3c14b3bf59b8f81141f9954bed3dbfa7a
parentd3d3c0f40c37d716cfccbf9297bfbdc98c692521 (diff)
downloadchouette-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.rb16
-rw-r--r--spec/models/chouette/purchase_window_spec.rb51
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