From f0568588ea01f96a9b801f3aa55bf822c39fbaa2 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 13:47:40 -0800 Subject: [PATCH 001/100] adds simplecov and reservation class --- test/test_helper.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..a34b5ba4c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,4 +1,8 @@ -# Add simplecov +require 'simplecov' +SimpleCov.start do + add_filter 'test/' # Tests should not be checked for coverage +end + require "minitest" require "minitest/autorun" require "minitest/reporters" @@ -6,3 +10,6 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # require_relative your lib files here! +require_relative '../lib/reservation' + +# In other test files, we will require_relative 'test_helper' \ No newline at end of file From 3144873a806ed40e302b7ee9ac54e4b427d0aeca Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 13:48:15 -0800 Subject: [PATCH 002/100] creates reservation class and tests instantiation --- lib/reservation.rb | 14 ++++++++++++++ test/reservation_test.rb | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 lib/reservation.rb create mode 100644 test/reservation_test.rb diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..8ac6bb317 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,14 @@ +module Hotel + class Reservation + attr_reader :id, :start_date, :end_date, :nights + + def initialize(id:, start_date:, end_date:, nights: nil) + @id = id + @start_date = Date.parse(start_date) + @end_date = Date.parse(end_date) + @nights = nights + end + + # define a method that calculates the number of nights for each stay, depending on the date range + end +end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..78e87a034 --- /dev/null +++ b/test/reservation_test.rb @@ -0,0 +1,18 @@ +require_relative 'test_helper' + +describe "Reservation class" do + describe "Reservation instantiation" do + before do + @reservation = Hotel::Reservation.new( + id: 1, + start_date: "March 2 2020", + end_date: "March 5 2020" + ) + end + + it "is an instance of Reservation" do + expect(@reservation).must_be_kind_of Hotel::Reservation + end + + end +end \ No newline at end of file From 19952f08f0c46db286e48b7b16d6d4caad6a1b72 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 14:02:27 -0800 Subject: [PATCH 003/100] removes nights variable (this will be implemented in an instance method later) --- lib/reservation.rb | 8 +++++--- test/reservation_test.rb | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 8ac6bb317..cb792ca7e 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,12 +1,14 @@ +require 'date' + module Hotel class Reservation - attr_reader :id, :start_date, :end_date, :nights + attr_reader :id, :room + attr_accessor :start_date, :end_date - def initialize(id:, start_date:, end_date:, nights: nil) + def initialize(id:, room:, start_date:, end_date:) @id = id @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) - @nights = nights end # define a method that calculates the number of nights for each stay, depending on the date range diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 78e87a034..f4c4d029a 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -5,6 +5,7 @@ before do @reservation = Hotel::Reservation.new( id: 1, + room: 15, start_date: "March 2 2020", end_date: "March 5 2020" ) From 90bd0458a57a10b2af60f86c145f9011bb34351f Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 14:10:12 -0800 Subject: [PATCH 004/100] adds pseudocode for wave 1 requirements --- lib/reservation.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/reservation.rb b/lib/reservation.rb index cb792ca7e..a63946b67 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -9,8 +9,13 @@ def initialize(id:, room:, start_date:, end_date:) @id = id @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) + + # I want exception raised when an invalid date range is provided, so that I can't make a reservation for an invalid date range end + # define a method that calculates the number of nights for each stay, depending on the date range + + # I can get the total cost for a given reservation end end \ No newline at end of file From a00f3afaa5b8b24b62cde402ea6b5d7e2d5f7a03 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 14:10:56 -0800 Subject: [PATCH 005/100] adds front_desk.rb to the required lib files --- test/test_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index a34b5ba4c..b7e0054a4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -11,5 +11,6 @@ # require_relative your lib files here! require_relative '../lib/reservation' +require_relative '../lib/front_desk' # In other test files, we will require_relative 'test_helper' \ No newline at end of file From 306f359dd70db368f2260df0ba3088c974a32d8c Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 14:11:47 -0800 Subject: [PATCH 006/100] adds frontdesk class and tests for instantiation --- lib/front_desk.rb | 15 +++++++++++++++ test/front_desk_test.rb | 14 ++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 lib/front_desk.rb create mode 100644 test/front_desk_test.rb diff --git a/lib/front_desk.rb b/lib/front_desk.rb new file mode 100644 index 000000000..5d70a8a83 --- /dev/null +++ b/lib/front_desk.rb @@ -0,0 +1,15 @@ +module Hotel + class FrontDesk + attr_reader :rooms, :reservations + + def initialize + + end + + # I can access the list of all of the rooms in the hotel + + # I access the list of reservations for a specified room and a given date range + + # I can access the list of reservations for a specific date, so that I can track reservations by date + end +end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb new file mode 100644 index 000000000..df420e79b --- /dev/null +++ b/test/front_desk_test.rb @@ -0,0 +1,14 @@ +require_relative 'test_helper' + +describe "FrontDesk class" do + describe "FrontDesk instantiation" do + before do + @front_desk = Hotel::FrontDesk.new + end + + it "is an instance of FrontDesk" do + expect(@front_desk).must_be_kind_of Hotel::FrontDesk + end + + end +end \ No newline at end of file From 0e64e25b330b45f4c71e448c6f6cf25b14e21e79 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 14:58:42 -0800 Subject: [PATCH 007/100] adds a room instance varible --- lib/reservation.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/reservation.rb b/lib/reservation.rb index a63946b67..35c291ac0 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -7,6 +7,7 @@ class Reservation def initialize(id:, room:, start_date:, end_date:) @id = id + @room = room @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) From 97eb647fa11dce82b5c54d5ea7fa1ef85463ef25 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 14:59:43 -0800 Subject: [PATCH 008/100] adds a method and test for accessing a list of all rooms --- lib/front_desk.rb | 2 +- test/front_desk_test.rb | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 5d70a8a83..f77c9161c 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -3,7 +3,7 @@ class FrontDesk attr_reader :rooms, :reservations def initialize - + @rooms = (1..20).to_a end # I can access the list of all of the rooms in the hotel diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index df420e79b..520b6a18c 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -10,5 +10,10 @@ expect(@front_desk).must_be_kind_of Hotel::FrontDesk end + it "can access the list of all the rooms in the hotel" do + expect(@front_desk.rooms).must_be_kind_of Array + expect(@front_desk.rooms.first).must_equal 1 + expect(@front_desk.rooms.last).must_equal 20 + end end end \ No newline at end of file From 35e9edda40ecf09b6d1f260df754814ae482098b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 15:55:26 -0800 Subject: [PATCH 009/100] changes tests to create Date objects and lib code to expect Date objects --- lib/reservation.rb | 4 ++-- test/reservation_test.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 35c291ac0..191ff0666 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -8,8 +8,8 @@ class Reservation def initialize(id:, room:, start_date:, end_date:) @id = id @room = room - @start_date = Date.parse(start_date) - @end_date = Date.parse(end_date) + @start_date = start_date + @end_date = end_date # I want exception raised when an invalid date range is provided, so that I can't make a reservation for an invalid date range end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index f4c4d029a..e4bb9bbdd 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -6,8 +6,8 @@ @reservation = Hotel::Reservation.new( id: 1, room: 15, - start_date: "March 2 2020", - end_date: "March 5 2020" + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) ) end From 866a9d2d2f77eda9c7fe5a3a53ed701039a5c0f6 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 15:56:51 -0800 Subject: [PATCH 010/100] adds reserve_room method and tests, refactors FrontDesk instantiation test for readability --- lib/front_desk.rb | 12 +++++++++++- test/front_desk_test.rb | 24 +++++++++++++++++------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index f77c9161c..d37931fd6 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,12 +1,22 @@ +require_relative 'reservation' + module Hotel class FrontDesk attr_reader :rooms, :reservations def initialize @rooms = (1..20).to_a + @reservations = [] end - # I can access the list of all of the rooms in the hotel + def reserve_room(start_date, end_date) + return Hotel::Reservation.new( + id: @reservations.length + 1, + room: nil, # placeholder + start_date: start_date, + end_date: end_date + ) + end # I access the list of reservations for a specified room and a given date range diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 520b6a18c..173e08883 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -1,19 +1,29 @@ require_relative 'test_helper' describe "FrontDesk class" do - describe "FrontDesk instantiation" do - before do - @front_desk = Hotel::FrontDesk.new - end + before do + @front_desk = Hotel::FrontDesk.new + end + describe "FrontDesk instantiation" do it "is an instance of FrontDesk" do expect(@front_desk).must_be_kind_of Hotel::FrontDesk end it "can access the list of all the rooms in the hotel" do - expect(@front_desk.rooms).must_be_kind_of Array - expect(@front_desk.rooms.first).must_equal 1 - expect(@front_desk.rooms.last).must_equal 20 + rooms = @front_desk.rooms + expect(rooms).must_be_kind_of Array + expect(rooms.first).must_equal 1 + expect(rooms.last).must_equal 20 + end + end + + describe "#reserve_room" do + it "can reserve a room given a start date and an end date" do + start_date = Date.new(2020,3,2) + end_date = Date.new(2020,3,5) + reservation = @front_desk.reserve_room(start_date, end_date) + expect(reservation).must_be_kind_of Hotel::Reservation end end end \ No newline at end of file From de5b3ae91dcd176543785245a087be81512e52e8 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 16:16:48 -0800 Subject: [PATCH 011/100] throws an exception when an invalid date range is provided --- lib/reservation.rb | 5 ++--- test/reservation_test.rb | 8 ++++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 191ff0666..3c722492c 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -11,10 +11,9 @@ def initialize(id:, room:, start_date:, end_date:) @start_date = start_date @end_date = end_date - # I want exception raised when an invalid date range is provided, so that I can't make a reservation for an invalid date range - end + raise ArgumentError.new("Invalid date range!") if @start_date > @end_date + end - # define a method that calculates the number of nights for each stay, depending on the date range # I can get the total cost for a given reservation diff --git a/test/reservation_test.rb b/test/reservation_test.rb index e4bb9bbdd..8d4fad951 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -15,5 +15,13 @@ expect(@reservation).must_be_kind_of Hotel::Reservation end + it "throws an exception when an invalid date range is provided" do + expect{ Hotel::Reservation.new( + id: 1, + room: 15, + start_date: Date.new(2020,3,5), + end_date: Date.new(2020,3,2) + ) }.must_raise ArgumentError + end end end \ No newline at end of file From 394d75508657e76043004dec2e8112f0f2a9ad7b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 16:26:07 -0800 Subject: [PATCH 012/100] defines a method and test that calculates the nights of stay --- lib/reservation.rb | 4 +++- test/reservation_test.rb | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 3c722492c..580001135 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -14,7 +14,9 @@ def initialize(id:, room:, start_date:, end_date:) raise ArgumentError.new("Invalid date range!") if @start_date > @end_date end - # define a method that calculates the number of nights for each stay, depending on the date range + def nights + return @end_date - @start_date + end # I can get the total cost for a given reservation end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 8d4fad951..06b37cd91 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -23,5 +23,10 @@ end_date: Date.new(2020,3,2) ) }.must_raise ArgumentError end + + it "calculates the nights of stay accurately" do + expect(@reservation.nights).must_equal 3 + end + end end \ No newline at end of file From 418c78f41cee7d80688fef36b4d4718a7a8ac97f Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 16:31:24 -0800 Subject: [PATCH 013/100] defines a method and test to calculate total cost --- lib/reservation.rb | 4 +++- test/reservation_test.rb | 27 +++++++++++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 580001135..589e75c11 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -18,6 +18,8 @@ def nights return @end_date - @start_date end - # I can get the total cost for a given reservation + def total_cost + return nights * 200.0 + end end end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 06b37cd91..f836d10f0 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,16 +1,16 @@ require_relative 'test_helper' describe "Reservation class" do - describe "Reservation instantiation" do - before do - @reservation = Hotel::Reservation.new( - id: 1, - room: 15, - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - end + before do + @reservation = Hotel::Reservation.new( + id: 1, + room: 15, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + end + describe "Reservation instantiation" do it "is an instance of Reservation" do expect(@reservation).must_be_kind_of Hotel::Reservation end @@ -23,10 +23,17 @@ end_date: Date.new(2020,3,2) ) }.must_raise ArgumentError end + end + describe "#nights" do it "calculates the nights of stay accurately" do expect(@reservation.nights).must_equal 3 end - + end + + describe "#total_cost" do + it "calculates the total cost accurately" do + expect(@reservation.total_cost).must_equal 600.0 + end end end \ No newline at end of file From 0b97375f49750954927ab3b8d364b8136edf18a8 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 2 Mar 2020 19:33:09 -0800 Subject: [PATCH 014/100] defines date_range method and tests --- lib/reservation.rb | 4 ++++ test/reservation_test.rb | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/reservation.rb b/lib/reservation.rb index 589e75c11..a57a87eb6 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -14,6 +14,10 @@ def initialize(id:, room:, start_date:, end_date:) raise ArgumentError.new("Invalid date range!") if @start_date > @end_date end + def date_range + return (@start_date..@end_date).to_a + end + def nights return @end_date - @start_date end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index f836d10f0..d3f23a4d4 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -25,6 +25,23 @@ end end + describe "#date_range" do + it "returns an array with the correct start and end values" do + range = @reservation.date_range + expect(range).must_be_kind_of Array + expect(range.first).must_equal @reservation.start_date + expect(range.last).must_equal @reservation.end_date + end + + it "returns all dates between the start and end dates" do + range = @reservation.date_range + second_date = range[1].strftime("%b %d %Y") + third_date = range[2].strftime("%b %d %Y") + expect(second_date).must_equal "Mar 03 2020" + expect(third_date).must_equal "Mar 04 2020" + end + end + describe "#nights" do it "calculates the nights of stay accurately" do expect(@reservation.nights).must_equal 3 From bbe2fda66bbe83428dd1830ba411dc5bdda4f4eb Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 10:04:56 -0800 Subject: [PATCH 015/100] adds .DS_Store --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5e1422c9c..8d2808a00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.DS_Store *.gem *.rbc /.config From aaee32a25c3b8c31433402446cf114beebdd0ada Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 10:05:32 -0800 Subject: [PATCH 016/100] removes skip_until tests --- test/test_helper.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index b7e0054a4..90d436da2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,9 +3,10 @@ add_filter 'test/' # Tests should not be checked for coverage end -require "minitest" -require "minitest/autorun" -require "minitest/reporters" +require 'minitest' +require 'minitest/autorun' +require 'minitest/reporters' +require 'minitest/skip_dsl' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new From 78c9850b1342e88bd417d9437546fea441f87692 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 14:02:38 -0800 Subject: [PATCH 017/100] adds comments for testing and refactoring opportunities --- test/reservation_test.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index d3f23a4d4..0d92fae1d 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -25,6 +25,10 @@ end end + describe "Reservation property" do + + end + describe "#date_range" do it "returns an array with the correct start and end values" do range = @reservation.date_range @@ -34,6 +38,7 @@ end it "returns all dates between the start and end dates" do + # tidy up because date objects can be compared range = @reservation.date_range second_date = range[1].strftime("%b %d %Y") third_date = range[2].strftime("%b %d %Y") From 20c3bb720466ae8307dc651e685a9046090aebcf Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 14:07:44 -0800 Subject: [PATCH 018/100] adds #add_reservation and #reservations_by_room methods and tests --- lib/front_desk.rb | 10 +++++-- test/front_desk_test.rb | 61 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index d37931fd6..df90db757 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -9,6 +9,10 @@ def initialize @reservations = [] end + def add_reservation(reservation) + @reservations << reservation + end + def reserve_room(start_date, end_date) return Hotel::Reservation.new( id: @reservations.length + 1, @@ -18,8 +22,10 @@ def reserve_room(start_date, end_date) ) end - # I access the list of reservations for a specified room and a given date range - + def reservations_by_room(room, start_date, end_date) + return @reservations.select { |reservation| reservation.room == room && reservation.date_range.include?(start_date) && reservation.date_range.include?(end_date) } + end + # I can access the list of reservations for a specific date, so that I can track reservations by date end end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 173e08883..6d9097547 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -18,6 +18,23 @@ end end + describe "#add_reservation" do + it "adds the reservation passed in to the reservations array" do + reservation = Hotel::Reservation.new( + id: 1, + room: 15, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + before_length = @front_desk.reservations.length + @front_desk.add_reservation(reservation) + after_length = @front_desk.reservations.length + expect(@front_desk.reservations.last).must_be_kind_of Hotel::Reservation + expect(before_length).must_equal 0 + expect(after_length).must_equal 1 + end + end + describe "#reserve_room" do it "can reserve a room given a start date and an end date" do start_date = Date.new(2020,3,2) @@ -25,5 +42,49 @@ reservation = @front_desk.reserve_room(start_date, end_date) expect(reservation).must_be_kind_of Hotel::Reservation end + + it "assigns a unique id number" do + + end + + it "adds the new reservation to the reservations array" do + + end + end + + describe "#reservations_by_room" do + before do + reservation1 = Hotel::Reservation.new( + id: 1, + room: 15, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + reservation2 = Hotel::Reservation.new( + id: 2, + room: 20, + start_date: Date.new(2020,3,3), + end_date: Date.new(2020,3,4) + ) + reservation3 = Hotel::Reservation.new( + id: 3, + room: 15, + start_date: Date.new(2020,3,5), + end_date: Date.new(2020,3,10) + ) + @front_desk.add_reservation(reservation1) + @front_desk.add_reservation(reservation2) + @front_desk.add_reservation(reservation3) + end + + it "returns an array of Reservations" do + start_date = Date.new(2020,3,2) + end_date = Date.new(2020,3,5) + selected_reservations = @front_desk.reservations_by_room(15, start_date, end_date) + + expect(@front_desk.reservations.length).must_equal 3 + expect(selected_reservations).must_be_kind_of Array + expect(selected_reservations.first).must_be_kind_of Hotel::Reservation + end end end \ No newline at end of file From 1df375f0c179f0a18a12698d3d816cfb72de662d Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 14:25:02 -0800 Subject: [PATCH 019/100] adds additional tests and functionality for #reserve_room --- lib/front_desk.rb | 4 +++- test/front_desk_test.rb | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index df90db757..325242145 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -14,12 +14,14 @@ def add_reservation(reservation) end def reserve_room(start_date, end_date) - return Hotel::Reservation.new( + new_reservation = Hotel::Reservation.new( id: @reservations.length + 1, room: nil, # placeholder start_date: start_date, end_date: end_date ) + add_reservation(new_reservation) + return new_reservation end def reservations_by_room(room, start_date, end_date) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 6d9097547..1f7d21620 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -36,19 +36,28 @@ end describe "#reserve_room" do - it "can reserve a room given a start date and an end date" do + before do start_date = Date.new(2020,3,2) end_date = Date.new(2020,3,5) - reservation = @front_desk.reserve_room(start_date, end_date) - expect(reservation).must_be_kind_of Hotel::Reservation + @reservation1 = @front_desk.reserve_room(start_date, end_date) + @reservation2 = @front_desk.reserve_room(start_date + 5, end_date + 5) + @reservation3 = @front_desk.reserve_room(start_date + 5, end_date + 5) end - it "assigns a unique id number" do - + it "can reserve a room given a start date and an end date" do + expect(@reservation1).must_be_kind_of Hotel::Reservation end - it "adds the new reservation to the reservations array" do - + it "assigns a unique id number to each Reservation" do + expect(@reservation1.id).must_equal 1 + expect(@reservation2.id).must_equal 2 + expect(@reservation3.id).must_equal 3 + end + + it "adds the new reservations to the reservations array" do + expect(@front_desk.reservations.length).must_equal 3 + expect(@front_desk.reservations.first).must_equal @reservation1 + expect(@front_desk.reservations.last).must_equal @reservation3 end end From 0b9fee858a588276d0458b39140edbb5e88f7915 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 14:32:02 -0800 Subject: [PATCH 020/100] adds a test to check whether #reserve_room assigns a valid room number --- lib/front_desk.rb | 3 ++- test/front_desk_test.rb | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 325242145..534b82b33 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -16,7 +16,7 @@ def add_reservation(reservation) def reserve_room(start_date, end_date) new_reservation = Hotel::Reservation.new( id: @reservations.length + 1, - room: nil, # placeholder + room: @rooms.sample, # placeholder start_date: start_date, end_date: end_date ) @@ -29,5 +29,6 @@ def reservations_by_room(room, start_date, end_date) end # I can access the list of reservations for a specific date, so that I can track reservations by date + end end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 1f7d21620..a6f508b07 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -54,6 +54,12 @@ expect(@reservation3.id).must_equal 3 end + it "assigns a valid room number" do + expect(@front_desk.rooms).must_include @reservation1.room + expect(@front_desk.rooms).must_include @reservation2.room + expect(@front_desk.rooms).must_include @reservation3.room + end + it "adds the new reservations to the reservations array" do expect(@front_desk.reservations.length).must_equal 3 expect(@front_desk.reservations.first).must_equal @reservation1 From 4aa4764d7bdc7f0aa97ca52ebd6585dbf4263aa4 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 15:21:54 -0800 Subject: [PATCH 021/100] adds #reservations_by_date method and tests --- lib/front_desk.rb | 5 +++-- test/front_desk_test.rb | 45 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 534b82b33..16f26b5b0 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -28,7 +28,8 @@ def reservations_by_room(room, start_date, end_date) return @reservations.select { |reservation| reservation.room == room && reservation.date_range.include?(start_date) && reservation.date_range.include?(end_date) } end - # I can access the list of reservations for a specific date, so that I can track reservations by date - + def reservations_by_date(date) + return @reservations.select { |reservation| reservation.start_date == date } + end end end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index a6f508b07..f618ffd23 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -97,9 +97,52 @@ end_date = Date.new(2020,3,5) selected_reservations = @front_desk.reservations_by_room(15, start_date, end_date) - expect(@front_desk.reservations.length).must_equal 3 expect(selected_reservations).must_be_kind_of Array expect(selected_reservations.first).must_be_kind_of Hotel::Reservation end + + it "can access the list of reservations for a specified room and a given date range" do + + end + end + + describe "#reservations_by_date" do + before do + @reservation1 = Hotel::Reservation.new( + id: 1, + room: 15, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @reservation2 = Hotel::Reservation.new( + id: 2, + room: 20, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,4) + ) + @reservation3 = Hotel::Reservation.new( + id: 3, + room: 15, + start_date: Date.new(2020,3,5), + end_date: Date.new(2020,3,10) + ) + @front_desk.add_reservation(@reservation1) + @front_desk.add_reservation(@reservation2) + @front_desk.add_reservation(@reservation3) + + @selected_reservations = @front_desk.reservations_by_date(Date.new(2020,3,2)) + end + + it "returns an array of Reservations" do + expect(@selected_reservations).must_be_kind_of Array + expect(@selected_reservations.first).must_be_kind_of Hotel::Reservation + end + + it "can access the list of reservations for a specific date" do + expect(@front_desk.reservations.length).must_equal 3 # ensure that the method isn't just returning the @reservations array + expect(@selected_reservations.length).must_equal 2 + expect(@selected_reservations.first).must_equal @reservation1 + expect(@selected_reservations.last).must_equal @reservation2 + end end end \ No newline at end of file From 9b145a86391356a446f4fe99e6f55e4cbc4a5937 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 15:36:59 -0800 Subject: [PATCH 022/100] adds a test for #reservations_by_room to check whether the correct Reservations are being returned, refactors tests --- lib/front_desk.rb | 2 +- test/front_desk_test.rb | 29 ++++++++++++++++------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 16f26b5b0..ca85cd36e 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -25,7 +25,7 @@ def reserve_room(start_date, end_date) end def reservations_by_room(room, start_date, end_date) - return @reservations.select { |reservation| reservation.room == room && reservation.date_range.include?(start_date) && reservation.date_range.include?(end_date) } + return @reservations.select { |reservation| reservation.room == room && reservation.date_range.include?(start_date) || reservation.date_range.include?(end_date) } end def reservations_by_date(date) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index f618ffd23..93060fa6c 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -69,40 +69,43 @@ describe "#reservations_by_room" do before do - reservation1 = Hotel::Reservation.new( + @reservation1 = Hotel::Reservation.new( id: 1, room: 15, start_date: Date.new(2020,3,2), end_date: Date.new(2020,3,5) ) - reservation2 = Hotel::Reservation.new( + @reservation2 = Hotel::Reservation.new( id: 2, room: 20, start_date: Date.new(2020,3,3), end_date: Date.new(2020,3,4) ) - reservation3 = Hotel::Reservation.new( + @reservation3 = Hotel::Reservation.new( id: 3, room: 15, start_date: Date.new(2020,3,5), end_date: Date.new(2020,3,10) ) - @front_desk.add_reservation(reservation1) - @front_desk.add_reservation(reservation2) - @front_desk.add_reservation(reservation3) - end + @front_desk.add_reservation(@reservation1) + @front_desk.add_reservation(@reservation2) + @front_desk.add_reservation(@reservation3) - it "returns an array of Reservations" do start_date = Date.new(2020,3,2) end_date = Date.new(2020,3,5) - selected_reservations = @front_desk.reservations_by_room(15, start_date, end_date) - - expect(selected_reservations).must_be_kind_of Array - expect(selected_reservations.first).must_be_kind_of Hotel::Reservation + @selected_reservations = @front_desk.reservations_by_room(15, start_date, end_date) end - it "can access the list of reservations for a specified room and a given date range" do + it "returns an array of Reservations" do + expect(@selected_reservations).must_be_kind_of Array + expect(@selected_reservations.first).must_be_kind_of Hotel::Reservation + end + it "can access the list of reservations for a specified room and a given date range" do + expect(@front_desk.reservations.length).must_equal 3 # ensure that the method isn't just returning the @reservations array + expect(@selected_reservations.length).must_equal 2 + expect(@selected_reservations.first).must_equal @reservation1 + expect(@selected_reservations.last).must_equal @reservation3 end end From 53a82f1acfce71841e99f60af2a2c6da3da30e40 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Tue, 3 Mar 2020 15:43:44 -0800 Subject: [PATCH 023/100] cleans up tests for #date_range --- test/reservation_test.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 0d92fae1d..2a8d8387a 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -30,20 +30,20 @@ end describe "#date_range" do - it "returns an array with the correct start and end values" do - range = @reservation.date_range - expect(range).must_be_kind_of Array - expect(range.first).must_equal @reservation.start_date - expect(range.last).must_equal @reservation.end_date + before do + @range = @reservation.date_range + end + + it "returns an array with the correct length and start/end values" do + expect(@range).must_be_kind_of Array + expect(@range.length).must_equal 4 + expect(@range.first).must_equal @reservation.start_date + expect(@range.last).must_equal @reservation.end_date end it "returns all dates between the start and end dates" do - # tidy up because date objects can be compared - range = @reservation.date_range - second_date = range[1].strftime("%b %d %Y") - third_date = range[2].strftime("%b %d %Y") - expect(second_date).must_equal "Mar 03 2020" - expect(third_date).must_equal "Mar 04 2020" + expect(@range[1]).must_equal @reservation.start_date + 1 + expect(@range[2]).must_equal @reservation.start_date + 2 end end From 3b79d8260928f6c87b8999ae99c4284cdbd7b9ed Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 10:17:42 -0800 Subject: [PATCH 024/100] refactors #reservation_by_room method for efficiency --- lib/front_desk.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index ca85cd36e..cf59362c8 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -25,11 +25,18 @@ def reserve_room(start_date, end_date) end def reservations_by_room(room, start_date, end_date) - return @reservations.select { |reservation| reservation.room == room && reservation.date_range.include?(start_date) || reservation.date_range.include?(end_date) } + # return @reservations.select { |reservation| reservation.room == room && reservation.date_range.include?(start_date) || reservation.date_range.include?(end_date) } + return @reservations.select { |reservation| reservation.room == room && reservation.start_date >= start_date && reservation.start_date <= end_date } end def reservations_by_date(date) return @reservations.select { |reservation| reservation.start_date == date } end + + # I can view a list of rooms that are not reserved for a given date range, so that I can see all available rooms for that day + + # I can make a reservation of a room for a given date range, and that room will not be part of any other reservation overlapping that date range + + # I want an exception raised if I try to reserve a room during a date range when all rooms are reserved, so that I cannot make two reservations for the same room that overlap by date end end From 37d2fd83c0a6832bf581cca7b744a177dae1840b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 10:25:24 -0800 Subject: [PATCH 025/100] adds test to check whether it can access the list of all reservations --- test/front_desk_test.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 93060fa6c..0854d9e2b 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -16,6 +16,11 @@ expect(rooms.first).must_equal 1 expect(rooms.last).must_equal 20 end + + it "can access the list of all reservations" do + reservations = @front_desk.reservations + expect(reservations).must_be_kind_of Array + end end describe "#add_reservation" do @@ -148,4 +153,8 @@ expect(@selected_reservations.last).must_equal @reservation2 end end + + describe "#" do + + end end \ No newline at end of file From 31d256d8af21415fabafd087f53b7036406e9eaa Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 11:15:15 -0800 Subject: [PATCH 026/100] adds tests for #overlap? method --- test/reservation_test.rb | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 2a8d8387a..d25368e68 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -26,7 +26,7 @@ end describe "Reservation property" do - + end describe "#date_range" do @@ -53,6 +53,41 @@ end end + describe "#overlap?" do + before do + @start_date = Date.new(2020,3,2) + @end_date = Date.new(2020,3,5) + end + + it "accurately checks whether dates overlap with date range when start_date and end_date are both within the range" do + expect(@reservation.overlap?(@start_date, @end_date)).must_equal true + end + + it "checks whether dates overlap with date range when start_date and end_date are both outside the range" do + start_date = @start_date + 8 + end_date = @start_date + 8 + expect(@reservation.overlap?(start_date, end_date)).must_equal false + end + + it "checks whether dates overlap with date range when start_date is within the range but end_date is outside the range" do + start_date = @start_date + 1 + end_date = @start_date + 1 + expect(@reservation.overlap?(start_date, end_date)).must_equal true + end + + it "checks whether dates overlap with date range when the start_date is outside the range but end_date is within the range" do + start_date = @start_date - 1 + end_date = @start_date - 1 + expect(@reservation.overlap?(start_date, end_date)).must_equal true + end + + it "ignores reservations whose start_date is equal to the end_date in the range (new check-ins can happen on the same day as check-outs)" do + start_date = @start_date + 3 + end_date = @start_date + 3 + expect(@reservation.overlap?(start_date, end_date)).must_equal false + end + end + describe "#total_cost" do it "calculates the total cost accurately" do expect(@reservation.total_cost).must_equal 600.0 From 39b6c938d90326b5e86d0aec3c8b98655e068c4b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 16:15:35 -0800 Subject: [PATCH 027/100] fixes #reservations_by_room so that it returns reservations with a start_date before the range_start, adds test --- lib/front_desk.rb | 7 +++---- test/front_desk_test.rb | 21 ++++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index cf59362c8..cf8f51d77 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -24,13 +24,12 @@ def reserve_room(start_date, end_date) return new_reservation end - def reservations_by_room(room, start_date, end_date) - # return @reservations.select { |reservation| reservation.room == room && reservation.date_range.include?(start_date) || reservation.date_range.include?(end_date) } - return @reservations.select { |reservation| reservation.room == room && reservation.start_date >= start_date && reservation.start_date <= end_date } + def reservations_by_room(room, range_start, range_end) + return @reservations.select { |reservation| reservation.room == room && reservation.start_date <= range_end && reservation.end_date >= range_start } end def reservations_by_date(date) - return @reservations.select { |reservation| reservation.start_date == date } + return @reservations.select { |reservation| reservation.date_range.include?(date) } end # I can view a list of rooms that are not reserved for a given date range, so that I can see all available rooms for that day diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 0854d9e2b..2793a0adf 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -92,13 +92,20 @@ start_date: Date.new(2020,3,5), end_date: Date.new(2020,3,10) ) + @reservation4 = Hotel::Reservation.new( + id: 3, + room: 15, + start_date: Date.new(2020,3,1), + end_date: Date.new(2020,3,2) + ) @front_desk.add_reservation(@reservation1) @front_desk.add_reservation(@reservation2) @front_desk.add_reservation(@reservation3) + @front_desk.add_reservation(@reservation4) - start_date = Date.new(2020,3,2) - end_date = Date.new(2020,3,5) - @selected_reservations = @front_desk.reservations_by_room(15, start_date, end_date) + range_start = Date.new(2020,3,2) + range_end = Date.new(2020,3,5) + @selected_reservations = @front_desk.reservations_by_room(15, range_start, range_end) end it "returns an array of Reservations" do @@ -107,10 +114,10 @@ end it "can access the list of reservations for a specified room and a given date range" do - expect(@front_desk.reservations.length).must_equal 3 # ensure that the method isn't just returning the @reservations array - expect(@selected_reservations.length).must_equal 2 + expect(@front_desk.reservations.length).must_equal 4 # ensure that the method isn't just returning the @reservations array + expect(@selected_reservations.length).must_equal 3 expect(@selected_reservations.first).must_equal @reservation1 - expect(@selected_reservations.last).must_equal @reservation3 + expect(@selected_reservations.last).must_equal @reservation4 end end @@ -125,7 +132,7 @@ @reservation2 = Hotel::Reservation.new( id: 2, room: 20, - start_date: Date.new(2020,3,2), + start_date: Date.new(2020,3,1), end_date: Date.new(2020,3,4) ) @reservation3 = Hotel::Reservation.new( From 030b0d33c01adf981dc400227fc9e52c84d1ac0b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 16:18:27 -0800 Subject: [PATCH 028/100] changes test and variable names for better readability --- test/reservation_test.rb | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index d25368e68..91af01448 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -59,32 +59,33 @@ @end_date = Date.new(2020,3,5) end - it "accurately checks whether dates overlap with date range when start_date and end_date are both within the range" do + it "returns true when start_date and end_date are both within the range" do expect(@reservation.overlap?(@start_date, @end_date)).must_equal true end - it "checks whether dates overlap with date range when start_date and end_date are both outside the range" do - start_date = @start_date + 8 - end_date = @start_date + 8 - expect(@reservation.overlap?(start_date, end_date)).must_equal false + it "returns false when start_date and end_date are both outside the range" do + range_start = @start_date + 8 + range_end = @start_date + 8 + expect(@reservation.overlap?(range_start, range_end)).must_equal false end - it "checks whether dates overlap with date range when start_date is within the range but end_date is outside the range" do - start_date = @start_date + 1 - end_date = @start_date + 1 - expect(@reservation.overlap?(start_date, end_date)).must_equal true + it "returns true when start_date is within the range but end_date is outside the range" do + range_start = @start_date + 1 + range_end = @start_date + 1 + expect(@reservation.overlap?(range_start, range_end)).must_equal true end - it "checks whether dates overlap with date range when the start_date is outside the range but end_date is within the range" do - start_date = @start_date - 1 - end_date = @start_date - 1 - expect(@reservation.overlap?(start_date, end_date)).must_equal true + it "returns true when the start_date is outside the range but end_date is within the range" do + range_start = @start_date - 1 + range_end = @start_date - 1 + expect(@reservation.overlap?(range_start, range_end)).must_equal true end - - it "ignores reservations whose start_date is equal to the end_date in the range (new check-ins can happen on the same day as check-outs)" do - start_date = @start_date + 3 - end_date = @start_date + 3 - expect(@reservation.overlap?(start_date, end_date)).must_equal false + + # new check-ins can happen on the same day as check-outs + it "ignores reservations whose start_date is equal to the end_date in the range" do + range_start = @start_date + 3 + range_end = @start_date + 3 + expect(@reservation.overlap?(range_start, range_end)).must_equal false end end From d3328f890b44892ae14d4a6db64bd5ab11182e0c Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 16:21:26 -0800 Subject: [PATCH 029/100] fixes error with range_end in the #overlap? tests --- test/reservation_test.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 91af01448..0911f9aea 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -65,26 +65,26 @@ it "returns false when start_date and end_date are both outside the range" do range_start = @start_date + 8 - range_end = @start_date + 8 + range_end = @end_date + 8 expect(@reservation.overlap?(range_start, range_end)).must_equal false end it "returns true when start_date is within the range but end_date is outside the range" do range_start = @start_date + 1 - range_end = @start_date + 1 + range_end = @end_date + 1 expect(@reservation.overlap?(range_start, range_end)).must_equal true end it "returns true when the start_date is outside the range but end_date is within the range" do range_start = @start_date - 1 - range_end = @start_date - 1 + range_end = @end_date - 1 expect(@reservation.overlap?(range_start, range_end)).must_equal true end # new check-ins can happen on the same day as check-outs it "ignores reservations whose start_date is equal to the end_date in the range" do range_start = @start_date + 3 - range_end = @start_date + 3 + range_end = @end_date + 3 expect(@reservation.overlap?(range_start, range_end)).must_equal false end end From 71f6fa0c53396d1e5543d82c20d8e4b1f80a949b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 16:21:54 -0800 Subject: [PATCH 030/100] adds #overlap? method --- lib/reservation.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/reservation.rb b/lib/reservation.rb index a57a87eb6..571f806f6 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -22,6 +22,10 @@ def nights return @end_date - @start_date end + def overlap?(range_start, range_end) + return @start_date < range_end && @end_date > range_start + end + def total_cost return nights * 200.0 end From ba4e1022571245ace8fb9c1df684ef72fd547267 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 16:39:57 -0800 Subject: [PATCH 031/100] adds method and tests for #find_available_room --- lib/front_desk.rb | 3 +++ test/front_desk_test.rb | 42 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index cf8f51d77..6802094fd 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -33,6 +33,9 @@ def reservations_by_date(date) end # I can view a list of rooms that are not reserved for a given date range, so that I can see all available rooms for that day + def find_available_room(range_start, range_end) + + end # I can make a reservation of a room for a given date range, and that room will not be part of any other reservation overlapping that date range diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 2793a0adf..eb6b27115 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -161,7 +161,47 @@ end end - describe "#" do + describe "#find_available_room" do + before do + @reservation1 = Hotel::Reservation.new( + id: 1, + room: 15, + start_date: Date.new(2020,2,27), + end_date: Date.new(2020,3,2) + ) + @reservation2 = Hotel::Reservation.new( + id: 2, + room: 20, + start_date: Date.new(2020,3,1), + end_date: Date.new(2020,3,4) + ) + @reservation3 = Hotel::Reservation.new( + id: 3, + room: 3, + start_date: Date.new(2020,3,5), + end_date: Date.new(2020,3,10) + ) + @front_desk.add_reservation(@reservation1) + @front_desk.add_reservation(@reservation2) + @front_desk.add_reservation(@reservation3) + + range_start = Date.new(2020,3,2) + range_end = Date.new(2020,3,5) + @available_rooms = @front_desk.find_available_room(range_start, range_end) + end + it "returns an array of valid room numbers" do + expect(@available_rooms).must_be_kind_of Array + expect(@available_rooms.first).must_be_kind_of Integer + expect(@front_desk.rooms).must_include @available_rooms.first + expect(@front_desk.rooms).must_include @available_rooms.last + end + + it "can view a list of rooms that are not reserved for a given date range" do + expect(@front_desk.reservations.length).must_equal 3 # ensure that the method isn't just returning the @reservations array + expect(@available_rooms.length).must_equal 2 + expect(@available_rooms.first).must_equal 15 + expect(@available_rooms.last).must_equal 3 + end end end \ No newline at end of file From 7f3d5ffbc404701eff120adedf60e361d247c37e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 16:44:34 -0800 Subject: [PATCH 032/100] adds test for #overlap? method --- test/reservation_test.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 0911f9aea..45323cd85 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -87,6 +87,13 @@ range_end = @end_date + 3 expect(@reservation.overlap?(range_start, range_end)).must_equal false end + + # check-outs can happen on the same day as a new check-in + it "ignores reservations whose end_date is equal to the start_date in the range" do + range_start = @start_date - 3 + range_end = @end_date - 3 + expect(@reservation.overlap?(range_start, range_end)).must_equal false + end end describe "#total_cost" do From 2aab0153028ccd54558c99e4c1fba90b6856021e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 18:16:57 -0800 Subject: [PATCH 033/100] amends tests for #find_available_room, adds a new test variable, adds a new test when there are no reservations --- test/front_desk_test.rb | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index eb6b27115..e5bfa92ed 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -181,9 +181,16 @@ start_date: Date.new(2020,3,5), end_date: Date.new(2020,3,10) ) + @reservation4 = Hotel::Reservation.new( + id: 2, + room: 9, + start_date: Date.new(2020,3,4), + end_date: Date.new(2020,3,10) + ) @front_desk.add_reservation(@reservation1) @front_desk.add_reservation(@reservation2) @front_desk.add_reservation(@reservation3) + @front_desk.add_reservation(@reservation4) range_start = Date.new(2020,3,2) range_end = Date.new(2020,3,5) @@ -197,11 +204,16 @@ expect(@front_desk.rooms).must_include @available_rooms.last end - it "can view a list of rooms that are not reserved for a given date range" do - expect(@front_desk.reservations.length).must_equal 3 # ensure that the method isn't just returning the @reservations array - expect(@available_rooms.length).must_equal 2 - expect(@available_rooms.first).must_equal 15 - expect(@available_rooms.last).must_equal 3 + it "returns a list of rooms that are not reserved for a given date range" do + expect(@available_rooms.length).must_equal 18 + expect(@available_rooms).must_include 15 + expect(@available_rooms).must_include 3 + end + + it "returns all rooms if there are no Reservations" do + @front_desk.reservations.clear + expect(@front_desk.reservations.length).must_equal 0 + expect(@available_rooms).must_equal @front_desk.rooms end end end \ No newline at end of file From f796015d692c5103d9241844ba92aff63c3a1152 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 18:17:20 -0800 Subject: [PATCH 034/100] adds #find_available_room method --- lib/front_desk.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 6802094fd..5e0e6861d 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -24,17 +24,24 @@ def reserve_room(start_date, end_date) return new_reservation end + # use less than/greater than instead of include? method to lower complexity def reservations_by_room(room, range_start, range_end) - return @reservations.select { |reservation| reservation.room == room && reservation.start_date <= range_end && reservation.end_date >= range_start } + return @reservations.select { |reservation| + reservation.room == room && reservation.start_date <= range_end && reservation.end_date >= range_start + } end def reservations_by_date(date) - return @reservations.select { |reservation| reservation.date_range.include?(date) } + return @reservations.select { |reservation| + reservation.date_range.include?(date) + } end - # I can view a list of rooms that are not reserved for a given date range, so that I can see all available rooms for that day def find_available_room(range_start, range_end) + return @rooms if @reservations == [] + @reservations.each { |reservation| @rooms.delete(reservation.room) if reservation.overlap?(range_start, range_end) } + return @rooms end # I can make a reservation of a room for a given date range, and that room will not be part of any other reservation overlapping that date range From 331bf77dbd0d546f89481735b617d8c8d00bd1e1 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 20:21:20 -0800 Subject: [PATCH 035/100] adds a test for #reserve_room to check that an exception is thrown when no rooms are available, refactors other tests --- test/front_desk_test.rb | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index e5bfa92ed..0a5d3f10f 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -46,13 +46,19 @@ end_date = Date.new(2020,3,5) @reservation1 = @front_desk.reserve_room(start_date, end_date) @reservation2 = @front_desk.reserve_room(start_date + 5, end_date + 5) - @reservation3 = @front_desk.reserve_room(start_date + 5, end_date + 5) + @reservation3 = @front_desk.reserve_room(start_date + 10, end_date + 10) end it "can reserve a room given a start date and an end date" do expect(@reservation1).must_be_kind_of Hotel::Reservation end + it "throws an exception if there are no rooms available" do + @front_desk.rooms.clear + expect(@front_desk.rooms.length).must_equal 0 + expect{@front_desk.reserve_room(Date.new(2020,3,2), Date.new(2020,3,5))}.must_raise ArgumentError + end + it "assigns a unique id number to each Reservation" do expect(@reservation1.id).must_equal 1 expect(@reservation2.id).must_equal 2 @@ -103,9 +109,7 @@ @front_desk.add_reservation(@reservation3) @front_desk.add_reservation(@reservation4) - range_start = Date.new(2020,3,2) - range_end = Date.new(2020,3,5) - @selected_reservations = @front_desk.reservations_by_room(15, range_start, range_end) + @selected_reservations = @front_desk.reservations_by_room(15, Date.new(2020,3,2), Date.new(2020,3,5)) end it "returns an array of Reservations" do @@ -192,9 +196,7 @@ @front_desk.add_reservation(@reservation3) @front_desk.add_reservation(@reservation4) - range_start = Date.new(2020,3,2) - range_end = Date.new(2020,3,5) - @available_rooms = @front_desk.find_available_room(range_start, range_end) + @available_rooms = @front_desk.find_available_room(Date.new(2020,3,2), Date.new(2020,3,5)) end it "returns an array of valid room numbers" do @@ -212,8 +214,9 @@ it "returns all rooms if there are no Reservations" do @front_desk.reservations.clear + available_rooms = @front_desk.find_available_room(Date.new(2020,3,2), Date.new(2020,3,5)) expect(@front_desk.reservations.length).must_equal 0 - expect(@available_rooms).must_equal @front_desk.rooms + expect(available_rooms).must_equal @front_desk.rooms end end end \ No newline at end of file From abbe760f42deffe9e302ab68e266e06b8513782e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 20:23:31 -0800 Subject: [PATCH 036/100] calls #find_available_room in the #reserve_room method, throws an exception when no rooms are available, fixes #find_available_room so original @rooms array is not changed --- lib/front_desk.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 5e0e6861d..d163bc1bc 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -14,13 +14,17 @@ def add_reservation(reservation) end def reserve_room(start_date, end_date) + available_rooms = find_available_room(start_date, end_date) + raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] + new_reservation = Hotel::Reservation.new( id: @reservations.length + 1, - room: @rooms.sample, # placeholder + room: available_rooms.first, start_date: start_date, end_date: end_date ) add_reservation(new_reservation) + return new_reservation end @@ -40,12 +44,9 @@ def reservations_by_date(date) def find_available_room(range_start, range_end) return @rooms if @reservations == [] - @reservations.each { |reservation| @rooms.delete(reservation.room) if reservation.overlap?(range_start, range_end) } - return @rooms + available_rooms = @rooms.dup + @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.overlap?(range_start, range_end) } + return available_rooms end - - # I can make a reservation of a room for a given date range, and that room will not be part of any other reservation overlapping that date range - - # I want an exception raised if I try to reserve a room during a date range when all rooms are reserved, so that I cannot make two reservations for the same room that overlap by date end end From 71fa3c9e76b23b629fdbd0428c47fd7d8e97a155 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 20:27:08 -0800 Subject: [PATCH 037/100] refactors #find_available_room method --- lib/front_desk.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index d163bc1bc..fbc85701a 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -42,8 +42,6 @@ def reservations_by_date(date) end def find_available_room(range_start, range_end) - return @rooms if @reservations == [] - available_rooms = @rooms.dup @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.overlap?(range_start, range_end) } return available_rooms From 9abeb0b6d657267a9077fc34e56be41895e96777 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Wed, 4 Mar 2020 21:10:46 -0800 Subject: [PATCH 038/100] adds a test to check attributes and data types during Reservation instantiation --- test/reservation_test.rb | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 45323cd85..7ad2bcd35 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -23,10 +23,17 @@ end_date: Date.new(2020,3,2) ) }.must_raise ArgumentError end - end - describe "Reservation property" do - + it "is set up for specific attributes and data types" do + [:id, :room, :start_date, :end_date].each do |attribute| + expect(@reservation).must_respond_to attribute + end + + expect(@reservation.id).must_be_kind_of Integer + expect(@reservation.room).must_be_kind_of Integer + expect(@reservation.start_date).must_be_kind_of Date + expect(@reservation.end_date).must_be_kind_of Date + end end describe "#date_range" do From a5d29a1075a3722e7024bb9bd49281a22dab864e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 10:23:44 -0800 Subject: [PATCH 039/100] fixes small numerical errors with reservation ids in the test arrangements for #reservations_by_room and #find_available_room --- test/front_desk_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 0a5d3f10f..ba26bcc1a 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -99,7 +99,7 @@ end_date: Date.new(2020,3,10) ) @reservation4 = Hotel::Reservation.new( - id: 3, + id: 4, room: 15, start_date: Date.new(2020,3,1), end_date: Date.new(2020,3,2) @@ -186,7 +186,7 @@ end_date: Date.new(2020,3,10) ) @reservation4 = Hotel::Reservation.new( - id: 2, + id: 4, room: 9, start_date: Date.new(2020,3,4), end_date: Date.new(2020,3,10) From 86db0ec44be9b63dd86bf0efbadf0f9f62643fed Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 10:30:25 -0800 Subject: [PATCH 040/100] adds a comment about a way to refactor #find_available_rooms so its more space efficient --- lib/front_desk.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index fbc85701a..089167b20 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -45,6 +45,9 @@ def find_available_room(range_start, range_end) available_rooms = @rooms.dup @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.overlap?(range_start, range_end) } return available_rooms + # if a room class is added, this method can be simplified in terms of space complexity + # return @rooms if @reservations = [] + # return @rooms.map { |room| room.num unless room.reservations.overlap?(range_start, range_end) } end end end From b87155ebaf03b06e8f2826ce79e5f606e0110658 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 13:25:26 -0800 Subject: [PATCH 041/100] adds a DateRange class and tests instantiation --- lib/date_range.rb | 12 ++++++++++++ test/date_range_test.rb | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 lib/date_range.rb create mode 100644 test/date_range_test.rb diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..a3e69c7ca --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,12 @@ +module Hotel + class DateRange + attr_accessor :start_date, :end_date + + def initialize(start_date:, end_date:) + @start_date = start_date + @end_date = end_date + + raise ArgumentError.new("Invalid date range!") if @start_date > @end_date + end + end +end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100644 index 000000000..0b198bcb5 --- /dev/null +++ b/test/date_range_test.rb @@ -0,0 +1,32 @@ +require_relative 'test_helper' + +describe "DateRange class" do + before do + @date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + end + + describe "DateRange instantiation" do + it "is an instance of DateRange" do + expect(@reservation).must_be_kind_of Hotel::Reservation + end + + it "is set up for specific attributes and data types" do + [:start_date, :end_date].each do |attribute| + expect(@reservation).must_respond_to attribute + end + + expect(@reservation.start_date).must_be_kind_of Date + expect(@reservation.end_date).must_be_kind_of Date + end + + it "throws an exception when an invalid date range is provided" do + expect{ Hotel::DateRange.new( + start_date: Date.new(2020,3,5), + end_date: Date.new(2020,3,2) + ) }.must_raise ArgumentError + end + end + \ No newline at end of file From db6f02c97d1353eec7f2079a1cb54f5ddb63bd23 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 14:23:44 -0800 Subject: [PATCH 042/100] transfers #nights method from Reservation to DateRange and updates variable names --- lib/date_range.rb | 10 ++++++++-- test/date_range_test.rb | 18 +++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index a3e69c7ca..6e182a4e6 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,12 +1,18 @@ module Hotel - class DateRange + class DateRange < Range + attr_reader :dates attr_accessor :start_date, :end_date def initialize(start_date:, end_date:) @start_date = start_date @end_date = end_date + @dates = (start_date..end_date) raise ArgumentError.new("Invalid date range!") if @start_date > @end_date - end + end + + def nights + return @end_date - @start_date + end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 0b198bcb5..3d10ad31c 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -10,16 +10,17 @@ describe "DateRange instantiation" do it "is an instance of DateRange" do - expect(@reservation).must_be_kind_of Hotel::Reservation + expect(@date_range).must_be_kind_of Hotel::DateRange end it "is set up for specific attributes and data types" do - [:start_date, :end_date].each do |attribute| - expect(@reservation).must_respond_to attribute + [:start_date, :end_date, :dates].each do |attribute| + expect(@date_range).must_respond_to attribute end - expect(@reservation.start_date).must_be_kind_of Date - expect(@reservation.end_date).must_be_kind_of Date + expect(@date_range.start_date).must_be_kind_of Date + expect(@date_range.end_date).must_be_kind_of Date + expect(@date_range.dates).must_be_kind_of Range end it "throws an exception when an invalid date range is provided" do @@ -29,4 +30,11 @@ ) }.must_raise ArgumentError end end + + describe "#nights" do + it "calculates the nights of stay accurately" do + expect(@date_range.nights).must_equal 3 + end + end +end \ No newline at end of file From a3e4a2f2b91bafa7f3425d1fe84093c406da3c8c Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 14:36:37 -0800 Subject: [PATCH 043/100] transfers #overlap? method and tests, updates variable names --- lib/date_range.rb | 4 ++++ test/date_range_test.rb | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/lib/date_range.rb b/lib/date_range.rb index 6e182a4e6..8f98fdf1d 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -14,5 +14,9 @@ def initialize(start_date:, end_date:) def nights return @end_date - @start_date end + + def overlap?(other) + return @start_date < other.end_date && @end_date > other.start_date + end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 3d10ad31c..4dbfc5277 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -36,5 +36,50 @@ expect(@date_range.nights).must_equal 3 end end + + describe "#overlap?" do + before do + @date_range2 = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + end + + it "returns true when start_date and end_date are both within the range" do + expect(@date_range.overlap?(@date_range2)).must_equal true + end + + it "returns false when start_date and end_date are both outside the range" do + @date_range2.start_date += 8 + @date_range2.end_date += 8 + expect(@date_range.overlap?(@date_range2)).must_equal false + end + + it "returns true when start_date is within the range but end_date is outside the range" do + @date_range2.start_date += 1 + @date_range2.end_date += 1 + expect(@date_range.overlap?(@date_range2)).must_equal true + end + + it "returns true when the start_date is outside the range but end_date is within the range" do + @date_range2.start_date -= 1 + @date_range2.end_date -= 1 + expect(@date_range.overlap?(@date_range2)).must_equal true + end + + # new check-ins can happen on the same day as check-outs + it "ignores reservations whose start_date is equal to the end_date in the range" do + @date_range2.start_date += 3 + @date_range2.end_date += 3 + expect(@date_range.overlap?(@date_range2)).must_equal false + end + + # check-outs can happen on the same day as a new check-in + it "ignores reservations whose end_date is equal to the start_date in the range" do + @date_range2.start_date -= 3 + @date_range2.end_date -= 3 + expect(@date_range.overlap?(@date_range2)).must_equal false + end + end end \ No newline at end of file From 4d9eaf18552cb87e830ece78737cb828f46483b1 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 14:42:54 -0800 Subject: [PATCH 044/100] removes unnecessary @dates instance variable --- lib/date_range.rb | 4 +--- test/date_range_test.rb | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 8f98fdf1d..3c636b0a6 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,13 +1,11 @@ module Hotel class DateRange < Range - attr_reader :dates attr_accessor :start_date, :end_date def initialize(start_date:, end_date:) @start_date = start_date @end_date = end_date - @dates = (start_date..end_date) - + raise ArgumentError.new("Invalid date range!") if @start_date > @end_date end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 4dbfc5277..96a31b012 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -14,13 +14,12 @@ end it "is set up for specific attributes and data types" do - [:start_date, :end_date, :dates].each do |attribute| + [:start_date, :end_date].each do |attribute| expect(@date_range).must_respond_to attribute end expect(@date_range.start_date).must_be_kind_of Date expect(@date_range.end_date).must_be_kind_of Date - expect(@date_range.dates).must_be_kind_of Range end it "throws an exception when an invalid date range is provided" do From 3966ea39709538559e130a8dfe8868a57f7af3f3 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 14:54:01 -0800 Subject: [PATCH 045/100] adds #include? method and tests, removes inheritance from Range class --- lib/date_range.rb | 6 +++++- test/date_range_test.rb | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 3c636b0a6..3502a55d4 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,5 +1,5 @@ module Hotel - class DateRange < Range + class DateRange attr_accessor :start_date, :end_date def initialize(start_date:, end_date:) @@ -16,5 +16,9 @@ def nights def overlap?(other) return @start_date < other.end_date && @end_date > other.start_date end + + def include?(date) + return (@start_date..@end_date).include?(date) + end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 96a31b012..1857733d1 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -80,5 +80,17 @@ expect(@date_range.overlap?(@date_range2)).must_equal false end end + + describe "#include?" do + it "returns true when the date given is within the range" do + date = Date.new(2020,3,3) + expect(@date_range.include?(date)).must_equal true + end + + it "returns false when the date given is outside the range" do + date = Date.new(2020,3,10) + expect(@date_range.include?(date)).must_equal false + end + end end \ No newline at end of file From 586651539fc420f8eb5322d464337589ebee4b30 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 15:40:36 -0800 Subject: [PATCH 046/100] removes methods and test that is redundant with DateRange class, revises instantiation --- lib/reservation.rb | 26 ++++-------- test/reservation_test.rb | 88 ++++------------------------------------ 2 files changed, 15 insertions(+), 99 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 571f806f6..8f2115477 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,33 +1,21 @@ require 'date' +require_relative 'date_range' module Hotel class Reservation - attr_reader :id, :room - attr_accessor :start_date, :end_date + attr_reader :id, :room, :date_range def initialize(id:, room:, start_date:, end_date:) @id = id @room = room - @start_date = start_date - @end_date = end_date - - raise ArgumentError.new("Invalid date range!") if @start_date > @end_date + @date_range = Hotel::DateRange.new( + start_date: start_date, + end_date: end_date + ) end - - def date_range - return (@start_date..@end_date).to_a - end - - def nights - return @end_date - @start_date - end - - def overlap?(range_start, range_end) - return @start_date < range_end && @end_date > range_start - end def total_cost - return nights * 200.0 + return @date_range.nights * 200.0 # this needs to be changed to account for the discounted rate in hotel blocks end end end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 7ad2bcd35..4a47dfecd 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -15,97 +15,25 @@ expect(@reservation).must_be_kind_of Hotel::Reservation end - it "throws an exception when an invalid date range is provided" do - expect{ Hotel::Reservation.new( - id: 1, - room: 15, - start_date: Date.new(2020,3,5), - end_date: Date.new(2020,3,2) - ) }.must_raise ArgumentError - end - it "is set up for specific attributes and data types" do - [:id, :room, :start_date, :end_date].each do |attribute| + [:id, :room, :date_range].each do |attribute| expect(@reservation).must_respond_to attribute end expect(@reservation.id).must_be_kind_of Integer expect(@reservation.room).must_be_kind_of Integer - expect(@reservation.start_date).must_be_kind_of Date - expect(@reservation.end_date).must_be_kind_of Date + expect(@reservation.date_range).must_be_kind_of Hotel::DateRange end end - describe "#date_range" do - before do - @range = @reservation.date_range - end - - it "returns an array with the correct length and start/end values" do - expect(@range).must_be_kind_of Array - expect(@range.length).must_equal 4 - expect(@range.first).must_equal @reservation.start_date - expect(@range.last).must_equal @reservation.end_date - end - - it "returns all dates between the start and end dates" do - expect(@range[1]).must_equal @reservation.start_date + 1 - expect(@range[2]).must_equal @reservation.start_date + 2 - end - end - - describe "#nights" do - it "calculates the nights of stay accurately" do - expect(@reservation.nights).must_equal 3 - end - end - - describe "#overlap?" do - before do - @start_date = Date.new(2020,3,2) - @end_date = Date.new(2020,3,5) - end - - it "returns true when start_date and end_date are both within the range" do - expect(@reservation.overlap?(@start_date, @end_date)).must_equal true - end - - it "returns false when start_date and end_date are both outside the range" do - range_start = @start_date + 8 - range_end = @end_date + 8 - expect(@reservation.overlap?(range_start, range_end)).must_equal false - end - - it "returns true when start_date is within the range but end_date is outside the range" do - range_start = @start_date + 1 - range_end = @end_date + 1 - expect(@reservation.overlap?(range_start, range_end)).must_equal true - end - - it "returns true when the start_date is outside the range but end_date is within the range" do - range_start = @start_date - 1 - range_end = @end_date - 1 - expect(@reservation.overlap?(range_start, range_end)).must_equal true - end - - # new check-ins can happen on the same day as check-outs - it "ignores reservations whose start_date is equal to the end_date in the range" do - range_start = @start_date + 3 - range_end = @end_date + 3 - expect(@reservation.overlap?(range_start, range_end)).must_equal false - end - - # check-outs can happen on the same day as a new check-in - it "ignores reservations whose end_date is equal to the start_date in the range" do - range_start = @start_date - 3 - range_end = @end_date - 3 - expect(@reservation.overlap?(range_start, range_end)).must_equal false - end - end - describe "#total_cost" do - it "calculates the total cost accurately" do + it "accurately calculates the total cost for single rooms" do expect(@reservation.total_cost).must_equal 600.0 end + + it "accurately calculates the total cost for hotel blocks" do + # @ block = Hotel::Block.new() + # expect(@reservation.total_cost).must_equal + end end end \ No newline at end of file From a35d80084a344eb8ae157efe7fe88f54be8fc19a Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 16:22:27 -0800 Subject: [PATCH 047/100] changes #reservations_by_room method and tests so that they work with the DateRange class --- lib/front_desk.rb | 5 ++--- test/front_desk_test.rb | 14 ++++++++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 089167b20..efcb216b5 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -28,10 +28,9 @@ def reserve_room(start_date, end_date) return new_reservation end - # use less than/greater than instead of include? method to lower complexity - def reservations_by_room(room, range_start, range_end) + def reservations_by_room(room, date_range) return @reservations.select { |reservation| - reservation.room == room && reservation.start_date <= range_end && reservation.end_date >= range_start + reservation.room == room && reservation.date_range.overlap?(date_range) } end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index ba26bcc1a..787a8ca2a 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -54,9 +54,11 @@ end it "throws an exception if there are no rooms available" do + start_date = Date.new(2020,3,2) + end_date = Date.new(2020,3,5) @front_desk.rooms.clear expect(@front_desk.rooms.length).must_equal 0 - expect{@front_desk.reserve_room(Date.new(2020,3,2), Date.new(2020,3,5))}.must_raise ArgumentError + expect{@front_desk.reserve_room(start_date, )}.must_raise ArgumentError end it "assigns a unique id number to each Reservation" do @@ -102,14 +104,18 @@ id: 4, room: 15, start_date: Date.new(2020,3,1), - end_date: Date.new(2020,3,2) + end_date: Date.new(2020,3,3) ) @front_desk.add_reservation(@reservation1) @front_desk.add_reservation(@reservation2) @front_desk.add_reservation(@reservation3) @front_desk.add_reservation(@reservation4) - @selected_reservations = @front_desk.reservations_by_room(15, Date.new(2020,3,2), Date.new(2020,3,5)) + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @selected_reservations = @front_desk.reservations_by_room(15, date_range) end it "returns an array of Reservations" do @@ -119,7 +125,7 @@ it "can access the list of reservations for a specified room and a given date range" do expect(@front_desk.reservations.length).must_equal 4 # ensure that the method isn't just returning the @reservations array - expect(@selected_reservations.length).must_equal 3 + expect(@selected_reservations.length).must_equal 2 expect(@selected_reservations.first).must_equal @reservation1 expect(@selected_reservations.last).must_equal @reservation4 end From 8adbae046fb7223f78ddec7b9613a9a65f38342e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 16:23:34 -0800 Subject: [PATCH 048/100] adds daterange.rb to libs list --- test/test_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 90d436da2..51179bda6 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,5 +13,6 @@ # require_relative your lib files here! require_relative '../lib/reservation' require_relative '../lib/front_desk' +require_relative '../lib/date_range' # In other test files, we will require_relative 'test_helper' \ No newline at end of file From 03cd2994cecf51546784af2b0f86839f57216e3b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 16:28:17 -0800 Subject: [PATCH 049/100] changes #find_available_room method and tests so that it works with the DateRange class --- lib/front_desk.rb | 4 ++-- test/front_desk_test.rb | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index efcb216b5..a131f00ee 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -40,9 +40,9 @@ def reservations_by_date(date) } end - def find_available_room(range_start, range_end) + def find_available_room(date_range) available_rooms = @rooms.dup - @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.overlap?(range_start, range_end) } + @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) } return available_rooms # if a room class is added, this method can be simplified in terms of space complexity # return @rooms if @reservations = [] diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 787a8ca2a..ace47558f 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -202,7 +202,11 @@ @front_desk.add_reservation(@reservation3) @front_desk.add_reservation(@reservation4) - @available_rooms = @front_desk.find_available_room(Date.new(2020,3,2), Date.new(2020,3,5)) + @date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @available_rooms = @front_desk.find_available_room(@date_range) end it "returns an array of valid room numbers" do @@ -220,7 +224,7 @@ it "returns all rooms if there are no Reservations" do @front_desk.reservations.clear - available_rooms = @front_desk.find_available_room(Date.new(2020,3,2), Date.new(2020,3,5)) + available_rooms = @front_desk.find_available_room(@date_range) expect(@front_desk.reservations.length).must_equal 0 expect(available_rooms).must_equal @front_desk.rooms end From d00e780d4adc12b068907c148f49479051ace119 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 16:33:18 -0800 Subject: [PATCH 050/100] revises comment on #find_available_method regarding reducing space complexity --- lib/front_desk.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index a131f00ee..d57082e19 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -41,12 +41,13 @@ def reservations_by_date(date) end def find_available_room(date_range) + return @rooms if @reservations == [] available_rooms = @rooms.dup @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) } return available_rooms # if a room class is added, this method can be simplified in terms of space complexity - # return @rooms if @reservations = [] - # return @rooms.map { |room| room.num unless room.reservations.overlap?(range_start, range_end) } + # return @rooms if @reservations == [] + # return @rooms.select { |room| room.num unless room.reservations.each { |reservation| reservation.date_range.overlap?(date_range) } end end end From 26f86574d60444856e38418259a2857ed7dad555 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 17:05:11 -0800 Subject: [PATCH 051/100] changes #reserve_room method and tests so that they work with DateRange class --- lib/front_desk.rb | 9 +++++---- test/front_desk_test.rb | 28 ++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index d57082e19..b210116d8 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,4 +1,5 @@ require_relative 'reservation' +require_relative 'date_range' module Hotel class FrontDesk @@ -13,15 +14,15 @@ def add_reservation(reservation) @reservations << reservation end - def reserve_room(start_date, end_date) - available_rooms = find_available_room(start_date, end_date) + def reserve_room(date_range) + available_rooms = find_available_room(date_range) raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] new_reservation = Hotel::Reservation.new( id: @reservations.length + 1, room: available_rooms.first, - start_date: start_date, - end_date: end_date + start_date: date_range.start_date, + end_date: date_range.end_date ) add_reservation(new_reservation) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index ace47558f..1121a1466 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -42,11 +42,21 @@ describe "#reserve_room" do before do - start_date = Date.new(2020,3,2) - end_date = Date.new(2020,3,5) - @reservation1 = @front_desk.reserve_room(start_date, end_date) - @reservation2 = @front_desk.reserve_room(start_date + 5, end_date + 5) - @reservation3 = @front_desk.reserve_room(start_date + 10, end_date + 10) + date_range1 = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + date_range2 = Hotel::DateRange.new( + start_date: Date.new(2020,3,7), + end_date: Date.new(2020,3,10) + ) + date_range3 = Hotel::DateRange.new( + start_date: Date.new(2020,3,12), + end_date: Date.new(2020,3,15) + ) + @reservation1 = @front_desk.reserve_room(date_range1) + @reservation2 = @front_desk.reserve_room(date_range2) + @reservation3 = @front_desk.reserve_room(date_range3) end it "can reserve a room given a start date and an end date" do @@ -54,11 +64,13 @@ end it "throws an exception if there are no rooms available" do - start_date = Date.new(2020,3,2) - end_date = Date.new(2020,3,5) @front_desk.rooms.clear + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) expect(@front_desk.rooms.length).must_equal 0 - expect{@front_desk.reserve_room(start_date, )}.must_raise ArgumentError + expect{@front_desk.reserve_room(date_range)}.must_raise ArgumentError end it "assigns a unique id number to each Reservation" do From 2a561de57dc996c01828a27d143cc0be94a5a64c Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 18:04:20 -0800 Subject: [PATCH 052/100] creates a Block class and tests instantiation --- lib/block.rb | 13 +++++++++++++ test/block_test.rb | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 lib/block.rb create mode 100644 test/block_test.rb diff --git a/lib/block.rb b/lib/block.rb new file mode 100644 index 000000000..49e0d8e68 --- /dev/null +++ b/lib/block.rb @@ -0,0 +1,13 @@ +require 'date' +require_relative 'date_range' + +module Hotel + class Block + attr_reader :date_range, :rooms, :rate + + def initialize(start_date:, end_date:, rooms:, rate:) + # I can create a Hotel Block if I give a date range, collection of rooms, and a discounted room rate + end + + end +end \ No newline at end of file diff --git a/test/block_test.rb b/test/block_test.rb new file mode 100644 index 000000000..f29749cd7 --- /dev/null +++ b/test/block_test.rb @@ -0,0 +1,19 @@ +require_relative 'test_helper' + +describe "Block class" do + before do + rooms = (1..5).to_a + @block = Hotel::Block.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5), + rooms: rooms, + rate: 150.0 + ) + end + + describe "Block instantiation" do + it "is an instance of Block" do + expect(@block).must_be_kind_of Hotel::Block + end + end +end \ No newline at end of file From dc157faf721f4a03ac9fb3609554dbb10c5b7d67 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 18:04:39 -0800 Subject: [PATCH 053/100] adds block.rb to libs list --- test/test_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 51179bda6..68ef1c108 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -14,5 +14,6 @@ require_relative '../lib/reservation' require_relative '../lib/front_desk' require_relative '../lib/date_range' +require_relative '../lib/block' # In other test files, we will require_relative 'test_helper' \ No newline at end of file From 676dbb38519b9aaaabd181a661d3a085c8ea6d4e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Fri, 6 Mar 2020 23:19:28 -0800 Subject: [PATCH 054/100] changes #reservations_by_room method so that it includes reservations that start on the first and last days of the range --- lib/front_desk.rb | 5 ++++- test/front_desk_test.rb | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index b210116d8..1bbedd44a 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -31,7 +31,7 @@ def reserve_room(date_range) def reservations_by_room(room, date_range) return @reservations.select { |reservation| - reservation.room == room && reservation.date_range.overlap?(date_range) + reservation.room == room && date_range.each { |date| reservation.date_range.include?(date) } } end @@ -39,6 +39,7 @@ def reservations_by_date(date) return @reservations.select { |reservation| reservation.date_range.include?(date) } + # Wave 3: I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) end def find_available_room(date_range) @@ -49,6 +50,8 @@ def find_available_room(date_range) # if a room class is added, this method can be simplified in terms of space complexity # return @rooms if @reservations == [] # return @rooms.select { |room| room.num unless room.reservations.each { |reservation| reservation.date_range.overlap?(date_range) } + + # Wave 3: Given a specific date, and that a room is set aside in a hotel block for that specific date, I cannot reserve that specific room for that specific date, because it is unavailable end end end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 1121a1466..b4ff19e7a 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -116,7 +116,7 @@ id: 4, room: 15, start_date: Date.new(2020,3,1), - end_date: Date.new(2020,3,3) + end_date: Date.new(2020,3,2) ) @front_desk.add_reservation(@reservation1) @front_desk.add_reservation(@reservation2) @@ -137,7 +137,7 @@ it "can access the list of reservations for a specified room and a given date range" do expect(@front_desk.reservations.length).must_equal 4 # ensure that the method isn't just returning the @reservations array - expect(@selected_reservations.length).must_equal 2 + expect(@selected_reservations.length).must_equal 3 expect(@selected_reservations.first).must_equal @reservation1 expect(@selected_reservations.last).must_equal @reservation4 end From ba9ee7eced429697872c9f8891ae78689ed22f0a Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 10:56:16 -0800 Subject: [PATCH 055/100] adds #each method and test --- lib/date_range.rb | 8 ++++++++ test/date_range_test.rb | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/date_range.rb b/lib/date_range.rb index 3502a55d4..33185a779 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -20,5 +20,13 @@ def overlap?(other) def include?(date) return (@start_date..@end_date).include?(date) end + + def each + index = 0 + while index <= self.nights + yield @start_date + index + index += 1 + end + end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 1857733d1..c2beca3fc 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -92,5 +92,15 @@ expect(@date_range.include?(date)).must_equal false end end + + describe "#each" do + it "iterates through each Date in the range" do + dates = [] + @date_range.each { |date| dates << date } + expect(dates.length).must_equal 4 + expect(dates.first).must_equal Date.new(2020,3,2) + expect(dates.last).must_equal Date.new(2020,3,5) + end + end end \ No newline at end of file From aa4ccbf55a57c88cae83a5a0dc4ed822c73b1f7b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 12:14:06 -0800 Subject: [PATCH 056/100] changes #nights method so it returns an Integer, adds two more tests to #include? method --- lib/date_range.rb | 3 ++- test/date_range_test.rb | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 33185a779..abb5bf50a 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -10,7 +10,7 @@ def initialize(start_date:, end_date:) end def nights - return @end_date - @start_date + return (@end_date - @start_date).to_i end def overlap?(other) @@ -27,6 +27,7 @@ def each yield @start_date + index index += 1 end + # return (@start_date..@end_date).each end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index c2beca3fc..d8982400c 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -31,6 +31,10 @@ end describe "#nights" do + it "returns an Integer" do + expect(@date_range.nights).must_be_kind_of Integer + end + it "calculates the nights of stay accurately" do expect(@date_range.nights).must_equal 3 end @@ -82,6 +86,16 @@ end describe "#include?" do + it "returns true when the date given is at the start of the range" do + date = Date.new(2020,3,2) + expect(@date_range.include?(date)).must_equal true + end + + it "returns true when the date given is at the end of the range" do + date = Date.new(2020,3,5) + expect(@date_range.include?(date)).must_equal true + end + it "returns true when the date given is within the range" do date = Date.new(2020,3,3) expect(@date_range.include?(date)).must_equal true From 554bfccb585fd8c167e8c73b78c7fe51b5a16ab4 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 12:14:47 -0800 Subject: [PATCH 057/100] changes #include? method to a binary search --- lib/date_range.rb | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index abb5bf50a..efeeeabf7 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -18,7 +18,23 @@ def overlap?(other) end def include?(date) - return (@start_date..@end_date).include?(date) + low = 0 + high = self.nights + + return true if @start_date == date || @end_date == date + + while low <= high + mid = (low + high) / 2 + if (@start_date + mid) == date + return true + elsif (@start_date + mid) > date + high = mid - 1 + elsif (@start_date + mid) < date + low = mid + 1 + end + end + + return false end def each From 623bc3ea2847c3e9824b823672b247eaed69220b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 12:56:52 -0800 Subject: [PATCH 058/100] removes #each method and tests --- lib/date_range.rb | 11 +---------- test/date_range_test.rb | 10 ---------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index efeeeabf7..c4f2f86b0 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -14,7 +14,7 @@ def nights end def overlap?(other) - return @start_date < other.end_date && @end_date > other.start_date + return @start_date <= other.end_date && @end_date >= other.start_date end def include?(date) @@ -36,14 +36,5 @@ def include?(date) return false end - - def each - index = 0 - while index <= self.nights - yield @start_date + index - index += 1 - end - # return (@start_date..@end_date).each - end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index d8982400c..ce36568d7 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -106,15 +106,5 @@ expect(@date_range.include?(date)).must_equal false end end - - describe "#each" do - it "iterates through each Date in the range" do - dates = [] - @date_range.each { |date| dates << date } - expect(dates.length).must_equal 4 - expect(dates.first).must_equal Date.new(2020,3,2) - expect(dates.last).must_equal Date.new(2020,3,5) - end - end end \ No newline at end of file From e7b09034f74984a5c1364f587814cef744cee064 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 13:05:35 -0800 Subject: [PATCH 059/100] changes #overlap? method so it returns true for DateRanges whose start_date is the same as the reservation end_date and vice versa --- test/date_range_test.rb | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/date_range_test.rb b/test/date_range_test.rb index ce36568d7..d26f72cb0 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -70,18 +70,16 @@ expect(@date_range.overlap?(@date_range2)).must_equal true end - # new check-ins can happen on the same day as check-outs - it "ignores reservations whose start_date is equal to the end_date in the range" do + it "returns true when the start_date is equal to the end_date in the range" do @date_range2.start_date += 3 @date_range2.end_date += 3 - expect(@date_range.overlap?(@date_range2)).must_equal false + expect(@date_range.overlap?(@date_range2)).must_equal true end - # check-outs can happen on the same day as a new check-in - it "ignores reservations whose end_date is equal to the start_date in the range" do + it "returns true when the end_date is equal to the start_date in the range" do @date_range2.start_date -= 3 @date_range2.end_date -= 3 - expect(@date_range.overlap?(@date_range2)).must_equal false + expect(@date_range.overlap?(@date_range2)).must_equal true end end From c47e6e7037aeeef25ea48013134e81aa69156fb8 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 13:08:14 -0800 Subject: [PATCH 060/100] refactors #reservations_by_room method and fixes #find_available_rooms method so it works with the new DateRange#overlap? method --- lib/front_desk.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 1bbedd44a..c792c2fda 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -31,7 +31,7 @@ def reserve_room(date_range) def reservations_by_room(room, date_range) return @reservations.select { |reservation| - reservation.room == room && date_range.each { |date| reservation.date_range.include?(date) } + reservation.room == room && reservation.date_range.overlap?(date_range) } end @@ -42,12 +42,15 @@ def reservations_by_date(date) # Wave 3: I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) end + # SPACE COMPLEXITY!!! def find_available_room(date_range) return @rooms if @reservations == [] available_rooms = @rooms.dup - @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) } + @reservations.each { |reservation| + available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) && reservation.date_range.start_date != date_range.end_date && reservation.date_range.end_date != date_range.start_date + } return available_rooms - # if a room class is added, this method can be simplified in terms of space complexity + # if a room class is added, this method can be simplified # return @rooms if @reservations == [] # return @rooms.select { |room| room.num unless room.reservations.each { |reservation| reservation.date_range.overlap?(date_range) } From 7e3acf073a96f83acbd0e20b182811a57d01a026 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 14:02:31 -0800 Subject: [PATCH 061/100] adds a :block attribute to the Reservation class --- lib/reservation.rb | 5 +++-- test/reservation_test.rb | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 8f2115477..83b2d9cad 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -3,11 +3,12 @@ module Hotel class Reservation - attr_reader :id, :room, :date_range + attr_reader :id, :room, :block, :date_range - def initialize(id:, room:, start_date:, end_date:) + def initialize(id:, room:, block: false, start_date:, end_date:) @id = id @room = room + @block = block @date_range = Hotel::DateRange.new( start_date: start_date, end_date: end_date diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 4a47dfecd..50171573d 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -16,12 +16,13 @@ end it "is set up for specific attributes and data types" do - [:id, :room, :date_range].each do |attribute| + [:id, :room, :block, :date_range].each do |attribute| expect(@reservation).must_respond_to attribute end expect(@reservation.id).must_be_kind_of Integer - expect(@reservation.room).must_be_kind_of Integer + expect(@reservation.room).must_be_kind_of Integer + expect(@reservation.block).must_equal false expect(@reservation.date_range).must_be_kind_of Hotel::DateRange end end From b6930c21543413097a2a9ab08200d8a0bb5c2462 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 14:03:44 -0800 Subject: [PATCH 062/100] removes first return in #include? method to ensure that the tests are hitting every line --- lib/date_range.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index c4f2f86b0..75752cf01 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -20,8 +20,6 @@ def overlap?(other) def include?(date) low = 0 high = self.nights - - return true if @start_date == date || @end_date == date while low <= high mid = (low + high) / 2 From 4ca32d37b536b62b4d752e2e2c9ca55bccf16b02 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 14:04:44 -0800 Subject: [PATCH 063/100] changes test name for #include? method --- test/date_range_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/date_range_test.rb b/test/date_range_test.rb index d26f72cb0..a18124b6f 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -94,7 +94,7 @@ expect(@date_range.include?(date)).must_equal true end - it "returns true when the date given is within the range" do + it "returns true when the date given is in the middle of the range" do date = Date.new(2020,3,3) expect(@date_range.include?(date)).must_equal true end From 6564809fc2be27b18ec4b988da12563367f66322 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 14:14:23 -0800 Subject: [PATCH 064/100] adds a comment to #reserve_room --- lib/front_desk.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index c792c2fda..4efadfa35 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -15,6 +15,7 @@ def add_reservation(reservation) end def reserve_room(date_range) + # Wave 3: All of the availability checking logic from Wave 2 should now respect room blocks as well as individual reservations available_rooms = find_available_room(date_range) raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] @@ -28,7 +29,7 @@ def reserve_room(date_range) return new_reservation end - + def reservations_by_room(room, date_range) return @reservations.select { |reservation| reservation.room == room && reservation.date_range.overlap?(date_range) From 87c63d53ee1346ec7b6449ca69eb865086c9a31e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 14:16:33 -0800 Subject: [PATCH 065/100] revises Block instantiation and tests --- lib/block.rb | 24 +++++++++++++++++++----- test/block_test.rb | 16 +++++++++++++--- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index 49e0d8e68..310f2f94b 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,13 +1,27 @@ require 'date' -require_relative 'date_range' module Hotel - class Block - attr_reader :date_range, :rooms, :rate + class Block + attr_reader :rooms, :rate, :date_range - def initialize(start_date:, end_date:, rooms:, rate:) - # I can create a Hotel Block if I give a date range, collection of rooms, and a discounted room rate + def initialize(rooms:, rate:, start_date:, end_date:) + @rooms = rooms + @rate = rate + @date_range = Hotel::DateRange.new( + start_date: start_date, + end_date: end_date + ) + + # Wave 3: I want an exception raised if I try to create a Hotel Block and at least one of the rooms is unavailable for the given date range + + # Wave 3: A block can contain a maximum of 5 rooms + + # Wave 3: When a room is reserved from a block of rooms, the reservation dates will always match the date range of the block end + # I can check whether a given block has any rooms available + + # I can reserve a specific room from a hotel block + # I can only reserve that room from a hotel block for the full duration of the block end end \ No newline at end of file diff --git a/test/block_test.rb b/test/block_test.rb index f29749cd7..5a51a5b20 100644 --- a/test/block_test.rb +++ b/test/block_test.rb @@ -4,10 +4,10 @@ before do rooms = (1..5).to_a @block = Hotel::Block.new( - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5), rooms: rooms, - rate: 150.0 + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) ) end @@ -15,5 +15,15 @@ it "is an instance of Block" do expect(@block).must_be_kind_of Hotel::Block end + + it "is set up for specific attributes and data types" do + [:rooms, :rate, :date_range].each do |attribute| + expect(@block).must_respond_to attribute + end + + expect(@block.rooms).must_be_kind_of Array + expect(@block.rate).must_be_kind_of Float + expect(@block.date_range).must_be_kind_of Hotel::DateRange + end end end \ No newline at end of file From cd15bfafc341d996385c49df8b98d0471a1e24ee Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 14:47:08 -0800 Subject: [PATCH 066/100] throws an exception if the list of rooms is less than 2 or greater than 5 --- lib/block.rb | 4 +--- test/block_test.rb | 21 +++++++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index 310f2f94b..dbb43221e 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -11,11 +11,9 @@ def initialize(rooms:, rate:, start_date:, end_date:) start_date: start_date, end_date: end_date ) - - # Wave 3: I want an exception raised if I try to create a Hotel Block and at least one of the rooms is unavailable for the given date range # Wave 3: A block can contain a maximum of 5 rooms - + raise ArgumentError.new("Block must contain between 2 and 5 rooms!") if @rooms.length < 2 || @rooms.length > 5 # Wave 3: When a room is reserved from a block of rooms, the reservation dates will always match the date range of the block end diff --git a/test/block_test.rb b/test/block_test.rb index 5a51a5b20..18109559e 100644 --- a/test/block_test.rb +++ b/test/block_test.rb @@ -2,9 +2,8 @@ describe "Block class" do before do - rooms = (1..5).to_a @block = Hotel::Block.new( - rooms: rooms, + rooms: (1..5).to_a, rate: 150.0, start_date: Date.new(2020,3,2), end_date: Date.new(2020,3,5) @@ -25,5 +24,23 @@ expect(@block.rate).must_be_kind_of Float expect(@block.date_range).must_be_kind_of Hotel::DateRange end + + it "throws an exception if the list of rooms is greater than 5" do + expect{ Hotel::Block.new( + rooms: (1..6).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) }.must_raise ArgumentError + end + + it "throws an exception if the list of rooms is less than 2" do + expect{ Hotel::Block.new( + rooms: [1], + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) }.must_raise ArgumentError + end end end \ No newline at end of file From de91b4e8a7879e1df4ab3b69382d1706f2494062 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 18:39:01 -0800 Subject: [PATCH 067/100] adds a #reserve_block method and tests whether it can create a Block --- lib/front_desk.rb | 16 +++++++--- test/front_desk_test.rb | 68 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 4efadfa35..17fd148bb 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,5 +1,4 @@ require_relative 'reservation' -require_relative 'date_range' module Hotel class FrontDesk @@ -16,12 +15,10 @@ def add_reservation(reservation) def reserve_room(date_range) # Wave 3: All of the availability checking logic from Wave 2 should now respect room blocks as well as individual reservations - available_rooms = find_available_room(date_range) - raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] new_reservation = Hotel::Reservation.new( id: @reservations.length + 1, - room: available_rooms.first, + room: find_available_room(date_range).first, start_date: date_range.start_date, end_date: date_range.end_date ) @@ -29,6 +26,16 @@ def reserve_room(date_range) return new_reservation end + + def reserve_block(rooms, rate, date_range) + new_block = Hotel::Block.new( + rooms: rooms, + rate: rate, + start_date: date_range.start_date, + end_date: date_range.end_date + ) + # Wave 3: I want an exception raised if I try to create a Hotel Block and at least one of the rooms is unavailable for the given date range + end def reservations_by_room(room, date_range) return @reservations.select { |reservation| @@ -50,6 +57,7 @@ def find_available_room(date_range) @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) && reservation.date_range.start_date != date_range.end_date && reservation.date_range.end_date != date_range.start_date } + raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] return available_rooms # if a room class is added, this method can be simplified # return @rooms if @reservations == [] diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index b4ff19e7a..d727840a4 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -92,6 +92,64 @@ end end + describe "#reserve_room" do + before do + date_range1 = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + date_range2 = Hotel::DateRange.new( + start_date: Date.new(2020,3,7), + end_date: Date.new(2020,3,10) + ) + date_range3 = Hotel::DateRange.new( + start_date: Date.new(2020,3,12), + end_date: Date.new(2020,3,15) + ) + @reservation1 = @front_desk.reserve_room(date_range1) + @reservation2 = @front_desk.reserve_room(date_range2) + @reservation3 = @front_desk.reserve_room(date_range3) + end + + it "can reserve a room given a start date and an end date" do + expect(@reservation1).must_be_kind_of Hotel::Reservation + end + + it "assigns a unique id number to each Reservation" do + expect(@reservation1.id).must_equal 1 + expect(@reservation2.id).must_equal 2 + expect(@reservation3.id).must_equal 3 + end + + it "assigns a valid room number" do + expect(@front_desk.rooms).must_include @reservation1.room + expect(@front_desk.rooms).must_include @reservation2.room + expect(@front_desk.rooms).must_include @reservation3.room + end + + it "adds the new reservations to the reservations array" do + expect(@front_desk.reservations.length).must_equal 3 + expect(@front_desk.reservations.first).must_equal @reservation1 + expect(@front_desk.reservations.last).must_equal @reservation3 + end + end + + describe "#reserve_block" do + before do + rooms = (1..5).to_a + rate = 150.0 + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @reservation = @front_desk.reserve_block(rooms, rate, date_range) + end + + it "can reserve a Block given a collection of rooms, a discounted room rate, and a date range" do + expect(@reservation).must_be_kind_of Hotel::Block + end + end + describe "#reservations_by_room" do before do @reservation1 = Hotel::Reservation.new( @@ -240,5 +298,15 @@ expect(@front_desk.reservations.length).must_equal 0 expect(available_rooms).must_equal @front_desk.rooms end + + it "throws an exception if there are no rooms available" do + @front_desk.rooms.clear + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + expect(@front_desk.rooms.length).must_equal 0 + expect{@front_desk.reserve_room(date_range)}.must_raise ArgumentError + end end end \ No newline at end of file From 38bc2ff37eb4455bbfba1e2c08e0e9ad794c8caf Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 19:04:19 -0800 Subject: [PATCH 068/100] throws an exception if one of the rooms is unavailable for the given date range --- lib/front_desk.rb | 16 +++++++--------- test/front_desk_test.rb | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 17fd148bb..80d008d74 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -14,8 +14,6 @@ def add_reservation(reservation) end def reserve_room(date_range) - # Wave 3: All of the availability checking logic from Wave 2 should now respect room blocks as well as individual reservations - new_reservation = Hotel::Reservation.new( id: @reservations.length + 1, room: find_available_room(date_range).first, @@ -28,13 +26,17 @@ def reserve_room(date_range) end def reserve_block(rooms, rate, date_range) + rooms.each { |room| raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !reservations_by_room(room, date_range).empty? } + new_block = Hotel::Block.new( rooms: rooms, rate: rate, start_date: date_range.start_date, end_date: date_range.end_date ) - # Wave 3: I want an exception raised if I try to create a Hotel Block and at least one of the rooms is unavailable for the given date range + # Wave 3: All of the availability checking logic from Wave 2 should now respect room blocks as well as individual reservations + + # Wave 3: Given a specific date, and that a room is set aside in a hotel block for that specific date, I cannot reserve that specific room for that specific date, because it is unavailable end def reservations_by_room(room, date_range) @@ -53,17 +55,13 @@ def reservations_by_date(date) # SPACE COMPLEXITY!!! def find_available_room(date_range) return @rooms if @reservations == [] + # available_rooms = rooms.select { |room| room if reservations_by_room(room, date_range).empty? } available_rooms = @rooms.dup @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) && reservation.date_range.start_date != date_range.end_date && reservation.date_range.end_date != date_range.start_date } raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] - return available_rooms - # if a room class is added, this method can be simplified - # return @rooms if @reservations == [] - # return @rooms.select { |room| room.num unless room.reservations.each { |reservation| reservation.date_range.overlap?(date_range) } - - # Wave 3: Given a specific date, and that a room is set aside in a hotel block for that specific date, I cannot reserve that specific room for that specific date, because it is unavailable + return available_rooms end end end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index d727840a4..662eae30d 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -142,11 +142,22 @@ start_date: Date.new(2020,3,2), end_date: Date.new(2020,3,5) ) - @reservation = @front_desk.reserve_block(rooms, rate, date_range) + @block = @front_desk.reserve_block(rooms, rate, date_range) end it "can reserve a Block given a collection of rooms, a discounted room rate, and a date range" do - expect(@reservation).must_be_kind_of Hotel::Block + expect(@block).must_be_kind_of Hotel::Block + end + + it "throws an exception if one of the rooms is unavailable for the given date range" do + rooms = (1..5).to_a + rate = 150.0 + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.reserve_room(date_range) + expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError end end From 96cb9b35a7934197acdf1991050d083a84d19d67 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 19:27:14 -0800 Subject: [PATCH 069/100] adds an id attribute to the Block class, tests for instantiation --- lib/block.rb | 7 +++---- test/block_test.rb | 6 +++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index dbb43221e..60f15c81c 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -2,9 +2,10 @@ module Hotel class Block - attr_reader :rooms, :rate, :date_range + attr_reader :id, :rooms, :rate, :date_range - def initialize(rooms:, rate:, start_date:, end_date:) + def initialize(id:, rooms:, rate:, start_date:, end_date:) + @id = id @rooms = rooms @rate = rate @date_range = Hotel::DateRange.new( @@ -12,9 +13,7 @@ def initialize(rooms:, rate:, start_date:, end_date:) end_date: end_date ) - # Wave 3: A block can contain a maximum of 5 rooms raise ArgumentError.new("Block must contain between 2 and 5 rooms!") if @rooms.length < 2 || @rooms.length > 5 - # Wave 3: When a room is reserved from a block of rooms, the reservation dates will always match the date range of the block end # I can check whether a given block has any rooms available diff --git a/test/block_test.rb b/test/block_test.rb index 18109559e..3ddc37dca 100644 --- a/test/block_test.rb +++ b/test/block_test.rb @@ -3,6 +3,7 @@ describe "Block class" do before do @block = Hotel::Block.new( + id: 1, rooms: (1..5).to_a, rate: 150.0, start_date: Date.new(2020,3,2), @@ -16,10 +17,11 @@ end it "is set up for specific attributes and data types" do - [:rooms, :rate, :date_range].each do |attribute| + [:id, :rooms, :rate, :date_range].each do |attribute| expect(@block).must_respond_to attribute end + expect(@block.id).must_be_kind_of Integer expect(@block.rooms).must_be_kind_of Array expect(@block.rate).must_be_kind_of Float expect(@block.date_range).must_be_kind_of Hotel::DateRange @@ -27,6 +29,7 @@ it "throws an exception if the list of rooms is greater than 5" do expect{ Hotel::Block.new( + id: 1, rooms: (1..6).to_a, rate: 150.0, start_date: Date.new(2020,3,2), @@ -36,6 +39,7 @@ it "throws an exception if the list of rooms is less than 2" do expect{ Hotel::Block.new( + id: 1, rooms: [1], rate: 150.0, start_date: Date.new(2020,3,2), From 2670238272462bdaa133a76065cccbf0e4b7e192 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 19:30:15 -0800 Subject: [PATCH 070/100] adds a @blocks instance variable and tests for instantiation --- lib/front_desk.rb | 10 ++++++++-- test/front_desk_test.rb | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 80d008d74..cb48fcd78 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -2,11 +2,12 @@ module Hotel class FrontDesk - attr_reader :rooms, :reservations + attr_reader :rooms, :reservations, :blocks def initialize @rooms = (1..20).to_a @reservations = [] + @blocks = [] end def add_reservation(reservation) @@ -21,7 +22,6 @@ def reserve_room(date_range) end_date: date_range.end_date ) add_reservation(new_reservation) - return new_reservation end @@ -29,11 +29,17 @@ def reserve_block(rooms, rate, date_range) rooms.each { |room| raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !reservations_by_room(room, date_range).empty? } new_block = Hotel::Block.new( + id: @blocks.length + 1, rooms: rooms, rate: rate, start_date: date_range.start_date, end_date: date_range.end_date ) + + # length(rooms).times { + # reservation = reserve_room(date_range) + # reservation.block = new_block.id + # } # Wave 3: All of the availability checking logic from Wave 2 should now respect room blocks as well as individual reservations # Wave 3: Given a specific date, and that a room is set aside in a hotel block for that specific date, I cannot reserve that specific room for that specific date, because it is unavailable diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 662eae30d..f5b888381 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -21,6 +21,11 @@ reservations = @front_desk.reservations expect(reservations).must_be_kind_of Array end + + it "can access the list of all blocks" do + blocks = @front_desk.blocks + expect(blocks).must_be_kind_of Array + end end describe "#add_reservation" do @@ -159,6 +164,18 @@ @front_desk.reserve_room(date_range) expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError end + + it "creates a reservation for each room in the Block" do + + # expect the list of reservations to be 5 in length + # expect the first in the list to have room 1 + # expect the last in the list to have room 2 + end + + it "sets @block in each Reservation to the Block id" do + + # expect reservation.block to equal block.id + end end describe "#reservations_by_room" do From bbc8a82f677a052d8ef1dac2533179a1b3784440 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sat, 7 Mar 2020 19:32:46 -0800 Subject: [PATCH 071/100] adds an #add_block method and test --- lib/front_desk.rb | 4 ++++ test/front_desk_test.rb | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index cb48fcd78..120a3818c 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -25,6 +25,10 @@ def reserve_room(date_range) return new_reservation end + def add_block(block) + @blocks << block + end + def reserve_block(rooms, rate, date_range) rooms.each { |room| raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !reservations_by_room(room, date_range).empty? } diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index f5b888381..db579e64b 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -139,6 +139,24 @@ end end + describe "#add_block" do + it "adds the block passed in to the blocks array" do + block = Hotel::Block.new( + id: 1, + rooms: (1..5).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + before_length = @front_desk.blocks.length + @front_desk.add_block(block) + after_length = @front_desk.blocks.length + expect(@front_desk.blocks.last).must_be_kind_of Hotel::Block + expect(before_length).must_equal 0 + expect(after_length).must_equal 1 + end + end + describe "#reserve_block" do before do rooms = (1..5).to_a From ba556d22691c3b45d70259bf627ab3bf208fd022 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 15:44:29 -0700 Subject: [PATCH 072/100] adds tests for #reserve_block method --- test/front_desk_test.rb | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index db579e64b..ccfd3167a 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -183,16 +183,23 @@ expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError end + it "adds the new Block to the blocks array" do + expect(@front_desk.blocks.length).must_equal 1 + expect(@front_desk.blocks.first).must_equal @block + end + it "creates a reservation for each room in the Block" do - - # expect the list of reservations to be 5 in length - # expect the first in the list to have room 1 - # expect the last in the list to have room 2 + first = @front_desk.reservations.first + last = @front_desk.reservations.last + expect(@front_desk.reservations.length).must_equal 5 + expect(first.room).must_equal 1 + expect(last.room).must_equal 5 end it "sets @block in each Reservation to the Block id" do - - # expect reservation.block to equal block.id + @front_desk.reservations.each { |reservation| + expect(reservation.block).must_equal @block.id + } end end From b00b3cc09c5c6365ca6290faad6456351ce83965 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 15:45:55 -0700 Subject: [PATCH 073/100] adds the new Block to the @blocks array within the #reserve_block method --- lib/front_desk.rb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 120a3818c..5b27fdd3b 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -39,11 +39,12 @@ def reserve_block(rooms, rate, date_range) start_date: date_range.start_date, end_date: date_range.end_date ) - - # length(rooms).times { - # reservation = reserve_room(date_range) + # @rooms.each { |room| + # reserve_room(date_range) # reservation.block = new_block.id # } + add_block(new_block) + return new_block # Wave 3: All of the availability checking logic from Wave 2 should now respect room blocks as well as individual reservations # Wave 3: Given a specific date, and that a room is set aside in a hotel block for that specific date, I cannot reserve that specific room for that specific date, because it is unavailable @@ -73,5 +74,7 @@ def find_available_room(date_range) raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] return available_rooms end + + # I can check whether a given block has any rooms available end end From fa831a117bc1a1c13302c5a46d6cc57abba1f42c Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 16:27:32 -0700 Subject: [PATCH 074/100] revises tests for #find_available_room to check whether the availability checking logic respects room blocks --- test/front_desk_test.rb | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index ccfd3167a..12a30f4bd 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -310,7 +310,7 @@ ) @reservation3 = Hotel::Reservation.new( id: 3, - room: 3, + room: 6, start_date: Date.new(2020,3,5), end_date: Date.new(2020,3,10) ) @@ -325,10 +325,14 @@ @front_desk.add_reservation(@reservation3) @front_desk.add_reservation(@reservation4) + rooms = (1..5).to_a + rate = 150.0 @date_range = Hotel::DateRange.new( start_date: Date.new(2020,3,2), end_date: Date.new(2020,3,5) ) + @block = @front_desk.reserve_block(rooms, rate, @date_range) + @available_rooms = @front_desk.find_available_room(@date_range) end @@ -340,9 +344,9 @@ end it "returns a list of rooms that are not reserved for a given date range" do - expect(@available_rooms.length).must_equal 18 + expect(@available_rooms.length).must_equal 13 expect(@available_rooms).must_include 15 - expect(@available_rooms).must_include 3 + expect(@available_rooms).must_include 6 end it "returns all rooms if there are no Reservations" do From 86050da7d4ba311d71f76fa7cc19e2d9ee37ed2d Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 16:31:10 -0700 Subject: [PATCH 075/100] realizes that my understanding of hotel blocks and reservations was incorrect, comments out erroneous functions and tests --- lib/front_desk.rb | 36 +++++++++++++++++++++++------------- test/front_desk_test.rb | 26 +++++++++++++------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 5b27fdd3b..6d0f2a7b5 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -30,7 +30,9 @@ def add_block(block) end def reserve_block(rooms, rate, date_range) - rooms.each { |room| raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !reservations_by_room(room, date_range).empty? } + rooms.each { |room| + raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !reservations_by_room(room, date_range).empty? + } new_block = Hotel::Block.new( id: @blocks.length + 1, @@ -39,15 +41,20 @@ def reserve_block(rooms, rate, date_range) start_date: date_range.start_date, end_date: date_range.end_date ) - # @rooms.each { |room| - # reserve_room(date_range) - # reservation.block = new_block.id - # } add_block(new_block) - return new_block - # Wave 3: All of the availability checking logic from Wave 2 should now respect room blocks as well as individual reservations - # Wave 3: Given a specific date, and that a room is set aside in a hotel block for that specific date, I cannot reserve that specific room for that specific date, because it is unavailable + # rooms.each { |room| + # new_reservation = Hotel::Reservation.new( + # id: @reservations.length + 1, + # room: room, + # block: new_block.id, + # start_date: date_range.start_date, + # end_date: date_range.end_date + # ) + # add_reservation(new_reservation) + # } + + return new_block end def reservations_by_room(room, date_range) @@ -56,25 +63,28 @@ def reservations_by_room(room, date_range) } end + def reservations_by_block(block_id, date_range) + # Wave 3: I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) + end + def reservations_by_date(date) return @reservations.select { |reservation| reservation.date_range.include?(date) } - # Wave 3: I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) end # SPACE COMPLEXITY!!! def find_available_room(date_range) return @rooms if @reservations == [] - # available_rooms = rooms.select { |room| room if reservations_by_room(room, date_range).empty? } + # available_rooms = rooms.select { |room| + # room if reservations_by_room(room, date_range).empty? + # } available_rooms = @rooms.dup @reservations.each { |reservation| - available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) && reservation.date_range.start_date != date_range.end_date && reservation.date_range.end_date != date_range.start_date + available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) && reservation.date_range.start_date != date_range.end_date && reservation.date_range.end_date != date_range.start_date } raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] return available_rooms end - - # I can check whether a given block has any rooms available end end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 12a30f4bd..f274e21aa 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -188,19 +188,19 @@ expect(@front_desk.blocks.first).must_equal @block end - it "creates a reservation for each room in the Block" do - first = @front_desk.reservations.first - last = @front_desk.reservations.last - expect(@front_desk.reservations.length).must_equal 5 - expect(first.room).must_equal 1 - expect(last.room).must_equal 5 - end - - it "sets @block in each Reservation to the Block id" do - @front_desk.reservations.each { |reservation| - expect(reservation.block).must_equal @block.id - } - end + # it "creates a reservation for each room in the Block" do + # first = @front_desk.reservations.first + # last = @front_desk.reservations.last + # expect(@front_desk.reservations.length).must_equal 5 + # expect(first.room).must_equal 1 + # expect(last.room).must_equal 5 + # end + + # it "sets @block in each Reservation to the Block id" do + # @front_desk.reservations.each { |reservation| + # expect(reservation.block).must_equal @block.id + # } + # end end describe "#reservations_by_room" do From 08621c5d13474d3ed89f8f27342f66034536be5f Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 18:47:44 -0700 Subject: [PATCH 076/100] adds DateRange class and removes Date gem from dependencies --- lib/block.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/block.rb b/lib/block.rb index 60f15c81c..8804bbde8 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,4 +1,4 @@ -require 'date' +require_relative 'date_range' module Hotel class Block From 16cdb7715c322e5e2ec1e4df057178076d5fcba9 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 18:51:07 -0700 Subject: [PATCH 077/100] revises test for 'returns all rooms if there are no Reservations' so it also checks Blocks --- test/front_desk_test.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index f274e21aa..b1f1d8b72 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -349,8 +349,9 @@ expect(@available_rooms).must_include 6 end - it "returns all rooms if there are no Reservations" do + it "returns all rooms if there are no Reservations and no Blocks" do @front_desk.reservations.clear + @front_desk.blocks.clear available_rooms = @front_desk.find_available_room(@date_range) expect(@front_desk.reservations.length).must_equal 0 expect(available_rooms).must_equal @front_desk.rooms From ff5ebed99743c5eed8083aab35a8d667f9c16080 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 18:52:10 -0700 Subject: [PATCH 078/100] revises #find_available_rooms method so it respects Blocks as well as individual Reservations --- lib/front_desk.rb | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 6d0f2a7b5..bee3a0b7e 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -75,16 +75,19 @@ def reservations_by_date(date) # SPACE COMPLEXITY!!! def find_available_room(date_range) - return @rooms if @reservations == [] - # available_rooms = rooms.select { |room| - # room if reservations_by_room(room, date_range).empty? - # } + # select rooms that aren't reserved during the date range (excluding start and end dates) and rooms that are not part of a block during that date range available_rooms = @rooms.dup @reservations.each { |reservation| - available_rooms.delete(reservation.room) if reservation.date_range.overlap?(date_range) && reservation.date_range.start_date != date_range.end_date && reservation.date_range.end_date != date_range.start_date + available_rooms.delete(reservation.room) if reservation.date_range.start_date < date_range.end_date && reservation.date_range.end_date > date_range.start_date + } + @blocks.each { |block| + (block.rooms).each { |room| + available_rooms.delete(room) + } if block.date_range.start_date < date_range.end_date && block.date_range.end_date > date_range.start_date } raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] return available_rooms end end end + # if !rooms.any? { |room| find_available_room(date_range).include?(room) } \ No newline at end of file From 28db7f9be6a10b2d2aa5040767685388320f7e7c Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 18:54:33 -0700 Subject: [PATCH 079/100] fixes #reserve_room method so it throws an exception if no rooms are available for the given date range --- lib/front_desk.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index bee3a0b7e..e8adc91b6 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -31,7 +31,7 @@ def add_block(block) def reserve_block(rooms, rate, date_range) rooms.each { |room| - raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !reservations_by_room(room, date_range).empty? + raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !rooms.any? { |room| find_available_room(date_range).include?(room) } } new_block = Hotel::Block.new( @@ -89,5 +89,4 @@ def find_available_room(date_range) return available_rooms end end -end - # if !rooms.any? { |room| find_available_room(date_range).include?(room) } \ No newline at end of file +end \ No newline at end of file From 5f3adcb43629335ec7e387c76f60c80dc8537935 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 20:35:36 -0700 Subject: [PATCH 080/100] adds tests for #find_block method and pseudocode for a new test in #reservations_by_date --- test/front_desk_test.rb | 55 ++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index b1f1d8b72..1e8e30aa7 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -187,20 +187,6 @@ expect(@front_desk.blocks.length).must_equal 1 expect(@front_desk.blocks.first).must_equal @block end - - # it "creates a reservation for each room in the Block" do - # first = @front_desk.reservations.first - # last = @front_desk.reservations.last - # expect(@front_desk.reservations.length).must_equal 5 - # expect(first.room).must_equal 1 - # expect(last.room).must_equal 5 - # end - - # it "sets @block in each Reservation to the Block id" do - # @front_desk.reservations.each { |reservation| - # expect(reservation.block).must_equal @block.id - # } - # end end describe "#reservations_by_room" do @@ -292,6 +278,18 @@ expect(@selected_reservations.first).must_equal @reservation1 expect(@selected_reservations.last).must_equal @reservation2 end + + it "can see a reservation made from a hotel block for a specific date" do + # rooms = (1..5).to_a + # rate = 150.0 + # date_range = Hotel::DateRange.new( + # start_date: Date.new(2020,3,2), + # end_date: Date.new(2020,3,5) + # ) + # block = @front_desk.reserve_block(rooms, rate, date_range) + # create a reservation made from a hotel block + # expect the reservation to include block.id + end end describe "#find_available_room" do @@ -367,4 +365,33 @@ expect{@front_desk.reserve_room(date_range)}.must_raise ArgumentError end end + + describe "find_block" do + before do + @block1 = Hotel::Block.new( + id: 1, + rooms: (1..5).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @block2 = Hotel::Block.new( + id: 2, + rooms: (6..10).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_block(@block1) + @front_desk.add_block(@block2) + end + + it "throws an exception if no Blocks match id given" do + expect{@front_desk.find_block(3)}.must_raise ArgumentError + end + + it "returns the correct block" do + expect(@front_desk.find_block(2)).must_equal @block2 + end + end end \ No newline at end of file From fc889178f2988fce15e05a84ec5b99ee4f1580d9 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 20:37:26 -0700 Subject: [PATCH 081/100] adds the #find_block method, adds pseudocode for methods that will allow for reservation of specific rooms in blocks --- lib/front_desk.rb | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index e8adc91b6..822cd3c27 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -42,18 +42,6 @@ def reserve_block(rooms, rate, date_range) end_date: date_range.end_date ) add_block(new_block) - - # rooms.each { |room| - # new_reservation = Hotel::Reservation.new( - # id: @reservations.length + 1, - # room: room, - # block: new_block.id, - # start_date: date_range.start_date, - # end_date: date_range.end_date - # ) - # add_reservation(new_reservation) - # } - return new_block end @@ -63,19 +51,13 @@ def reservations_by_room(room, date_range) } end - def reservations_by_block(block_id, date_range) - # Wave 3: I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) - end - def reservations_by_date(date) return @reservations.select { |reservation| reservation.date_range.include?(date) } end - # SPACE COMPLEXITY!!! def find_available_room(date_range) - # select rooms that aren't reserved during the date range (excluding start and end dates) and rooms that are not part of a block during that date range available_rooms = @rooms.dup @reservations.each { |reservation| available_rooms.delete(reservation.room) if reservation.date_range.start_date < date_range.end_date && reservation.date_range.end_date > date_range.start_date @@ -88,5 +70,32 @@ def find_available_room(date_range) raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] return available_rooms end + + def find_block(id) + raise ArgumentError.new("No blocks with the given ID!") if @blocks.none? { |block| block.id == id } + return @blocks.find { |block| block.id == id } + end + + # I can check whether a given block has any rooms available + def find_available_room_in_block(id) + # look up reservations that match the block id, exclude their rooms from the list of rooms it returns + end + + # I can reserve a specific room from a hotel block + # I can only reserve that room from a hotel block for the full duration of the block + def reserve_room_in_block(id, room) + # finds block by id + # creates reservation for that room + # rooms.each { |room| + # new_reservation = Hotel::Reservation.new( + # id: @reservations.length + 1, + # room: room, + # block: new_block.id, + # start_date: date_range.start_date, + # end_date: date_range.end_date + # ) + # add_reservation(new_reservation) + # } + end end end \ No newline at end of file From 2046f2ee228b3d5bcabdeb9708e865b4f00e6ea6 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 20:39:49 -0700 Subject: [PATCH 082/100] removes unnecessary comments --- lib/block.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index 8804bbde8..601023e07 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,7 +1,7 @@ require_relative 'date_range' module Hotel - class Block + class Block attr_reader :id, :rooms, :rate, :date_range def initialize(id:, rooms:, rate:, start_date:, end_date:) @@ -15,10 +15,5 @@ def initialize(id:, rooms:, rate:, start_date:, end_date:) raise ArgumentError.new("Block must contain between 2 and 5 rooms!") if @rooms.length < 2 || @rooms.length > 5 end - - # I can check whether a given block has any rooms available - - # I can reserve a specific room from a hotel block - # I can only reserve that room from a hotel block for the full duration of the block end end \ No newline at end of file From 4de7cee961db1a1623ad4bbf19a94adf493065aa Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 20:41:55 -0700 Subject: [PATCH 083/100] adds a new rate attribute to the Reservation class and tests for instantiation, changes the #total_cost method --- lib/reservation.rb | 6 +++--- test/reservation_test.rb | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 83b2d9cad..15c19fb9d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,14 +1,14 @@ -require 'date' require_relative 'date_range' module Hotel class Reservation - attr_reader :id, :room, :block, :date_range + attr_reader :id, :room, :block, :rate, :date_range def initialize(id:, room:, block: false, start_date:, end_date:) @id = id @room = room @block = block + @rate = 200.0 @date_range = Hotel::DateRange.new( start_date: start_date, end_date: end_date @@ -16,7 +16,7 @@ def initialize(id:, room:, block: false, start_date:, end_date:) end def total_cost - return @date_range.nights * 200.0 # this needs to be changed to account for the discounted rate in hotel blocks + return @date_range.nights * @rate end end end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 50171573d..6fcea0f71 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -16,13 +16,14 @@ end it "is set up for specific attributes and data types" do - [:id, :room, :block, :date_range].each do |attribute| + [:id, :room, :block, :rate, :date_range].each do |attribute| expect(@reservation).must_respond_to attribute end expect(@reservation.id).must_be_kind_of Integer expect(@reservation.room).must_be_kind_of Integer expect(@reservation.block).must_equal false + expect(@reservation.rate).must_be_kind_of Float expect(@reservation.date_range).must_be_kind_of Hotel::DateRange end end From f1023dcf3cbf0a4867ed882a331af0eb147c0d90 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 20:54:43 -0700 Subject: [PATCH 084/100] changes rate attribute into an optional keyword for instantiation with a default value of 200.0 --- lib/reservation.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 15c19fb9d..33e5caf97 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,11 +4,11 @@ module Hotel class Reservation attr_reader :id, :room, :block, :rate, :date_range - def initialize(id:, room:, block: false, start_date:, end_date:) + def initialize(id:, room:, block: false, rate: 200.0, start_date:, end_date:) @id = id @room = room @block = block - @rate = 200.0 + @rate = rate @date_range = Hotel::DateRange.new( start_date: start_date, end_date: end_date From e78198ecf3a10793706715c0b147ac4ebc5fbac5 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 21:19:11 -0700 Subject: [PATCH 085/100] adds #find_available_room_in_block method and tests --- lib/front_desk.rb | 11 +++-- test/front_desk_test.rb | 89 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 95 insertions(+), 5 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 822cd3c27..144b0209b 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -76,16 +76,19 @@ def find_block(id) return @blocks.find { |block| block.id == id } end - # I can check whether a given block has any rooms available def find_available_room_in_block(id) - # look up reservations that match the block id, exclude their rooms from the list of rooms it returns + block = find_block(id) + unavailable_rooms = @reservations.map { |reservation| reservation.room if reservation.block == block.id } + available_rooms = block.rooms - unavailable_rooms + raise ArgumentError.new("No rooms available in the given block!") if available_rooms.empty? + return available_rooms end # I can reserve a specific room from a hotel block # I can only reserve that room from a hotel block for the full duration of the block - def reserve_room_in_block(id, room) + def reserve_room_in_block(id) # finds block by id - # creates reservation for that room + # creates reservation for first available room in block & sets rate to hotel block rate # rooms.each { |room| # new_reservation = Hotel::Reservation.new( # id: @reservations.length + 1, diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 1e8e30aa7..acf67f7e3 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -352,6 +352,7 @@ @front_desk.blocks.clear available_rooms = @front_desk.find_available_room(@date_range) expect(@front_desk.reservations.length).must_equal 0 + expect(@front_desk.blocks.length).must_equal 0 expect(available_rooms).must_equal @front_desk.rooms end @@ -362,7 +363,7 @@ end_date: Date.new(2020,3,5) ) expect(@front_desk.rooms.length).must_equal 0 - expect{@front_desk.reserve_room(date_range)}.must_raise ArgumentError + expect{@front_desk.find_available_room(date_range)}.must_raise ArgumentError end end @@ -394,4 +395,90 @@ expect(@front_desk.find_block(2)).must_equal @block2 end end + + describe "#find_available_room_in_block" do + before do + @block = Hotel::Block.new( + id: 1, + rooms: (1..5).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_block(@block) + + @reservation = Hotel::Reservation.new( + id: 1, + room: 1, + block: 1, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_reservation(@reservation) + + @available_rooms = @front_desk.find_available_room_in_block(1) + end + + it "returns an array of valid room numbers" do + expect(@available_rooms).must_be_kind_of Array + expect(@available_rooms.first).must_be_kind_of Integer + expect(@block.rooms).must_include @available_rooms.first + expect(@block.rooms).must_include @available_rooms.last + end + + it "returns a list of rooms that are not reserved for a given date range" do + expect(@available_rooms.length).must_equal 4 + expect(@available_rooms).wont_include 1 + end + + it "returns all rooms if there are no Reservations with the given block id" do + @front_desk.reservations.clear + available_rooms = @front_desk.find_available_room_in_block(1) + expect(@front_desk.reservations.length).must_equal 0 + expect(available_rooms).must_equal @block.rooms + end + + it "throws an exception if there are no rooms available" do + reservation2 = Hotel::Reservation.new( + id: 2, + room: 2, + block: 1, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + reservation3 = Hotel::Reservation.new( + id: 3, + room: 3, + block: 1, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + reservation4 = Hotel::Reservation.new( + id: 4, + room: 4, + block: 1, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + reservation5 = Hotel::Reservation.new( + id: 5, + room: 5, + block: 1, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_reservation(reservation2) + @front_desk.add_reservation(reservation3) + @front_desk.add_reservation(reservation4) + @front_desk.add_reservation(reservation5) + + expect(@front_desk.reservations.length).must_equal 5 + expect{@front_desk.find_available_room_in_block(1)}.must_raise ArgumentError + end + end end \ No newline at end of file From 97805292829cc58abe4b8474db4d045a6d1a8f46 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 21:31:42 -0700 Subject: [PATCH 086/100] adds tests for #reserve_room_in_block method --- test/front_desk_test.rb | 42 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index acf67f7e3..a103a0113 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -481,4 +481,46 @@ expect{@front_desk.find_available_room_in_block(1)}.must_raise ArgumentError end end + + describe "#reserve_room_in_block" do + before do + @block = Hotel::Block.new( + id: 1, + rooms: (1..5).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_block(@block) + + @reservation1 = Hotel::Reservation.new( + id: 1, + room: 1, + block: 1, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_reservation(@reservation1) + + @reservation2 = @front_desk.reserve_room_in_block(1, 2) + end + + it "can reserve a specific room from a hotel block" do + expect(@reservation2).must_be_kind_of Hotel::Reservation + expect(@block.rooms).must_include @reservation2.room + end + + it "assigns a unique id number to each Reservation" do + expect(@reservation1.id).must_equal 1 + expect(@reservation2.id).must_equal 2 + expect(@reservation3.id).must_equal 3 + end + + it "adds the new reservation to the reservations array" do + expect(@front_desk.reservations.length).must_equal 2 + expect(@front_desk.reservations.first).must_equal @reservation1 + expect(@front_desk.reservations.last).must_equal @reservation2 + end + end end \ No newline at end of file From 6a9ee8468c15ffdb01f2daec22de4fde107d9e8e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 21:37:37 -0700 Subject: [PATCH 087/100] revises test that checks for unique id numbers in #reserve_room_in_block --- test/front_desk_test.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index a103a0113..5561587d4 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -511,10 +511,8 @@ expect(@block.rooms).must_include @reservation2.room end - it "assigns a unique id number to each Reservation" do - expect(@reservation1.id).must_equal 1 + it "assigns a unique id number to the new reservation" do expect(@reservation2.id).must_equal 2 - expect(@reservation3.id).must_equal 3 end it "adds the new reservation to the reservations array" do From 6c13c7698cc31a8383fb62debef41739442d3f1b Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 21:38:00 -0700 Subject: [PATCH 088/100] adds #reserve_room_in_block method --- lib/front_desk.rb | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 144b0209b..77b775bae 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -86,19 +86,18 @@ def find_available_room_in_block(id) # I can reserve a specific room from a hotel block # I can only reserve that room from a hotel block for the full duration of the block - def reserve_room_in_block(id) - # finds block by id - # creates reservation for first available room in block & sets rate to hotel block rate - # rooms.each { |room| - # new_reservation = Hotel::Reservation.new( - # id: @reservations.length + 1, - # room: room, - # block: new_block.id, - # start_date: date_range.start_date, - # end_date: date_range.end_date - # ) - # add_reservation(new_reservation) - # } - end + def reserve_room_in_block(id, room) + block = find_block(id) + new_reservation = Hotel::Reservation.new( + id: @reservations.length + 1, + room: room, + block: block.id, + rate: block.rate, + start_date: block.date_range.start_date, + end_date: block.date_range.end_date + ) + add_reservation(new_reservation) + return new_reservation + end end end \ No newline at end of file From 62163c9a5c4c7b3b2e3a0a14133efe06f23fe9f8 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 21:55:45 -0700 Subject: [PATCH 089/100] adds test to #reservations_by_date to check that it can see a reservations made from a hotel block --- test/front_desk_test.rb | 62 ++++++++--------------------------------- 1 file changed, 11 insertions(+), 51 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 5561587d4..3e4386469 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -97,48 +97,6 @@ end end - describe "#reserve_room" do - before do - date_range1 = Hotel::DateRange.new( - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - date_range2 = Hotel::DateRange.new( - start_date: Date.new(2020,3,7), - end_date: Date.new(2020,3,10) - ) - date_range3 = Hotel::DateRange.new( - start_date: Date.new(2020,3,12), - end_date: Date.new(2020,3,15) - ) - @reservation1 = @front_desk.reserve_room(date_range1) - @reservation2 = @front_desk.reserve_room(date_range2) - @reservation3 = @front_desk.reserve_room(date_range3) - end - - it "can reserve a room given a start date and an end date" do - expect(@reservation1).must_be_kind_of Hotel::Reservation - end - - it "assigns a unique id number to each Reservation" do - expect(@reservation1.id).must_equal 1 - expect(@reservation2.id).must_equal 2 - expect(@reservation3.id).must_equal 3 - end - - it "assigns a valid room number" do - expect(@front_desk.rooms).must_include @reservation1.room - expect(@front_desk.rooms).must_include @reservation2.room - expect(@front_desk.rooms).must_include @reservation3.room - end - - it "adds the new reservations to the reservations array" do - expect(@front_desk.reservations.length).must_equal 3 - expect(@front_desk.reservations.first).must_equal @reservation1 - expect(@front_desk.reservations.last).must_equal @reservation3 - end - end - describe "#add_block" do it "adds the block passed in to the blocks array" do block = Hotel::Block.new( @@ -280,15 +238,17 @@ end it "can see a reservation made from a hotel block for a specific date" do - # rooms = (1..5).to_a - # rate = 150.0 - # date_range = Hotel::DateRange.new( - # start_date: Date.new(2020,3,2), - # end_date: Date.new(2020,3,5) - # ) - # block = @front_desk.reserve_block(rooms, rate, date_range) - # create a reservation made from a hotel block - # expect the reservation to include block.id + block = Hotel::Block.new( + id: 1, + rooms: (1..5).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_block(block) + reservation = @front_desk.reserve_room_in_block(1, 1) + @selected_reservations = @front_desk.reservations_by_date(Date.new(2020,3,2)) + expect(@selected_reservations).must_include reservation end end From 9b67631c4a5bd0ab80f62ae0218cd799797fdb78 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 22:16:47 -0700 Subject: [PATCH 090/100] adds test to #reserve_block that checks whether an exception is thrown when a new block includes a date in an existing block --- test/front_desk_test.rb | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 3e4386469..f64cd1611 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -130,17 +130,34 @@ expect(@block).must_be_kind_of Hotel::Block end - it "throws an exception if one of the rooms is unavailable for the given date range" do + it "throws an exception if at least one of the rooms is unavailable for the given date range" do rooms = (1..5).to_a rate = 150.0 date_range = Hotel::DateRange.new( start_date: Date.new(2020,3,2), end_date: Date.new(2020,3,5) ) - @front_desk.reserve_room(date_range) + reservation = Hotel::Reservation.new( + id: 1, + room: 1, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_reservation(reservation) expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError end + it "throws an exception if the new block includes a specific room from an existing block" do + rooms = (2..6).to_a + rate = 150.0 + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + new_block = @front_desk.reserve_block(rooms, rate, date_range) + expect{new_block}.must_raise ArgumentError + end + it "adds the new Block to the blocks array" do expect(@front_desk.blocks.length).must_equal 1 expect(@front_desk.blocks.first).must_equal @block From b17de34c50c28e8d7c8f4f9822a54f447f684f5e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 22:57:25 -0700 Subject: [PATCH 091/100] revises test in #reserve_block that checks whether an exception is thrown if a new block includes a room from an existing block --- test/front_desk_test.rb | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index f64cd1611..e60a41ba5 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -131,7 +131,7 @@ end it "throws an exception if at least one of the rooms is unavailable for the given date range" do - rooms = (1..5).to_a + rooms = (6..10).to_a rate = 150.0 date_range = Hotel::DateRange.new( start_date: Date.new(2020,3,2), @@ -139,7 +139,7 @@ ) reservation = Hotel::Reservation.new( id: 1, - room: 1, + room: 6, start_date: Date.new(2020,3,2), end_date: Date.new(2020,3,5) ) @@ -147,15 +147,14 @@ expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError end - it "throws an exception if the new block includes a specific room from an existing block" do - rooms = (2..6).to_a + it "throws an exception if at least one of the rooms can be found in an existing hotel block for the given date range" do + rooms = (5..9).to_a rate = 150.0 date_range = Hotel::DateRange.new( start_date: Date.new(2020,3,2), end_date: Date.new(2020,3,5) ) - new_block = @front_desk.reserve_block(rooms, rate, date_range) - expect{new_block}.must_raise ArgumentError + expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError end it "adds the new Block to the blocks array" do @@ -324,7 +323,7 @@ expect(@available_rooms).must_include 6 end - it "returns all rooms if there are no Reservations and no Blocks" do + it "returns all rooms if there are no reservations and no blocks" do @front_desk.reservations.clear @front_desk.blocks.clear available_rooms = @front_desk.find_available_room(@date_range) From 2f1f41c7e196800fcd4f0ad56dfd9e863cb7505f Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 22:59:46 -0700 Subject: [PATCH 092/100] removes redundant code from the #reserve_block method --- lib/front_desk.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 77b775bae..46bb0db86 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -30,8 +30,8 @@ def add_block(block) end def reserve_block(rooms, rate, date_range) - rooms.each { |room| - raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !rooms.any? { |room| find_available_room(date_range).include?(room) } + rooms.each { |room| + raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !find_available_room(date_range).include?(room) } new_block = Hotel::Block.new( From 1aa8991b5490b33b8aa1ec22ff4377af2e7b198d Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 23:02:08 -0700 Subject: [PATCH 093/100] removes require_relative 'date_range' --- lib/block.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index 601023e07..b9830520b 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,5 +1,3 @@ -require_relative 'date_range' - module Hotel class Block attr_reader :id, :rooms, :rate, :date_range From 634fc4b6d7c3dc2cfe819a6864f00fa2a849f1ce Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 23:19:06 -0700 Subject: [PATCH 094/100] adds a test to #total_cost that checks whether it accurately calculates the cost for rooms reserved from a hotel block --- test/reservation_test.rb | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 6fcea0f71..d090dfed6 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -29,13 +29,24 @@ end describe "#total_cost" do - it "accurately calculates the total cost for single rooms" do + it "accurately calculates the total cost for single rooms with the default rate" do expect(@reservation.total_cost).must_equal 600.0 end - it "accurately calculates the total cost for hotel blocks" do - # @ block = Hotel::Block.new() - # expect(@reservation.total_cost).must_equal + it "accurately calculates the total cost for a room reserved from a hotel block" do + @front_desk = Hotel::FrontDesk.new + block = Hotel::Block.new( + id: 1, + rooms: (1..5).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_block(block) + + reservation = @front_desk.reserve_room_in_block(1, 1) + + expect(reservation.total_cost).must_equal 450.0 end end end \ No newline at end of file From 0e3bff981baf9ec93efa0224a831908fdaceb113 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 23:41:02 -0700 Subject: [PATCH 095/100] adds functionality and test to check that custom rates can be converted to Floats --- lib/reservation.rb | 4 +++- test/reservation_test.rb | 12 +++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 33e5caf97..0c0ee6cdf 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -8,11 +8,13 @@ def initialize(id:, room:, block: false, rate: 200.0, start_date:, end_date:) @id = id @room = room @block = block - @rate = rate + @rate = rate.to_f @date_range = Hotel::DateRange.new( start_date: start_date, end_date: end_date ) + + raise ArgumentError.new("Invalid rate!") if rate.class != Float end def total_cost diff --git a/test/reservation_test.rb b/test/reservation_test.rb index d090dfed6..16afa24c8 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -25,7 +25,17 @@ expect(@reservation.block).must_equal false expect(@reservation.rate).must_be_kind_of Float expect(@reservation.date_range).must_be_kind_of Hotel::DateRange - end + end + + it "throws an exception if the custom rate cannot be converted to a float" do + expect{Hotel::Reservation.new( + id: 1, + room: 15, + rate: "a", + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + )}.must_raise ArgumentError + end end describe "#total_cost" do From bd7e40d837d266c319353bd666f5901787754abf Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Sun, 8 Mar 2020 23:43:06 -0700 Subject: [PATCH 096/100] adds functionality that allows for setting different rates for different rooms in the #reserve_room method --- lib/front_desk.rb | 3 ++- test/front_desk_test.rb | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 46bb0db86..004166cf9 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -14,10 +14,11 @@ def add_reservation(reservation) @reservations << reservation end - def reserve_room(date_range) + def reserve_room(date_range, rate = 200.0) new_reservation = Hotel::Reservation.new( id: @reservations.length + 1, room: find_available_room(date_range).first, + rate: rate.to_f, start_date: date_range.start_date, end_date: date_range.end_date ) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index e60a41ba5..2024c41dd 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -68,6 +68,15 @@ expect(@reservation1).must_be_kind_of Hotel::Reservation end + it "can set different rates for different rooms" do + date_range4 = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + reservation4 = @front_desk.reserve_room(date_range4, 300.0) + expect(reservation4.rate).must_equal 300.0 + end + it "throws an exception if there are no rooms available" do @front_desk.rooms.clear date_range = Hotel::DateRange.new( @@ -126,7 +135,7 @@ @block = @front_desk.reserve_block(rooms, rate, date_range) end - it "can reserve a Block given a collection of rooms, a discounted room rate, and a date range" do + it "can reserve a block given a collection of rooms, a discounted room rate, and a date range" do expect(@block).must_be_kind_of Hotel::Block end From edff9dddb3262bb7bd765ac78c96c9a5fc15292e Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 9 Mar 2020 00:48:27 -0700 Subject: [PATCH 097/100] reorganizes and refactors methods, adds comments --- lib/front_desk.rb | 103 ++++++++-------- test/front_desk_test.rb | 258 ++++++++++++++++++++-------------------- 2 files changed, 182 insertions(+), 179 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 004166cf9..afa7a8aaa 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -14,15 +14,40 @@ def add_reservation(reservation) @reservations << reservation end + def reservations_by_room(room, date_range) + return @reservations.select { |reservation| + reservation.room == room && reservation.date_range.overlap?(date_range) + } + end + + def reservations_by_date(date) + return @reservations.select { |reservation| + reservation.date_range.include?(date) + } + end + + def find_available_room(date_range) + unavailable_rooms = @reservations.map { |reservation| + reservation.room if reservation.date_range.start_date < date_range.end_date && reservation.date_range.end_date > date_range.start_date + } + @blocks.each { |block| + (block.rooms).each { |room| unavailable_rooms << room } if block.date_range.start_date < date_range.end_date && block.date_range.end_date > date_range.start_date + } # This method is very expensive. See refactors.txt for details. + available_rooms = @rooms - unavailable_rooms + + raise ArgumentError.new("No rooms available for that date range!") if available_rooms.empty? + return available_rooms + end + def reserve_room(date_range, rate = 200.0) new_reservation = Hotel::Reservation.new( id: @reservations.length + 1, - room: find_available_room(date_range).first, + room: find_available_room(date_range).first, rate: rate.to_f, start_date: date_range.start_date, end_date: date_range.end_date ) - add_reservation(new_reservation) + add_reservation(new_reservation) return new_reservation end @@ -30,11 +55,17 @@ def add_block(block) @blocks << block end + def find_block(id) + block = @blocks.find { |block| block.id == id } + raise ArgumentError.new("No blocks with the given ID!") if block.nil? + return block + end + def reserve_block(rooms, rate, date_range) rooms.each { |room| raise ArgumentError.new("At least one of the rooms is unavailable for the given date range!") if !find_available_room(date_range).include?(room) } - + new_block = Hotel::Block.new( id: @blocks.length + 1, rooms: rooms, @@ -46,57 +77,27 @@ def reserve_block(rooms, rate, date_range) return new_block end - def reservations_by_room(room, date_range) - return @reservations.select { |reservation| - reservation.room == room && reservation.date_range.overlap?(date_range) - } - end - - def reservations_by_date(date) - return @reservations.select { |reservation| - reservation.date_range.include?(date) - } - end - - def find_available_room(date_range) - available_rooms = @rooms.dup - @reservations.each { |reservation| - available_rooms.delete(reservation.room) if reservation.date_range.start_date < date_range.end_date && reservation.date_range.end_date > date_range.start_date - } - @blocks.each { |block| - (block.rooms).each { |room| - available_rooms.delete(room) - } if block.date_range.start_date < date_range.end_date && block.date_range.end_date > date_range.start_date + def find_available_room_in_block(id) + block = find_block(id) + unavailable_rooms = @reservations.map { |reservation| + reservation.room if reservation.block == block.id } - raise ArgumentError.new("No rooms available for that date range!") if available_rooms == [] - return available_rooms + available_rooms = block.rooms - unavailable_rooms + + raise ArgumentError.new("No rooms available in the given block!") if available_rooms.empty? + return available_rooms end - def find_block(id) - raise ArgumentError.new("No blocks with the given ID!") if @blocks.none? { |block| block.id == id } - return @blocks.find { |block| block.id == id } - end - - def find_available_room_in_block(id) - block = find_block(id) - unavailable_rooms = @reservations.map { |reservation| reservation.room if reservation.block == block.id } - available_rooms = block.rooms - unavailable_rooms - raise ArgumentError.new("No rooms available in the given block!") if available_rooms.empty? - return available_rooms - end - - # I can reserve a specific room from a hotel block - # I can only reserve that room from a hotel block for the full duration of the block - def reserve_room_in_block(id, room) - block = find_block(id) - new_reservation = Hotel::Reservation.new( - id: @reservations.length + 1, - room: room, - block: block.id, - rate: block.rate, - start_date: block.date_range.start_date, - end_date: block.date_range.end_date - ) + def reserve_room_in_block(id, room) + block = find_block(id) + new_reservation = Hotel::Reservation.new( + id: @reservations.length + 1, + room: room, + block: block.id, + rate: block.rate, + start_date: block.date_range.start_date, + end_date: block.date_range.end_date + ) add_reservation(new_reservation) return new_reservation end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 2024c41dd..bc89f975c 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -12,6 +12,7 @@ it "can access the list of all the rooms in the hotel" do rooms = @front_desk.rooms + expect(rooms).must_be_kind_of Array expect(rooms.first).must_equal 1 expect(rooms.last).must_equal 20 @@ -19,11 +20,13 @@ it "can access the list of all reservations" do reservations = @front_desk.reservations + expect(reservations).must_be_kind_of Array end it "can access the list of all blocks" do blocks = @front_desk.blocks + expect(blocks).must_be_kind_of Array end end @@ -39,139 +42,13 @@ before_length = @front_desk.reservations.length @front_desk.add_reservation(reservation) after_length = @front_desk.reservations.length - expect(@front_desk.reservations.last).must_be_kind_of Hotel::Reservation - expect(before_length).must_equal 0 - expect(after_length).must_equal 1 - end - end - describe "#reserve_room" do - before do - date_range1 = Hotel::DateRange.new( - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - date_range2 = Hotel::DateRange.new( - start_date: Date.new(2020,3,7), - end_date: Date.new(2020,3,10) - ) - date_range3 = Hotel::DateRange.new( - start_date: Date.new(2020,3,12), - end_date: Date.new(2020,3,15) - ) - @reservation1 = @front_desk.reserve_room(date_range1) - @reservation2 = @front_desk.reserve_room(date_range2) - @reservation3 = @front_desk.reserve_room(date_range3) - end - - it "can reserve a room given a start date and an end date" do - expect(@reservation1).must_be_kind_of Hotel::Reservation - end - - it "can set different rates for different rooms" do - date_range4 = Hotel::DateRange.new( - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - reservation4 = @front_desk.reserve_room(date_range4, 300.0) - expect(reservation4.rate).must_equal 300.0 - end - - it "throws an exception if there are no rooms available" do - @front_desk.rooms.clear - date_range = Hotel::DateRange.new( - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - expect(@front_desk.rooms.length).must_equal 0 - expect{@front_desk.reserve_room(date_range)}.must_raise ArgumentError - end - - it "assigns a unique id number to each Reservation" do - expect(@reservation1.id).must_equal 1 - expect(@reservation2.id).must_equal 2 - expect(@reservation3.id).must_equal 3 - end - - it "assigns a valid room number" do - expect(@front_desk.rooms).must_include @reservation1.room - expect(@front_desk.rooms).must_include @reservation2.room - expect(@front_desk.rooms).must_include @reservation3.room - end - - it "adds the new reservations to the reservations array" do - expect(@front_desk.reservations.length).must_equal 3 - expect(@front_desk.reservations.first).must_equal @reservation1 - expect(@front_desk.reservations.last).must_equal @reservation3 - end - end - - describe "#add_block" do - it "adds the block passed in to the blocks array" do - block = Hotel::Block.new( - id: 1, - rooms: (1..5).to_a, - rate: 150.0, - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - before_length = @front_desk.blocks.length - @front_desk.add_block(block) - after_length = @front_desk.blocks.length - expect(@front_desk.blocks.last).must_be_kind_of Hotel::Block + expect(@front_desk.reservations.last).must_be_kind_of Hotel::Reservation expect(before_length).must_equal 0 expect(after_length).must_equal 1 end end - describe "#reserve_block" do - before do - rooms = (1..5).to_a - rate = 150.0 - date_range = Hotel::DateRange.new( - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - @block = @front_desk.reserve_block(rooms, rate, date_range) - end - - it "can reserve a block given a collection of rooms, a discounted room rate, and a date range" do - expect(@block).must_be_kind_of Hotel::Block - end - - it "throws an exception if at least one of the rooms is unavailable for the given date range" do - rooms = (6..10).to_a - rate = 150.0 - date_range = Hotel::DateRange.new( - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - reservation = Hotel::Reservation.new( - id: 1, - room: 6, - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - @front_desk.add_reservation(reservation) - expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError - end - - it "throws an exception if at least one of the rooms can be found in an existing hotel block for the given date range" do - rooms = (5..9).to_a - rate = 150.0 - date_range = Hotel::DateRange.new( - start_date: Date.new(2020,3,2), - end_date: Date.new(2020,3,5) - ) - expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError - end - - it "adds the new Block to the blocks array" do - expect(@front_desk.blocks.length).must_equal 1 - expect(@front_desk.blocks.first).must_equal @block - end - end - describe "#reservations_by_room" do before do @reservation1 = Hotel::Reservation.new( @@ -246,7 +123,7 @@ @front_desk.add_reservation(@reservation1) @front_desk.add_reservation(@reservation2) @front_desk.add_reservation(@reservation3) - + @selected_reservations = @front_desk.reservations_by_date(Date.new(2020,3,2)) end @@ -273,6 +150,7 @@ @front_desk.add_block(block) reservation = @front_desk.reserve_room_in_block(1, 1) @selected_reservations = @front_desk.reservations_by_date(Date.new(2020,3,2)) + expect(@selected_reservations).must_include reservation end end @@ -336,6 +214,7 @@ @front_desk.reservations.clear @front_desk.blocks.clear available_rooms = @front_desk.find_available_room(@date_range) + expect(@front_desk.reservations.length).must_equal 0 expect(@front_desk.blocks.length).must_equal 0 expect(available_rooms).must_equal @front_desk.rooms @@ -347,11 +226,83 @@ start_date: Date.new(2020,3,2), end_date: Date.new(2020,3,5) ) + expect(@front_desk.rooms.length).must_equal 0 expect{@front_desk.find_available_room(date_range)}.must_raise ArgumentError end end + describe "#reserve_room" do + before do + date_range1 = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + date_range2 = Hotel::DateRange.new( + start_date: Date.new(2020,3,7), + end_date: Date.new(2020,3,10) + ) + date_range3 = Hotel::DateRange.new( + start_date: Date.new(2020,3,12), + end_date: Date.new(2020,3,15) + ) + @reservation1 = @front_desk.reserve_room(date_range1) + @reservation2 = @front_desk.reserve_room(date_range2) + @reservation3 = @front_desk.reserve_room(date_range3) + end + + it "can reserve a room given a start date and an end date" do + expect(@reservation1).must_be_kind_of Hotel::Reservation + end + + it "can set different rates for different rooms" do + date_range4 = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + reservation4 = @front_desk.reserve_room(date_range4, 300.0) + + expect(reservation4.rate).must_equal 300.0 + end + + it "assigns a unique id number to each Reservation" do + expect(@reservation1.id).must_equal 1 + expect(@reservation2.id).must_equal 2 + expect(@reservation3.id).must_equal 3 + end + + it "assigns a valid room number" do + expect(@front_desk.rooms).must_include @reservation1.room + expect(@front_desk.rooms).must_include @reservation2.room + expect(@front_desk.rooms).must_include @reservation3.room + end + + it "adds the new reservations to the reservations array" do + expect(@front_desk.reservations.length).must_equal 3 + expect(@front_desk.reservations.first).must_equal @reservation1 + expect(@front_desk.reservations.last).must_equal @reservation3 + end + end + + describe "#add_block" do + it "adds the block passed in to the blocks array" do + block = Hotel::Block.new( + id: 1, + rooms: (1..5).to_a, + rate: 150.0, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + before_length = @front_desk.blocks.length + @front_desk.add_block(block) + after_length = @front_desk.blocks.length + + expect(@front_desk.blocks.last).must_be_kind_of Hotel::Block + expect(before_length).must_equal 0 + expect(after_length).must_equal 1 + end + end + describe "find_block" do before do @block1 = Hotel::Block.new( @@ -381,6 +332,56 @@ end end + describe "#reserve_block" do + before do + rooms = (1..5).to_a + rate = 150.0 + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @block = @front_desk.reserve_block(rooms, rate, date_range) + end + + it "can reserve a block given a collection of rooms, a discounted room rate, and a date range" do + expect(@block).must_be_kind_of Hotel::Block + end + + it "throws an exception if at least one of the rooms is unavailable for the given date range" do + rooms = (6..10).to_a + rate = 150.0 + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + reservation = Hotel::Reservation.new( + id: 1, + room: 6, + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + @front_desk.add_reservation(reservation) + + expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError + end + + it "throws an exception if at least one of the rooms can be found in an existing hotel block for the given date range" do + rooms = (5..9).to_a + rate = 150.0 + date_range = Hotel::DateRange.new( + start_date: Date.new(2020,3,2), + end_date: Date.new(2020,3,5) + ) + + expect{@front_desk.reserve_block(rooms, rate, date_range)}.must_raise ArgumentError + end + + it "adds the new Block to the blocks array" do + expect(@front_desk.blocks.length).must_equal 1 + expect(@front_desk.blocks.first).must_equal @block + end + end + describe "#find_available_room_in_block" do before do @block = Hotel::Block.new( @@ -420,6 +421,7 @@ it "returns all rooms if there are no Reservations with the given block id" do @front_desk.reservations.clear available_rooms = @front_desk.find_available_room_in_block(1) + expect(@front_desk.reservations.length).must_equal 0 expect(available_rooms).must_equal @block.rooms end From f20001484f1d4e5b39e54725b42ab54b2144f7aa Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 9 Mar 2020 01:49:55 -0700 Subject: [PATCH 098/100] creates refactors.txt --- refactors.txt | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 refactors.txt diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..b49ba3671 --- /dev/null +++ b/refactors.txt @@ -0,0 +1,43 @@ +================= +lib/front_desk.rb +================= + +1) class FrontDesk +- Since the program will be used by employees of the hotel and not the general public, I thought FrontDesk would be more descriptive. But if the program is ported to an online reservation system that is open to the general public, the class name should probably change to HotelController or ReservationSystem. + +2) #find_available_room +- TIME COMPLEXITY is O(n^2)! This method is very expensive because it iterates through two arrays of unknown size and it creates a new array in memory each time it adds a room to the unavailable_rooms list. +- If I created a Room class that knew its Reservations and/or the Blocks it belonged to during a DateRange, I could refactor this method to just use the #reject enumerable, rejecting any rooms that met the existing conditionals. + +3) any method that has date_range as a parameter +- I was visualizing this program as the backend of a digital form with separate fields for the start and end dates of range (if the function required that information). Each time the 'submit' button is pressed, the program would collect the values of these fields and use them to instantiate a new DateRange object, then pass that object into the method. This is why the start_date and end_date attributes are both readable and writable, so they can be written from outside the program. However, I'm not sure if this will work as intended, so it's possible that many of my tests are passing superficially! + +4) #reserve_room & #reserve_room_in_block +- I may be able to merge these methods into one, because a Reservation can be instantiated without a block and rate attribute. +- If I create a Room class, I could have the rate stored in each Room instead of having it passed into these methods. +- But if the program is ported to an online reservation system that is open to the general public, these methods should stay separate because the general public is not allowed to reserve rooms in blocks. + +================== +lib/reservation.rb +================== + +1) #rate & #total_cost +- If I create a Room class, I could have the rate stored in each Room instead of having it passed into a new Reservation. +- The #total_cost method would then call the room.rate + +2) #start_date & #end_date +- I was thinking that since these attributes can be written over in the DateRange class, they should probably not be stored anywhere else. But if each Reservation was able to call its start_date and end_date, this would simplify some method calls in the FrontDesk class. Perhaps this is an opportunity for inheritance (i.e., class Reservation < DateRange)? + +================= +lib/date_range.rb +================= + +1) #include? +- An earlier version simply returned (start_date..end_date).include?(date), which creates an instance of the Range class, which already has an include? method. I'm wondering if this was a better design, but I also wanted to avoid dependencies (if the Range class changes in the future, any method that creates an instance of that class might break). Instead, I created a binary search method that is not dependent on an additional class. + +============ +lib/block.rb +============ + +1) class Block +- If I create a Room class, there could be an opportunity for inheritance here (i.e., a Block is a Room), which could help with the FrontDesk#find_available_room (see notes above) \ No newline at end of file From 3363369c67ad0e8c1dab74cc2f231cd34cf36a20 Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 9 Mar 2020 02:40:42 -0700 Subject: [PATCH 099/100] removes require_relative 'reservation' --- lib/front_desk.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index afa7a8aaa..dffdd1368 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,5 +1,3 @@ -require_relative 'reservation' - module Hotel class FrontDesk attr_reader :rooms, :reservations, :blocks From c6689d5292ba80fd85b8c5a9670369558f3cabbd Mon Sep 17 00:00:00 2001 From: saraleecodes Date: Mon, 9 Mar 2020 02:44:04 -0700 Subject: [PATCH 100/100] revises notes for #find_available_room --- refactors.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/refactors.txt b/refactors.txt index b49ba3671..c462bb94f 100644 --- a/refactors.txt +++ b/refactors.txt @@ -6,7 +6,7 @@ lib/front_desk.rb - Since the program will be used by employees of the hotel and not the general public, I thought FrontDesk would be more descriptive. But if the program is ported to an online reservation system that is open to the general public, the class name should probably change to HotelController or ReservationSystem. 2) #find_available_room -- TIME COMPLEXITY is O(n^2)! This method is very expensive because it iterates through two arrays of unknown size and it creates a new array in memory each time it adds a room to the unavailable_rooms list. +- This method is very expensive because it iterates through two arrays of unknown size (time complexity is O(n^2)) and it creates a new array in memory each time it adds a room to the unavailable_rooms list (space complexity is O(n)). - If I created a Room class that knew its Reservations and/or the Blocks it belonged to during a DateRange, I could refactor this method to just use the #reject enumerable, rejecting any rooms that met the existing conditionals. 3) any method that has date_range as a parameter