aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlban Peignier2018-01-05 09:12:07 +0100
committerAlban Peignier2018-01-05 10:23:29 +0100
commitf2fb3bedf3eec870b872842f53b456f08915c3ba (patch)
tree8d95d431f29e73e52010d4e4c63ac08fd9c7d37c
parente1b3f15bfd3559676b05487dca400a3da43fa126 (diff)
downloadchouette-core-f2fb3bedf3eec870b872842f53b456f08915c3ba.tar.bz2
Add TimeTable#remove_periods! and #empty. Refs #5299
-rw-r--r--app/models/chouette/time_table.rb32
-rw-r--r--spec/models/chouette/time_table_spec.rb51
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