From aefb9f1d8b06341eb24980605fb4eb56e674025e Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Tue, 4 Sep 2018 14:43:05 -0700 Subject: [PATCH 01/50] Add coverage directory to .gitignore file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5e1422c9c..c0ac3dc53 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ build-iPhoneSimulator/ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: .rvmrc +coverage From 08989e99f53f57f7f8baa9a0042e3f13deea8a71 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Tue, 4 Sep 2018 14:47:08 -0700 Subject: [PATCH 02/50] Define initial module/classes --- lib/reservator.rb | 4 ++++ lib/room.rb | 4 ++++ lib/room_block.rb | 4 ++++ lib/room_tracker.rb | 4 ++++ 4 files changed, 16 insertions(+) create mode 100644 lib/reservator.rb create mode 100644 lib/room.rb create mode 100644 lib/room_block.rb create mode 100644 lib/room_tracker.rb diff --git a/lib/reservator.rb b/lib/reservator.rb new file mode 100644 index 000000000..5847a4288 --- /dev/null +++ b/lib/reservator.rb @@ -0,0 +1,4 @@ +module BookingLogic + class Reservator + end +end diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..4cdd90409 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,4 @@ +module BookingLogic + class Room + end +end diff --git a/lib/room_block.rb b/lib/room_block.rb new file mode 100644 index 000000000..9a748149f --- /dev/null +++ b/lib/room_block.rb @@ -0,0 +1,4 @@ +module BookingLogic + class RoomBlock + end +end diff --git a/lib/room_tracker.rb b/lib/room_tracker.rb new file mode 100644 index 000000000..5de4065f7 --- /dev/null +++ b/lib/room_tracker.rb @@ -0,0 +1,4 @@ +module BookingLogic + class RoomTracker + end +end From fa4a9dd8429bda96ef2c50c6aee9bfd447a9e9d7 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Tue, 4 Sep 2018 15:01:00 -0700 Subject: [PATCH 03/50] Add test for RoomTracker#list_rooms --- spec/room_tracker_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 spec/room_tracker_spec.rb diff --git a/spec/room_tracker_spec.rb b/spec/room_tracker_spec.rb new file mode 100644 index 000000000..5d29358c6 --- /dev/null +++ b/spec/room_tracker_spec.rb @@ -0,0 +1,14 @@ +require_relative 'spec_helper.rb' + +describe 'Wave 1' do + describe 'list_rooms method' do + it 'lists all rooms in the hotel' do + hotel = BookingLogic::RoomTracker.new + + expect(hotel.list_rooms).must_be_kind_of Array + expect(hotel.list_rooms.length).must_equal 20 + end + end + + +end From f72661654fefca4dfd8368f40581e398dd00a530 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Tue, 4 Sep 2018 16:07:25 -0700 Subject: [PATCH 04/50] Rename RoomTracker and Reservator to RoomBooker and Reservation respectively --- lib/reservation.rb | 4 ++++ lib/room_booker.rb | 4 ++++ spec/room_booker_spec.rb | 14 ++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 lib/reservation.rb create mode 100644 lib/room_booker.rb create mode 100644 spec/room_booker_spec.rb diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..a76f45a7e --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,4 @@ +module BookingLogic + class Reservation + end +end diff --git a/lib/room_booker.rb b/lib/room_booker.rb new file mode 100644 index 000000000..02014347b --- /dev/null +++ b/lib/room_booker.rb @@ -0,0 +1,4 @@ +module BookingLogic + class RoomBooker + end +end diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb new file mode 100644 index 000000000..2c810e120 --- /dev/null +++ b/spec/room_booker_spec.rb @@ -0,0 +1,14 @@ +require_relative 'spec_helper.rb' + +describe 'Wave 1' do + describe 'list_rooms method' do + it 'lists all rooms in the hotel' do + hotel = BookingLogic::RoomBooker.new + + expect(hotel.list_rooms).must_be_kind_of Array + expect(hotel.list_rooms.length).must_equal 20 + end + end + + +end From 1bba7105ce1dc3f9c619731609245578a386e9fe Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Tue, 4 Sep 2018 16:08:21 -0700 Subject: [PATCH 05/50] Remove deleted files --- lib/reservator.rb | 4 ---- lib/room_tracker.rb | 4 ---- spec/room_tracker_spec.rb | 14 -------------- 3 files changed, 22 deletions(-) delete mode 100644 lib/reservator.rb delete mode 100644 lib/room_tracker.rb delete mode 100644 spec/room_tracker_spec.rb diff --git a/lib/reservator.rb b/lib/reservator.rb deleted file mode 100644 index 5847a4288..000000000 --- a/lib/reservator.rb +++ /dev/null @@ -1,4 +0,0 @@ -module BookingLogic - class Reservator - end -end diff --git a/lib/room_tracker.rb b/lib/room_tracker.rb deleted file mode 100644 index 5de4065f7..000000000 --- a/lib/room_tracker.rb +++ /dev/null @@ -1,4 +0,0 @@ -module BookingLogic - class RoomTracker - end -end diff --git a/spec/room_tracker_spec.rb b/spec/room_tracker_spec.rb deleted file mode 100644 index 5d29358c6..000000000 --- a/spec/room_tracker_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative 'spec_helper.rb' - -describe 'Wave 1' do - describe 'list_rooms method' do - it 'lists all rooms in the hotel' do - hotel = BookingLogic::RoomTracker.new - - expect(hotel.list_rooms).must_be_kind_of Array - expect(hotel.list_rooms.length).must_equal 20 - end - end - - -end From f7e7024ac573c0494bdf8fe20a52bfb55390d8a3 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Tue, 4 Sep 2018 16:18:06 -0700 Subject: [PATCH 06/50] Add test for RoomBooker#new_reservation --- spec/room_booker_spec.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 2c810e120..52343497c 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -10,5 +10,15 @@ end end + describe 'new_reservation method' do + it 'adds a new reservation to master collection' do + room_id = 14 + check_in = Date.new(2018, 4, 1) + check_out = Date.new(2018, 4, 2) + reservation = hotel.new_reservation(room_id, check_in, check_out) + expect(@reservations.last).must_be_instance_of Reservation + expect(@reservations.last).must_equal reservation + end + end end From a0e80242c8b566365235ca21064ab69353645796 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Tue, 4 Sep 2018 16:27:56 -0700 Subject: [PATCH 07/50] Add test for RoomBooker#list_reservations --- spec/room_booker_spec.rb | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 52343497c..fc848523e 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -1,24 +1,41 @@ require_relative 'spec_helper.rb' describe 'Wave 1' do + before do + @hotel = BookingLogic::RoomBooker.new + @room_id = 14 + @check_in = Date.new(2018, 4, 1) + @check_out = Date.new(2018, 4, 2) + @reservation1 = @hotel.new_reservation(room_id, check_in, check_out) + end + describe 'list_rooms method' do it 'lists all rooms in the hotel' do - hotel = BookingLogic::RoomBooker.new - - expect(hotel.list_rooms).must_be_kind_of Array - expect(hotel.list_rooms.length).must_equal 20 + expect(@hotel.list_rooms).must_be_kind_of Array + expect(@hotel.list_rooms.length).must_equal 20 end end describe 'new_reservation method' do it 'adds a new reservation to master collection' do - room_id = 14 - check_in = Date.new(2018, 4, 1) - check_out = Date.new(2018, 4, 2) - reservation = hotel.new_reservation(room_id, check_in, check_out) + expect(@hotel.reservations.last).must_be_instance_of Reservation + expect(@hotel.reservations.last).must_equal @reservation + end + end + + describe 'list_reservations method' do + it 'lists the reservations for a given date' do + room_id = 15 + check_in = Date.new(2018, 4, 3) + check_out = Date.new(2018, 4, 6) + reservation2 = @hotel.new_reservation(room_id, check_in, check_out) + + given_date = Date.new(2018, 4, 1) + listed_reservations = @hotel.list_reservations - expect(@reservations.last).must_be_instance_of Reservation - expect(@reservations.last).must_equal reservation + expect(listed_reservations).must_be_kind_of Array + expect(listed_reservations.first).must_equal @reservation + expect(listed_reservations.last).must_equal reservation2 end end end From 3cd6c0408985dcffdc378eb4d0f881b4f5893af0 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Tue, 4 Sep 2018 16:55:25 -0700 Subject: [PATCH 08/50] Initialize RoomBooker class, add RoomBooker#populate_rooms --- lib/room_booker.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 02014347b..bd11e89ee 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -1,4 +1,26 @@ module BookingLogic class RoomBooker + attr_reader :rooms + attr_accessor :reservations, :blocks + + def initialize + @rooms = populate_rooms + @reservations = [] + @blocks = [] + end + + Room = Struct.new(:id, :cost) + + def populate_rooms + rooms_array = [] + + 20.times do |id| + room = Room.new((id + 1), 200) + rooms_array << room + end + + return rooms_array + end + end end From 9d99057ddd7247fb4f4857bf0ddcca336b8f1240 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 12:18:05 -0700 Subject: [PATCH 09/50] Refactor tests using before block --- spec/room_booker_spec.rb | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index fc848523e..f00ea9c4d 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -1,12 +1,19 @@ +require_relative '../lib/room_booker' require_relative 'spec_helper.rb' describe 'Wave 1' do before do @hotel = BookingLogic::RoomBooker.new - @room_id = 14 - @check_in = Date.new(2018, 4, 1) - @check_out = Date.new(2018, 4, 2) - @reservation1 = @hotel.new_reservation(room_id, check_in, check_out) + + # room_id = 14 + # check_in = Date.new(2018, 4, 1) + # check_out = Date.new(2018, 4, 2) + # @reservation1 = @hotel.new_reservation(room_id, check_in, check_out) + # + # room_id2 = 15 + # check_in2 = Date.new(2018, 4, 3) + # check_out2 = Date.new(2018, 4, 6) + # @reservation2 = hotel.new_reservation(room_id2, check_in2, heck_out2) end describe 'list_rooms method' do @@ -25,17 +32,22 @@ describe 'list_reservations method' do it 'lists the reservations for a given date' do - room_id = 15 - check_in = Date.new(2018, 4, 3) - check_out = Date.new(2018, 4, 6) - reservation2 = @hotel.new_reservation(room_id, check_in, check_out) - given_date = Date.new(2018, 4, 1) listed_reservations = @hotel.list_reservations expect(listed_reservations).must_be_kind_of Array expect(listed_reservations.first).must_equal @reservation - expect(listed_reservations.last).must_equal reservation2 + expect(listed_reservations.last).must_equal @reservation2 end end + + # describe 'reservation_cost method' do + # it 'finds the cost of a given reservation' do + # found_reservation = hotel.find_reservation(@reservation) + # cost2 = hotel.reservation_cost(@reservation2) + # + # expect(cost).must_equal 200 + # expect(cost2).must_equal 600 + # end + # end end From 7c4892fcf172d4b0168f0748f15b19f9e6756745 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 12:26:08 -0700 Subject: [PATCH 10/50] Implement RoomBooker#list_rooms --- lib/room_booker.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index bd11e89ee..422c87c03 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -22,5 +22,8 @@ def populate_rooms return rooms_array end + def list_rooms + return @rooms + end end end From 5bf6222416586f6c4c57e0567f589e1a384239cb Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 12:27:45 -0700 Subject: [PATCH 11/50] Add initialize/attr_reader methods to Reservation --- lib/reservation.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/reservation.rb b/lib/reservation.rb index a76f45a7e..ae786e48d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,4 +1,11 @@ module BookingLogic class Reservation + attr_reader :room_id, :check_in, :check_out + + def initialize(room_id, check_in, check_out) + @room = find_room_by_id(room_id) + @check_in = check_in + @check_out = check_out + end end end From 22f046dab6057117af238934075e5b4b0c0d1d16 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 12:36:54 -0700 Subject: [PATCH 12/50] Implement RoomBooker#find_room_by_id --- lib/room_booker.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 422c87c03..4814ee3f8 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -25,5 +25,9 @@ def populate_rooms def list_rooms return @rooms end + + def find_room_by_id(room_id) + return rooms.find { |room| room.id = room_id } + end end end From 9f1a580c0755b3bec971e027c15b38a98bd03914 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 13:45:35 -0700 Subject: [PATCH 13/50] Refactor init method --- lib/reservation.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index ae786e48d..af5ccc19f 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,9 +1,11 @@ +require_relative 'room_booker' + module BookingLogic class Reservation attr_reader :room_id, :check_in, :check_out - def initialize(room_id, check_in, check_out) - @room = find_room_by_id(room_id) + def initialize(room, check_in, check_out) + @room = room @check_in = check_in @check_out = check_out end From 94516044de087de6f14306459b6fed7d6b3e5549 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 13:46:13 -0700 Subject: [PATCH 14/50] Refactor RoomBooker#list_rooms --- lib/room_booker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 4814ee3f8..fd47f7f21 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -23,7 +23,7 @@ def populate_rooms end def list_rooms - return @rooms + return rooms end def find_room_by_id(room_id) From 257423d38320f90df42abc47a050eea132206532 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 13:47:13 -0700 Subject: [PATCH 15/50] Add simplecov --- spec/spec_helper.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4d1e3fdc8..185fa6890 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,6 @@ +require 'simplecov' +SimpleCov.start + require 'minitest' require 'minitest/autorun' require 'minitest/reporters' From cf3732a489fb376aa003a18c0b1ff211a30690b9 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 13:52:17 -0700 Subject: [PATCH 16/50] Add .gitignore file, ignore Guardfile --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c0ac3dc53..a045b3481 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,4 @@ build-iPhoneSimulator/ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: .rvmrc coverage +./Guardfile From 7c5f7d56e8e1ff48327c76c8ecf5755259cba72a Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 13:53:52 -0700 Subject: [PATCH 17/50] Update .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a045b3481..58b5cdce3 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,4 @@ build-iPhoneSimulator/ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: .rvmrc coverage -./Guardfile +Guardfile From eb47cdcd22c20dcd43064758c8dc55eaa5d9e0c2 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 13:54:28 -0700 Subject: [PATCH 18/50] Fix Guardfile --- Guardfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Guardfile b/Guardfile index 6760f9177..fa59fc3ef 100644 --- a/Guardfile +++ b/Guardfile @@ -1,4 +1,4 @@ -guard :minitest, bundler: false, rubygems: false do +guard :minitest, bundler: false, autorun: false, rubygems: false do # with Minitest::Spec watch(%r{^spec/(.*)_spec\.rb$}) watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } From d3f6c12453b5dcc8ceeabb1b46e75e2fbc11507b Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 14:18:36 -0700 Subject: [PATCH 19/50] Implement RoomBooker#new_reservation --- lib/room_booker.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index fd47f7f21..448693a75 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -1,3 +1,6 @@ +require 'date' +require_relative 'reservation' + module BookingLogic class RoomBooker attr_reader :rooms @@ -29,5 +32,10 @@ def list_rooms def find_room_by_id(room_id) return rooms.find { |room| room.id = room_id } end + + def new_reservation(room_id, check_in, check_out) + room = find_room_by_id(room_id) + reservations << BookingLogic::Reservation.new(room, check_in, check_out) + end end end From e1cb08293674f195118adcd96f68ba31baea556c Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 14:20:32 -0700 Subject: [PATCH 20/50] Refactor before block and RoomBooker#new_reservation tests --- spec/room_booker_spec.rb | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index f00ea9c4d..517ab47c0 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -1,19 +1,18 @@ -require_relative '../lib/room_booker' require_relative 'spec_helper.rb' describe 'Wave 1' do before do @hotel = BookingLogic::RoomBooker.new - # room_id = 14 - # check_in = Date.new(2018, 4, 1) - # check_out = Date.new(2018, 4, 2) - # @reservation1 = @hotel.new_reservation(room_id, check_in, check_out) - # - # room_id2 = 15 - # check_in2 = Date.new(2018, 4, 3) - # check_out2 = Date.new(2018, 4, 6) - # @reservation2 = hotel.new_reservation(room_id2, check_in2, heck_out2) + room_id1 = 14 + check_in1 = Date.new(2018, 4, 1) + check_out1 = Date.new(2018, 4, 2) + @reservation1 = @hotel.new_reservation(room_id1, check_in1, check_out1) + + room_id2 = 15 + check_in2 = Date.new(2018, 4, 3) + check_out2 = Date.new(2018, 4, 6) + @reservation2 = @hotel.new_reservation(room_id2, check_in2, check_out2) end describe 'list_rooms method' do @@ -25,8 +24,7 @@ describe 'new_reservation method' do it 'adds a new reservation to master collection' do - expect(@hotel.reservations.last).must_be_instance_of Reservation - expect(@hotel.reservations.last).must_equal @reservation + expect(@hotel.reservations.first).must_be_instance_of BookingLogic::Reservation end end From d917169d36372f8d917eb3d438e8133384871555 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 14:21:08 -0700 Subject: [PATCH 21/50] Add require_relative for all lib files --- spec/spec_helper.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 185fa6890..11cc09650 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,10 +1,14 @@ +# Add simplecov require 'simplecov' SimpleCov.start require 'minitest' require 'minitest/autorun' require 'minitest/reporters' -# Add simplecov + +require_relative '../lib/room_booker' +require_relative '../lib/reservation.rb' +require_relative '../lib/room_block.rb' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new From 5808a9ac18b4c6b4e7537b7bc61393dd49ed0577 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 15:12:23 -0700 Subject: [PATCH 22/50] Fix typo in attr_reader --- lib/reservation.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index af5ccc19f..cc9b9feb6 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,7 +2,7 @@ module BookingLogic class Reservation - attr_reader :room_id, :check_in, :check_out + attr_reader :room, :check_in, :check_out def initialize(room, check_in, check_out) @room = room From d388c3ec6cf0235b218ed18d30d8c47868e91267 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 15:15:48 -0700 Subject: [PATCH 23/50] Fix typo in RoomBooker#find_room_by_id, implement RoomBooker#list_reservations, and implement RoomBooker#reservation_cost plus helper method RoomBooker#find_reservation --- lib/room_booker.rb | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 448693a75..c73c0f929 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -1,6 +1,8 @@ require 'date' require_relative 'reservation' +require 'pry' + module BookingLogic class RoomBooker attr_reader :rooms @@ -30,12 +32,39 @@ def list_rooms end def find_room_by_id(room_id) - return rooms.find { |room| room.id = room_id } + return rooms.find { |room| room.id == room_id } end def new_reservation(room_id, check_in, check_out) room = find_room_by_id(room_id) reservations << BookingLogic::Reservation.new(room, check_in, check_out) end + + def list_reservations(date) + list_of_reservations = [] + + reservations.each do |reservation| + if (reservation.check_in..reservation.check_out).cover?(date) + list_of_reservations << reservation + end + end + + return list_of_reservations + end + + def find_reservation(room_id, check_in) + reservations.each do |reservation| + if reservation.room.id == room_id && reservation.check_in == check_in + return reservation + end + end + end + + def reservation_cost(room_id, check_in) + reservation = find_reservation(room_id, check_in) + days = reservation.check_out - reservation.check_in + return days.to_i * reservation.room.cost + end + end end From dff05857510fd01584e37d064d18ddc3ed0b34b4 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 15:17:05 -0700 Subject: [PATCH 24/50] Fix tests for list_reservations and reservation_cost --- spec/room_booker_spec.rb | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 517ab47c0..ec3c690f0 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -31,21 +31,24 @@ describe 'list_reservations method' do it 'lists the reservations for a given date' do given_date = Date.new(2018, 4, 1) - listed_reservations = @hotel.list_reservations + listed_reservations = @hotel.list_reservations(given_date) expect(listed_reservations).must_be_kind_of Array - expect(listed_reservations.first).must_equal @reservation - expect(listed_reservations.last).must_equal @reservation2 + # According to the before block there should only be one reservation on 4/1/2018 + expect(listed_reservations.length).must_equal 1 + listed_reservations.each do |reservation| + expect(reservation).must_be_instance_of BookingLogic::Reservation + end end end - # describe 'reservation_cost method' do - # it 'finds the cost of a given reservation' do - # found_reservation = hotel.find_reservation(@reservation) - # cost2 = hotel.reservation_cost(@reservation2) - # - # expect(cost).must_equal 200 - # expect(cost2).must_equal 600 - # end - # end + describe 'reservation_cost method' do + it 'finds the cost of a given reservation' do + reservation = @hotel.reservation_cost(14, Date.new(2018, 4, 1)) + reservation2 = @hotel.reservation_cost(15, Date.new(2018, 4, 3)) + + expect(reservation).must_equal 200 + expect(reservation2).must_equal 600 + end + end end From 886aaabff29a9223ad10bc30b90956e00a1be162 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 16:03:12 -0700 Subject: [PATCH 25/50] Add tests for RoomBooker#list_available_rooms --- spec/room_booker_spec.rb | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index ec3c690f0..092cad566 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -52,3 +52,47 @@ end end end + +describe 'Wave 2' do + before do + @hotel = BookingLogic::RoomBooker.new + + room_id1 = 14 + check_in1 = Date.new(2018, 4, 1) + check_out1 = Date.new(2018, 4, 2) + @reservation1 = @hotel.new_reservation(room_id1, check_in1, check_out1) + + room_id2 = 15 + check_in2 = Date.new(2018, 4, 3) + check_out2 = Date.new(2018, 4, 6) + @reservation2 = @hotel.new_reservation(room_id2, check_in2, check_out2) + + room_id3 = 2 + check_in3 = Date.new(2018, 3, 21) + check_out3 = Date.new(2018, 4, 3) + @reservation3 = @hotel.new_reservation(room_id3, check_in3, check_out3) + end + + describe 'list_available_rooms method' do + before do + @array_of_rooms = @hotel.list_available_rooms(Date.new(2018, 4, 1)) + end + + it 'returns an array of rooms' do + expect(@array_of_rooms).must_be_kind_of Array + @array_of_rooms.each do |room| + expect(room).must_be_instance_of Room + end + end + + it 'only returns available rooms' do + room14 = @hotel.rooms.find { |room| room.id == 14 } + room2 = @hotel.rooms.find { |room| room.id == 2 } + remaining_rooms = @hotel.rooms.find_all { |room| room.id != 14 && room.id != 2 } + + expect(@array_of_rooms).wont_include room14 + expect(@array_of_rooms).wont_include room2 + expect(@array_of_rooms).must_include remaining_rooms + end + end +end From 833f7ffb6e66734026e064e12864176243b01508 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 16:25:09 -0700 Subject: [PATCH 26/50] Implement RoomBooker#date_range_include? and RoomBooker#list_available_rooms --- lib/room_booker.rb | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index c73c0f929..f98aaaef9 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -40,11 +40,19 @@ def new_reservation(room_id, check_in, check_out) reservations << BookingLogic::Reservation.new(room, check_in, check_out) end + def date_range_include?(reservation, date) + if (reservation.check_in..reservation.check_out).cover?(date) + return true + else + return false + end + end + def list_reservations(date) list_of_reservations = [] reservations.each do |reservation| - if (reservation.check_in..reservation.check_out).cover?(date) + if date_range_include?(reservation, date) list_of_reservations << reservation end end @@ -66,5 +74,19 @@ def reservation_cost(room_id, check_in) return days.to_i * reservation.room.cost end + def list_available_rooms(date) + reserved_rooms = [] + + reservations.each do |reservation| + if date_range_include?(reservation, date) + reserved_rooms << reservation.room + end + end + + available_rooms = rooms - reserved_rooms + + return available_rooms + end + end end From b38fe0945bad37887167f07e8773b7055efa35a5 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 16:26:11 -0700 Subject: [PATCH 27/50] Refactor tests for list_available_rooms --- spec/room_booker_spec.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 092cad566..b79d712db 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -1,4 +1,5 @@ require_relative 'spec_helper.rb' +require 'pry' describe 'Wave 1' do before do @@ -81,7 +82,7 @@ it 'returns an array of rooms' do expect(@array_of_rooms).must_be_kind_of Array @array_of_rooms.each do |room| - expect(room).must_be_instance_of Room + expect(room).must_be_kind_of Struct end end @@ -92,7 +93,9 @@ expect(@array_of_rooms).wont_include room14 expect(@array_of_rooms).wont_include room2 - expect(@array_of_rooms).must_include remaining_rooms + remaining_rooms.each do |room| + expect(@array_of_rooms).must_include room + end end end end From aeb934c8fcb5c82dff3b2ad5d8a2cb0abdeed9d1 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Wed, 5 Sep 2018 23:18:42 -0700 Subject: [PATCH 28/50] Rename variables in RoomBooker#reservation_cost --- lib/room_booker.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index f98aaaef9..1a89814b8 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -70,8 +70,8 @@ def find_reservation(room_id, check_in) def reservation_cost(room_id, check_in) reservation = find_reservation(room_id, check_in) - days = reservation.check_out - reservation.check_in - return days.to_i * reservation.room.cost + days_reserved = reservation.check_out - reservation.check_in + return days_reserved.to_i * reservation.room.cost end def list_available_rooms(date) From 52e41c22689d404cb3d98afaeec9eb4002b92d36 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Thu, 6 Sep 2018 09:22:40 -0700 Subject: [PATCH 29/50] Implement RoomBooker#create_date_range_array and RoomBooker#date_ranges_overlap? --- lib/room_booker.rb | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 1a89814b8..2825fb961 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -74,6 +74,29 @@ def reservation_cost(room_id, check_in) return days_reserved.to_i * reservation.room.cost end + def create_date_range_array(check_in, check_out) + date_range_array = check_in...check_out + return date_range_array.to_a + end + + def date_ranges_overlap?( + existing_check_in, + existing_check_out, + new_check_in, + new_check_out) + + existing_range = create_date_range_array(existing_check_in, existing_check_out) + new_range = create_date_range_array(new_check_in, new_check_out) + + intersecting_dates = existing_range & new_range + + if intersecting_dates.empty? + return true + else + return false + end + end + def list_available_rooms(date) reserved_rooms = [] From b4087df6c5e57e9d91b5c8a32489a1da9210684d Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Thu, 6 Sep 2018 09:24:59 -0700 Subject: [PATCH 30/50] Add test for reserve_available_room method and update test for list_available_rooms method --- spec/room_booker_spec.rb | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index b79d712db..53e574725 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -83,6 +83,8 @@ expect(@array_of_rooms).must_be_kind_of Array @array_of_rooms.each do |room| expect(room).must_be_kind_of Struct + expect(1..20).must_include room.id + expect(room.cost).must_equal 200 end end @@ -98,4 +100,33 @@ end end end + + describe 'reserve_available_room method' do + before do + @hotel = BookingLogic::RoomBooker.new + + room_id1 = 14 + check_in1 = Date.new(2018, 4, 1) + check_out1 = Date.new(2018, 4, 2) + @reservation1 = @hotel.new_reservation(room_id1, check_in1, check_out1) + + room_id2 = 15 + check_in2 = Date.new(2018, 4, 3) + check_out2 = Date.new(2018, 4, 6) + @reservation2 = @hotel.new_reservation(room_id2, check_in2, check_out2) + + room_id3 = 2 + check_in3 = Date.new(2018, 3, 21) + check_out3 = Date.new(2018, 4, 3) + @reservation3 = @hotel.new_reservation(room_id3, check_in3, check_out3) + + @new_reservation = @hotel.reserve_available_room(4, Date.new(2018, 4, 1), Date.new(2018, 4, 4)) + end + + it 'instantiates a new Reservation' do + expect(@new_reservation).must_be_instance_of Reservation + end + + + end end From 3288ef2af0d7c5bb7b613134f5a51033e8d71005 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Sun, 9 Sep 2018 19:43:23 -0700 Subject: [PATCH 31/50] Implement Reservation#reservation_cost --- lib/reservation.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/reservation.rb b/lib/reservation.rb index cc9b9feb6..cb0e24340 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,7 +1,9 @@ +require_relative 'date_logic' require_relative 'room_booker' module BookingLogic class Reservation + include DateLogic attr_reader :room, :check_in, :check_out def initialize(room, check_in, check_out) @@ -9,5 +11,10 @@ def initialize(room, check_in, check_out) @check_in = check_in @check_out = check_out end + + def reservation_cost + days_reserved = check_out - check_in + return days_reserved.to_i * room.cost + end end end From 43e3e122c8ed5f97c6238dccca56850a9efce543 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Sun, 9 Sep 2018 19:49:25 -0700 Subject: [PATCH 32/50] Move all date related methods DateLogic module, implement RoomBooker#reserve_available_room, and refactor RoomBooker#list_available_rooms and RoomBooker#list_reservations, move RoomBooker#reservation_cost to Reservation class --- lib/room_booker.rb | 91 ++++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 2825fb961..51a24a322 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -1,4 +1,5 @@ require 'date' +require_relative 'date_logic' require_relative 'reservation' require 'pry' @@ -37,22 +38,24 @@ def find_room_by_id(room_id) def new_reservation(room_id, check_in, check_out) room = find_room_by_id(room_id) - reservations << BookingLogic::Reservation.new(room, check_in, check_out) + new_reservation = BookingLogic::Reservation.new(room, check_in, check_out) + reservations << new_reservation + return new_reservation end - def date_range_include?(reservation, date) - if (reservation.check_in..reservation.check_out).cover?(date) - return true - else - return false - end - end + # def date_range_include?(reservation, date) + # if (reservation.check_in..reservation.check_out).cover?(date) + # return true + # else + # return false + # end + # end def list_reservations(date) list_of_reservations = [] reservations.each do |reservation| - if date_range_include?(reservation, date) + if DateLogic.date_range_include?(reservation, date) list_of_reservations << reservation end end @@ -68,40 +71,41 @@ def find_reservation(room_id, check_in) end end - def reservation_cost(room_id, check_in) - reservation = find_reservation(room_id, check_in) - days_reserved = reservation.check_out - reservation.check_in - return days_reserved.to_i * reservation.room.cost - end - - def create_date_range_array(check_in, check_out) - date_range_array = check_in...check_out - return date_range_array.to_a - end - - def date_ranges_overlap?( - existing_check_in, - existing_check_out, - new_check_in, - new_check_out) - - existing_range = create_date_range_array(existing_check_in, existing_check_out) - new_range = create_date_range_array(new_check_in, new_check_out) - - intersecting_dates = existing_range & new_range - - if intersecting_dates.empty? - return true - else - return false - end - end - - def list_available_rooms(date) + # def reservation_cost(room_id, check_in) + # reservation = find_reservation(room_id, check_in) + # days_reserved = reservation.check_out - reservation.check_in + # return days_reserved.to_i * reservation.room.cost + # end + + # def create_date_range_array(check_in, check_out) + # date_range_array = check_in...check_out + # return date_range_array.to_a + # end + + # def date_ranges_exclusive?( + # existing_reservation, + # new_check_in, + # new_check_out) + # + # existing_range_array = existing_reservation.date_range_array + # new_range_array = new_reservation.date_range_array + # + # intersecting_dates = existing_range_array & new_range_array + # + # if intersecting_dates.empty? + # return true + # else + # return false + # end + # end + + + + def list_available_rooms(check_in, check_out) reserved_rooms = [] reservations.each do |reservation| - if date_range_include?(reservation, date) + unless DateLogic.date_ranges_exclusive?(reservation, check_in, check_out) reserved_rooms << reservation.room end end @@ -111,5 +115,12 @@ def list_available_rooms(date) return available_rooms end + def reserve_available_room(check_in, check_out) + available_rooms = list_available_rooms(check_in, check_out) + room = available_rooms.first + + return new_reservation(room.id, check_in, check_out) + end + end end From 21cec25ed6a20137f62480fb6d79d07ed3dc4859 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Sun, 9 Sep 2018 19:49:49 -0700 Subject: [PATCH 33/50] Implement all date-related methods in DateLogic module --- lib/date_logic.rb | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/date_logic.rb diff --git a/lib/date_logic.rb b/lib/date_logic.rb new file mode 100644 index 000000000..8d1bf9d6d --- /dev/null +++ b/lib/date_logic.rb @@ -0,0 +1,46 @@ +module DateLogic + def DateLogic.date_range_include?(reservation, date) + if (reservation.check_in...reservation.check_out).cover?(date) + return true + else + return false + end + end + + def DateLogic.date_ranges_exclusive?( + existing_reservation, + new_check_in, + new_check_out) + + existing_range_array = date_range_array( + existing_reservation: existing_reservation + ) + + new_range_array = date_range_array( + check_in: new_check_in, + check_out: new_check_out + ) + + intersecting_dates = existing_range_array & new_range_array + + if intersecting_dates.empty? + return true + else + return false + end + end + + def DateLogic.date_range_array( + existing_reservation: nil, + check_in: nil, + check_out: nil) + + if existing_reservation + date_range = existing_reservation.check_in...existing_reservation.check_out + return date_range.to_a + elsif check_in && check_out + date_range = check_in...check_out + return date_range.to_a + end + end +end From 7760b1a1d16c8a337b3da630b213fd5123232fbc Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Sun, 9 Sep 2018 19:50:43 -0700 Subject: [PATCH 34/50] Refactor several tests --- spec/room_booker_spec.rb | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 53e574725..5e5a8371c 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -76,7 +76,9 @@ describe 'list_available_rooms method' do before do - @array_of_rooms = @hotel.list_available_rooms(Date.new(2018, 4, 1)) + @array_of_rooms = @hotel.list_available_rooms( + Date.new(2018, 4, 1), Date.new(2018, 4, 4) + ) end it 'returns an array of rooms' do @@ -89,12 +91,14 @@ end it 'only returns available rooms' do - room14 = @hotel.rooms.find { |room| room.id == 14 } room2 = @hotel.rooms.find { |room| room.id == 2 } - remaining_rooms = @hotel.rooms.find_all { |room| room.id != 14 && room.id != 2 } + room14 = @hotel.rooms.find { |room| room.id == 14 } + room15 = @hotel.rooms.find { |room| room.id == 15 } + remaining_rooms = @hotel.rooms.find_all { |room| room.id != 14 && room.id != 2 && room.id != 15 } - expect(@array_of_rooms).wont_include room14 expect(@array_of_rooms).wont_include room2 + expect(@array_of_rooms).wont_include room14 + expect(@array_of_rooms).wont_include room15 remaining_rooms.each do |room| expect(@array_of_rooms).must_include room end @@ -105,28 +109,33 @@ before do @hotel = BookingLogic::RoomBooker.new - room_id1 = 14 + room_id1 = 1 check_in1 = Date.new(2018, 4, 1) check_out1 = Date.new(2018, 4, 2) @reservation1 = @hotel.new_reservation(room_id1, check_in1, check_out1) - room_id2 = 15 + room_id2 = 2 check_in2 = Date.new(2018, 4, 3) check_out2 = Date.new(2018, 4, 6) @reservation2 = @hotel.new_reservation(room_id2, check_in2, check_out2) - room_id3 = 2 + room_id3 = 14 check_in3 = Date.new(2018, 3, 21) check_out3 = Date.new(2018, 4, 3) @reservation3 = @hotel.new_reservation(room_id3, check_in3, check_out3) - @new_reservation = @hotel.reserve_available_room(4, Date.new(2018, 4, 1), Date.new(2018, 4, 4)) + @new_reservation = @hotel.reserve_available_room(Date.new(2018, 4, 1), Date.new(2018, 4, 4)) end it 'instantiates a new Reservation' do - expect(@new_reservation).must_be_instance_of Reservation + expect(@new_reservation).must_be_instance_of BookingLogic::Reservation end + it 'does not attempt to reserve a room that is already reserved for that date range' do + expect(@new_reservation.room).wont_equal 1 + expect(@new_reservation.room).wont_equal 2 + expect(@new_reservation.room).wont_equal 14 + end end end From dbed7c01321a516f4d5f7c0d1101fa9f3c539068 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Sun, 9 Sep 2018 19:56:38 -0700 Subject: [PATCH 35/50] Move reservation_cost test from room_booker_spec to reservation_spec --- spec/reservation_spec.rb | 27 +++++++++++++++++++++++++++ spec/room_booker_spec.rb | 10 ---------- 2 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 spec/reservation_spec.rb diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb new file mode 100644 index 000000000..1931d2061 --- /dev/null +++ b/spec/reservation_spec.rb @@ -0,0 +1,27 @@ +require_relative 'spec_helper.rb' + +describe 'Wave 1' do + before do + @hotel = BookingLogic::RoomBooker.new + + room_id1 = 14 + check_in1 = Date.new(2018, 4, 1) + check_out1 = Date.new(2018, 4, 2) + @reservation1 = @hotel.new_reservation(room_id1, check_in1, check_out1) + + room_id2 = 15 + check_in2 = Date.new(2018, 4, 3) + check_out2 = Date.new(2018, 4, 6) + @reservation2 = @hotel.new_reservation(room_id2, check_in2, check_out2) + end + + describe 'reservation_cost method' do + it 'finds the cost of a given reservation' do + reservation1 = @reservation1.reservation_cost + reservation2 = @reservation2.reservation_cost + + expect(reservation1).must_equal 200 + expect(reservation2).must_equal 600 + end + end +end diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 5e5a8371c..fb40caaf7 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -42,16 +42,6 @@ end end end - - describe 'reservation_cost method' do - it 'finds the cost of a given reservation' do - reservation = @hotel.reservation_cost(14, Date.new(2018, 4, 1)) - reservation2 = @hotel.reservation_cost(15, Date.new(2018, 4, 3)) - - expect(reservation).must_equal 200 - expect(reservation2).must_equal 600 - end - end end describe 'Wave 2' do From 04cc1412ca35c95e44c5ee14877ba117718c8de4 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Sun, 9 Sep 2018 20:38:55 -0700 Subject: [PATCH 36/50] Implement RoomBooker#new_room_block --- lib/room_booker.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 51a24a322..c2d98d9ae 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -122,5 +122,11 @@ def reserve_available_room(check_in, check_out) return new_reservation(room.id, check_in, check_out) end + def new_room_block(check_in, check_out, number_of_rooms, rate) + new_room_block = RoomBlock.new(check_in, check_out, number_of_rooms, rate) + @blocks << new_room_block + return new_room_block + end + end end From 6ef98f6b38140a656a65db7cfceae84cb706e6ec Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 00:14:28 -0700 Subject: [PATCH 37/50] Refactor DateLogic.date_range_array and DateLogic.date_ranges_exclusive? --- lib/date_logic.rb | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/lib/date_logic.rb b/lib/date_logic.rb index 8d1bf9d6d..485d3b9d1 100644 --- a/lib/date_logic.rb +++ b/lib/date_logic.rb @@ -8,18 +8,14 @@ def DateLogic.date_range_include?(reservation, date) end def DateLogic.date_ranges_exclusive?( - existing_reservation, + old_check_in, + old_check_out, new_check_in, new_check_out) - - existing_range_array = date_range_array( - existing_reservation: existing_reservation - ) - new_range_array = date_range_array( - check_in: new_check_in, - check_out: new_check_out - ) + existing_range_array = date_range_array(old_check_in, old_check_out) + + new_range_array = date_range_array(new_check_in, new_check_out) intersecting_dates = existing_range_array & new_range_array @@ -30,17 +26,8 @@ def DateLogic.date_ranges_exclusive?( end end - def DateLogic.date_range_array( - existing_reservation: nil, - check_in: nil, - check_out: nil) - - if existing_reservation - date_range = existing_reservation.check_in...existing_reservation.check_out - return date_range.to_a - elsif check_in && check_out - date_range = check_in...check_out - return date_range.to_a - end + def DateLogic.date_range_array(check_in, check_out) + date_range = check_in...check_out + return date_range.to_a end end From 07f110af0139d733eace2e6866fecf3ba65ce656 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 00:15:18 -0700 Subject: [PATCH 38/50] Add error checking to Reservation#initialize via Reservation#check_date_range --- lib/reservation.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index cb0e24340..14758131d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,17 +1,22 @@ -require_relative 'date_logic' require_relative 'room_booker' module BookingLogic class Reservation - include DateLogic attr_reader :room, :check_in, :check_out def initialize(room, check_in, check_out) + check_date_range(check_in, check_out) @room = room @check_in = check_in @check_out = check_out end + def check_date_range(check_in, check_out) + if check_out <= check_in + raise StandardError, "Invalid date range provided" + end + end + def reservation_cost days_reserved = check_out - check_in return days_reserved.to_i * room.cost From 6fe0089df9d3712633ebd43f07ee0496f9a14f9e Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 00:16:47 -0700 Subject: [PATCH 39/50] Implement RoomBlock class, RoomBlock#available, and RoomBlock#set_blocked_room_rate --- lib/room_block.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lib/room_block.rb b/lib/room_block.rb index 9a748149f..822cb66f9 100644 --- a/lib/room_block.rb +++ b/lib/room_block.rb @@ -1,4 +1,38 @@ +require_relative 'no_rooms_in_block' + module BookingLogic class RoomBlock + attr_reader :name, :check_in, :check_out, :rooms, :rate + + def initialize(name, check_in, check_out, room_block, rate) + check_number_of_rooms(room_block) + @name = name + @check_in = check_in + @check_out = check_out + @rooms = room_block + @rate = rate + end + + def check_number_of_rooms(room_block) + if room_block.length > 5 + raise StandardError, "Maximum of 5 rooms per room block" + end + end + + def available + available_rooms = rooms.find_all { |room| room.block_reserved == nil } + + if available_rooms.empty? + raise NoRoomsInBlock, "No rooms currently available in this block" + else + return available_rooms + end + end + + def set_blocked_room_rate + rooms.each do |room| + room.cost = rate + end + end end end From afd0c786146afa0a224313f4eaccb0152ba1f8cd Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 00:21:55 -0700 Subject: [PATCH 40/50] Add necessary require_relatives, add :block_reserved to Room Struct, remove obsolete methods, refactor RoomBooker#list_available_rooms and RoomBooker#new_reservation, implement all RoomBlock related methods, RoomBooker#set_room_rate, and RoomBooker#room_unavailable? error handling --- lib/room_booker.rb | 146 ++++++++++++++++++++++++++++----------------- 1 file changed, 91 insertions(+), 55 deletions(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index c2d98d9ae..63c1776ba 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -1,11 +1,15 @@ require 'date' require_relative 'date_logic' require_relative 'reservation' +require_relative 'room_block' +require_relative 'room_not_available' require 'pry' module BookingLogic class RoomBooker + Room = Struct.new(:id, :cost, :block_reserved) + attr_reader :rooms attr_accessor :reservations, :blocks @@ -15,8 +19,6 @@ def initialize @blocks = [] end - Room = Struct.new(:id, :cost) - def populate_rooms rooms_array = [] @@ -36,21 +38,6 @@ def find_room_by_id(room_id) return rooms.find { |room| room.id == room_id } end - def new_reservation(room_id, check_in, check_out) - room = find_room_by_id(room_id) - new_reservation = BookingLogic::Reservation.new(room, check_in, check_out) - reservations << new_reservation - return new_reservation - end - - # def date_range_include?(reservation, date) - # if (reservation.check_in..reservation.check_out).cover?(date) - # return true - # else - # return false - # end - # end - def list_reservations(date) list_of_reservations = [] @@ -71,62 +58,111 @@ def find_reservation(room_id, check_in) end end - # def reservation_cost(room_id, check_in) - # reservation = find_reservation(room_id, check_in) - # days_reserved = reservation.check_out - reservation.check_in - # return days_reserved.to_i * reservation.room.cost - # end - - # def create_date_range_array(check_in, check_out) - # date_range_array = check_in...check_out - # return date_range_array.to_a - # end - - # def date_ranges_exclusive?( - # existing_reservation, - # new_check_in, - # new_check_out) - # - # existing_range_array = existing_reservation.date_range_array - # new_range_array = new_reservation.date_range_array - # - # intersecting_dates = existing_range_array & new_range_array - # - # if intersecting_dates.empty? - # return true - # else - # return false - # end - # end - - - def list_available_rooms(check_in, check_out) reserved_rooms = [] reservations.each do |reservation| - unless DateLogic.date_ranges_exclusive?(reservation, check_in, check_out) + unless DateLogic.date_ranges_exclusive?( + reservation.check_in, + reservation.check_out, + check_in, + check_out + ) + reserved_rooms << reservation.room end end - available_rooms = rooms - reserved_rooms + unavailable_rooms = reserved_rooms + find_blocked_rooms(check_in, check_out) + + available_rooms = rooms.dup + + unavailable_rooms.each do |unavailable_room| + available_rooms.delete_if { |room| room.id == unavailable_room.id } + end return available_rooms end - def reserve_available_room(check_in, check_out) - available_rooms = list_available_rooms(check_in, check_out) - room = available_rooms.first + def new_reservation(room_id, check_in, check_out) + room = find_room_by_id(room_id) + room_unavailable?(room, check_in, check_out) + new_reservation = BookingLogic::Reservation.new(room, check_in, check_out) + reservations << new_reservation + return new_reservation + end + + def new_block_reservation(name) + block = find_block(name) + room = block.available.first + room.block_reserved = true + new_reservation = BookingLogic::Reservation.new(room, block.check_in, block.check_out) + reservations << new_reservation + return new_reservation + end + + def room_unavailable?(room, check_in, check_out) + unless list_available_rooms(check_in, check_out).include?(room) + raise RoomNotAvailable, "Room not available for the given dates" + end + end + + def find_block(name) + found_block = blocks.find { |block| block.name == name } + return found_block + end + + def find_blocked_rooms(check_in, check_out) + blocked_rooms = [] - return new_reservation(room.id, check_in, check_out) + blocks.each do |block| + unless DateLogic::date_ranges_exclusive?( + block.check_in, + block.check_out, + check_in, + check_out + ) + + block.rooms.each do |room| + blocked_rooms << room + end + end + end + + return blocked_rooms end - def new_room_block(check_in, check_out, number_of_rooms, rate) - new_room_block = RoomBlock.new(check_in, check_out, number_of_rooms, rate) + def block_available_rooms(check_in, check_out, number_of_rooms, rate) + available_rooms = list_available_rooms(check_in, check_out) + room_block = available_rooms.take(number_of_rooms) + return room_block + end + + def new_room_block(name, check_in, check_out, number_of_rooms, rate) + block_of_rooms = block_available_rooms( + check_in, + check_out, + number_of_rooms, + rate + ) + + new_room_block = BookingLogic::RoomBlock.new( + name, + check_in, + check_out, + block_of_rooms, + rate + ) + + new_room_block.set_blocked_room_rate + @blocks << new_room_block return new_room_block end + def set_room_rate(room_id, custom_rate) + room = rooms.find { |room| room.id == room_id } + room.cost = custom_rate + end end end From deb9bf5671333e3d17a052f8d125caeed2e268e8 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 00:22:34 -0700 Subject: [PATCH 41/50] Refactor Wave 2 tests --- spec/room_booker_spec.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index fb40caaf7..136ac7362 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -114,17 +114,15 @@ check_out3 = Date.new(2018, 4, 3) @reservation3 = @hotel.new_reservation(room_id3, check_in3, check_out3) - @new_reservation = @hotel.reserve_available_room(Date.new(2018, 4, 1), Date.new(2018, 4, 4)) + @new_reservation = @hotel.new_reservation(5, Date.new(2018, 4, 1), Date.new(2018, 4, 4)) end it 'instantiates a new Reservation' do expect(@new_reservation).must_be_instance_of BookingLogic::Reservation end - it 'does not attempt to reserve a room that is already reserved for that date range' do - expect(@new_reservation.room).wont_equal 1 - expect(@new_reservation.room).wont_equal 2 - expect(@new_reservation.room).wont_equal 14 + it 'throws a RoomNotAvailable error when trying to reserve a room with a pre-existing reservation conflicting with given dates' do + expect{ @hotel.new_reservation(14, Date.new(2018, 4, 1), Date.new(2018, 4, 4)) }.must_raise RoomNotAvailable end end From 5faca3aff915715ae5bcdfe04d9e44368382ff5b Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 00:23:17 -0700 Subject: [PATCH 42/50] Implement NoRoomsInBlock and RoomNotAvailable custom exceptions --- lib/no_rooms_in_block.rb | 2 ++ lib/room_not_available.rb | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 lib/no_rooms_in_block.rb create mode 100644 lib/room_not_available.rb diff --git a/lib/no_rooms_in_block.rb b/lib/no_rooms_in_block.rb new file mode 100644 index 000000000..fb61ec8cb --- /dev/null +++ b/lib/no_rooms_in_block.rb @@ -0,0 +1,2 @@ +class NoRoomsInBlock < StandardError +end diff --git a/lib/room_not_available.rb b/lib/room_not_available.rb new file mode 100644 index 000000000..0d5b57552 --- /dev/null +++ b/lib/room_not_available.rb @@ -0,0 +1,2 @@ +class RoomNotAvailable < StandardError +end From f427b946cd4a08018d885266f885e9cb4595084b Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 00:24:31 -0700 Subject: [PATCH 43/50] Add tests for RoomBlock --- spec/room_block_spec.rb | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 spec/room_block_spec.rb diff --git a/spec/room_block_spec.rb b/spec/room_block_spec.rb new file mode 100644 index 000000000..1dcfc4705 --- /dev/null +++ b/spec/room_block_spec.rb @@ -0,0 +1,34 @@ +require_relative 'spec_helper.rb' + +describe 'Wave 3' do + before do + @hotel = BookingLogic::RoomBooker.new + + room_id1 = 14 + @check_in1 = Date.new(2018, 4, 1) + check_out1 = Date.new(2018, 4, 2) + @reservation1 = @hotel.new_reservation(room_id1, @check_in1, check_out1) + + room_id2 = 15 + check_in2 = Date.new(2018, 4, 3) + @check_out2 = Date.new(2018, 4, 6) + @reservation2 = @hotel.new_reservation(room_id2, check_in2, @check_out2) + + @name = "Gay Convention" + @room_rate = 160 + @number_of_rooms = 5 + @room_block = @hotel.new_room_block(@name, @check_in1, @check_out2, @number_of_rooms, @room_rate) + end + + describe 'Can create a new RoomBlock' do + it 'creates a new RoomBlock when RoomBlock.new is called' do + expect(@room_block).must_be_instance_of BookingLogic::RoomBlock + + # The following assertions based off of provided arguments in before block + expect(@room_block.check_in).must_equal @check_in1 + expect(@room_block.check_out).must_equal @check_out2 + expect(@room_block.rooms.length).must_equal @number_of_rooms + expect(@room_block.rate).must_equal @room_rate + end + end +end From 627a1affa533366388ad9206c1bf866cdce99615 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 01:44:16 -0700 Subject: [PATCH 44/50] Remove obsolete require_relative --- lib/reservation.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 14758131d..05b40d7ad 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,5 +1,3 @@ -require_relative 'room_booker' - module BookingLogic class Reservation attr_reader :room, :check_in, :check_out From ce4c99555761036d0a74978a6fe736678eed721e Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 01:45:36 -0700 Subject: [PATCH 45/50] Remove RoomBooker#find_reservation, refactor RoomBooker#block_available_rooms --- lib/room_booker.rb | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 63c1776ba..6fc3704e9 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -50,14 +50,6 @@ def list_reservations(date) return list_of_reservations end - def find_reservation(room_id, check_in) - reservations.each do |reservation| - if reservation.room.id == room_id && reservation.check_in == check_in - return reservation - end - end - end - def list_available_rooms(check_in, check_out) reserved_rooms = [] @@ -92,15 +84,6 @@ def new_reservation(room_id, check_in, check_out) return new_reservation end - def new_block_reservation(name) - block = find_block(name) - room = block.available.first - room.block_reserved = true - new_reservation = BookingLogic::Reservation.new(room, block.check_in, block.check_out) - reservations << new_reservation - return new_reservation - end - def room_unavailable?(room, check_in, check_out) unless list_available_rooms(check_in, check_out).include?(room) raise RoomNotAvailable, "Room not available for the given dates" @@ -133,12 +116,24 @@ def find_blocked_rooms(check_in, check_out) end def block_available_rooms(check_in, check_out, number_of_rooms, rate) + available_rooms = list_available_rooms(check_in, check_out) - room_block = available_rooms.take(number_of_rooms) + + room_block = [] + + number_of_rooms.times do |i| + room_block << available_rooms[i].dup + end + + if room_block.length < number_of_rooms + raise StandardError, "There are not enough available rooms for the given dates to create this room block" + end + return room_block end def new_room_block(name, check_in, check_out, number_of_rooms, rate) + block_of_rooms = block_available_rooms( check_in, check_out, @@ -160,6 +155,15 @@ def new_room_block(name, check_in, check_out, number_of_rooms, rate) return new_room_block end + def new_block_reservation(name) + block = find_block(name) + room = block.available.first + room.block_reserved = true + new_reservation = BookingLogic::Reservation.new(room, block.check_in, block.check_out) + reservations << new_reservation + return new_reservation + end + def set_room_rate(room_id, custom_rate) room = rooms.find { |room| room.id == room_id } room.cost = custom_rate From fd332cad485615e1122813b2126b4db10a3b5bd4 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 01:46:44 -0700 Subject: [PATCH 46/50] Add as many edge case tests as I can think of --- spec/room_booker_spec.rb | 94 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 6 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 136ac7362..6e85714d5 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -89,13 +89,22 @@ expect(@array_of_rooms).wont_include room2 expect(@array_of_rooms).wont_include room14 expect(@array_of_rooms).wont_include room15 + remaining_rooms.each do |room| expect(@array_of_rooms).must_include room end end + + it 'does not include blocked rooms' do + block = @hotel.new_room_block("fdsaj", Date.new(2018, 4, 1), Date.new(2018, 4, 6), 5, 150) + + block.rooms.each do |room| + expect(@array_of_rooms).wont_include room + end + end end - describe 'reserve_available_room method' do + describe 'new_reservation method' do before do @hotel = BookingLogic::RoomBooker.new @@ -109,21 +118,94 @@ check_out2 = Date.new(2018, 4, 6) @reservation2 = @hotel.new_reservation(room_id2, check_in2, check_out2) - room_id3 = 14 + room_id3 = 3 check_in3 = Date.new(2018, 3, 21) check_out3 = Date.new(2018, 4, 3) @reservation3 = @hotel.new_reservation(room_id3, check_in3, check_out3) + end - @new_reservation = @hotel.new_reservation(5, Date.new(2018, 4, 1), Date.new(2018, 4, 4)) + it 'instantiates a new Reservation and adds it to master collection' do + expect(@reservation1).must_be_instance_of BookingLogic::Reservation + expect(@hotel.reservations).must_include @reservation1 end - it 'instantiates a new Reservation' do - expect(@new_reservation).must_be_instance_of BookingLogic::Reservation + it 'throws a StandardError when provided with invalid date range' do + expect{ @hotel.new_reservation(4, Date.new(2018, 4, 1), Date.new(2015, 5, 1)) }.must_raise StandardError end it 'throws a RoomNotAvailable error when trying to reserve a room with a pre-existing reservation conflicting with given dates' do - expect{ @hotel.new_reservation(14, Date.new(2018, 4, 1), Date.new(2018, 4, 4)) }.must_raise RoomNotAvailable + expect{ @hotel.new_reservation(3, Date.new(2018, 4, 1), Date.new(2018, 4, 4)) }.must_raise RoomNotAvailable + end + + it 'throws a RoomNotAvailable error when all rooms in the hotel are booked' do + 20.times do |i| + @hotel.new_reservation((i + 1), Date.new(2019, 5, 1), Date.new(2019, 5, 4)) + end + + expect{ @hotel.new_reservation(14, Date.new(2019, 5, 1), Date.new(2019, 5, 4)) }.must_raise RoomNotAvailable + end + end +end + +describe 'Wave 3' do + before do + @hotel = BookingLogic::RoomBooker.new + + room_id1 = 14 + @check_in1 = Date.new(2018, 4, 1) + check_out1 = Date.new(2018, 4, 2) + @reservation1 = @hotel.new_reservation(room_id1, @check_in1, check_out1) + + room_id2 = 15 + check_in2 = Date.new(2018, 4, 3) + @check_out2 = Date.new(2018, 4, 6) + @reservation2 = @hotel.new_reservation(room_id2, check_in2, @check_out2) + + @name = "Gay Convention" + @room_rate = 160 + @number_of_rooms = 5 + @room_block = @hotel.new_room_block(@name, @check_in1, @check_out2, @number_of_rooms, @room_rate) + end + + describe 'new_room_block method' do + it 'instantiates a new RoomBlock' do + expect(@room_block).must_be_instance_of BookingLogic::RoomBlock + + # The following assertions based off of provided arguments in before block + expect(@room_block.name).must_equal @name + expect(@room_block.check_in).must_equal @check_in1 + expect(@room_block.check_out).must_equal @check_out2 + expect(@room_block.rooms.length).must_equal @number_of_rooms + expect(@room_block.rate).must_equal @room_rate + end + + it 'throws an error when creating a RoomBlock with more than 5 rooms' do + expect{ @hotel.new_room_block(@name, @check_in1, @check_out2, 6, @room_rate) }.must_raise StandardError + end + + it 'throws an error when there are not enough rooms left to create new RoomBlock' do + 2.times do |i| + @hotel.new_room_block("#{i}", @check_in1, @check_out2, 5, 150) + end + + expect{ @hotel.new_room_block("asldkfj", @check_in1, @check_out2, 5, 150) }.must_raise StandardError + end + end + + describe 'new_block_reservation method' do + it 'instantiates a new Reservation and adds it to master collection' do + reservation = @hotel.new_block_reservation(@name) + + expect(reservation).must_be_instance_of BookingLogic::Reservation + expect(@hotel.reservations).must_include reservation end + it 'throws a NoRoomsInBlock error when all rooms in that block have already been reserved' do + 5.times do + @hotel.new_block_reservation(@name) + end + + expect{ @hotel.new_block_reservation(@name) }.must_raise NoRoomsInBlock + end end end From 81c33ea1b7446cc2bff92ce5430682e0c68367ca Mon Sep 17 00:00:00 2001 From: haydenwilliams Date: Mon, 10 Sep 2018 01:47:59 -0700 Subject: [PATCH 47/50] Delete room_block_spec.rb --- spec/room_block_spec.rb | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 spec/room_block_spec.rb diff --git a/spec/room_block_spec.rb b/spec/room_block_spec.rb deleted file mode 100644 index 1dcfc4705..000000000 --- a/spec/room_block_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require_relative 'spec_helper.rb' - -describe 'Wave 3' do - before do - @hotel = BookingLogic::RoomBooker.new - - room_id1 = 14 - @check_in1 = Date.new(2018, 4, 1) - check_out1 = Date.new(2018, 4, 2) - @reservation1 = @hotel.new_reservation(room_id1, @check_in1, check_out1) - - room_id2 = 15 - check_in2 = Date.new(2018, 4, 3) - @check_out2 = Date.new(2018, 4, 6) - @reservation2 = @hotel.new_reservation(room_id2, check_in2, @check_out2) - - @name = "Gay Convention" - @room_rate = 160 - @number_of_rooms = 5 - @room_block = @hotel.new_room_block(@name, @check_in1, @check_out2, @number_of_rooms, @room_rate) - end - - describe 'Can create a new RoomBlock' do - it 'creates a new RoomBlock when RoomBlock.new is called' do - expect(@room_block).must_be_instance_of BookingLogic::RoomBlock - - # The following assertions based off of provided arguments in before block - expect(@room_block.check_in).must_equal @check_in1 - expect(@room_block.check_out).must_equal @check_out2 - expect(@room_block.rooms.length).must_equal @number_of_rooms - expect(@room_block.rate).must_equal @room_rate - end - end -end From 0dce5260fe3cc38971ec3969b35bda57a3442576 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 10 Sep 2018 09:28:37 -0700 Subject: [PATCH 48/50] Add tests for DateLogic module --- spec/date_logic_spec.rb | 123 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 spec/date_logic_spec.rb diff --git a/spec/date_logic_spec.rb b/spec/date_logic_spec.rb new file mode 100644 index 000000000..dba14d6d7 --- /dev/null +++ b/spec/date_logic_spec.rb @@ -0,0 +1,123 @@ +require_relative 'spec_helper.rb' + +describe 'Wave 1' do + describe 'DateLogic.date_range_include?' do + before do + @hotel = BookingLogic::RoomBooker.new + + room_id1 = 14 + check_in1 = Date.new(2018, 4, 1) + check_out1 = Date.new(2018, 4, 2) + @reservation1 = @hotel.new_reservation(room_id1, check_in1, check_out1) + + room_id2 = 15 + check_in2 = Date.new(2018, 4, 3) + check_out2 = Date.new(2018, 4, 6) + @reservation2 = @hotel.new_reservation(room_id2, check_in2, check_out2) + end + + it 'returns true when reservation date range includes given date' do + result = DateLogic.date_range_include?(@reservation1, Date.new(2018, 4, 1)) + expect(result).must_equal true + + result2 = DateLogic.date_range_include?(@reservation2, Date.new(2018, 4, 4)) + expect(result2).must_equal true + end + + it 'returns false when reservation date range does not include given date' do + result = DateLogic.date_range_include?(@reservation1, Date.new(2018, 4, 2)) + expect(result).must_equal false + + result2 = DateLogic.date_range_include?(@reservation2, Date.new(1992, 9, 11)) + expect(result2).must_equal false + + result3 = DateLogic.date_range_include?(@reservation2, Date.new(2018, 4, 6)) + expect(result3).must_equal false + end + end +end + +describe 'Wave 2' do + describe 'DateLogic.date_range_exclusive?' do + it 'returns true for completely non-intersecting date ranges' do + non_intersecting = DateLogic.date_ranges_exclusive?( + Date.new(2018, 4, 1), + Date.new(2018, 4, 3), + Date.new(2018, 4, 4), + Date.new(2018, 4, 18)) + + non_intersecting2 = DateLogic.date_ranges_exclusive?( + Date.new(2018, 3, 1), + Date.new(2018, 3, 16), + Date.new(2018, 2, 3), + Date.new(2018, 2, 28)) + + expect(non_intersecting).must_equal true + expect(non_intersecting2).must_equal true + end + + it 'returns false for back intersecting dates' do + intersecting = DateLogic.date_ranges_exclusive?( + Date.new(2018, 4, 1), + Date.new(2018, 4, 3), + Date.new(2018, 4, 2), + Date.new(2018, 4, 18)) + + expect(intersecting).must_equal false + end + + it 'returns false for front intersecting dates' do + intersecting = DateLogic.date_ranges_exclusive?( + Date.new(2018, 4, 1), + Date.new(2018, 4, 5), + Date.new(2018, 4, 4), + Date.new(2018, 4, 18)) + + expect(intersecting).must_equal false + end + + it 'returns false for encapsulated dates' do + encapsulated1 = DateLogic.date_ranges_exclusive?( + Date.new(2018, 4, 1), + Date.new(2018, 4, 21), + Date.new(2018, 4, 4), + Date.new(2018, 4, 18)) + + encapsulated2 = DateLogic.date_ranges_exclusive?( + Date.new(2018, 4, 1), + Date.new(2018, 4, 3), + Date.new(2018, 3, 2), + Date.new(2018, 4, 18)) + + expect(encapsulated1).must_equal false + expect(encapsulated2).must_equal false + end + + it 'returns false for same dates' do + same_dates = DateLogic.date_ranges_exclusive?( + Date.new(2018, 4, 1), + Date.new(2018, 4, 3), + Date.new(2018, 4, 1), + Date.new(2018, 4, 3)) + + expect(same_dates).must_equal false + end + + it 'returns true when reservations end/begin on checkout date' do + first_checkout = DateLogic.date_ranges_exclusive?( + Date.new(2018, 4, 1), + Date.new(2018, 4, 3), + Date.new(2018, 4, 3), + Date.new(2018, 4, 18)) + + second_checkout = DateLogic.date_ranges_exclusive?( + Date.new(2018, 4, 1), + Date.new(2018, 4, 3), + Date.new(2018, 3, 27), + Date.new(2018, 4, 1)) + + expect(first_checkout).must_equal true + expect(second_checkout).must_equal true + end + end +end From d57fd520f635a34a91cf6519e23462fb5aa5d995 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 1 Oct 2018 14:03:23 -0700 Subject: [PATCH 49/50] add design-activity prompt responses --- design-activity.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..32d1be430 --- /dev/null +++ b/design-activity.md @@ -0,0 +1,35 @@ +1. Both implementations contains the same three classes--CartEntry, ShoppingCart, and Order. + +2. CartEntry - Responsible for a single entry in a ShoppingCart, tracks unit_price of an item and quantity of that item being purchased. + + ShoppingCart - Responsible for multiple CartEntries. + + Order - Responsible for calculating total price of a particular ShoppingCart + +3. CartEntry (one or many) + v + ShoppingCart (only one) + v + Order + +4. CartEntry - price of a single unit of an item, quantity of that item being purchased + ShoppingCart - holds multiple individual CartEntries + Order - sales tax constant, a single ShoppingCart + + The data stored by each class does not change between implementations + +5. CartEntry - #price returns the price of a quantity of some item + ShoppingCart - #price returns the price of all entries in the cart + Order - #total_price returns the cart price + sales tax + + Implementation A uses attr_accessor to make the data from CartEntry and ShoppingCart available to Order so it can calculate the total price, but Implementation B provides instance methods for each that return their respective prices, so that Order can simply call @cart.price then add sales tax. + +6. In Implementation B, the price logic is delegated to lower level classes, but in Implementation A it is not. + + total_price does directly manipulate the instance variables of other classes in Implementation A, but not in B. + +7. Ideally we would be working with Implementation B and could just add conditional functionality in CartEntry#price that affected unit price based on quantity. In Implementation A we would need to modify the code in Order#total_price, which is both unintuitive and messy. + +8. Implementation B, absolutely. I've made my case above... lol + +9. Once again, B. From 185789a5421860cccf290480630946d26068ff52 Mon Sep 17 00:00:00 2001 From: Hayden Williams Date: Mon, 1 Oct 2018 16:51:20 -0700 Subject: [PATCH 50/50] Refactor RoomBooker#new_block_reservation and add RoomBlock#reserve_room to more loosely couple the classes --- design-activity.md | 8 +++++++- lib/room_block.rb | 6 ++++++ lib/room_booker.rb | 7 ++----- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/design-activity.md b/design-activity.md index 32d1be430..32e737a10 100644 --- a/design-activity.md +++ b/design-activity.md @@ -32,4 +32,10 @@ 8. Implementation B, absolutely. I've made my case above... lol -9. Once again, B. +9. Once again, B. + + +----------- + + +In RoomBooker#new_block_reservation, the local `room` variable is used to modify the state of the Room struct, which belongs to the RoomBlock instance. If I were to handle this functionality instead within the RoomBlock class itself in an instance method, my classes would be even more loosely coupled and resilient to future change/easier to change in the future. diff --git a/lib/room_block.rb b/lib/room_block.rb index 822cb66f9..1bb7ed538 100644 --- a/lib/room_block.rb +++ b/lib/room_block.rb @@ -34,5 +34,11 @@ def set_blocked_room_rate room.cost = rate end end + + def reserve_room + room = self.available.first + room.block_reserved = true + return room + end end end diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 6fc3704e9..6ec6421fc 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -4,8 +4,6 @@ require_relative 'room_block' require_relative 'room_not_available' -require 'pry' - module BookingLogic class RoomBooker Room = Struct.new(:id, :cost, :block_reserved) @@ -116,7 +114,7 @@ def find_blocked_rooms(check_in, check_out) end def block_available_rooms(check_in, check_out, number_of_rooms, rate) - + available_rooms = list_available_rooms(check_in, check_out) room_block = [] @@ -157,8 +155,7 @@ def new_room_block(name, check_in, check_out, number_of_rooms, rate) def new_block_reservation(name) block = find_block(name) - room = block.available.first - room.block_reserved = true + room = block.reserve_room new_reservation = BookingLogic::Reservation.new(room, block.check_in, block.check_out) reservations << new_reservation return new_reservation