From bf0a1dc5a46672e647eed5f397018067fba159d2 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 11:09:38 -0700 Subject: [PATCH 01/43] Wrote tests for Room in spec file. Wrote Room class file. Started with hotel class. --- .DS_Store | Bin 0 -> 6148 bytes Rakefile.rb | 9 +++++++++ lib/Hotel.rb | 9 +++++++++ lib/Room.rb | 12 ++++++++++++ specs/spec_helper.rb | 11 +++++++++++ specs/wave-1-specs.rb | 41 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 82 insertions(+) create mode 100644 .DS_Store create mode 100644 Rakefile.rb create mode 100644 lib/Hotel.rb create mode 100644 lib/Room.rb create mode 100644 specs/spec_helper.rb create mode 100644 specs/wave-1-specs.rb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..90c7b22c90821be20ca3d7dadb1b9b842af1c415 GIT binary patch literal 6148 zcmeH~JqiLr422W55Nx)zoW=uqgF*BJUO-k61i?b==jgutu;6MfA}^4ET z-rJ!i>uPEXjdsx-J~ZE~HpRd++C>XCFs&{OBtQZq0@K)ccK+|+pXUEj3%4Xd0)Iw8 zXWRXDgOAFy_3iU4f5@z@8yxE82rriaZ0smr!rkz^*aBKpTPQLxUIZKi0||VUz!L$j B5n})V literal 0 HcmV?d00001 diff --git a/Rakefile.rb b/Rakefile.rb new file mode 100644 index 000000000..5032abcfb --- /dev/null +++ b/Rakefile.rb @@ -0,0 +1,9 @@ +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.libs = ["lib"] + t.warning = true + t.test_files = FileList['specs/*-specs.rb'] +end + +task default: :test diff --git a/lib/Hotel.rb b/lib/Hotel.rb new file mode 100644 index 000000000..a88c99666 --- /dev/null +++ b/lib/Hotel.rb @@ -0,0 +1,9 @@ +module Hotel + class Hotel + def initialize + end + + + + end +end diff --git a/lib/Room.rb b/lib/Room.rb new file mode 100644 index 000000000..aef1222e4 --- /dev/null +++ b/lib/Room.rb @@ -0,0 +1,12 @@ +module Hotel + class Room + attr_reader :room_number, :room_rate + + def initialize(room_number, room_rate = 200) + @room_number = room_number + @room_rate = room_rate + end + + end + +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb new file mode 100644 index 000000000..a40749b85 --- /dev/null +++ b/specs/spec_helper.rb @@ -0,0 +1,11 @@ + +require 'SimpleCov' +SimpleCov.start +require 'minitest' +require 'minitest/autorun' +require 'minitest/reporters' +require 'minitest/skip_dsl' +require 'pry' + +require_relative '../lib/Room.rb' +require_relative '../lib/Hotel.rb' diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb new file mode 100644 index 000000000..a038e0281 --- /dev/null +++ b/specs/wave-1-specs.rb @@ -0,0 +1,41 @@ +require_relative 'spec_helper' + +describe 'Room' do + before do + @new_room = Hotel::Room.new("1") + end + describe 'initialize' do + it "must be an instance of Room" do + @new_room.must_be_instance_of Hotel::Room + end + end + + describe 'room number' do + + it "must have a room number" do + @new_room.must_respond_to :room_number + end + it "must output its correct room number" do + @new_room.room_number.must_equal "1" + end + end + + describe 'room rate' do + it "must have a designated room rate" do + @new_room.must_respond_to :room_rate + end + it "must default to 200" do + @new_room.room_rate.must_equal 200 + end + end + + describe 'Hotel' do + before do + @hotel = Hotel::Hotel.new + end + describe 'initalize' do + @hotel.must_be_instance_of Hotel::Hotel + end + end + +end From f43e7876a4c2e1c4675e935eba50bfc1b35d9f8a Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 12:50:07 -0700 Subject: [PATCH 02/43] Began creating Reservations class. Created self.all_rooms to generate collection of rooms. Began creating tests for Booking class and created file for Booking class. --- lib/.DS_Store | Bin 0 -> 6148 bytes lib/{Hotel.rb => Booking.rb} | 6 +-- lib/Reservations.rb | 36 ++++++++++++++++ specs/spec_helper.rb | 3 +- specs/wave-1-specs.rb | 78 ++++++++++++++++++++++++----------- 5 files changed, 95 insertions(+), 28 deletions(-) create mode 100644 lib/.DS_Store rename lib/{Hotel.rb => Booking.rb} (76%) create mode 100644 lib/Reservations.rb diff --git a/lib/.DS_Store b/lib/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 Date: Wed, 6 Sep 2017 13:07:15 -0700 Subject: [PATCH 03/43] Fleshing out Booking class --- lib/Booking.rb | 10 +++++++++- specs/spec_helper.rb | 1 + specs/wave-1-specs.rb | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 0428b4934..592137f30 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -1,6 +1,14 @@ +require 'date' + module Hotel class Booking - def initialize + def initialize(check_in, check_out) #room_rate, total_cost) + # @check_in_date = check_in_date + # @check_out_date = check_out_date + #@date_range = date_range + #@room_rate = room_rate + @dates = DateRange.new(check_in, check_out) + @total_cost = total_cost end end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index 86e6996a6..ae485c419 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -6,6 +6,7 @@ require 'minitest/reporters' require 'minitest/skip_dsl' require 'pry' +require 'date' require_relative '../lib/Room.rb' require_relative '../lib/Reservations.rb' diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index 8739aa6d1..a2851f6f2 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -32,7 +32,7 @@ describe 'Booking' do before do - @new_booking = Hotel::Booking.new + @new_booking = Hotel::Booking.new(9/21/17, 9/23/17) end describe 'initialize' do it "must be an instance of Booking" do From 366a37e252e07f4bc22c3e784cb33af56c356722 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 13:13:17 -0700 Subject: [PATCH 04/43] created DateRange class file --- lib/Booking.rb | 8 +++++--- lib/DateRange.rb | 8 ++++++++ specs/spec_helper.rb | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 lib/DateRange.rb diff --git a/lib/Booking.rb b/lib/Booking.rb index 592137f30..09d85754c 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -1,14 +1,16 @@ require 'date' +require 'DateRange' module Hotel class Booking def initialize(check_in, check_out) #room_rate, total_cost) - # @check_in_date = check_in_date - # @check_out_date = check_out_date + + @check_in = Date.new(check_in) + @check_out = Date.new(check_out) #@date_range = date_range #@room_rate = room_rate @dates = DateRange.new(check_in, check_out) - @total_cost = total_cost + #@total_cost = total_cost end end diff --git a/lib/DateRange.rb b/lib/DateRange.rb new file mode 100644 index 000000000..7daf8614e --- /dev/null +++ b/lib/DateRange.rb @@ -0,0 +1,8 @@ +require 'date' + +module Hotel + class DateRange + def initialize(check_in, check_out) + end + end +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index ae485c419..0e26cffa9 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -11,3 +11,4 @@ require_relative '../lib/Room.rb' require_relative '../lib/Reservations.rb' require_relative '../lib/Booking.rb' +require_relative '../lib/DateRange.rb' From eca0b032ac3ba5b531f4aa90f89c89da363004ce Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 14:03:18 -0700 Subject: [PATCH 05/43] added tests for Booking class --- lib/Booking.rb | 9 +++++---- specs/wave-1-specs.rb | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 09d85754c..c240abf75 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -3,10 +3,11 @@ module Hotel class Booking - def initialize(check_in, check_out) #room_rate, total_cost) - - @check_in = Date.new(check_in) - @check_out = Date.new(check_out) + attr_reader :check_in, :check_out, :room_number + def initialize(check_in, check_out, room_number = rand(1..20)) #room_rate, total_cost) + @room_number = room_number + @check_in = Date.parse(check_in) + @check_out = Date.parse(check_out) #@date_range = date_range #@room_rate = room_rate @dates = DateRange.new(check_in, check_out) diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index a2851f6f2..dee298946 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -32,12 +32,49 @@ describe 'Booking' do before do - @new_booking = Hotel::Booking.new(9/21/17, 9/23/17) + @new_booking = Hotel::Booking.new("2017-09-21", "2017-09-23") end describe 'initialize' do it "must be an instance of Booking" do @new_booking.must_be_instance_of Hotel::Booking end + it "must have a check in date" do + @new_booking.must_respond_to :check_in + end + it "must have a check out date" do + @new_booking.must_respond_to :check_out + end + it "must have a room number" do + @new_booking.must_respond_to :room_number + end + end + + describe "check in date" do + it "must be a date" do + @new_booking.check_in.must_be_kind_of Date + end + it "must output the correct date" do + @new_booking.check_in.must_equal Date.parse("2017-09-21") + end + end + + describe "check out date" do + it "must be a date do" do + @new_booking.check_out.must_be_kind_of Date + end + it "must output the correct date" do + @new_booking.check_out.must_equal Date.parse("2017-09-23") + end + end + + describe "room number" do + it "must be an integer" do + @new_booking.room_number.must_be_kind_of Integer + end + # it "must be between 1 and 20" do + # @new_booking.room_number.must_equal 1, <=:, 20 + # #@new_booking.room_number.must_equal :<=, 20 + # end end end From d4a50650e01c250e2177e3c11597078963b0b0a4 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 14:26:56 -0700 Subject: [PATCH 06/43] added tests and code for self.all_reservations method. Also added method to create a new reserveration under Reservations class. Need to make tests for new_reservation method --- lib/Reservations.rb | 12 +++++++----- specs/wave-1-specs.rb | 10 +++++----- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 1580a036b..6f04cdde3 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -1,12 +1,11 @@ module Hotel class Reservations - attr_reader :rooms_collection, :reservations_collection, :blocks_collection - + attr_reader :all_reservations + @all_reservations = [] def initialize #(1..20).to_a #@rooms_collection = [] - # @reservations_arr = [] # @blocks_arr = [] end @@ -23,14 +22,17 @@ def self.all_rooms end def self.all_reservations - @reservations_collection = [] - + return @all_reservations end def self.all_blocks @blocks_collection = [] end + def new_reservation(check_in, check_out) + booking = Booking.new(check_in, check_out) + @all_reservations << booking + end end end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index dee298946..5c7e5f2f9 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -96,15 +96,15 @@ ##TODO: write more tests here ## end - # describe 'collection of reservations' do - # it "has a collection of reservtations" do - # @new_hotel.reservations_collection.must_be_kind of Array - # end + describe 'all reservations' do + it "has a collection of reservations" do + Hotel::Reservations.all_reservations.must_be_kind_of Array + end # ##TODO: write more tests # end # describe 'blocks' do # it "has a colelction of blocks" do # @new_hotel.blocks_collection.must_be_kind of Array # end - # end + end end From 35184697e5e2d5a3972a6118a871b27ce917962a Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 15:42:07 -0700 Subject: [PATCH 07/43] fixed method for new reservation and testing --- lib/Reservations.rb | 11 ++++++----- specs/wave-1-specs.rb | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 6f04cdde3..6f39f3177 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -25,13 +25,14 @@ def self.all_reservations return @all_reservations end - def self.all_blocks - @blocks_collection = [] - end + # def self.all_blocks + # @blocks_collection = [] + # end - def new_reservation(check_in, check_out) - booking = Booking.new(check_in, check_out) + def self.new_reservation(check_in, check_out) + booking = Hotel::Booking.new(check_in, check_out) @all_reservations << booking + return booking end end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index 5c7e5f2f9..a3ccab041 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -100,11 +100,28 @@ it "has a collection of reservations" do Hotel::Reservations.all_reservations.must_be_kind_of Array end + end + + describe 'new reservation' do + before do + @new_booking1 = Hotel::Reservations.new_reservation("2017-09-21", "2017-09-23") + end + it 'must create a new booking' do + @new_booking1.must_be_instance_of Hotel::Booking + end + end + + describe 'all reservations' do + it 'must be an array of all reservations' do + + + end + end + # ##TODO: write more tests # end # describe 'blocks' do - # it "has a colelction of blocks" do + # it "has a collection of blocks" do # @new_hotel.blocks_collection.must_be_kind of Array # end - end end From 100c4c7177a5b7664ef8b013d6fb3ac07a37fe7f Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 16:09:25 -0700 Subject: [PATCH 08/43] fixed/finished tests for all_reservations method --- lib/Booking.rb | 3 ++- lib/Reservations.rb | 4 ++++ specs/wave-1-specs.rb | 23 +++++++++++++++++------ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index c240abf75..fb197d13f 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -11,8 +11,9 @@ def initialize(check_in, check_out, room_number = rand(1..20)) #room_rate, total #@date_range = date_range #@room_rate = room_rate @dates = DateRange.new(check_in, check_out) - #@total_cost = total_cost + @total_cost = total_cost end + end end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 6f39f3177..b8653f391 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -35,5 +35,9 @@ def self.new_reservation(check_in, check_out) return booking end + def self.clear_reservations + @all_reservations = [] + end + end end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index a3ccab041..369774163 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -103,18 +103,29 @@ end describe 'new reservation' do - before do - @new_booking1 = Hotel::Reservations.new_reservation("2017-09-21", "2017-09-23") - end + it 'must create a new booking' do - @new_booking1.must_be_instance_of Hotel::Booking + new_booking1 = Hotel::Reservations.new_reservation("2017-09-21", "2017-09-23") + new_booking1.must_be_instance_of Hotel::Booking end end describe 'all reservations' do + before do + Hotel::Reservations.clear_reservations + @new_booking1 = Hotel::Reservations.new_reservation("2017-09-21", "2017-09-23") + @new_booking2 = Hotel::Reservations.new_reservation("2020-01-01", "2020-01-15") + @new_booking3 = Hotel::Reservations.new_reservation("2019-01-01", "2019-01-15") + end it 'must be an array of all reservations' do - - + Hotel::Reservations.all_reservations.must_be_kind_of Array + end + it 'must contain correct number of reservations made' do + puts Hotel::Reservations.all_reservations + Hotel::Reservations.all_reservations.length.must_equal 3 + end + it 'must contain the first reservation made' do + Hotel::Reservations.all_reservations[0].check_in.must_equal Date.parse("2017-09-21") end end From 49a2723dcdc9d325105bba22e656c008ca0060e5 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 16:35:39 -0700 Subject: [PATCH 09/43] added total cost method to booking and tested with all reservations --- lib/Booking.rb | 17 ++++++++++++----- lib/Reservations.rb | 7 +++++-- specs/wave-1-specs.rb | 4 +++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index fb197d13f..a3ec0954d 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -3,17 +3,24 @@ module Hotel class Booking - attr_reader :check_in, :check_out, :room_number - def initialize(check_in, check_out, room_number = rand(1..20)) #room_rate, total_cost) + attr_reader :check_in, :check_out, :room_number, :total_cost + def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) #total_cost = 200) @room_number = room_number @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) #@date_range = date_range - #@room_rate = room_rate + @room_rate = room_rate @dates = DateRange.new(check_in, check_out) - @total_cost = total_cost + # @num_days = (@check_out - @check_in).to_i + # @total_cost = (@room_rate * @num_days) + @discount = 0 + end + + def total_cost + num_days = (@check_out - @check_in).to_i + @total_cost = @room_rate * num_days + return @total_cost end - end end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index b8653f391..bd6c76208 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -29,13 +29,16 @@ def self.all_reservations # @blocks_collection = [] # end - def self.new_reservation(check_in, check_out) + def self.new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200, total_cost = 200) booking = Hotel::Booking.new(check_in, check_out) @all_reservations << booking return booking end - def self.clear_reservations + def list_reservations_by_date + end + + def self.clear_reservations #Using this for testing purposes @all_reservations = [] end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index 369774163..b881ce69d 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -121,12 +121,14 @@ Hotel::Reservations.all_reservations.must_be_kind_of Array end it 'must contain correct number of reservations made' do - puts Hotel::Reservations.all_reservations Hotel::Reservations.all_reservations.length.must_equal 3 end it 'must contain the first reservation made' do Hotel::Reservations.all_reservations[0].check_in.must_equal Date.parse("2017-09-21") end + it 'must contain the correct total cost of the reservation' do + Hotel::Reservations.all_reservations[0].total_cost.must_equal 400 + end end # ##TODO: write more tests From 3c52875fed00a6770fccc6bdbca4aea4acea03c7 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 17:04:26 -0700 Subject: [PATCH 10/43] working on Date Range class and way to get list of dates involved in a reservation, so that can generate list of reservations on a specific day. Added method under Reservations for list reservations by day but it is not complete yet. --- lib/DateRange.rb | 1 + lib/Reservations.rb | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/DateRange.rb b/lib/DateRange.rb index 7daf8614e..c7b8ccfd9 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -3,6 +3,7 @@ module Hotel class DateRange def initialize(check_in, check_out) + @dates = check_in..check_out end end end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index bd6c76208..cad360da5 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -35,7 +35,11 @@ def self.new_reservation(check_in, check_out, room_number = rand(1..20), room_ra return booking end - def list_reservations_by_date + def list_reservations_by_date(date) + date = Date.parse(date) + @all_reservations.each do |reservation| + reservation.dates + end end def self.clear_reservations #Using this for testing purposes From fc22026afbc0e94f2bec851bf92a05d091835bb0 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 19:26:24 -0700 Subject: [PATCH 11/43] updated DateRange class to include dates method to return an array of dates included in the reservation in string format - was not able to figure out how to get it to dates format directly just yet --- lib/Booking.rb | 2 +- lib/DateRange.rb | 8 +++++++- specs/wave-1-specs.rb | 28 +++++++++++++++++++++------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index a3ec0954d..34da67b2b 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -10,7 +10,7 @@ def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) @check_out = Date.parse(check_out) #@date_range = date_range @room_rate = room_rate - @dates = DateRange.new(check_in, check_out) + @dates = Hotel::DateRange.new(check_in, check_out) # @num_days = (@check_out - @check_in).to_i # @total_cost = (@room_rate * @num_days) @discount = 0 diff --git a/lib/DateRange.rb b/lib/DateRange.rb index c7b8ccfd9..fce05b55e 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -3,7 +3,13 @@ module Hotel class DateRange def initialize(check_in, check_out) - @dates = check_in..check_out + @check_in = check_in + @check_out = check_out + end + + def dates + @dates = (@check_in..@check_out).map(&:to_s) + return @dates end end end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index b881ce69d..cae2c2698 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -43,7 +43,7 @@ end it "must have a check out date" do @new_booking.must_respond_to :check_out - end + end it "must have a room number" do @new_booking.must_respond_to :room_number end @@ -130,11 +130,25 @@ Hotel::Reservations.all_reservations[0].total_cost.must_equal 400 end end +end - # ##TODO: write more tests - # end - # describe 'blocks' do - # it "has a collection of blocks" do - # @new_hotel.blocks_collection.must_be_kind of Array - # end +describe 'DateRange' do + before do + @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") + # @new_date_range2 = Hotel::DateRange.new("2017-01-02", "2017-01-03") + # @new_date_range3 = Hotel::DateRange.new("2017-02-04", "2017-02-07") + end + describe 'initialize' do + it 'will initialize' do + @new_date_range.must_be_instance_of Hotel::DateRange + end + end + describe 'dates method' do + it 'is an array' do + @new_date_range.dates.must_be_kind_of Array + end + it 'must include the correct number of dates' do + @new_date_range.dates.length.must_equal 4 + end + end end From 59b5ae9f6d90696585039639947ba048bb9fea7a Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Wed, 6 Sep 2017 19:29:39 -0700 Subject: [PATCH 12/43] updated DateRange date method to create array of dates rather than strings --- lib/DateRange.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/DateRange.rb b/lib/DateRange.rb index fce05b55e..8e9afad3a 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -9,6 +9,9 @@ def initialize(check_in, check_out) def dates @dates = (@check_in..@check_out).map(&:to_s) + @dates.each do |date| + date = Date.parse(date) + end return @dates end end From 5a3cab7e617390a91bdf28ed671aa0b968ffc132 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Thu, 7 Sep 2017 15:49:02 -0700 Subject: [PATCH 13/43] updated reservations with method to list reservations by date. Tests do not pass. Received feedback from Dan that I sould not be mixing self methods/variables and instance methods/variables. Next will adjust code to have all instance methods/variables (in Reservations class). --- lib/Booking.rb | 10 ++++++---- lib/DateRange.rb | 7 ++++--- lib/Reservations.rb | 10 +++++++--- specs/wave-1-specs.rb | 13 +++++++++++++ 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 34da67b2b..1f72e94a9 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -3,14 +3,16 @@ module Hotel class Booking + # include DateRange attr_reader :check_in, :check_out, :room_number, :total_cost def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) #total_cost = 200) @room_number = room_number @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) - #@date_range = date_range + @date_range = DateRange.new(@check_in, @check_out) + @dates = @date_range.dates @room_rate = room_rate - @dates = Hotel::DateRange.new(check_in, check_out) + #@dates = Hotel::DateRange.new(check_in, check_out) # @num_days = (@check_out - @check_in).to_i # @total_cost = (@room_rate * @num_days) @discount = 0 @@ -18,8 +20,8 @@ def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) def total_cost num_days = (@check_out - @check_in).to_i - @total_cost = @room_rate * num_days - return @total_cost + total_cost = @room_rate * num_days + return total_cost end end diff --git a/lib/DateRange.rb b/lib/DateRange.rb index 8e9afad3a..de596b761 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -5,14 +5,15 @@ class DateRange def initialize(check_in, check_out) @check_in = check_in @check_out = check_out + #@dates = [] end def dates - @dates = (@check_in..@check_out).map(&:to_s) - @dates.each do |date| + dates = (@check_in..@check_out).map(&:to_s) + dates.each do |date| date = Date.parse(date) end - return @dates + return dates end end end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index cad360da5..2017e4519 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -29,17 +29,21 @@ def self.all_reservations # @blocks_collection = [] # end - def self.new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200, total_cost = 200) - booking = Hotel::Booking.new(check_in, check_out) + def self.new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) + booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) @all_reservations << booking return booking end def list_reservations_by_date(date) date = Date.parse(date) + list = [] @all_reservations.each do |reservation| - reservation.dates + if reservation.dates.include?(date) + list << reservation + end end + return list end def self.clear_reservations #Using this for testing purposes diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index cae2c2698..df0734195 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -130,6 +130,19 @@ Hotel::Reservations.all_reservations[0].total_cost.must_equal 400 end end + + describe 'list_reservations_by_date' do + before do + @new_booking4 = Hotel::Reservations.new_reservation("2019-01-01", "2019-01-15") + end + it "must be a method of Reservations" do + Hotel::Reservations.must_respond_to :list_reservations_by_date + end + it "must be an array" do + + Hotel::Reservations.list_reservations_by_date("2019-01-01").must_be_kind_of Array + end + end end describe 'DateRange' do From 0df26f045d13131c14df6ad6a7ff97f92c9f97fc Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Thu, 7 Sep 2017 16:10:29 -0700 Subject: [PATCH 14/43] changed all methods to instance methods. Now working on list reservations by date method. Still does not work - not able to call method dates within the reservations class. --- lib/Reservations.rb | 17 +++++++---- specs/wave-1-specs.rb | 71 +++++++++++++++++++++---------------------- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 2017e4519..2ed17de93 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -1,15 +1,19 @@ +require 'Booking' +require 'DateRange' + module Hotel class Reservations attr_reader :all_reservations - @all_reservations = [] def initialize + @all_reservations = [] + #(1..20).to_a #@rooms_collection = [] # @blocks_arr = [] end - def self.all_rooms + def all_rooms @rooms_collection = [] n = 1 @@ -21,7 +25,7 @@ def self.all_rooms return @rooms_collection end - def self.all_reservations + def all_reservations return @all_reservations end @@ -29,7 +33,7 @@ def self.all_reservations # @blocks_collection = [] # end - def self.new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) + def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) @all_reservations << booking return booking @@ -39,14 +43,15 @@ def list_reservations_by_date(date) date = Date.parse(date) list = [] @all_reservations.each do |reservation| - if reservation.dates.include?(date) + dates = reservation.dates + if dates.include?(date) list << reservation end end return list end - def self.clear_reservations #Using this for testing purposes + def clear_reservations #Using this for testing purposes @all_reservations = [] end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index df0734195..e9780a42c 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -91,77 +91,76 @@ describe "collection of rooms" do it "has a collection of rooms" do - Hotel::Reservations.all_rooms.must_be_kind_of Array + @new_hotel.all_rooms.must_be_kind_of Array end ##TODO: write more tests here ## end describe 'all reservations' do it "has a collection of reservations" do - Hotel::Reservations.all_reservations.must_be_kind_of Array + @new_hotel.all_reservations.must_be_kind_of Array end end describe 'new reservation' do it 'must create a new booking' do - new_booking1 = Hotel::Reservations.new_reservation("2017-09-21", "2017-09-23") + new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") new_booking1.must_be_instance_of Hotel::Booking end end describe 'all reservations' do before do - Hotel::Reservations.clear_reservations - @new_booking1 = Hotel::Reservations.new_reservation("2017-09-21", "2017-09-23") - @new_booking2 = Hotel::Reservations.new_reservation("2020-01-01", "2020-01-15") - @new_booking3 = Hotel::Reservations.new_reservation("2019-01-01", "2019-01-15") + @new_hotel.clear_reservations + @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") + @new_booking2 = @new_hotel.new_reservation("2020-01-01", "2020-01-15") + @new_booking3 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") end it 'must be an array of all reservations' do - Hotel::Reservations.all_reservations.must_be_kind_of Array + @new_hotel.all_reservations.must_be_kind_of Array end it 'must contain correct number of reservations made' do - Hotel::Reservations.all_reservations.length.must_equal 3 + @new_hotel.all_reservations.length.must_equal 3 end it 'must contain the first reservation made' do - Hotel::Reservations.all_reservations[0].check_in.must_equal Date.parse("2017-09-21") + @new_hotel.all_reservations[0].check_in.must_equal Date.parse("2017-09-21") end it 'must contain the correct total cost of the reservation' do - Hotel::Reservations.all_reservations[0].total_cost.must_equal 400 + @new_hotel.all_reservations[0].total_cost.must_equal 400 end end describe 'list_reservations_by_date' do before do - @new_booking4 = Hotel::Reservations.new_reservation("2019-01-01", "2019-01-15") + @new_booking4 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") end it "must be a method of Reservations" do - Hotel::Reservations.must_respond_to :list_reservations_by_date + @new_hotel.must_respond_to :list_reservations_by_date end it "must be an array" do - - Hotel::Reservations.list_reservations_by_date("2019-01-01").must_be_kind_of Array - end - end -end - -describe 'DateRange' do - before do - @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") - # @new_date_range2 = Hotel::DateRange.new("2017-01-02", "2017-01-03") - # @new_date_range3 = Hotel::DateRange.new("2017-02-04", "2017-02-07") - end - describe 'initialize' do - it 'will initialize' do - @new_date_range.must_be_instance_of Hotel::DateRange - end - end - describe 'dates method' do - it 'is an array' do - @new_date_range.dates.must_be_kind_of Array - end - it 'must include the correct number of dates' do - @new_date_range.dates.length.must_equal 4 + @new_hotel.list_reservations_by_date("2019-01-01").must_be_kind_of Array end end end +# +# describe 'DateRange' do +# before do +# @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") +# # @new_date_range2 = Hotel::DateRange.new("2017-01-02", "2017-01-03") +# # @new_date_range3 = Hotel::DateRange.new("2017-02-04", "2017-02-07") +# end +# describe 'initialize' do +# it 'will initialize' do +# @new_date_range.must_be_instance_of Hotel::DateRange +# end +# end +# describe 'dates method' do +# it 'is an array' do +# @new_date_range.dates.must_be_kind_of Array +# end +# it 'must include the correct number of dates' do +# @new_date_range.dates.length.must_equal 4 +# end +# end +# end From 5363e85d6534e4bce42d5686a98b5ba2b523d604 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Thu, 7 Sep 2017 16:12:35 -0700 Subject: [PATCH 15/43] moved method dates from the date range class to the booking class and this resolved the issues with Reservations method list reservations by date. --- lib/Booking.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/Booking.rb b/lib/Booking.rb index 1f72e94a9..5b5eab47b 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -18,6 +18,14 @@ def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) @discount = 0 end + def dates + dates = (@check_in..@check_out).map(&:to_s) + dates.each do |date| + date = Date.parse(date) + end + return dates + end + def total_cost num_days = (@check_out - @check_in).to_i total_cost = @room_rate * num_days From b1b2b23431c7eb333b547e0097aaed10aa7f33b7 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Thu, 7 Sep 2017 16:53:35 -0700 Subject: [PATCH 16/43] fixed DateRange dates method - it was not sending the dates to the array. Fixed Reservations list reservations by date method. Dates must be coming through in slightly different format. Found work around to verify if dates in reservation match with date passed in. --- lib/DateRange.rb | 10 +++++----- lib/Reservations.rb | 8 +++++--- specs/wave-1-specs.rb | 9 ++++++++- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/DateRange.rb b/lib/DateRange.rb index de596b761..46e8f9c86 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -9,11 +9,11 @@ def initialize(check_in, check_out) end def dates - dates = (@check_in..@check_out).map(&:to_s) - dates.each do |date| - date = Date.parse(date) - end - return dates + return Array(@check_in..@check_out) + # dates.each do |date| + # date = Date.parse(date) + # end + end end end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 2ed17de93..4f868471a 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -3,7 +3,7 @@ module Hotel class Reservations - attr_reader :all_reservations + attr_reader def initialize @all_reservations = [] @@ -43,8 +43,10 @@ def list_reservations_by_date(date) date = Date.parse(date) list = [] @all_reservations.each do |reservation| - dates = reservation.dates - if dates.include?(date) + #dates = reservation.dates + # if reservation.dates.include?(date) + # list << reservation + if date >= reservation.check_in && date <= reservation.check_out list << reservation end end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index e9780a42c..39ec414f2 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -133,7 +133,11 @@ describe 'list_reservations_by_date' do before do - @new_booking4 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") + @new_hotel.clear_reservations + @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") + @new_booking2 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") + @new_booking3 = @new_hotel.new_reservation("2019-01-02", "2019-01-12") + @new_booking4 = @new_hotel.new_reservation("2019-01-01", "2019-01-13") end it "must be a method of Reservations" do @new_hotel.must_respond_to :list_reservations_by_date @@ -141,6 +145,9 @@ it "must be an array" do @new_hotel.list_reservations_by_date("2019-01-01").must_be_kind_of Array end + it "must have the correct number of reservations for the date given" do + @new_hotel.list_reservations_by_date("2019-01-04").length.must_equal 3 + end end end # From 1284d1324fc07c72cb425fe721404a05bcd0fdcd Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Thu, 7 Sep 2017 18:58:34 -0700 Subject: [PATCH 17/43] moved def dates back to daterange. --- lib/Booking.rb | 14 +++++++------- lib/Reservations.rb | 7 ++----- specs/wave-1-specs.rb | 45 +++++++++++++++++++++++-------------------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 5b5eab47b..d848e9a75 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -18,13 +18,13 @@ def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) @discount = 0 end - def dates - dates = (@check_in..@check_out).map(&:to_s) - dates.each do |date| - date = Date.parse(date) - end - return dates - end + # def dates + # dates = (@check_in..@check_out).map(&:to_s) + # dates.each do |date| + # date = Date.parse(date) + # end + # return dates + # end def total_cost num_days = (@check_out - @check_in).to_i diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 4f868471a..d48965291 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -3,11 +3,11 @@ module Hotel class Reservations - attr_reader + attr_reader :room_number def initialize @all_reservations = [] - + @room_number = room_number #(1..20).to_a #@rooms_collection = [] # @blocks_arr = [] @@ -43,9 +43,6 @@ def list_reservations_by_date(date) date = Date.parse(date) list = [] @all_reservations.each do |reservation| - #dates = reservation.dates - # if reservation.dates.include?(date) - # list << reservation if date >= reservation.check_in && date <= reservation.check_out list << reservation end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index 39ec414f2..b814d5851 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -148,26 +148,29 @@ it "must have the correct number of reservations for the date given" do @new_hotel.list_reservations_by_date("2019-01-04").length.must_equal 3 end + it "must return the correct reservations" do + @new_hotel.list_reservations_by_date("2017-09-21")[0].room_number.must_equal @new_booking1.room_number + end + end +end + +describe 'DateRange' do + before do + @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") + # @new_date_range2 = Hotel::DateRange.new("2017-01-02", "2017-01-03") + # @new_date_range3 = Hotel::DateRange.new("2017-02-04", "2017-02-07") + end + describe 'initialize' do + it 'will initialize' do + @new_date_range.must_be_instance_of Hotel::DateRange + end + end + describe 'dates method' do + it 'is an array' do + @new_date_range.dates.must_be_kind_of Array + end + it 'must include the correct number of dates' do + @new_date_range.dates.length.must_equal 4 + end end end -# -# describe 'DateRange' do -# before do -# @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") -# # @new_date_range2 = Hotel::DateRange.new("2017-01-02", "2017-01-03") -# # @new_date_range3 = Hotel::DateRange.new("2017-02-04", "2017-02-07") -# end -# describe 'initialize' do -# it 'will initialize' do -# @new_date_range.must_be_instance_of Hotel::DateRange -# end -# end -# describe 'dates method' do -# it 'is an array' do -# @new_date_range.dates.must_be_kind_of Array -# end -# it 'must include the correct number of dates' do -# @new_date_range.dates.length.must_equal 4 -# end -# end -# end From d5e134017497ca7866d0491cda9d0dff4ce076a0 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Fri, 8 Sep 2017 10:07:58 -0700 Subject: [PATCH 18/43] added class for InvalidDateError and added method within Booking to validate dates. Added that method to initialize for Booking. Wrote tests for check if invalid dates raise Invalid DateError. Tests are not passing and I'm not sure why. --- lib/Booking.rb | 33 +++++++++++++++++++++++++-------- lib/DateRange.rb | 21 ++++++++++++++++----- lib/Reservations.rb | 5 +---- specs/wave-1-specs.rb | 12 ++++++++++++ 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index d848e9a75..88c020585 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -2,8 +2,10 @@ require 'DateRange' module Hotel + class InvalidDateError < StandardError + end + class Booking - # include DateRange attr_reader :check_in, :check_out, :room_number, :total_cost def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) #total_cost = 200) @room_number = room_number @@ -16,15 +18,19 @@ def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) # @num_days = (@check_out - @check_in).to_i # @total_cost = (@room_rate * @num_days) @discount = 0 + + validate_dates + end + + def validate_dates + unless @check_in >= Date.today + raise InvalidDateError.new("Check-in cannot be before today's date.") + end + unless @check_in < @check_out + raise InvalidDateError.new("Check-in cannot be after check-out.") + end end - # def dates - # dates = (@check_in..@check_out).map(&:to_s) - # dates.each do |date| - # date = Date.parse(date) - # end - # return dates - # end def total_cost num_days = (@check_out - @check_in).to_i @@ -34,3 +40,14 @@ def total_cost end end + + + + +# def valid_dates +# +# unless card_is_valid?(card_number) +# raise InvalidCardNumberError.new("Invalid credit card number #{card_number}") +# end +# # ... process the transaction ... +# end diff --git a/lib/DateRange.rb b/lib/DateRange.rb index 46e8f9c86..38868c1a1 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -2,18 +2,29 @@ module Hotel class DateRange + #attr_reader :dates Add this? def initialize(check_in, check_out) @check_in = check_in @check_out = check_out #@dates = [] end - def dates + def dates #Add @dates here? return Array(@check_in..@check_out) - # dates.each do |date| - # date = Date.parse(date) - # end - end + + + # class InvalidCardNumberError < StandardError + # end + # + # def process_transaction(card_number, amount) + # # card_is_valid? is defined elsewhere + # unless card_is_valid?(card_number) + # raise InvalidCardNumberError.new("Invalid credit card number #{card_number}") + # end + # # ... process the transaction ... + # end + + end end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index d48965291..edbb84eb1 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -1,5 +1,6 @@ require 'Booking' require 'DateRange' +require 'date' module Hotel class Reservations @@ -29,10 +30,6 @@ def all_reservations return @all_reservations end - # def self.all_blocks - # @blocks_collection = [] - # end - def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) @all_reservations << booking diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index b814d5851..0d2d6bfa4 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -108,6 +108,18 @@ new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") new_booking1.must_be_instance_of Hotel::Booking end + it 'must raise an error if the check-in date is in the past' do + proc{new_booking = @new_hotel.new_reservation("2017-06-01", "2017-09-21")}.must_raise InvalidDateError + end + it 'must raise an error if the check-in date is the same as the check-out date' do + proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-20")}.must_raise InvalidDateError + end + it 'must raise an error if the check_in date is after the check-out date' do + proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18")}.must_raise InvalidDateError + end + it 'must raise an error if the date is not valid on calendar' do + proc{new_booking = @new_hotel.new_reservation("2018-02-30")}.must_raise InvalidDateError + end end describe 'all reservations' do From 30aa6ddb6e16074bb868b31b04a9c27625c2b2a6 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Fri, 8 Sep 2017 10:16:50 -0700 Subject: [PATCH 19/43] corrected syntax error in tests for validate dates. tests now pass. --- lib/Booking.rb | 1 - specs/wave-1-specs.rb | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 88c020585..76e9e00e0 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -31,7 +31,6 @@ def validate_dates end end - def total_cost num_days = (@check_out - @check_in).to_i total_cost = @room_rate * num_days diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index 0d2d6bfa4..3921b3ac7 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -109,16 +109,16 @@ new_booking1.must_be_instance_of Hotel::Booking end it 'must raise an error if the check-in date is in the past' do - proc{new_booking = @new_hotel.new_reservation("2017-06-01", "2017-09-21")}.must_raise InvalidDateError + proc{new_booking = @new_hotel.new_reservation("2017-06-01", "2017-09-21")}.must_raise Hotel::InvalidDateError end it 'must raise an error if the check-in date is the same as the check-out date' do - proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-20")}.must_raise InvalidDateError + proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-20")}.must_raise Hotel::InvalidDateError end it 'must raise an error if the check_in date is after the check-out date' do - proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18")}.must_raise InvalidDateError + proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18")}.must_raise Hotel::InvalidDateError end it 'must raise an error if the date is not valid on calendar' do - proc{new_booking = @new_hotel.new_reservation("2018-02-30")}.must_raise InvalidDateError + proc{new_booking = @new_hotel.new_reservation("2018-02-30")}.must_raise ArgumentError end end From 8bde54c347b68d01ed2efe6f9b15eb8e6cf363dd Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Fri, 8 Sep 2017 11:11:21 -0700 Subject: [PATCH 20/43] Wrote method to check if room is available for dates given in reservation and method to auto-assign room number if a room not chosen when creating a new reservation. Not running correctly yet. Will write tests to try to debug --- lib/Booking.rb | 4 +++ lib/Reservations.rb | 63 ++++++++++++++++++++++++++++++++----------- specs/wave-1-specs.rb | 2 +- 3 files changed, 52 insertions(+), 17 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 76e9e00e0..13a490e79 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -22,6 +22,10 @@ def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) validate_dates end + def auto_assign_room_number + + end + def validate_dates unless @check_in >= Date.today raise InvalidDateError.new("Check-in cannot be before today's date.") diff --git a/lib/Reservations.rb b/lib/Reservations.rb index edbb84eb1..6a244fcb6 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -7,11 +7,11 @@ class Reservations attr_reader :room_number def initialize - @all_reservations = [] - @room_number = room_number - #(1..20).to_a - #@rooms_collection = [] - # @blocks_arr = [] + @all_reservations = [] + @room_number = room_number + #(1..20).to_a + #@rooms_collection = [] + # @blocks_arr = [] end def all_rooms @@ -30,26 +30,57 @@ def all_reservations return @all_reservations end - def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) + def new_reservation(check_in, check_out, room_number = 0, room_rate = 200) booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) + # auto_assign_room_number + # available? @all_reservations << booking return booking end - def list_reservations_by_date(date) - date = Date.parse(date) - list = [] - @all_reservations.each do |reservation| - if date >= reservation.check_in && date <= reservation.check_out - list << reservation + def available? + unless @rooms_collection.include?(@room_number) + raise ArgumentError.new("#{@room_number} is not a valid room number at this property.") + end + @dates[0...-1].each do |date| + list_reservations_by_date(date) + @list.each do |booking| + if booking.room_number == @room_number + return false end + end end - return list + end - def clear_reservations #Using this for testing purposes - @all_reservations = [] + def auto_assign_room_number + unless @room_number > 0 + @rooms_collection.each do |room| + if room.available? + @room_number = room + else @room_number = nil + end + end + if @room_number == nil + raise ArgumentError.new("No rooms available for those dates.") + end + end end + def list_reservations_by_date(date) + date = Date.parse(date) + @list = [] + @all_reservations.each do |reservation| + if date >= reservation.check_in && date < reservation.check_out #removed = so that it wont' include the check out date + list << reservation + end + end + return @list + end + + def clear_reservations #Using this for testing purposes + @all_reservations = [] + end + + end end -end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index 3921b3ac7..646eae6f1 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -118,7 +118,7 @@ proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18")}.must_raise Hotel::InvalidDateError end it 'must raise an error if the date is not valid on calendar' do - proc{new_booking = @new_hotel.new_reservation("2018-02-30")}.must_raise ArgumentError + proc{new_booking = @new_hotel.new_reservation("2018-02-30", "2018-02-31")}.must_raise ArgumentError end end From 0a93b752929b9a198bdc997b278c471e67fd7051 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Fri, 8 Sep 2017 11:34:22 -0700 Subject: [PATCH 21/43] made adjustments to auto assign room number method and to availabe method. Appears auto assign room number may be working without the available method. Available method appears not to be working. Temporarily commented out most of available method so that it only returns true. Will write tests for auto assign room number and then further troubleshoot available method. --- lib/Booking.rb | 4 -- lib/Reservations.rb | 65 ++++++++++++++------------- specs/Reservations-specs.rb | 89 +++++++++++++++++++++++++++++++++++++ specs/wave-1-specs.rb | 87 ------------------------------------ 4 files changed, 123 insertions(+), 122 deletions(-) create mode 100644 specs/Reservations-specs.rb diff --git a/lib/Booking.rb b/lib/Booking.rb index 13a490e79..76e9e00e0 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -22,10 +22,6 @@ def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) validate_dates end - def auto_assign_room_number - - end - def validate_dates unless @check_in >= Date.today raise InvalidDateError.new("Check-in cannot be before today's date.") diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 6a244fcb6..be22d1a87 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -9,6 +9,8 @@ class Reservations def initialize @all_reservations = [] @room_number = room_number + @rooms_collection = [] + all_rooms #(1..20).to_a #@rooms_collection = [] # @blocks_arr = [] @@ -32,55 +34,56 @@ def all_reservations def new_reservation(check_in, check_out, room_number = 0, room_rate = 200) booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - # auto_assign_room_number - # available? + auto_assign_room_number(room_number) + #booking.available? @all_reservations << booking return booking end def available? - unless @rooms_collection.include?(@room_number) - raise ArgumentError.new("#{@room_number} is not a valid room number at this property.") - end - @dates[0...-1].each do |date| - list_reservations_by_date(date) - @list.each do |booking| - if booking.room_number == @room_number - return false - end - end - end + return true + # unless @rooms_collection.include?(room_number) + # raise ArgumentError.new("#{room_number} is not a valid room number at this property.") + # end + # @dates[0...-1].each do |date| + # list_reservations_by_date(date) + # @list.each do |booking| + # if booking.room_number == room_number + # return false + # end + # end + # end end - def auto_assign_room_number - unless @room_number > 0 + def auto_assign_room_number(room_number) + unless room_number > 0 @rooms_collection.each do |room| - if room.available? - @room_number = room - else @room_number = nil + if available? + room_number = room + else room_number = nil end end - if @room_number == nil + if room_number == nil raise ArgumentError.new("No rooms available for those dates.") end end end - def list_reservations_by_date(date) - date = Date.parse(date) - @list = [] - @all_reservations.each do |reservation| - if date >= reservation.check_in && date < reservation.check_out #removed = so that it wont' include the check out date - list << reservation - end + def list_reservations_by_date(date) + date = Date.parse(date) + @list = [] + @all_reservations.each do |reservation| + if date >= reservation.check_in && date < reservation.check_out #removed = so that it wont' include the check out date + @list << reservation end - return @list - end - - def clear_reservations #Using this for testing purposes - @all_reservations = [] end + return @list + end + def clear_reservations #Using this for testing purposes + @all_reservations = [] end + end +end diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb new file mode 100644 index 000000000..55fd0c857 --- /dev/null +++ b/specs/Reservations-specs.rb @@ -0,0 +1,89 @@ +require_relative 'spec_helper' + +#TODO: Write more tests for Reservations +describe 'Reservations' do + before do + @new_hotel = Hotel::Reservations.new + end + describe 'initialize' do + it "must be an instance of Reservations" do + @new_hotel.must_be_instance_of Hotel::Reservations + end + end + + describe "collection of rooms" do + it "has a collection of rooms" do + @new_hotel.all_rooms.must_be_kind_of Array + end + ##TODO: write more tests here ## + end + + describe 'all reservations' do + it "has a collection of reservations" do + @new_hotel.all_reservations.must_be_kind_of Array + end + end + + describe 'new reservation' do + + it 'must create a new booking' do + new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") + new_booking1.must_be_instance_of Hotel::Booking + end + it 'must raise an error if the check-in date is in the past' do + proc{new_booking = @new_hotel.new_reservation("2017-06-01", "2017-09-21")}.must_raise Hotel::InvalidDateError + end + it 'must raise an error if the check-in date is the same as the check-out date' do + proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-20")}.must_raise Hotel::InvalidDateError + end + it 'must raise an error if the check_in date is after the check-out date' do + proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18")}.must_raise Hotel::InvalidDateError + end + it 'must raise an error if the date is not valid on calendar' do + proc{new_booking = @new_hotel.new_reservation("2018-02-30", "2018-02-31")}.must_raise ArgumentError + end + end + + describe 'all reservations' do + before do + @new_hotel.clear_reservations + @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") + @new_booking2 = @new_hotel.new_reservation("2020-01-01", "2020-01-15") + @new_booking3 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") + end + it 'must be an array of all reservations' do + @new_hotel.all_reservations.must_be_kind_of Array + end + it 'must contain correct number of reservations made' do + @new_hotel.all_reservations.length.must_equal 3 + end + it 'must contain the first reservation made' do + @new_hotel.all_reservations[0].check_in.must_equal Date.parse("2017-09-21") + end + it 'must contain the correct total cost of the reservation' do + @new_hotel.all_reservations[0].total_cost.must_equal 400 + end + end + + describe 'list_reservations_by_date' do + before do + @new_hotel.clear_reservations + @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") + @new_booking2 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") + @new_booking3 = @new_hotel.new_reservation("2019-01-02", "2019-01-12") + @new_booking4 = @new_hotel.new_reservation("2019-01-01", "2019-01-13") + end + it "must be a method of Reservations" do + @new_hotel.must_respond_to :list_reservations_by_date + end + it "must be an array" do + @new_hotel.list_reservations_by_date("2019-01-01").must_be_kind_of Array + end + it "must have the correct number of reservations for the date given" do + @new_hotel.list_reservations_by_date("2019-01-04").length.must_equal 3 + end + it "must return the correct reservations" do + @new_hotel.list_reservations_by_date("2017-09-21")[0].room_number.must_equal @new_booking1.room_number + end + end +end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index 646eae6f1..632ca7ff3 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -78,93 +78,6 @@ end end -#TODO: Write more tests for Reservations -describe 'Reservations' do - before do - @new_hotel = Hotel::Reservations.new - end - describe 'initialize' do - it "must be an instance of Reservations" do - @new_hotel.must_be_instance_of Hotel::Reservations - end - end - - describe "collection of rooms" do - it "has a collection of rooms" do - @new_hotel.all_rooms.must_be_kind_of Array - end - ##TODO: write more tests here ## - end - - describe 'all reservations' do - it "has a collection of reservations" do - @new_hotel.all_reservations.must_be_kind_of Array - end - end - - describe 'new reservation' do - - it 'must create a new booking' do - new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") - new_booking1.must_be_instance_of Hotel::Booking - end - it 'must raise an error if the check-in date is in the past' do - proc{new_booking = @new_hotel.new_reservation("2017-06-01", "2017-09-21")}.must_raise Hotel::InvalidDateError - end - it 'must raise an error if the check-in date is the same as the check-out date' do - proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-20")}.must_raise Hotel::InvalidDateError - end - it 'must raise an error if the check_in date is after the check-out date' do - proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18")}.must_raise Hotel::InvalidDateError - end - it 'must raise an error if the date is not valid on calendar' do - proc{new_booking = @new_hotel.new_reservation("2018-02-30", "2018-02-31")}.must_raise ArgumentError - end - end - - describe 'all reservations' do - before do - @new_hotel.clear_reservations - @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") - @new_booking2 = @new_hotel.new_reservation("2020-01-01", "2020-01-15") - @new_booking3 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") - end - it 'must be an array of all reservations' do - @new_hotel.all_reservations.must_be_kind_of Array - end - it 'must contain correct number of reservations made' do - @new_hotel.all_reservations.length.must_equal 3 - end - it 'must contain the first reservation made' do - @new_hotel.all_reservations[0].check_in.must_equal Date.parse("2017-09-21") - end - it 'must contain the correct total cost of the reservation' do - @new_hotel.all_reservations[0].total_cost.must_equal 400 - end - end - - describe 'list_reservations_by_date' do - before do - @new_hotel.clear_reservations - @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") - @new_booking2 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") - @new_booking3 = @new_hotel.new_reservation("2019-01-02", "2019-01-12") - @new_booking4 = @new_hotel.new_reservation("2019-01-01", "2019-01-13") - end - it "must be a method of Reservations" do - @new_hotel.must_respond_to :list_reservations_by_date - end - it "must be an array" do - @new_hotel.list_reservations_by_date("2019-01-01").must_be_kind_of Array - end - it "must have the correct number of reservations for the date given" do - @new_hotel.list_reservations_by_date("2019-01-04").length.must_equal 3 - end - it "must return the correct reservations" do - @new_hotel.list_reservations_by_date("2017-09-21")[0].room_number.must_equal @new_booking1.room_number - end - end -end describe 'DateRange' do before do From 2060ee886f8f0764e5a54a8f2d06235fe55c13e9 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Fri, 8 Sep 2017 14:02:58 -0700 Subject: [PATCH 22/43] Finally got method available working - gives argument error if a room is not available when a new reservation is being made. Started creating method to list all rooms available by date and testing. It is not passing tests yet. --- lib/Booking.rb | 15 ++++++- lib/Reservations.rb | 85 +++++++++++++++++++++++++++---------- specs/Reservations-specs.rb | 47 +++++++++++++++++++- 3 files changed, 123 insertions(+), 24 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 76e9e00e0..19632f296 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -40,7 +40,20 @@ def total_cost end - +# def available +# # greater than or equal than check_in date +# # and less than or equal to check_out date +# # +# # if the reservation dates contains the check_in date of an existing reservation it's already aproblem? +# @dates[0...-1].each do |date| +# list = Hotel::Reservations.list_reservations_by_date(date) +# list.each do |booking| +# if booking.room_number == room_number +# raise ArgumentError.new("Room number #{room_number} is not available for those dates.") +# end +# end +# end +# end # def valid_dates diff --git a/lib/Reservations.rb b/lib/Reservations.rb index be22d1a87..f78e09779 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -32,19 +32,57 @@ def all_reservations return @all_reservations end - def new_reservation(check_in, check_out, room_number = 0, room_rate = 200) + def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - auto_assign_room_number(room_number) - #booking.available? + #validate_room_number + #booking.assign_room_number + available(check_in, check_out, room_number) @all_reservations << booking return booking end - def available? - return true - # unless @rooms_collection.include?(room_number) - # raise ArgumentError.new("#{room_number} is not a valid room number at this property.") - # end + def available(check_in, check_out, room_number) + date_range = DateRange.new(check_in, check_out).dates + date_range[0...-1].each do |date| + list_reservations_by_date(date).each do |booking| + if booking.room_number == room_number + raise ArgumentError.new("Room number #{room_number} is not available for those dates.") + end + end + end + end + + def list_rooms_available_by_date(date) + rooms_available = @rooms_collection + + list_reservations_by_date(date).each do |booking| + if room_number == booking.room_number + rooms_available.delete(room_number) + end + end + return rooms_available + end + + # def validate_room_number #THIS DOESN"T WORK YET + # validation = false + # @rooms_collection.each do |room| + # unless validation == true + # if room.room_number == @room_number + # validation = true + # else validation = false + # end + # end + # end + # if validation == false + # raise ArgumentError.new("#{room_number} is not a valid room number at this property.") + # return false + # else + # return true + # end + # end + + + #THIS DIDN"T WORK# # @dates[0...-1].each do |date| # list_reservations_by_date(date) # @list.each do |booking| @@ -54,21 +92,24 @@ def available? # end # end - end + #end - def auto_assign_room_number(room_number) - unless room_number > 0 - @rooms_collection.each do |room| - if available? - room_number = room - else room_number = nil - end - end - if room_number == nil - raise ArgumentError.new("No rooms available for those dates.") - end - end - end + # def assign_room_number #DOESN"T WORK YET + # unless @room_number > 0 + # @rooms_collection.each do |room| + # if available? + # @room_number = room.room_number + # return @room_number + # else @room_number = nil + # end + # end + # if @room_number == nil + # raise ArgumentError.new("No rooms available for those dates.") + # end + # end + # #room_number = @rooms_collection + # #end + # end def list_reservations_by_date(date) date = Date.parse(date) diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index 55fd0c857..3c72bca79 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -27,7 +27,7 @@ describe 'new reservation' do it 'must create a new booking' do - new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") + new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23", 1) new_booking1.must_be_instance_of Hotel::Booking end it 'must raise an error if the check-in date is in the past' do @@ -44,6 +44,51 @@ end end + describe 'available' do + before do + @new_hotel.clear_reservations + @new_reservation1 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 1) + end + after do + @new_hotel.clear_reservations + end + it 'must must raise argument error if room is not available' do + proc{new_reservation2 = @new_hotel.new_reservation("2018-01-01", "2018-01-04", 1)}.must_raise ArgumentError + end + end + + describe 'list rooms available by date' do + before do + @new_reservation1 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 1) + @new_reservation2 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 2) + @new_reservation3 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 10) + end + it 'must return an array' do + @new_hotel.list_rooms_available_by_date("2018-01-02").must_be_kind_of Array + end + it 'must return the correct number of rooms available' do + @new_hotel.list_rooms_available_by_date("2018-01-03").length.must_equal 17 + end + it 'must return the correct rooms available' do + + end + end + # describe 'assign room number' do + # it 'will assign a room number if no room number is given' do + # new_booking = @new_hotel.new_reservation("2017-09-21", "2017-09-23") + # new_booking.room_number.wont_equal 0 + # end + # end + + # describe 'validate room number' do + # after do + # @new_hotel.clear_reservations + # end + # it 'must raise an error if a room number that does not exist is entered' do + # proc{new_booking = @new_hotel.new_reservation("2017-09-21", "2017-09-30", 45)}.must_raise ArgumentError + # end + # end + describe 'all reservations' do before do @new_hotel.clear_reservations From 3f8d3437720cf69e223cfe21062b8690af6d2776 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Fri, 8 Sep 2017 15:12:48 -0700 Subject: [PATCH 23/43] created tests on reservations. All passing. Started working on Blocks --- lib/Block.rb | 12 ++++++++++++ lib/Reservations.rb | 17 +++++++++++++++-- specs/Block-specs.rb | 15 +++++++++++++++ specs/Reservations-specs.rb | 28 ++++++++++++++++++++-------- specs/spec_helper.rb | 1 + 5 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 lib/Block.rb create mode 100644 specs/Block-specs.rb diff --git a/lib/Block.rb b/lib/Block.rb new file mode 100644 index 000000000..156b2c641 --- /dev/null +++ b/lib/Block.rb @@ -0,0 +1,12 @@ + +module Hotel + class Block < Reservations + + def initialize + + end + + + + end +end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index f78e09779..1ff727cbf 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -55,9 +55,22 @@ def available(check_in, check_out, room_number) def list_rooms_available_by_date(date) rooms_available = @rooms_collection + + # list_reservations_by_date(date).each do |booking| + # i = 0 + # rooms_available.length.times do + # if booking.room_number == rooms_available[i].room_number + # rooms_available.delete_at(i) + # end + # i += 1 + # end + # end list_reservations_by_date(date).each do |booking| - if room_number == booking.room_number - rooms_available.delete(room_number) + #room_number = booking.room_number + rooms_available.each do |room| + if room.room_number == booking.room_number + rooms_available.delete(room) + end end end return rooms_available diff --git a/specs/Block-specs.rb b/specs/Block-specs.rb new file mode 100644 index 000000000..1ec1bfa7c --- /dev/null +++ b/specs/Block-specs.rb @@ -0,0 +1,15 @@ +require_relative 'spec_helper' + +describe 'Block' do + + describe 'initialize' do + it "must be an instance of a Block" do + new_block = block.new + new_block.must_be_instance of Hotel::Block + end + end + + + + +end diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index 3c72bca79..2db638997 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -25,7 +25,9 @@ end describe 'new reservation' do - + before do + @new_hotel.clear_reservations + end it 'must create a new booking' do new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23", 1) new_booking1.must_be_instance_of Hotel::Booking @@ -42,6 +44,12 @@ it 'must raise an error if the date is not valid on calendar' do proc{new_booking = @new_hotel.new_reservation("2018-02-30", "2018-02-31")}.must_raise ArgumentError end + it 'allows a new reservation to be made on a room on the same day as previous check-out' do + @new_hotel.clear_reservations + @new_reservation1 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 1) + @new_reservation2 = @new_hotel.new_reservation("2018-01-05", "2018-01-07", 1) + @new_hotel.all_reservations.length.must_equal 2 + end end describe 'available' do @@ -59,10 +67,14 @@ describe 'list rooms available by date' do before do + @new_hotel.clear_reservations @new_reservation1 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 1) @new_reservation2 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 2) @new_reservation3 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 10) end + after do + @new_hotel.clear_reservations + end it 'must return an array' do @new_hotel.list_rooms_available_by_date("2018-01-02").must_be_kind_of Array end @@ -92,9 +104,9 @@ describe 'all reservations' do before do @new_hotel.clear_reservations - @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") - @new_booking2 = @new_hotel.new_reservation("2020-01-01", "2020-01-15") - @new_booking3 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") + @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23", 2) + @new_booking2 = @new_hotel.new_reservation("2020-01-01", "2020-01-15", 3) + @new_booking3 = @new_hotel.new_reservation("2019-01-01", "2019-01-15", 5) end it 'must be an array of all reservations' do @new_hotel.all_reservations.must_be_kind_of Array @@ -113,10 +125,10 @@ describe 'list_reservations_by_date' do before do @new_hotel.clear_reservations - @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23") - @new_booking2 = @new_hotel.new_reservation("2019-01-01", "2019-01-15") - @new_booking3 = @new_hotel.new_reservation("2019-01-02", "2019-01-12") - @new_booking4 = @new_hotel.new_reservation("2019-01-01", "2019-01-13") + @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23", 1) + @new_booking2 = @new_hotel.new_reservation("2019-01-01", "2019-01-15", 10) + @new_booking3 = @new_hotel.new_reservation("2019-01-02", "2019-01-12", 12) + @new_booking4 = @new_hotel.new_reservation("2019-01-01", "2019-01-13", 15) end it "must be a method of Reservations" do @new_hotel.must_respond_to :list_reservations_by_date diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index 0e26cffa9..61c877602 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -12,3 +12,4 @@ require_relative '../lib/Reservations.rb' require_relative '../lib/Booking.rb' require_relative '../lib/DateRange.rb' +require_relative '../lib/Block.rb' From 22cb829d7ed780ff935d32f173c453a7c1f75ce5 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sat, 9 Sep 2017 11:02:35 -0700 Subject: [PATCH 24/43] updated Block class - it passes tests so far. --- lib/Block.rb | 14 +++++++++++--- lib/Reservations.rb | 16 ---------------- specs/Block-specs.rb | 19 ++++++++++++++++--- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/lib/Block.rb b/lib/Block.rb index 156b2c641..ce99c8d1c 100644 --- a/lib/Block.rb +++ b/lib/Block.rb @@ -1,11 +1,19 @@ module Hotel - class Block < Reservations - - def initialize + class Block + attr_reader :check_in, :check_out, :date_range, :rooms_collection, :discounted_room_rate + def initialize(check_in, check_out, rooms_collection, discounted_room_rate = 180) + @check_in = Date.parse(check_in) + @check_out = Date.parse(check_out) + @date_range = Hotel::DateRange.new(@check_in, @check_out).dates + #@dates = @date_range.dates + @rooms_collection = rooms_collection + @discounted_room_rate = discounted_room_rate end + #def make_new_block + end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 1ff727cbf..46057b097 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -11,8 +11,6 @@ def initialize @room_number = room_number @rooms_collection = [] all_rooms - #(1..20).to_a - #@rooms_collection = [] # @blocks_arr = [] end @@ -34,8 +32,6 @@ def all_reservations def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - #validate_room_number - #booking.assign_room_number available(check_in, check_out, room_number) @all_reservations << booking return booking @@ -54,19 +50,7 @@ def available(check_in, check_out, room_number) def list_rooms_available_by_date(date) rooms_available = @rooms_collection - - - # list_reservations_by_date(date).each do |booking| - # i = 0 - # rooms_available.length.times do - # if booking.room_number == rooms_available[i].room_number - # rooms_available.delete_at(i) - # end - # i += 1 - # end - # end list_reservations_by_date(date).each do |booking| - #room_number = booking.room_number rooms_available.each do |room| if room.room_number == booking.room_number rooms_available.delete(room) diff --git a/specs/Block-specs.rb b/specs/Block-specs.rb index 1ec1bfa7c..f5f76a8b7 100644 --- a/specs/Block-specs.rb +++ b/specs/Block-specs.rb @@ -1,14 +1,27 @@ require_relative 'spec_helper' describe 'Block' do - +before do + @new_hotel = Hotel::Reservations.new + @new_block = Hotel::Block.new("2018-01-01", "2018-01-10", []) +end describe 'initialize' do it "must be an instance of a Block" do - new_block = block.new - new_block.must_be_instance of Hotel::Block + @new_block.must_be_instance_of Hotel::Block end end + describe 'dates' do + it 'must have a list of dates' do + @new_block.must_respond_to :date_range + end + it 'must be an array' do + @new_block.date_range.must_be_kind_of Array + end + it 'elements in the array must be of the date class' do + @new_block.date_range[0].must_be_kind_of Date + end + end From 616ecac4a018bb24a29695508c383dc306ce6367 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sat, 9 Sep 2017 13:25:37 -0700 Subject: [PATCH 25/43] wrote methods in Reservations: new_block. Also created collection of blocks called @blocks. New Blocks get added to the collection when created. Wrote tests as well. --- lib/Block.rb | 6 +++--- lib/Reservations.rb | 25 ++++++++++++++++++++++++- specs/Block-specs.rb | 4 ++-- specs/Reservations-specs.rb | 13 ++++++++++++- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/lib/Block.rb b/lib/Block.rb index ce99c8d1c..3d3545db1 100644 --- a/lib/Block.rb +++ b/lib/Block.rb @@ -1,12 +1,12 @@ module Hotel class Block - attr_reader :check_in, :check_out, :date_range, :rooms_collection, :discounted_room_rate + attr_reader :check_in, :check_out, :date_range, :dates, :rooms_collection, :discounted_room_rate def initialize(check_in, check_out, rooms_collection, discounted_room_rate = 180) @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) - @date_range = Hotel::DateRange.new(@check_in, @check_out).dates - #@dates = @date_range.dates + @date_range = Hotel::DateRange.new(@check_in, @check_out) + @dates = Hotel::DateRange.new(@check_in, @check_out).dates @rooms_collection = rooms_collection @discounted_room_rate = discounted_room_rate diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 46057b097..5efb2658b 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -1,6 +1,7 @@ require 'Booking' require 'DateRange' require 'date' +require 'block' module Hotel class Reservations @@ -11,7 +12,7 @@ def initialize @room_number = room_number @rooms_collection = [] all_rooms - # @blocks_arr = [] + @blocks = [] end def all_rooms @@ -60,6 +61,28 @@ def list_rooms_available_by_date(date) return rooms_available end + def new_block(check_in, check_out, rooms_collection, discounted_room_rate = 180) + block = Hotel::Block.new(check_in, check_out, rooms_collection, discounted_room_rate = 180) + @blocks << block + return block + #avail - check if rooms are availble + + end + + def block_rooms #select rooms from available list + + end + + def new_reservation_in_block(room) + + #check if rooms are in block an available + end + + + + + + # def validate_room_number #THIS DOESN"T WORK YET # validation = false # @rooms_collection.each do |room| diff --git a/specs/Block-specs.rb b/specs/Block-specs.rb index f5f76a8b7..a66536ed9 100644 --- a/specs/Block-specs.rb +++ b/specs/Block-specs.rb @@ -16,10 +16,10 @@ @new_block.must_respond_to :date_range end it 'must be an array' do - @new_block.date_range.must_be_kind_of Array + @new_block.dates.must_be_kind_of Array end it 'elements in the array must be of the date class' do - @new_block.date_range[0].must_be_kind_of Date + @new_block.dates[0].must_be_kind_of Date end end diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index 2db638997..67ba7ecee 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -1,6 +1,5 @@ require_relative 'spec_helper' -#TODO: Write more tests for Reservations describe 'Reservations' do before do @new_hotel = Hotel::Reservations.new @@ -143,4 +142,16 @@ @new_hotel.list_reservations_by_date("2017-09-21")[0].room_number.must_equal @new_booking1.room_number end end + + describe 'make a new block' do + before do + @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", []) + end + it 'must be an instance of a block' do + @new_block.must_be_instance_of Hotel::Block + end + it 'must add the block to the blocks collection' do + @blocks.must_include(@new_block) + end + end end From 35c918dcf588cd2cf019cae306a99855de8488b4 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sat, 9 Sep 2017 15:01:32 -0700 Subject: [PATCH 26/43] Under Reservations class, new blocks can now be created with max 5 rooms. Room collection for the block is created based on number of rooms needed and available rooms for those dates. Started a method to list blocks by dates. Goal is to add this to the availability checks so that rooms will not show as available for general bookings. --- lib/Block.rb | 6 +-- lib/Reservations.rb | 78 ++++++++++++++++++++++++++++--------- specs/Reservations-specs.rb | 11 +++++- 3 files changed, 71 insertions(+), 24 deletions(-) diff --git a/lib/Block.rb b/lib/Block.rb index 3d3545db1..26c2c7599 100644 --- a/lib/Block.rb +++ b/lib/Block.rb @@ -1,13 +1,13 @@ module Hotel class Block - attr_reader :check_in, :check_out, :date_range, :dates, :rooms_collection, :discounted_room_rate - def initialize(check_in, check_out, rooms_collection, discounted_room_rate = 180) + attr_accessor :check_in, :check_out, :date_range, :dates, :block_rooms_collection, :discounted_room_rate + def initialize(check_in, check_out, block_rooms_collection = [], discounted_room_rate = 180) @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) @date_range = Hotel::DateRange.new(@check_in, @check_out) @dates = Hotel::DateRange.new(@check_in, @check_out).dates - @rooms_collection = rooms_collection + @block_rooms_collection = block_rooms_collection @discounted_room_rate = discounted_room_rate end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 5efb2658b..59fdbed4d 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -6,13 +6,16 @@ module Hotel class Reservations attr_reader :room_number + attr_accessor :blocks_collection def initialize - @all_reservations = [] + @all_reservations = [] #pass block reservations into this. @room_number = room_number @rooms_collection = [] all_rooms - @blocks = [] + @blocks_collection = [] #put blocks created into this #When making reservation on a block I need to check if it's part of the block from here. + + #When making a general reservation i need to check all_reservations list AN bif it's in the blocks list to see if it's availble end def all_rooms @@ -40,13 +43,13 @@ def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = def available(check_in, check_out, room_number) date_range = DateRange.new(check_in, check_out).dates - date_range[0...-1].each do |date| - list_reservations_by_date(date).each do |booking| - if booking.room_number == room_number - raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - end + date_range[0...-1].each do |date| + list_reservations_by_date(date).each do |booking| + if booking.room_number == room_number + raise ArgumentError.new("Room number #{room_number} is not available for those dates.") end end + end end def list_rooms_available_by_date(date) @@ -58,21 +61,49 @@ def list_rooms_available_by_date(date) end end end + #Also check blocks array too! return rooms_available end - def new_block(check_in, check_out, rooms_collection, discounted_room_rate = 180) - block = Hotel::Block.new(check_in, check_out, rooms_collection, discounted_room_rate = 180) - @blocks << block + def new_block(check_in, check_out, number_of_rooms, block_rooms_collection = [], discounted_room_rate = 180) + @number_of_rooms = number_of_rooms + @dates = DateRange.new(check_in, check_out).dates + create_block_rooms_collection + block_rooms_collection = @block_rooms_collection + block = Hotel::Block.new(check_in, check_out, @block_rooms_collection, discounted_room_rate = 180) + @blocks_collection << block return block #avail - check if rooms are availble end - def block_rooms #select rooms from available list + def create_block_rooms_collection + if @number_of_rooms > 5 || @number_of_rooms < 1 + raise ArgumentError.new("Blocks can only have between 1 and 5 rooms.") + end + rooms_available = @rooms_collection + @dates.each do |date| + list_reservations_by_date(date).each do |booking| + rooms_available.each do |room| + if room.room_number == booking.room_number + rooms_available.delete(room) + end + end + end + end + @block_rooms_collection = [] + @number_of_rooms.times do |i| + @block_rooms_collection << rooms_available[i] + end + return @block_rooms_collection end + + # def block_rooms #select rooms from available list + # + # end + def new_reservation_in_block(room) #check if rooms are in block an available @@ -103,14 +134,14 @@ def new_reservation_in_block(room) #THIS DIDN"T WORK# - # @dates[0...-1].each do |date| - # list_reservations_by_date(date) - # @list.each do |booking| - # if booking.room_number == room_number - # return false - # end - # end - # end + # @dates[0...-1].each do |date| + # list_reservations_by_date(date) + # @list.each do |booking| + # if booking.room_number == room_number + # return false + # end + # end + # end #end @@ -142,6 +173,15 @@ def list_reservations_by_date(date) return @list end + def list_blocks_by_date(date) + date = Date.parse(date) + @block_list = [] + @blocks_collection.each do |block| + if date >= block.dates[0] && date < block.dates[-1] + @blocks_list << block + end + end + def clear_reservations #Using this for testing purposes @all_reservations = [] end diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index 67ba7ecee..3e7a2db76 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -145,13 +145,20 @@ describe 'make a new block' do before do - @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", []) + @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", 5) + #@new_block2 = @new_hotel.new_block("2018-02-02", "2018-02-05", 3) end it 'must be an instance of a block' do @new_block.must_be_instance_of Hotel::Block end it 'must add the block to the blocks collection' do - @blocks.must_include(@new_block) + @new_hotel.blocks_collection.must_include(@new_block) + end + it 'must have a collection of rooms' do + @new_block.block_rooms_collection.must_be_kind_of Array + end + it 'must have the correct number of rooms in the collection' do + @new_block.block_rooms_collection.length.must_equal 5 end end end From 6f773049044ed7526ae8e0a4fb6103a967c79d5a Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sat, 9 Sep 2017 15:16:27 -0700 Subject: [PATCH 27/43] list rooms available by date will now exclude rooms in a block. Need to revamp or update the available method so that it prevents rooms from being booked if they are on the available list --- lib/Reservations.rb | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 59fdbed4d..60973f6e1 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -61,7 +61,13 @@ def list_rooms_available_by_date(date) end end end - #Also check blocks array too! + list_blocks_by_date(date).each do |block| + rooms_available.each do |room| + if room.room_number == booking.room_number + rooms_availale.delete(room) + end + end + end return rooms_available end @@ -100,20 +106,12 @@ def create_block_rooms_collection end - # def block_rooms #select rooms from available list - # - # end - def new_reservation_in_block(room) #check if rooms are in block an available end - - - - # def validate_room_number #THIS DOESN"T WORK YET # validation = false # @rooms_collection.each do |room| @@ -180,10 +178,11 @@ def list_blocks_by_date(date) if date >= block.dates[0] && date < block.dates[-1] @blocks_list << block end + end end def clear_reservations #Using this for testing purposes - @all_reservations = [] + @all_reservations = [] end end From 2b568e1219c1a68d358b204cba5427e5357f799a Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sat, 9 Sep 2017 15:49:59 -0700 Subject: [PATCH 28/43] made a new method for checking if room is available, but tests are now failing. New method includes checking for rooms in blocks. Need to find out why older tests for new reservations are failing. Then need to test if it works correctly with blocks. --- lib/Booking.rb | 2 +- lib/Reservations.rb | 43 +++++++++++++++++++++++++++++-------- specs/Reservations-specs.rb | 4 ++++ 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 19632f296..e4df2f69e 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -6,7 +6,7 @@ class InvalidDateError < StandardError end class Booking - attr_reader :check_in, :check_out, :room_number, :total_cost + attr_accessor :check_in, :check_out, :room_number, :total_cost, :dates def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) #total_cost = 200) @room_number = room_number @check_in = Date.parse(check_in) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 60973f6e1..90ca32bac 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -36,20 +36,43 @@ def all_reservations def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - available(check_in, check_out, room_number) + available @all_reservations << booking return booking end - def available(check_in, check_out, room_number) - date_range = DateRange.new(check_in, check_out).dates - date_range[0...-1].each do |date| - list_reservations_by_date(date).each do |booking| - if booking.room_number == room_number + #OLDER AVAILABLE METHOD -- works but does not include check for rooms in blocks + # def available(check_in, check_out, room_number) + # date_range = DateRange.new(check_in, check_out).dates + # date_range[0...-1].each do |date| + # list_reservations_by_date(date).each do |booking| + # if booking.room_number == room_number + # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") + # end + # end + # end + # end + + #New one does not work -- + def available + @dates[0...-1].each do |date| + list_rooms_available_by_date(date).each do |room| + if room.room_number != room_number raise ArgumentError.new("Room number #{room_number} is not available for those dates.") + return false + else return true end end + # list_blocked_rooms_by_date(date).each do |blocked_room| + # if blocked_room.room_number == room_number + # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") + # return false + # end + # end + # end end + # end + # return true end def list_rooms_available_by_date(date) @@ -171,18 +194,20 @@ def list_reservations_by_date(date) return @list end - def list_blocks_by_date(date) + def list_blocked_rooms_by_date(date) date = Date.parse(date) @block_list = [] @blocks_collection.each do |block| if date >= block.dates[0] && date < block.dates[-1] - @blocks_list << block + block.each do |room| + @blocks_list << room + end end end end def clear_reservations #Using this for testing purposes - @all_reservations = [] + @all_reservations = [] end end diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index 3e7a2db76..e22338d78 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -145,9 +145,13 @@ describe 'make a new block' do before do + @new_hotel.clear_reservations @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", 5) #@new_block2 = @new_hotel.new_block("2018-02-02", "2018-02-05", 3) end + after do + @new_hotel.clear_reservations + end it 'must be an instance of a block' do @new_block.must_be_instance_of Hotel::Block end From cab1b3a832528ab775b1fe75425947e8aa51c99a Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sat, 9 Sep 2017 17:38:08 -0700 Subject: [PATCH 29/43] In Reserations Class, rewriting methods or new methods for avail check and list be available date to accomodate blocks appropriately. Added new variable to indicate whether a new reservation is for a block as well. Need to write tests and also incorporate the new methods in the new reservations and new block reservations to see if they work. --- lib/Reservations.rb | 88 ++++++++++++++++++++++++++++++--------------- 1 file changed, 60 insertions(+), 28 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 90ca32bac..ae3b542bd 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -36,33 +36,34 @@ def all_reservations def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - available + block_booking = false + available(check_in, check_out, room_number) @all_reservations << booking return booking end #OLDER AVAILABLE METHOD -- works but does not include check for rooms in blocks - # def available(check_in, check_out, room_number) - # date_range = DateRange.new(check_in, check_out).dates - # date_range[0...-1].each do |date| - # list_reservations_by_date(date).each do |booking| - # if booking.room_number == room_number - # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - # end - # end - # end - # end - - #New one does not work -- - def available - @dates[0...-1].each do |date| - list_rooms_available_by_date(date).each do |room| - if room.room_number != room_number + def available(check_in, check_out, room_number) + date_range = DateRange.new(check_in, check_out).dates + date_range[0...-1].each do |date| + list_reservations_by_date(date).each do |booking| + if booking.room_number == room_number raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - return false - else return true end end + end + end + + # #New one does not work -- + # def available + # @dates[0...-1].each do |date| + # list_rooms_available_by_date(date).each do |room| + # if room.room_number != room_number + # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") + # return false + # else return true + # end + # end # list_blocked_rooms_by_date(date).each do |blocked_room| # if blocked_room.room_number == room_number # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") @@ -70,28 +71,53 @@ def available # end # end # end - end + #end # end # return true - end + #end - def list_rooms_available_by_date(date) + def list_rooms_available_by_date(date, block_booking) rooms_available = @rooms_collection list_reservations_by_date(date).each do |booking| rooms_available.each do |room| if room.room_number == booking.room_number rooms_available.delete(room) + end #if end + end #rooms avail end + end #list do end + unless block_booking == true + return rooms_available + end #unless end + list_blocked_rooms_by_date(date).each do |block| + rooms_available.each do |room| + if room.room_number == block.room_number + rooms_availale.delete(room) + end #if end + end # room avail do end + end #list do end + return rooms_available + end #def end + + def available?(dates, room_number, blocked_booking) + dates.each do |date| + list_rooms_available_by_date(date, blocked_booking).each do |room| + if room.room_number == room_number + return true end end + return ArgumentError.new("Room number #{room_number} unavailable for those dates.") end - list_blocks_by_date(date).each do |block| - rooms_available.each do |room| - if room.room_number == booking.room_number - rooms_availale.delete(room) + end + + def in_block? + @blocks_collection.each do |block| + block.each do |booking| + if booking.room_number == @room_number + return true end end end - return rooms_available + return ArgumentError.new("Room number #{room_number} not included in a block.") end def new_block(check_in, check_out, number_of_rooms, block_rooms_collection = [], discounted_room_rate = 180) @@ -129,11 +155,17 @@ def create_block_rooms_collection end - def new_reservation_in_block(room) + def new_reservation_in_block + + block_booking = true + #check if rooms are in block an available end + # def block_check_room_available(room_number, dates) + # list_reservations_by_date + # end # def validate_room_number #THIS DOESN"T WORK YET # validation = false From 7161af381f704b625c1a6fab458b4a55774cb74b Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 10:33:25 -0700 Subject: [PATCH 30/43] Added has_available_rooms? method to Block class and instance variables within Block class to store info on rooms that have been booked. Added test in Block spec to test. This is working. Also have been drafting some methods within reservations that need to be tested and arranged. --- lib/Block.rb | 15 +++-- lib/Booking.rb | 2 +- lib/DateRange.rb | 2 +- lib/Reservations.rb | 127 +++++++++++++++++++----------------- specs/Block-specs.rb | 13 ++++ specs/Reservations-specs.rb | 17 +++-- 6 files changed, 105 insertions(+), 71 deletions(-) diff --git a/lib/Block.rb b/lib/Block.rb index 26c2c7599..709aa8260 100644 --- a/lib/Block.rb +++ b/lib/Block.rb @@ -1,18 +1,25 @@ module Hotel class Block - attr_accessor :check_in, :check_out, :date_range, :dates, :block_rooms_collection, :discounted_room_rate - def initialize(check_in, check_out, block_rooms_collection = [], discounted_room_rate = 180) + attr_accessor :check_in, :check_out, :date_range, :dates, :block_rooms_collection, :discounted_room_rate, :available_rooms, :booked + def initialize(check_in, check_out, block_name, block_rooms_collection = [], discounted_room_rate = 180) @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) @date_range = Hotel::DateRange.new(@check_in, @check_out) @dates = Hotel::DateRange.new(@check_in, @check_out).dates @block_rooms_collection = block_rooms_collection @discounted_room_rate = discounted_room_rate - + @booked = [] + #@available_rooms = @block_rooms_collection end - #def make_new_block + def has_rooms_available? + if @booked.length < @block_rooms_collection.length + return true + else + return false + end + end diff --git a/lib/Booking.rb b/lib/Booking.rb index e4df2f69e..07aa83025 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -7,7 +7,7 @@ class InvalidDateError < StandardError class Booking attr_accessor :check_in, :check_out, :room_number, :total_cost, :dates - def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) #total_cost = 200) + def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200, block_booking = false) @room_number = room_number @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) diff --git a/lib/DateRange.rb b/lib/DateRange.rb index 38868c1a1..5c8240b70 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -2,7 +2,7 @@ module Hotel class DateRange - #attr_reader :dates Add this? + attr_accessor :dates def initialize(check_in, check_out) @check_in = check_in @check_out = check_out diff --git a/lib/Reservations.rb b/lib/Reservations.rb index ae3b542bd..717892e46 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -34,36 +34,18 @@ def all_reservations return @all_reservations end - def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) - booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) + def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200, block_booking = false) + booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate, block_booking) block_booking = false - available(check_in, check_out, room_number) + #available(check_in, check_out, room_number) + dates = Hotel::DateRange.new(check_in, check_out).dates + #dates = booking.dates + check_availability(dates, room_number, block_booking) @all_reservations << booking return booking end - #OLDER AVAILABLE METHOD -- works but does not include check for rooms in blocks - def available(check_in, check_out, room_number) - date_range = DateRange.new(check_in, check_out).dates - date_range[0...-1].each do |date| - list_reservations_by_date(date).each do |booking| - if booking.room_number == room_number - raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - end - end - end - end - # #New one does not work -- - # def available - # @dates[0...-1].each do |date| - # list_rooms_available_by_date(date).each do |room| - # if room.room_number != room_number - # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - # return false - # else return true - # end - # end # list_blocked_rooms_by_date(date).each do |blocked_room| # if blocked_room.room_number == room_number # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") @@ -98,9 +80,10 @@ def list_rooms_available_by_date(date, block_booking) return rooms_available end #def end - def available?(dates, room_number, blocked_booking) - dates.each do |date| - list_rooms_available_by_date(date, blocked_booking).each do |room| +#NEWEST AVAILABLE METHOD + def check_availability(dates, room_number, block_booking) + dates[0...-1].each do |date| + list_rooms_available_by_date(date, block_booking).each do |room| if room.room_number == room_number return true end @@ -108,24 +91,36 @@ def available?(dates, room_number, blocked_booking) return ArgumentError.new("Room number #{room_number} unavailable for those dates.") end end + #OLDER AVAILABLE METHOD -- works but does not include check for rooms in blocks + # def available(check_in, check_out, room_number) + # date_range = DateRange.new(check_in, check_out).dates + # date_range[0...-1].each do |date| + # list_reservations_by_date(date).each do |booking| + # if booking.room_number == room_number + # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") + # end + # end + # end + # end - def in_block? - @blocks_collection.each do |block| - block.each do |booking| - if booking.room_number == @room_number - return true - end - end - end - return ArgumentError.new("Room number #{room_number} not included in a block.") - end + # #New one does not work -- + # def available + # @dates[0...-1].each do |date| + # list_rooms_available_by_date(date).each do |room| + # if room.room_number != room_number + # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") + # return false + # else return true + # end + # end - def new_block(check_in, check_out, number_of_rooms, block_rooms_collection = [], discounted_room_rate = 180) + + def new_block(check_in, check_out, block_name, number_of_rooms, block_rooms_collection = [], discounted_room_rate = 180) @number_of_rooms = number_of_rooms @dates = DateRange.new(check_in, check_out).dates create_block_rooms_collection block_rooms_collection = @block_rooms_collection - block = Hotel::Block.new(check_in, check_out, @block_rooms_collection, discounted_room_rate = 180) + block = Hotel::Block.new(check_in, check_out, block_name, @block_rooms_collection, discounted_room_rate = 180) @blocks_collection << block return block #avail - check if rooms are availble @@ -154,19 +149,45 @@ def create_block_rooms_collection return @block_rooms_collection end + def in_block? + @blocks_collection.each do |block| + block.each do |booking| + if booking.room_number == @room_number + return true + end + end + end + return ArgumentError.new("Room number #{room_number} not included in a block.") + end - def new_reservation_in_block - - block_booking = true - - - #check if rooms are in block an available + def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200, block_booking = true) + block_room = Hotel::Booking.new(check_in, check_out, room_number, room_rate, block_booking) + block_room.has_rooms_available? + #need error message if not + room_number = block_room.available_rooms.pop! + #not sure about above... can't I just compare booked rooms with rooms collection? + #Be sure to add to booked rooms list once booked and all reservations end +#I don't think I"ll need this but keep for now and hasn't been tested# + # def assign_block_room(check_in, check_out, room_number) + # date_range = DateRange.new(check_in, check_out).dates + # block_name. + # date_range[0...-1].each do |date| + # list_reservations_by_date(date).each do |booking| + # if booking.room_number == room_number + # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") + # end + # end + # end + # end + +#I moved this function under the block class - delete later # def block_check_room_available(room_number, dates) # list_reservations_by_date # end +#Not required and not yet incorporated nor tested # def validate_room_number #THIS DOESN"T WORK YET # validation = false # @rooms_collection.each do |room| @@ -185,19 +206,7 @@ def new_reservation_in_block # end # end - - #THIS DIDN"T WORK# - # @dates[0...-1].each do |date| - # list_reservations_by_date(date) - # @list.each do |booking| - # if booking.room_number == room_number - # return false - # end - # end - # end - - #end - +#Not required and not yet incorporated nor tested # def assign_room_number #DOESN"T WORK YET # unless @room_number > 0 # @rooms_collection.each do |room| @@ -219,7 +228,7 @@ def list_reservations_by_date(date) date = Date.parse(date) @list = [] @all_reservations.each do |reservation| - if date >= reservation.check_in && date < reservation.check_out #removed = so that it wont' include the check out date + if date >= reservation.check_in && date < reservation.check_out #check_out date excluded @list << reservation end end diff --git a/specs/Block-specs.rb b/specs/Block-specs.rb index a66536ed9..53091858f 100644 --- a/specs/Block-specs.rb +++ b/specs/Block-specs.rb @@ -23,6 +23,19 @@ end end + describe 'has_rooms_available' do + before do + @new_block1 = Hotel::Block.new("2018-01-01", "2018-01-10", "Heritage", [1, 2, 3, 4, 5]) + @new_block1.booked = [1, 2, 3, 4] + end + it 'must return true when at least one room is available' do + @new_block1.has_rooms_available?.must_equal true + end + it 'must return false when no rooms available' do + @new_block1.booked << 5 + @new_block1.has_rooms_available?.must_equal false + end + end end diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index e22338d78..ea776a952 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -56,9 +56,9 @@ @new_hotel.clear_reservations @new_reservation1 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 1) end - after do - @new_hotel.clear_reservations - end + # after do + # @new_hotel.clear_reservations + # end it 'must must raise argument error if room is not available' do proc{new_reservation2 = @new_hotel.new_reservation("2018-01-01", "2018-01-04", 1)}.must_raise ArgumentError end @@ -75,10 +75,10 @@ @new_hotel.clear_reservations end it 'must return an array' do - @new_hotel.list_rooms_available_by_date("2018-01-02").must_be_kind_of Array + @new_hotel.list_rooms_available_by_date("2018-01-02", false).must_be_kind_of Array end it 'must return the correct number of rooms available' do - @new_hotel.list_rooms_available_by_date("2018-01-03").length.must_equal 17 + @new_hotel.list_rooms_available_by_date("2018-01-03", false).length.must_equal 17 end it 'must return the correct rooms available' do @@ -146,7 +146,7 @@ describe 'make a new block' do before do @new_hotel.clear_reservations - @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", 5) + @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", "Heritage", 5) #@new_block2 = @new_hotel.new_block("2018-02-02", "2018-02-05", 3) end after do @@ -165,4 +165,9 @@ @new_block.block_rooms_collection.length.must_equal 5 end end + + describe 'reserve a room in a block' do + + it 'must be' + end end From c4d5974903e270308da5e739ec690764c28addc7 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 12:05:45 -0700 Subject: [PATCH 31/43] removed variable to determine if a reservation is a block booking - do not think I will need this. Created tests for list blocked rooms by date method within Reservations class. Corrected the method so that it functions properly. Going through all methods in Reservations to create tests and be sure each one is working properly. Check availability by date is not working properly since I rewrote the method adding in to account for blocks, so I am looking at all methods involved to trouble shoot. Currently it does not raise arugment error when a room is not available as it should. --- lib/Booking.rb | 2 +- lib/Reservations.rb | 49 ++++++++++++++++++------------------- specs/Block-specs.rb | 2 +- specs/Reservations-specs.rb | 20 ++++++++++++--- 4 files changed, 43 insertions(+), 30 deletions(-) diff --git a/lib/Booking.rb b/lib/Booking.rb index 07aa83025..08a92fa5b 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -7,7 +7,7 @@ class InvalidDateError < StandardError class Booking attr_accessor :check_in, :check_out, :room_number, :total_cost, :dates - def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200, block_booking = false) + def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) @room_number = room_number @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 717892e46..cbd135626 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -13,9 +13,8 @@ def initialize @room_number = room_number @rooms_collection = [] all_rooms - @blocks_collection = [] #put blocks created into this #When making reservation on a block I need to check if it's part of the block from here. + @blocks_collection = [] - #When making a general reservation i need to check all_reservations list AN bif it's in the blocks list to see if it's availble end def all_rooms @@ -34,18 +33,17 @@ def all_reservations return @all_reservations end - def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200, block_booking = false) - booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate, block_booking) - block_booking = false + def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) + booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) #available(check_in, check_out, room_number) dates = Hotel::DateRange.new(check_in, check_out).dates #dates = booking.dates - check_availability(dates, room_number, block_booking) + check_availability(dates, room_number) @all_reservations << booking return booking end - +#Not using this # list_blocked_rooms_by_date(date).each do |blocked_room| # if blocked_room.room_number == room_number # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") @@ -58,7 +56,7 @@ def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = # return true #end - def list_rooms_available_by_date(date, block_booking) + def list_rooms_available_by_date(date) rooms_available = @rooms_collection list_reservations_by_date(date).each do |booking| rooms_available.each do |room| @@ -67,9 +65,9 @@ def list_rooms_available_by_date(date, block_booking) end #if end end #rooms avail end end #list do end - unless block_booking == true - return rooms_available - end #unless end + # unless block_booking == true + # return rooms_available + # end #unless end list_blocked_rooms_by_date(date).each do |block| rooms_available.each do |room| if room.room_number == block.room_number @@ -81,9 +79,9 @@ def list_rooms_available_by_date(date, block_booking) end #def end #NEWEST AVAILABLE METHOD - def check_availability(dates, room_number, block_booking) + def check_availability(dates, room_number) dates[0...-1].each do |date| - list_rooms_available_by_date(date, block_booking).each do |room| + list_rooms_available_by_date(date).each do |room| if room.room_number == room_number return true end @@ -114,7 +112,7 @@ def check_availability(dates, room_number, block_booking) # end # end - +#MOSTLY TESTED but will need a few more tests most likely def new_block(check_in, check_out, block_name, number_of_rooms, block_rooms_collection = [], discounted_room_rate = 180) @number_of_rooms = number_of_rooms @dates = DateRange.new(check_in, check_out).dates @@ -127,7 +125,7 @@ def new_block(check_in, check_out, block_name, number_of_rooms, block_rooms_coll end - def create_block_rooms_collection + def create_block_rooms_collection #TESTED if @number_of_rooms > 5 || @number_of_rooms < 1 raise ArgumentError.new("Blocks can only have between 1 and 5 rooms.") end @@ -160,8 +158,8 @@ def in_block? return ArgumentError.new("Room number #{room_number} not included in a block.") end - def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200, block_booking = true) - block_room = Hotel::Booking.new(check_in, check_out, room_number, room_rate, block_booking) + def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200) + block_room = Hotel::Booking.new(check_in, check_out, room_number, room_rate) block_room.has_rooms_available? #need error message if not room_number = block_room.available_rooms.pop! @@ -224,27 +222,28 @@ def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, r # #end # end - def list_reservations_by_date(date) + def list_reservations_by_date(date) #TESTED date = Date.parse(date) - @list = [] + list = [] @all_reservations.each do |reservation| if date >= reservation.check_in && date < reservation.check_out #check_out date excluded - @list << reservation + list << reservation end end - return @list + return list end - def list_blocked_rooms_by_date(date) + def list_blocked_rooms_by_date(date) #TESTED date = Date.parse(date) - @block_list = [] + blocks_list = [] @blocks_collection.each do |block| if date >= block.dates[0] && date < block.dates[-1] - block.each do |room| - @blocks_list << room + block.block_rooms_collection.each do |room| + blocks_list << room end end end + return blocks_list end def clear_reservations #Using this for testing purposes diff --git a/specs/Block-specs.rb b/specs/Block-specs.rb index 53091858f..517504793 100644 --- a/specs/Block-specs.rb +++ b/specs/Block-specs.rb @@ -2,7 +2,7 @@ describe 'Block' do before do - @new_hotel = Hotel::Reservations.new + @hotel = Hotel::Reservations.new @new_block = Hotel::Block.new("2018-01-01", "2018-01-10", []) end describe 'initialize' do diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index ea776a952..fe969dee8 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -60,7 +60,7 @@ # @new_hotel.clear_reservations # end it 'must must raise argument error if room is not available' do - proc{new_reservation2 = @new_hotel.new_reservation("2018-01-01", "2018-01-04", 1)}.must_raise ArgumentError + proc{ new_reservation2 = @new_hotel.new_reservation("2018-01-01", "2018-01-04", 1) }.must_raise ArgumentError end end @@ -75,10 +75,10 @@ @new_hotel.clear_reservations end it 'must return an array' do - @new_hotel.list_rooms_available_by_date("2018-01-02", false).must_be_kind_of Array + @new_hotel.list_rooms_available_by_date("2018-01-02").must_be_kind_of Array end it 'must return the correct number of rooms available' do - @new_hotel.list_rooms_available_by_date("2018-01-03", false).length.must_equal 17 + @new_hotel.list_rooms_available_by_date("2018-01-03").length.must_equal 17 end it 'must return the correct rooms available' do @@ -166,6 +166,20 @@ end end + describe 'list block rooms by date' do + before do + @new_hotel.clear_reservations + @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", "Heritage", 5) + end + it 'must list the correct number of rooms for a given date' do + @new_block.block_rooms_collection.each do |room| + puts room.room_number + end + #puts @new_hotel.list_blocked_rooms_by_date + @new_hotel.list_blocked_rooms_by_date("2018-01-02").length.must_equal 5 + end + end + describe 'reserve a room in a block' do it 'must be' From 5a86dc60861379c05ecd8624e588c9086303c6a6 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 13:01:55 -0700 Subject: [PATCH 32/43] check availability method updated but tests still failing. Tests updated to include room numbers to prevent accidental fails. Something wrong with Atom. Pushing now in hopes that work will not be lost. --- lib/Reservations.rb | 28 +++++++++++++++++----------- specs/Reservations-specs.rb | 12 ++++++------ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index cbd135626..64afb3619 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -10,7 +10,7 @@ class Reservations def initialize @all_reservations = [] #pass block reservations into this. - @room_number = room_number + #@room_number = room_number @rooms_collection = [] all_rooms @blocks_collection = [] @@ -34,11 +34,12 @@ def all_reservations end def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) + dates = Hotel::DateRange.new(check_in, check_out).dates + unless check_availability?(dates, room_number) == true + raise ArgumentError.new("Room number #{room_number} unavailable for those dates.") + end booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) #available(check_in, check_out, room_number) - dates = Hotel::DateRange.new(check_in, check_out).dates - #dates = booking.dates - check_availability(dates, room_number) @all_reservations << booking return booking end @@ -55,7 +56,7 @@ def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = # end # return true #end - +#Tested for Booking only and seems to work def list_rooms_available_by_date(date) rooms_available = @rooms_collection list_reservations_by_date(date).each do |booking| @@ -78,15 +79,20 @@ def list_rooms_available_by_date(date) return rooms_available end #def end -#NEWEST AVAILABLE METHOD - def check_availability(dates, room_number) +#NEWEST AVAILABLE METHOD ##Troubleshoot tests in Bookings first# + def check_availability?(dates, room_number) + available = true dates[0...-1].each do |date| - list_rooms_available_by_date(date).each do |room| - if room.room_number == room_number - return true + while available == true + list_rooms_available_by_date(date).each do |room| + if room.room_number == room_number + available = true + else + available = false + end end end - return ArgumentError.new("Room number #{room_number} unavailable for those dates.") + return available end end #OLDER AVAILABLE METHOD -- works but does not include check for rooms in blocks diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index fe969dee8..9dc3374f2 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -32,16 +32,16 @@ new_booking1.must_be_instance_of Hotel::Booking end it 'must raise an error if the check-in date is in the past' do - proc{new_booking = @new_hotel.new_reservation("2017-06-01", "2017-09-21")}.must_raise Hotel::InvalidDateError + proc{new_booking = @new_hotel.new_reservation("2017-06-01", "2017-09-21", 2)}.must_raise Hotel::InvalidDateError end it 'must raise an error if the check-in date is the same as the check-out date' do - proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-20")}.must_raise Hotel::InvalidDateError + proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-20"), 3}.must_raise Hotel::InvalidDateError end it 'must raise an error if the check_in date is after the check-out date' do - proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18")}.must_raise Hotel::InvalidDateError + proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18"), 4}.must_raise Hotel::InvalidDateError end it 'must raise an error if the date is not valid on calendar' do - proc{new_booking = @new_hotel.new_reservation("2018-02-30", "2018-02-31")}.must_raise ArgumentError + proc{new_booking = @new_hotel.new_reservation("2018-02-30", "2018-02-31"), 5}.must_raise ArgumentError end it 'allows a new reservation to be made on a room on the same day as previous check-out' do @new_hotel.clear_reservations @@ -51,7 +51,7 @@ end end - describe 'available' do + describe 'check availability' do before do @new_hotel.clear_reservations @new_reservation1 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 1) @@ -81,7 +81,7 @@ @new_hotel.list_rooms_available_by_date("2018-01-03").length.must_equal 17 end it 'must return the correct rooms available' do - + @new_hotel.list_rooms_available_by_date("2018-01-03")[0].room_number.must_equal 3 end end # describe 'assign room number' do From af5228a4bd82dc2b754a4d6d732e58f41767ae5e Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 13:19:11 -0700 Subject: [PATCH 33/43] Found problem with availability. Had to move it to after the Booking in the new_reservation method under Reservations Class. Otherwise it was checking the room_number of the previous reservation instead of the current one. --- lib/Reservations.rb | 21 +++++++++++---------- specs/Reservations-specs.rb | 20 +++++++++++--------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 64afb3619..28cc950ca 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -35,10 +35,10 @@ def all_reservations def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) dates = Hotel::DateRange.new(check_in, check_out).dates + booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) unless check_availability?(dates, room_number) == true raise ArgumentError.new("Room number #{room_number} unavailable for those dates.") end - booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) #available(check_in, check_out, room_number) @all_reservations << booking return booking @@ -57,6 +57,8 @@ def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = # return true #end #Tested for Booking only and seems to work + +#USING THIS one: def list_rooms_available_by_date(date) rooms_available = @rooms_collection list_reservations_by_date(date).each do |booking| @@ -66,9 +68,6 @@ def list_rooms_available_by_date(date) end #if end end #rooms avail end end #list do end - # unless block_booking == true - # return rooms_available - # end #unless end list_blocked_rooms_by_date(date).each do |block| rooms_available.each do |room| if room.room_number == block.room_number @@ -83,13 +82,15 @@ def list_rooms_available_by_date(date) def check_availability?(dates, room_number) available = true dates[0...-1].each do |date| - while available == true + unless available == false + room_number_array = [] list_rooms_available_by_date(date).each do |room| - if room.room_number == room_number - available = true - else - available = false - end + room_number_array << room.room_number + end + if room_number_array.include?(room_number) + available = true + else + available = false end end return available diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index 9dc3374f2..58faf2725 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -26,28 +26,30 @@ describe 'new reservation' do before do @new_hotel.clear_reservations + @new_hotel1 = Hotel::Reservations.new end it 'must create a new booking' do - new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23", 1) + new_booking1 = @new_hotel1.new_reservation("2017-09-21", "2017-09-23", 1) new_booking1.must_be_instance_of Hotel::Booking end it 'must raise an error if the check-in date is in the past' do - proc{new_booking = @new_hotel.new_reservation("2017-06-01", "2017-09-21", 2)}.must_raise Hotel::InvalidDateError + + proc{new_booking = @new_hotel1.new_reservation("2017-06-01", "2017-09-21", 2)}.must_raise Hotel::InvalidDateError end it 'must raise an error if the check-in date is the same as the check-out date' do - proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-20"), 3}.must_raise Hotel::InvalidDateError + proc{new_booking = @new_hotel1.new_reservation("2017-09-20", "2017-09-20"), 3}.must_raise Hotel::InvalidDateError end it 'must raise an error if the check_in date is after the check-out date' do - proc{new_booking = @new_hotel.new_reservation("2017-09-20", "2017-09-18"), 4}.must_raise Hotel::InvalidDateError + proc{new_booking = @new_hotel1.new_reservation("2017-09-20", "2017-09-18"), 4}.must_raise Hotel::InvalidDateError end it 'must raise an error if the date is not valid on calendar' do - proc{new_booking = @new_hotel.new_reservation("2018-02-30", "2018-02-31"), 5}.must_raise ArgumentError + proc{new_booking = @new_hotel1.new_reservation("2018-02-30", "2018-02-31"), 5}.must_raise ArgumentError end it 'allows a new reservation to be made on a room on the same day as previous check-out' do - @new_hotel.clear_reservations - @new_reservation1 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 1) - @new_reservation2 = @new_hotel.new_reservation("2018-01-05", "2018-01-07", 1) - @new_hotel.all_reservations.length.must_equal 2 + @new_hotel1.clear_reservations + @new_reservation1 = @new_hotel1.new_reservation("2018-01-01", "2018-01-05", 1) + @new_reservation2 = @new_hotel1.new_reservation("2018-01-05", "2018-01-07", 1) + @new_hotel1.all_reservations.length.must_equal 2 end end From 88d15c4c9d223cc4cee7948e15019fe571a43e4a Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 14:22:29 -0700 Subject: [PATCH 34/43] In Reservations class, have basic method for make a new reservation in block started. Tests also started. Writing more tests and then adding more functionality. --- lib/Block.rb | 2 +- lib/Reservations.rb | 80 +++++++++++++------------------------ specs/Reservations-specs.rb | 20 ++++++---- 3 files changed, 41 insertions(+), 61 deletions(-) diff --git a/lib/Block.rb b/lib/Block.rb index 709aa8260..6051c2232 100644 --- a/lib/Block.rb +++ b/lib/Block.rb @@ -1,7 +1,7 @@ module Hotel class Block - attr_accessor :check_in, :check_out, :date_range, :dates, :block_rooms_collection, :discounted_room_rate, :available_rooms, :booked + attr_accessor :check_in, :check_out, :date_range, :dates, :block_rooms_collection, :discounted_room_rate, :available_rooms, :booked, :block_name def initialize(check_in, check_out, block_name, block_rooms_collection = [], discounted_room_rate = 180) @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 28cc950ca..fb444823a 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -36,29 +36,16 @@ def all_reservations def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) dates = Hotel::DateRange.new(check_in, check_out).dates booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - unless check_availability?(dates, room_number) == true + if check_availability?(dates, room_number) == false raise ArgumentError.new("Room number #{room_number} unavailable for those dates.") + else + @all_reservations << booking + return booking end - #available(check_in, check_out, room_number) - @all_reservations << booking - return booking end -#Not using this - # list_blocked_rooms_by_date(date).each do |blocked_room| - # if blocked_room.room_number == room_number - # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - # return false - # end - # end - # end - #end - # end - # return true - #end -#Tested for Booking only and seems to work -#USING THIS one: +#TESTED and WORKS - need to verify with Block reservatioins but it should work def list_rooms_available_by_date(date) rooms_available = @rooms_collection list_reservations_by_date(date).each do |booking| @@ -78,7 +65,7 @@ def list_rooms_available_by_date(date) return rooms_available end #def end -#NEWEST AVAILABLE METHOD ##Troubleshoot tests in Bookings first# +#TESTED and it WORKS - need to test for Block reservations def check_availability?(dates, room_number) available = true dates[0...-1].each do |date| @@ -96,44 +83,21 @@ def check_availability?(dates, room_number) return available end end - #OLDER AVAILABLE METHOD -- works but does not include check for rooms in blocks - # def available(check_in, check_out, room_number) - # date_range = DateRange.new(check_in, check_out).dates - # date_range[0...-1].each do |date| - # list_reservations_by_date(date).each do |booking| - # if booking.room_number == room_number - # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - # end - # end - # end - # end - # #New one does not work -- - # def available - # @dates[0...-1].each do |date| - # list_rooms_available_by_date(date).each do |room| - # if room.room_number != room_number - # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - # return false - # else return true - # end - # end #MOSTLY TESTED but will need a few more tests most likely def new_block(check_in, check_out, block_name, number_of_rooms, block_rooms_collection = [], discounted_room_rate = 180) @number_of_rooms = number_of_rooms @dates = DateRange.new(check_in, check_out).dates - create_block_rooms_collection + create_block_rooms_collection #Method already checks for room availability in order to create collection block_rooms_collection = @block_rooms_collection block = Hotel::Block.new(check_in, check_out, block_name, @block_rooms_collection, discounted_room_rate = 180) @blocks_collection << block return block - #avail - check if rooms are availble - end def create_block_rooms_collection #TESTED - if @number_of_rooms > 5 || @number_of_rooms < 1 + unless @number_of_rooms <= 5 && @number_of_rooms >= 1 raise ArgumentError.new("Blocks can only have between 1 and 5 rooms.") end rooms_available = @rooms_collection @@ -154,24 +118,34 @@ def create_block_rooms_collection #TESTED return @block_rooms_collection end - def in_block? + def in_block?(block_name, room_number) + found = false @blocks_collection.each do |block| - block.each do |booking| - if booking.room_number == @room_number - return true + unless found == true + if block.block_name == block_name + block.block_rooms_collection.each do |room| + if room.room_number == room_number + found = true + end + end end end end - return ArgumentError.new("Room number #{room_number} not included in a block.") + return found end def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200) - block_room = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - block_room.has_rooms_available? - #need error message if not - room_number = block_room.available_rooms.pop! + block_room_booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) + #block_room.has_rooms_available? #need error message if not + # unless in_block?(block_name, room_number) == true + # return ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") + # end + + #room_number = block_room.available_rooms.pop! #not sure about above... can't I just compare booked rooms with rooms collection? #Be sure to add to booked rooms list once booked and all reservations + @all_reservations << block_room_booking # TEST that it doesn't go in if not a valid booking + return block_room_booking end #I don't think I"ll need this but keep for now and hasn't been tested# diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index 58faf2725..edbbae6d4 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -174,16 +174,22 @@ @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", "Heritage", 5) end it 'must list the correct number of rooms for a given date' do - @new_block.block_rooms_collection.each do |room| - puts room.room_number - end - #puts @new_hotel.list_blocked_rooms_by_date - @new_hotel.list_blocked_rooms_by_date("2018-01-02").length.must_equal 5 + @new_hotel.list_blocked_rooms_by_date("2018-01-02").length.must_equal 5 end end describe 'reserve a room in a block' do - - it 'must be' + before do + @new_hotel_with_blocks = Hotel::Reservations.new + @new_booking1 = @new_hotel_with_blocks.new_reservation("2018-01-01", "2018-01-05", 1) + @new_booking2 = @new_hotel_with_blocks.new_reservation("2018-01-01", "2018-01-04", 2) + @new_booking3 = @new_hotel_with_blocks.new_reservation("2018-01-01", "2018-01-05", 3) + @new_booking4 = @new_hotel_with_blocks.new_reservation("2018-01-01", "2018-01-13", 4) + @new_block = @new_hotel_with_blocks.new_block("2018-01-01", "2018-01-10", "Heritage", 5) + @new_block_reservation = @new_hotel_with_blocks.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 6) + end + it 'must be an instance of Hotel Booking' do + @new_block_reservation.must_be_instance_of Hotel::Booking + end end end From a0d858f22fe77ac19bac41273324478b0197910c Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 14:44:48 -0700 Subject: [PATCH 35/43] in block method now working under Reservations Class. It checks that the room requested for booking is actually in that block, and gives an error message if it is not. --- lib/Block.rb | 1 + lib/Reservations.rb | 8 +++----- specs/Reservations-specs.rb | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/Block.rb b/lib/Block.rb index 6051c2232..bccb03a46 100644 --- a/lib/Block.rb +++ b/lib/Block.rb @@ -10,6 +10,7 @@ def initialize(check_in, check_out, block_name, block_rooms_collection = [], dis @block_rooms_collection = block_rooms_collection @discounted_room_rate = discounted_room_rate @booked = [] + @block_name = block_name #@available_rooms = @block_rooms_collection end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index fb444823a..4859a2aac 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -121,7 +121,6 @@ def create_block_rooms_collection #TESTED def in_block?(block_name, room_number) found = false @blocks_collection.each do |block| - unless found == true if block.block_name == block_name block.block_rooms_collection.each do |room| if room.room_number == room_number @@ -129,7 +128,6 @@ def in_block?(block_name, room_number) end end end - end end return found end @@ -137,9 +135,9 @@ def in_block?(block_name, room_number) def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200) block_room_booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) #block_room.has_rooms_available? #need error message if not - # unless in_block?(block_name, room_number) == true - # return ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") - # end + unless in_block?(block_name, room_number) == true + return ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") + end #room_number = block_room.available_rooms.pop! #not sure about above... can't I just compare booked rooms with rooms collection? diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index edbbae6d4..6695bf2ce 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -189,6 +189,7 @@ @new_block_reservation = @new_hotel_with_blocks.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 6) end it 'must be an instance of Hotel Booking' do + @new_block_reservation.must_be_instance_of Hotel::Booking end end From 9127e719da5d5798ab7c5bfe79e8bd14de7c048f Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 15:39:43 -0700 Subject: [PATCH 36/43] All methods so far working except if room is not in block is failing tests - not raising argument error. Have not been able to find the problem yet. --- lib/Reservations.rb | 102 ++++++++++++++++++++---------------- specs/Reservations-specs.rb | 30 ++++++++++- 2 files changed, 86 insertions(+), 46 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 4859a2aac..080c9c0a1 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -118,34 +118,81 @@ def create_block_rooms_collection #TESTED return @block_rooms_collection end +#Testing, not working to produce an error when room is not in the block def in_block?(block_name, room_number) - found = false @blocks_collection.each do |block| if block.block_name == block_name block.block_rooms_collection.each do |room| if room.room_number == room_number - found = true + return true end end end end - return found + return ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") end def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200) block_room_booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - #block_room.has_rooms_available? #need error message if not - unless in_block?(block_name, room_number) == true - return ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") - end + in_block?(block_name, room_number) + + check_block_room_available(block_name, room_number) + add_block_booking_to_block(block_name, block_room_booking) - #room_number = block_room.available_rooms.pop! - #not sure about above... can't I just compare booked rooms with rooms collection? - #Be sure to add to booked rooms list once booked and all reservations @all_reservations << block_room_booking # TEST that it doesn't go in if not a valid booking return block_room_booking end + def add_block_booking_to_block(block_name, block_room_booking) + @blocks_collection.each do |block| + if block.block_name == block_name + block.booked << block_room_booking + end + end + end + + def check_block_room_available(block_name, room_number) + @blocks_collection.each do |block| + if block.block_name == block_name + block.booked.each do |booking| + if booking.room_number == room_number + raise ArgumentError.new("Unable to book. Room number #{room_number} has already been booked.") + end + end + end + end + return true + end + def list_reservations_by_date(date) #TESTED + date = Date.parse(date) + list = [] + @all_reservations.each do |reservation| + if date >= reservation.check_in && date < reservation.check_out #check_out date excluded + list << reservation + end + end + return list + end + + def list_blocked_rooms_by_date(date) #TESTED + date = Date.parse(date) + blocks_list = [] + @blocks_collection.each do |block| + if date >= block.dates[0] && date < block.dates[-1] + block.block_rooms_collection.each do |room| + blocks_list << room + end + end + end + return blocks_list + end + + def clear_reservations #Using this for testing purposes + @all_reservations = [] + end + + end +end #I don't think I"ll need this but keep for now and hasn't been tested# # def assign_block_room(check_in, check_out, room_number) # date_range = DateRange.new(check_in, check_out).dates @@ -159,10 +206,6 @@ def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, r # end # end -#I moved this function under the block class - delete later - # def block_check_room_available(room_number, dates) - # list_reservations_by_date - # end #Not required and not yet incorporated nor tested # def validate_room_number #THIS DOESN"T WORK YET @@ -200,34 +243,3 @@ def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, r # #room_number = @rooms_collection # #end # end - - def list_reservations_by_date(date) #TESTED - date = Date.parse(date) - list = [] - @all_reservations.each do |reservation| - if date >= reservation.check_in && date < reservation.check_out #check_out date excluded - list << reservation - end - end - return list - end - - def list_blocked_rooms_by_date(date) #TESTED - date = Date.parse(date) - blocks_list = [] - @blocks_collection.each do |block| - if date >= block.dates[0] && date < block.dates[-1] - block.block_rooms_collection.each do |room| - blocks_list << room - end - end - end - return blocks_list - end - - def clear_reservations #Using this for testing purposes - @all_reservations = [] - end - - end -end diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index 6695bf2ce..c914f76ea 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -189,8 +189,36 @@ @new_block_reservation = @new_hotel_with_blocks.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 6) end it 'must be an instance of Hotel Booking' do - @new_block_reservation.must_be_instance_of Hotel::Booking end + it 'must raise an error if the room is not in the block' do + proc {@new_block_reservation1 = @new_hotel_with_blocks.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 20)}.must_raise ArgumentError + end + it 'must raise an error if the room selected is not available' do + proc { @new_block_reservation1 = @new_hotel_with_blocks.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 6)}.must_raise ArgumentError + end + end + + describe 'block has rooms available' do + before do + @new_hotel_with_blocks1 = Hotel::Reservations.new + @new_booking1 = @new_hotel_with_blocks1.new_reservation("2018-01-01", "2018-01-05", 1) + @new_booking2 = @new_hotel_with_blocks1.new_reservation("2018-01-01", "2018-01-04", 2) + @new_booking3 = @new_hotel_with_blocks1.new_reservation("2018-01-01", "2018-01-05", 3) + @new_booking4 = @new_hotel_with_blocks1.new_reservation("2018-01-01", "2018-01-13", 4) + @new_block = @new_hotel_with_blocks1.new_block("2018-01-01", "2018-01-10", "Heritage", 5) + @new_block_reservation = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 6) + @new_block_reservation2 = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 7) + end + it 'must return true if there are rooms available in block to be booked' do + @new_block.has_rooms_available?.must_equal true + end + it 'must return false if there are NOT any rooms available in block to be booked' do + @new_block_reservation3 = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 8) + @new_block_reservation4 = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 9) + @new_block_reservation5 = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 10) + + @new_block.has_rooms_available?.must_equal false + end end end From c08170d3db0c0c60550ed670fcf0bef6eb9a25bb Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 17:21:40 -0700 Subject: [PATCH 37/43] Added validate dates in Reservations class to make sure dates of new block reservations match the block date range. --- lib/Reservations.rb | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 080c9c0a1..dc9d96f41 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -133,7 +133,12 @@ def in_block?(block_name, room_number) end def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200) + + block_room_booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) + check_in = Date.parse(check_in) + check_out = Date.parse(check_out) + validate_block_dates(check_in, check_out, block_name) in_block?(block_name, room_number) check_block_room_available(block_name, room_number) @@ -143,6 +148,26 @@ def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, r return block_room_booking end + def match_block + #write a def to find out which block it is so don't have to repeat code + end + + def validate_block_dates(check_in, check_out, block_name) + this_block = nil + @blocks_collection.each do |block| + if block.block_name == block_name + this_block = block + end + end + + if check_in >= this_block.check_in && check_out <= this_block.check_out + return true + else + raise ArgumentError.new("Cannot reserve for those dates - dates must be the same as block dates.") + return false + end + end + def add_block_booking_to_block(block_name, block_room_booking) @blocks_collection.each do |block| if block.block_name == block_name From 0b64991ea401f0d99346d949b57448f19d8dba75 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 22:15:40 -0700 Subject: [PATCH 38/43] added a method match_block to quickly find which block the new reservation is for. Fixed method and tests for checking if a room inputed during a new block reservation is in the block, which prevents booking if the room is not part of the block. All methods currently passing tests. Just need to clean up a bit. --- lib/Reservations.rb | 38 ++++++++++++++++++++++++++----------- specs/Reservations-specs.rb | 12 ++++++++++-- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/lib/Reservations.rb b/lib/Reservations.rb index dc9d96f41..25a594ce0 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -119,7 +119,8 @@ def create_block_rooms_collection #TESTED end #Testing, not working to produce an error when room is not in the block - def in_block?(block_name, room_number) + def check_in_block(block_name, room_number) + #match_block(block_name) @blocks_collection.each do |block| if block.block_name == block_name block.block_rooms_collection.each do |room| @@ -129,8 +130,23 @@ def in_block?(block_name, room_number) end end end - return ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") + raise ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") + return false end +#new one, not working + # def in_block?(block_name, room_number) + # match_block(block_name) + # list_room_numbers = [] + # @this_block.block_rooms_collection.each do |room| + # list_room_numbers << room.room_number + # end + # if list_room_numbers.include?(room) + # return true + # else + # raise ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") + # return false + # end + # end def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200) @@ -139,7 +155,7 @@ def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, r check_in = Date.parse(check_in) check_out = Date.parse(check_out) validate_block_dates(check_in, check_out, block_name) - in_block?(block_name, room_number) + check_in_block(block_name, room_number) check_block_room_available(block_name, room_number) add_block_booking_to_block(block_name, block_room_booking) @@ -148,19 +164,19 @@ def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, r return block_room_booking end - def match_block - #write a def to find out which block it is so don't have to repeat code - end - - def validate_block_dates(check_in, check_out, block_name) - this_block = nil + def match_block(block_name) + @this_block = nil @blocks_collection.each do |block| if block.block_name == block_name - this_block = block + @this_block = block end end + return @this_block + end - if check_in >= this_block.check_in && check_out <= this_block.check_out + def validate_block_dates(check_in, check_out, block_name) + match_block(block_name) + if check_in >= @this_block.check_in && check_out <= @this_block.check_out return true else raise ArgumentError.new("Cannot reserve for those dates - dates must be the same as block dates.") diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index c914f76ea..eb0a869eb 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -216,9 +216,17 @@ it 'must return false if there are NOT any rooms available in block to be booked' do @new_block_reservation3 = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 8) @new_block_reservation4 = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 9) - @new_block_reservation5 = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 10) - + @new_block_reservation5 = @new_hotel_with_blocks1.new_reservation_in_block("2018-01-01", "2018-01-05", "Heritage", 5) + @new_block.has_rooms_available?.must_equal false end end + + describe 'block room reservation will match with block date range' do + it 'must raise an arugment error if the dates are outside of the range' do + new_hotel = Hotel::Reservations.new + new_block = new_hotel.new_block("2018-01-01", "2018-01-10", "Heritage", 5) + proc {new_block_reservation = new_hotel.new_reservation_in_block("2018-01-01", "2018-01-15", "Heritage", 5)}.must_raise ArgumentError + end + end end From cd21027fae7c9bc0749e8e1c2cbaee516efbb604 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 10 Sep 2017 22:27:56 -0700 Subject: [PATCH 39/43] corrected spec files to be separate by class --- lib/Reservations.rb | 38 +++++------------------ specs/Booking-specs.rb | 65 ++++++++++++++++++++++++++++++++++++++++ specs/DateRange-specs.rb | 20 +++++++++++++ specs/Room-specs.rb | 31 +++++++++++++++++++ specs/wave-1-specs.rb | 6 ---- 5 files changed, 123 insertions(+), 37 deletions(-) create mode 100644 specs/Booking-specs.rb create mode 100644 specs/DateRange-specs.rb create mode 100644 specs/Room-specs.rb diff --git a/lib/Reservations.rb b/lib/Reservations.rb index 25a594ce0..bb1f8a3c9 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -9,12 +9,10 @@ class Reservations attr_accessor :blocks_collection def initialize - @all_reservations = [] #pass block reservations into this. - #@room_number = room_number + @all_reservations = [] @rooms_collection = [] all_rooms @blocks_collection = [] - end def all_rooms @@ -44,8 +42,6 @@ def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = end end - -#TESTED and WORKS - need to verify with Block reservatioins but it should work def list_rooms_available_by_date(date) rooms_available = @rooms_collection list_reservations_by_date(date).each do |booking| @@ -65,7 +61,6 @@ def list_rooms_available_by_date(date) return rooms_available end #def end -#TESTED and it WORKS - need to test for Block reservations def check_availability?(dates, room_number) available = true dates[0...-1].each do |date| @@ -84,8 +79,6 @@ def check_availability?(dates, room_number) end end - -#MOSTLY TESTED but will need a few more tests most likely def new_block(check_in, check_out, block_name, number_of_rooms, block_rooms_collection = [], discounted_room_rate = 180) @number_of_rooms = number_of_rooms @dates = DateRange.new(check_in, check_out).dates @@ -96,7 +89,7 @@ def new_block(check_in, check_out, block_name, number_of_rooms, block_rooms_coll return block end - def create_block_rooms_collection #TESTED + def create_block_rooms_collection unless @number_of_rooms <= 5 && @number_of_rooms >= 1 raise ArgumentError.new("Blocks can only have between 1 and 5 rooms.") end @@ -118,9 +111,7 @@ def create_block_rooms_collection #TESTED return @block_rooms_collection end -#Testing, not working to produce an error when room is not in the block def check_in_block(block_name, room_number) - #match_block(block_name) @blocks_collection.each do |block| if block.block_name == block_name block.block_rooms_collection.each do |room| @@ -133,34 +124,18 @@ def check_in_block(block_name, room_number) raise ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") return false end -#new one, not working - # def in_block?(block_name, room_number) - # match_block(block_name) - # list_room_numbers = [] - # @this_block.block_rooms_collection.each do |room| - # list_room_numbers << room.room_number - # end - # if list_room_numbers.include?(room) - # return true - # else - # raise ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") - # return false - # end - # end def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200) - - block_room_booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) check_in = Date.parse(check_in) check_out = Date.parse(check_out) + validate_block_dates(check_in, check_out, block_name) check_in_block(block_name, room_number) - check_block_room_available(block_name, room_number) add_block_booking_to_block(block_name, block_room_booking) - @all_reservations << block_room_booking # TEST that it doesn't go in if not a valid booking + @all_reservations << block_room_booking return block_room_booking end @@ -204,7 +179,8 @@ def check_block_room_available(block_name, room_number) end return true end - def list_reservations_by_date(date) #TESTED + + def list_reservations_by_date(date) date = Date.parse(date) list = [] @all_reservations.each do |reservation| @@ -215,7 +191,7 @@ def list_reservations_by_date(date) #TESTED return list end - def list_blocked_rooms_by_date(date) #TESTED + def list_blocked_rooms_by_date(date) date = Date.parse(date) blocks_list = [] @blocks_collection.each do |block| diff --git a/specs/Booking-specs.rb b/specs/Booking-specs.rb new file mode 100644 index 000000000..04e25e78a --- /dev/null +++ b/specs/Booking-specs.rb @@ -0,0 +1,65 @@ +require_relative 'spec_helper' + +describe 'Booking' do + before do + @new_booking = Hotel::Booking.new("2017-09-21", "2017-09-23") + end + describe 'initialize' do + it "must be an instance of Booking" do + @new_booking.must_be_instance_of Hotel::Booking + end + it "must have a check in date" do + @new_booking.must_respond_to :check_in + end + it "must have a check out date" do + @new_booking.must_respond_to :check_out + end + it "must have a room number" do + @new_booking.must_respond_to :room_number + end + end + + describe "check in date" do + it "must be a date" do + @new_booking.check_in.must_be_kind_of Date + end + it "must output the correct date" do + @new_booking.check_in.must_equal Date.parse("2017-09-21") + end + end + + describe "check out date" do + it "must be a date do" do + @new_booking.check_out.must_be_kind_of Date + end + it "must output the correct date" do + @new_booking.check_out.must_equal Date.parse("2017-09-23") + end + end + + describe "room number" do + it "must be an integer" do + @new_booking.room_number.must_be_kind_of Integer + end + end +end + + +describe 'DateRange' do + before do + @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") + end + describe 'initialize' do + it 'will initialize' do + @new_date_range.must_be_instance_of Hotel::DateRange + end + end + describe 'dates method' do + it 'is an array' do + @new_date_range.dates.must_be_kind_of Array + end + it 'must include the correct number of dates' do + @new_date_range.dates.length.must_equal 4 + end + end +end diff --git a/specs/DateRange-specs.rb b/specs/DateRange-specs.rb new file mode 100644 index 000000000..e1b9e6b07 --- /dev/null +++ b/specs/DateRange-specs.rb @@ -0,0 +1,20 @@ +require_relative 'spec_helper' + +describe 'DateRange' do + before do + @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") + end + describe 'initialize' do + it 'will initialize' do + @new_date_range.must_be_instance_of Hotel::DateRange + end + end + describe 'dates method' do + it 'is an array' do + @new_date_range.dates.must_be_kind_of Array + end + it 'must include the correct number of dates' do + @new_date_range.dates.length.must_equal 4 + end + end +end diff --git a/specs/Room-specs.rb b/specs/Room-specs.rb new file mode 100644 index 000000000..77639e698 --- /dev/null +++ b/specs/Room-specs.rb @@ -0,0 +1,31 @@ +require_relative 'spec_helper' + +describe 'Room' do + before do + @new_room = Hotel::Room.new("1") + end + describe 'initialize' do + it "must be an instance of Room" do + @new_room.must_be_instance_of Hotel::Room + end + end + + describe 'room number' do + + it "must have a room number" do + @new_room.must_respond_to :room_number + end + it "must output its correct room number" do + @new_room.room_number.must_equal "1" + end + end + + describe 'room rate' do + it "must have a designated room rate" do + @new_room.must_respond_to :room_rate + end + it "must default to 200" do + @new_room.room_rate.must_equal 200 + end + end +end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb index 632ca7ff3..b2ae98650 100644 --- a/specs/wave-1-specs.rb +++ b/specs/wave-1-specs.rb @@ -71,10 +71,6 @@ it "must be an integer" do @new_booking.room_number.must_be_kind_of Integer end - # it "must be between 1 and 20" do - # @new_booking.room_number.must_equal 1, <=:, 20 - # #@new_booking.room_number.must_equal :<=, 20 - # end end end @@ -82,8 +78,6 @@ describe 'DateRange' do before do @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") - # @new_date_range2 = Hotel::DateRange.new("2017-01-02", "2017-01-03") - # @new_date_range3 = Hotel::DateRange.new("2017-02-04", "2017-02-07") end describe 'initialize' do it 'will initialize' do From 02fc0e995f3400c7c72c28726d3dc07334b44070 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Fri, 29 Sep 2017 08:32:17 -0700 Subject: [PATCH 40/43] completed design activity questions --- design-activity.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..5fb8347fa --- /dev/null +++ b/design-activity.md @@ -0,0 +1,72 @@ +#What classes does each implementation include? Are the lists the same? + +Implementation A includes the following classes: +CartEntry, ShoppingCart, Order + +Implementation B includes the following classes: +CartEntry, ShoppingCart, Order + +The lists are the same. + +#Write down a sentence to describe each class. + +CartEntry adds an item to cart with the quantity and unit price. + +ShoppingCart holds a list of all items added to the cart. + +Order creates a new instance of ShoppingCart and can calculate the total price of the cart. + + +How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. + +An Order holds a ShoppingCart and its price. A ShoppingCart holds all items entered for that cart. A CartEntry is used to create entries that will be added to the ShoppingCart. + +What data does each class store? How (if at all) does this differ between the two implementations? + +In A and B, CartEntry stores the unit price and quantity for an item. + +In A and B, ShoppingCart stores a list of entries. + +In A and B, Order stores SALES_TAX and a ShoppingCart. + +What methods does each class have? How (if at all) does this differ between the two implementations? + +A has the following methods for each class: +CartEntry: initialize +ShoppingCart: initialize +Order: initialize, total_price + +B had the following: +CartEntry: initialize, price +ShoppingCart: initialize, price +Order: initialize, total_price + +B has a method to calculate price for each class, rather than only one as in A. + + +Consider the Order#total_price method. In each implementation: + +Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? +In B the logic to compute price is contained in lower level classes, but in A it is not - in A it is retained in Order. + +Does total_price directly manipulate the instance variables of other classes? + +In A it does. + +If we decide items are cheaper if bought in bulk, how would this change the code? + +In A it would be harder to change because we do not calculate price for each item separately in A. + +In B it would be easier to change, because we could add code to give an item discount when bought in bulk in the CartEntry class. Since price is calculated for each item in CartEntry, the other classes would not be affected or have knowledge of this change. + + Which implementation is easier to modify? + + B is easier to modify. + +Which implementation better adheres to the single responsibility principle? + +B adheres better. + +Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? + +B is more loosely coupled. From bef0655097f8c52314f31d146ce0c8262c3cdf4c Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 1 Oct 2017 18:50:41 -0700 Subject: [PATCH 41/43] Trying to clean up the mess from trying to rework this code... --- design-activity.md | 9 ++ lib/Block.rb | 44 ++++++++-- lib/Booking.rb | 27 +++--- lib/DateRange.rb | 71 ++++++++++++---- lib/Reservations.rb | 161 ++++++++++++++++++++---------------- specs/Booking-specs.rb | 6 +- specs/Reservations-specs.rb | 18 ++-- specs/wave-1-specs.rb | 95 --------------------- 8 files changed, 216 insertions(+), 215 deletions(-) delete mode 100644 specs/wave-1-specs.rb diff --git a/design-activity.md b/design-activity.md index 5fb8347fa..c0bb6e8de 100644 --- a/design-activity.md +++ b/design-activity.md @@ -70,3 +70,12 @@ B adheres better. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? B is more loosely coupled. + +# Identify one place in your Hotel project where a class takes on multiple roles, or directly modifies the attributes of another class. +The Reservations class directly modifies attributes of other classes and overreaches in responsibility. The other classes stick to single responsibility but Reservations does not and is much more complicated. Reservations is too tightly coupled with other classes in several methods. + +# Describe in design-activity.md what changes you would need to make to improve this design, and how why the resulting design would be an improvement. + +I would remove direct calls on other classes in the methods as much as possible, and instead create instance variables on initialize within Reservations. I would move as much as possible of the date checking, availability checking, date range creation, etc to the DateRange class. I would have DateRange initialize with an array of dates rather than needing to call that method on a date range each time I need it. + +This would be an improvement because it would make the program more resilient to breaking if changes are made to other classes. It would also make the code easier and less complicated to change in the future. diff --git a/lib/Block.rb b/lib/Block.rb index bccb03a46..f651fcf9f 100644 --- a/lib/Block.rb +++ b/lib/Block.rb @@ -1,28 +1,58 @@ module Hotel - class Block - attr_accessor :check_in, :check_out, :date_range, :dates, :block_rooms_collection, :discounted_room_rate, :available_rooms, :booked, :block_name + class Block < DateRange + attr_accessor :check_in, :check_out, :date_range, :dates, :block_rooms_collection, :discounted_room_rate, :available_rooms, :booked, :block_name, :number_of_rooms def initialize(check_in, check_out, block_name, block_rooms_collection = [], discounted_room_rate = 180) + @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) - @date_range = Hotel::DateRange.new(@check_in, @check_out) - @dates = Hotel::DateRange.new(@check_in, @check_out).dates + @date_range = Hotel::DateRange.new(check_in, check_out) + @dates = @date_range.dates + # @dates = Hotel::DateRange.new(@check_in, @check_out).dates @block_rooms_collection = block_rooms_collection @discounted_room_rate = discounted_room_rate @booked = [] @block_name = block_name #@available_rooms = @block_rooms_collection + # @number_of_rooms = number_of_rooms + # create_block_rooms_collection + # Hotel::Reservations.blocks_collection << Self end + + # def create_block_rooms_collection + # unless @number_of_rooms <= 5 && @number_of_rooms >= 1 + # raise ArgumentError.new("Blocks can only have between 1 and 5 rooms.") + # end + # rooms_available = Hotel::Reservations.rooms_collection + # @dates.each do |date| + # Hotel::Reservations.list_reservations_by_date(date).each do |booking| + # rooms_available.each do |room| + # if room.room_number == booking.room_number + # rooms_available.delete(room) + # end + # end + # end + # end + # @block_rooms_collection = [] + # + # @number_of_rooms.times do |i| + # @block_rooms_collection << rooms_available[i] + # end + # return @block_rooms_collection + # end + + def has_rooms_available? - if @booked.length < @block_rooms_collection.length - return true - else + if !(@booked.length < @block_rooms_collection.length) return false + else + return true end end + end end diff --git a/lib/Booking.rb b/lib/Booking.rb index 08a92fa5b..175f274b9 100644 --- a/lib/Booking.rb +++ b/lib/Booking.rb @@ -2,16 +2,15 @@ require 'DateRange' module Hotel - class InvalidDateError < StandardError - end - class Booking - attr_accessor :check_in, :check_out, :room_number, :total_cost, :dates + + class Booking < DateRange + attr_reader :check_in, :check_out, :room_number, :date_range def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) @room_number = room_number @check_in = Date.parse(check_in) @check_out = Date.parse(check_out) - @date_range = DateRange.new(@check_in, @check_out) + @date_range = DateRange.new(check_in, check_out) @dates = @date_range.dates @room_rate = room_rate #@dates = Hotel::DateRange.new(check_in, check_out) @@ -19,17 +18,17 @@ def initialize(check_in, check_out, room_number = rand(1..20), room_rate = 200) # @total_cost = (@room_rate * @num_days) @discount = 0 - validate_dates + # validate_dates end - def validate_dates - unless @check_in >= Date.today - raise InvalidDateError.new("Check-in cannot be before today's date.") - end - unless @check_in < @check_out - raise InvalidDateError.new("Check-in cannot be after check-out.") - end - end + # def validate_dates + # unless @check_in >= Date.today + # raise InvalidDateError.new("Check-in cannot be before today's date.") + # end + # unless @check_in < @check_out + # raise InvalidDateError.new("Check-in cannot be after check-out.") + # end + # end def total_cost num_days = (@check_out - @check_in).to_i diff --git a/lib/DateRange.rb b/lib/DateRange.rb index 5c8240b70..26a2aa61f 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -1,29 +1,68 @@ require 'date' module Hotel + class InvalidDateError < StandardError + end + class DateRange - attr_accessor :dates + attr_reader :dates, :check_in, :check_out def initialize(check_in, check_out) - @check_in = check_in - @check_out = check_out - #@dates = [] + @check_in = Date.parse(check_in) + @check_out = Date.parse(check_out) + @dates = Array(@check_in..@check_out) + validate_dates + end + + def validate_dates + unless @check_in >= Date.today + raise InvalidDateError.new("Check-in cannot be before today's date.") + end + unless @check_in < @check_out + raise InvalidDateError.new("Check-in cannot be after check-out.") + end + end + + def make_date(date) + if date.class != Date + date = Date.parse(date) + end + return date + end + + def validate_block_dates(check_in, check_out) + check_in = make_date(check_in) + check_out = make_date(check_out) + if @check_in >= check_in && @check_out <= check_out + return true + else + raise ArgumentError.new("Cannot reserve for those dates - dates must be the same as block dates.") + return false + end end - def dates #Add @dates here? - return Array(@check_in..@check_out) + def overlaps?(date) + date = make_date(date) + unless date >= @check_in && date < @check_out + return false + end end + # def dates #Add @dates here? + # return Array(@check_in..@check_out) + # end + + + # class InvalidCardNumberError < StandardError + # end + # + # def process_transaction(card_number, amount) + # # card_is_valid? is defined elsewhere + # unless card_is_valid?(card_number) + # raise InvalidCardNumberError.new("Invalid credit card number #{card_number}") + # end + # # ... process the transaction ... + # end - # class InvalidCardNumberError < StandardError - # end - # - # def process_transaction(card_number, amount) - # # card_is_valid? is defined elsewhere - # unless card_is_valid?(card_number) - # raise InvalidCardNumberError.new("Invalid credit card number #{card_number}") - # end - # # ... process the transaction ... - # end end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index bb1f8a3c9..a924089ea 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -5,7 +5,7 @@ module Hotel class Reservations - attr_reader :room_number + attr_reader :room_number, :all_reservations, :rooms_collection attr_accessor :blocks_collection def initialize @@ -13,10 +13,16 @@ def initialize @rooms_collection = [] all_rooms @blocks_collection = [] + # @booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) + # @block = Hotel::Block.new(check_in, check_out, block_name, @block_rooms_collection, discounted_room_rate = 180) + # @dates = @date_range.dates end def all_rooms - @rooms_collection = [] + if @rooms_collection.empty? == false + return @rooms_collection + end + n = 1 (1..20).each do @@ -32,13 +38,14 @@ def all_reservations end def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) - dates = Hotel::DateRange.new(check_in, check_out).dates + # dates = Hotel::DateRange.new(check_in, check_out).dates booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - if check_availability?(dates, room_number) == false + @dates = booking.dates + if check_availability?(@dates, room_number) == false raise ArgumentError.new("Room number #{room_number} unavailable for those dates.") - else - @all_reservations << booking - return booking + else + @all_reservations << booking + return booking end end @@ -85,6 +92,7 @@ def new_block(check_in, check_out, block_name, number_of_rooms, block_rooms_coll create_block_rooms_collection #Method already checks for room availability in order to create collection block_rooms_collection = @block_rooms_collection block = Hotel::Block.new(check_in, check_out, block_name, @block_rooms_collection, discounted_room_rate = 180) + # @dates = @date_range.dates @blocks_collection << block return block end @@ -103,6 +111,7 @@ def create_block_rooms_collection end end end + @block_rooms_collection = [] @number_of_rooms.times do |i| @@ -113,26 +122,28 @@ def create_block_rooms_collection def check_in_block(block_name, room_number) @blocks_collection.each do |block| - if block.block_name == block_name - block.block_rooms_collection.each do |room| - if room.room_number == room_number + if block.block_name == block_name + block.block_rooms_collection.each do |room| + if room.room_number == room_number return true - end end end + end end raise ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") return false end - def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 200) + def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 180) block_room_booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - check_in = Date.parse(check_in) - check_out = Date.parse(check_out) + # check_in = Date.parse(check_in) + # check_out = Date.parse(check_out) validate_block_dates(check_in, check_out, block_name) check_in_block(block_name, room_number) check_block_room_available(block_name, room_number) + + add_block_booking_to_block(block_name, block_room_booking) @all_reservations << block_room_booking @@ -140,23 +151,25 @@ def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, r end def match_block(block_name) - @this_block = nil + this_block = nil @blocks_collection.each do |block| if block.block_name == block_name - @this_block = block + this_block = block end end - return @this_block + return this_block end def validate_block_dates(check_in, check_out, block_name) - match_block(block_name) - if check_in >= @this_block.check_in && check_out <= @this_block.check_out - return true - else - raise ArgumentError.new("Cannot reserve for those dates - dates must be the same as block dates.") - return false - end + block = match_block(block_name) + date_range = block.date_range + # block.validate_block_dates(check_in, check_out) + if check_in >= block.check_in && check_out <= block.check_out + return true + else + raise ArgumentError.new("Cannot reserve for those dates - dates must be the same as block dates.") + return false + end end def add_block_booking_to_block(block_name, block_room_booking) @@ -181,10 +194,13 @@ def check_block_room_available(block_name, room_number) end def list_reservations_by_date(date) - date = Date.parse(date) + if date.class != Date + date = Date.parse(date) + end list = [] @all_reservations.each do |reservation| - if date >= reservation.check_in && date < reservation.check_out #check_out date excluded + if date >= reservation.check_in && date < reservation.check_out + #reservation.overlaps?(date) #check_out date excluded list << reservation end end @@ -192,7 +208,10 @@ def list_reservations_by_date(date) end def list_blocked_rooms_by_date(date) - date = Date.parse(date) + if date.class != Date + date = Date.parse(date) + end + # date = Date.parse(date) blocks_list = [] @blocks_collection.each do |block| if date >= block.dates[0] && date < block.dates[-1] @@ -211,52 +230,52 @@ def clear_reservations #Using this for testing purposes end end #I don't think I"ll need this but keep for now and hasn't been tested# - # def assign_block_room(check_in, check_out, room_number) - # date_range = DateRange.new(check_in, check_out).dates - # block_name. - # date_range[0...-1].each do |date| - # list_reservations_by_date(date).each do |booking| - # if booking.room_number == room_number - # raise ArgumentError.new("Room number #{room_number} is not available for those dates.") - # end - # end - # end - # end +# def assign_block_room(check_in, check_out, room_number) +# date_range = DateRange.new(check_in, check_out).dates +# block_name. +# date_range[0...-1].each do |date| +# list_reservations_by_date(date).each do |booking| +# if booking.room_number == room_number +# raise ArgumentError.new("Room number #{room_number} is not available for those dates.") +# end +# end +# end +# end #Not required and not yet incorporated nor tested - # def validate_room_number #THIS DOESN"T WORK YET - # validation = false - # @rooms_collection.each do |room| - # unless validation == true - # if room.room_number == @room_number - # validation = true - # else validation = false - # end - # end - # end - # if validation == false - # raise ArgumentError.new("#{room_number} is not a valid room number at this property.") - # return false - # else - # return true - # end - # end +# def validate_room_number #THIS DOESN"T WORK YET +# validation = false +# @rooms_collection.each do |room| +# unless validation == true +# if room.room_number == @room_number +# validation = true +# else validation = false +# end +# end +# end +# if validation == false +# raise ArgumentError.new("#{room_number} is not a valid room number at this property.") +# return false +# else +# return true +# end +# end #Not required and not yet incorporated nor tested - # def assign_room_number #DOESN"T WORK YET - # unless @room_number > 0 - # @rooms_collection.each do |room| - # if available? - # @room_number = room.room_number - # return @room_number - # else @room_number = nil - # end - # end - # if @room_number == nil - # raise ArgumentError.new("No rooms available for those dates.") - # end - # end - # #room_number = @rooms_collection - # #end - # end +# def assign_room_number #DOESN"T WORK YET +# unless @room_number > 0 +# @rooms_collection.each do |room| +# if available? +# @room_number = room.room_number +# return @room_number +# else @room_number = nil +# end +# end +# if @room_number == nil +# raise ArgumentError.new("No rooms available for those dates.") +# end +# end +# #room_number = @rooms_collection +# #end +# end diff --git a/specs/Booking-specs.rb b/specs/Booking-specs.rb index 04e25e78a..437699c15 100644 --- a/specs/Booking-specs.rb +++ b/specs/Booking-specs.rb @@ -2,7 +2,7 @@ describe 'Booking' do before do - @new_booking = Hotel::Booking.new("2017-09-21", "2017-09-23") + @new_booking = Hotel::Booking.new("2018-09-21", "2018-09-23") end describe 'initialize' do it "must be an instance of Booking" do @@ -24,7 +24,7 @@ @new_booking.check_in.must_be_kind_of Date end it "must output the correct date" do - @new_booking.check_in.must_equal Date.parse("2017-09-21") + @new_booking.check_in.must_equal Date.parse("2018-09-21") end end @@ -33,7 +33,7 @@ @new_booking.check_out.must_be_kind_of Date end it "must output the correct date" do - @new_booking.check_out.must_equal Date.parse("2017-09-23") + @new_booking.check_out.must_equal Date.parse("2018-09-23") end end diff --git a/specs/Reservations-specs.rb b/specs/Reservations-specs.rb index eb0a869eb..bd4695611 100644 --- a/specs/Reservations-specs.rb +++ b/specs/Reservations-specs.rb @@ -29,7 +29,7 @@ @new_hotel1 = Hotel::Reservations.new end it 'must create a new booking' do - new_booking1 = @new_hotel1.new_reservation("2017-09-21", "2017-09-23", 1) + new_booking1 = @new_hotel1.new_reservation("2018-09-21", "2018-09-23", 1) new_booking1.must_be_instance_of Hotel::Booking end it 'must raise an error if the check-in date is in the past' do @@ -37,10 +37,10 @@ proc{new_booking = @new_hotel1.new_reservation("2017-06-01", "2017-09-21", 2)}.must_raise Hotel::InvalidDateError end it 'must raise an error if the check-in date is the same as the check-out date' do - proc{new_booking = @new_hotel1.new_reservation("2017-09-20", "2017-09-20"), 3}.must_raise Hotel::InvalidDateError + proc{new_booking = @new_hotel1.new_reservation("2018-09-20", "2018-09-20"), 3}.must_raise Hotel::InvalidDateError end it 'must raise an error if the check_in date is after the check-out date' do - proc{new_booking = @new_hotel1.new_reservation("2017-09-20", "2017-09-18"), 4}.must_raise Hotel::InvalidDateError + proc{new_booking = @new_hotel1.new_reservation("2018-09-20", "2018-09-18"), 4}.must_raise Hotel::InvalidDateError end it 'must raise an error if the date is not valid on calendar' do proc{new_booking = @new_hotel1.new_reservation("2018-02-30", "2018-02-31"), 5}.must_raise ArgumentError @@ -80,7 +80,7 @@ @new_hotel.list_rooms_available_by_date("2018-01-02").must_be_kind_of Array end it 'must return the correct number of rooms available' do - @new_hotel.list_rooms_available_by_date("2018-01-03").length.must_equal 17 + @new_hotel.list_rooms_available_by_date(Date.parse("2018-01-03")).length.must_equal 17 end it 'must return the correct rooms available' do @new_hotel.list_rooms_available_by_date("2018-01-03")[0].room_number.must_equal 3 @@ -105,7 +105,7 @@ describe 'all reservations' do before do @new_hotel.clear_reservations - @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23", 2) + @new_booking1 = @new_hotel.new_reservation("2018-09-21", "2018-09-23", 2) @new_booking2 = @new_hotel.new_reservation("2020-01-01", "2020-01-15", 3) @new_booking3 = @new_hotel.new_reservation("2019-01-01", "2019-01-15", 5) end @@ -116,7 +116,7 @@ @new_hotel.all_reservations.length.must_equal 3 end it 'must contain the first reservation made' do - @new_hotel.all_reservations[0].check_in.must_equal Date.parse("2017-09-21") + @new_hotel.all_reservations[0].check_in.must_equal Date.parse("2018-09-21") end it 'must contain the correct total cost of the reservation' do @new_hotel.all_reservations[0].total_cost.must_equal 400 @@ -126,7 +126,7 @@ describe 'list_reservations_by_date' do before do @new_hotel.clear_reservations - @new_booking1 = @new_hotel.new_reservation("2017-09-21", "2017-09-23", 1) + @new_booking1 = @new_hotel.new_reservation("2018-09-21", "2018-09-23", 1) @new_booking2 = @new_hotel.new_reservation("2019-01-01", "2019-01-15", 10) @new_booking3 = @new_hotel.new_reservation("2019-01-02", "2019-01-12", 12) @new_booking4 = @new_hotel.new_reservation("2019-01-01", "2019-01-13", 15) @@ -141,7 +141,7 @@ @new_hotel.list_reservations_by_date("2019-01-04").length.must_equal 3 end it "must return the correct reservations" do - @new_hotel.list_reservations_by_date("2017-09-21")[0].room_number.must_equal @new_booking1.room_number + @new_hotel.list_reservations_by_date("2018-09-21")[0].room_number.must_equal @new_booking1.room_number end end @@ -174,7 +174,7 @@ @new_block = @new_hotel.new_block("2018-01-01", "2018-01-10", "Heritage", 5) end it 'must list the correct number of rooms for a given date' do - @new_hotel.list_blocked_rooms_by_date("2018-01-02").length.must_equal 5 + @new_hotel.list_blocked_rooms_by_date(Date.parse("2018-01-02")).length.must_equal 5 end end diff --git a/specs/wave-1-specs.rb b/specs/wave-1-specs.rb deleted file mode 100644 index b2ae98650..000000000 --- a/specs/wave-1-specs.rb +++ /dev/null @@ -1,95 +0,0 @@ -require_relative 'spec_helper' - -describe 'Room' do - before do - @new_room = Hotel::Room.new("1") - end - describe 'initialize' do - it "must be an instance of Room" do - @new_room.must_be_instance_of Hotel::Room - end - end - - describe 'room number' do - - it "must have a room number" do - @new_room.must_respond_to :room_number - end - it "must output its correct room number" do - @new_room.room_number.must_equal "1" - end - end - - describe 'room rate' do - it "must have a designated room rate" do - @new_room.must_respond_to :room_rate - end - it "must default to 200" do - @new_room.room_rate.must_equal 200 - end - end -end - -describe 'Booking' do - before do - @new_booking = Hotel::Booking.new("2017-09-21", "2017-09-23") - end - describe 'initialize' do - it "must be an instance of Booking" do - @new_booking.must_be_instance_of Hotel::Booking - end - it "must have a check in date" do - @new_booking.must_respond_to :check_in - end - it "must have a check out date" do - @new_booking.must_respond_to :check_out - end - it "must have a room number" do - @new_booking.must_respond_to :room_number - end - end - - describe "check in date" do - it "must be a date" do - @new_booking.check_in.must_be_kind_of Date - end - it "must output the correct date" do - @new_booking.check_in.must_equal Date.parse("2017-09-21") - end - end - - describe "check out date" do - it "must be a date do" do - @new_booking.check_out.must_be_kind_of Date - end - it "must output the correct date" do - @new_booking.check_out.must_equal Date.parse("2017-09-23") - end - end - - describe "room number" do - it "must be an integer" do - @new_booking.room_number.must_be_kind_of Integer - end - end -end - - -describe 'DateRange' do - before do - @new_date_range = Hotel::DateRange.new("2019-01-01", "2019-01-04") - end - describe 'initialize' do - it 'will initialize' do - @new_date_range.must_be_instance_of Hotel::DateRange - end - end - describe 'dates method' do - it 'is an array' do - @new_date_range.dates.must_be_kind_of Array - end - it 'must include the correct number of dates' do - @new_date_range.dates.length.must_equal 4 - end - end -end From 1d6fca5a88b0caa7f886b8af59774d1facd68712 Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 1 Oct 2017 22:38:39 -0700 Subject: [PATCH 42/43] cleaned up the reservations class - moved some functions to Block class and some to DateRange class. --- lib/Block.rb | 12 +++-- lib/DateRange.rb | 18 ------- lib/Reservations.rb | 119 ++++++++++---------------------------------- 3 files changed, 33 insertions(+), 116 deletions(-) diff --git a/lib/Block.rb b/lib/Block.rb index f651fcf9f..d8a2f7921 100644 --- a/lib/Block.rb +++ b/lib/Block.rb @@ -2,6 +2,7 @@ module Hotel class Block < DateRange attr_accessor :check_in, :check_out, :date_range, :dates, :block_rooms_collection, :discounted_room_rate, :available_rooms, :booked, :block_name, :number_of_rooms + def initialize(check_in, check_out, block_name, block_rooms_collection = [], discounted_room_rate = 180) @check_in = Date.parse(check_in) @@ -13,13 +14,11 @@ def initialize(check_in, check_out, block_name, block_rooms_collection = [], dis @discounted_room_rate = discounted_room_rate @booked = [] @block_name = block_name - #@available_rooms = @block_rooms_collection # @number_of_rooms = number_of_rooms # create_block_rooms_collection # Hotel::Reservations.blocks_collection << Self end - # def create_block_rooms_collection # unless @number_of_rooms <= 5 && @number_of_rooms >= 1 # raise ArgumentError.new("Blocks can only have between 1 and 5 rooms.") @@ -42,6 +41,13 @@ def initialize(check_in, check_out, block_name, block_rooms_collection = [], dis # return @block_rooms_collection # end + def validate_block_dates(check_in, check_out, block) + if check_in >= block.check_in && check_out <= block.check_out + return true + else + raise ArgumentError.new("Cannot reserve for those dates - dates must be the same as block dates.") + end + end def has_rooms_available? if !(@booked.length < @block_rooms_collection.length) @@ -52,7 +58,5 @@ def has_rooms_available? end - - end end diff --git a/lib/DateRange.rb b/lib/DateRange.rb index 26a2aa61f..e8408ee56 100644 --- a/lib/DateRange.rb +++ b/lib/DateRange.rb @@ -47,23 +47,5 @@ def overlaps?(date) end end - # def dates #Add @dates here? - # return Array(@check_in..@check_out) - # end - - - # class InvalidCardNumberError < StandardError - # end - # - # def process_transaction(card_number, amount) - # # card_is_valid? is defined elsewhere - # unless card_is_valid?(card_number) - # raise InvalidCardNumberError.new("Invalid credit card number #{card_number}") - # end - # # ... process the transaction ... - # end - - - end end diff --git a/lib/Reservations.rb b/lib/Reservations.rb index a924089ea..1693727fe 100644 --- a/lib/Reservations.rb +++ b/lib/Reservations.rb @@ -5,7 +5,7 @@ module Hotel class Reservations - attr_reader :room_number, :all_reservations, :rooms_collection + attr_reader :all_reservations, :rooms_collection attr_accessor :blocks_collection def initialize @@ -33,15 +33,11 @@ def all_rooms return @rooms_collection end - def all_reservations - return @all_reservations - end def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = 200) - # dates = Hotel::DateRange.new(check_in, check_out).dates booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - @dates = booking.dates - if check_availability?(@dates, room_number) == false + dates = booking.dates + if check_availability?(dates, room_number) == false raise ArgumentError.new("Room number #{room_number} unavailable for those dates.") else @all_reservations << booking @@ -51,6 +47,7 @@ def new_reservation(check_in, check_out, room_number = rand(1..20), room_rate = def list_rooms_available_by_date(date) rooms_available = @rooms_collection + list_reservations_by_date(date).each do |booking| rooms_available.each do |room| if room.room_number == booking.room_number @@ -58,6 +55,7 @@ def list_rooms_available_by_date(date) end #if end end #rooms avail end end #list do end + list_blocked_rooms_by_date(date).each do |block| rooms_available.each do |room| if room.room_number == block.room_number @@ -65,6 +63,7 @@ def list_rooms_available_by_date(date) end #if end end # room avail do end end #list do end + return rooms_available end #def end @@ -120,31 +119,26 @@ def create_block_rooms_collection return @block_rooms_collection end - def check_in_block(block_name, room_number) - @blocks_collection.each do |block| - if block.block_name == block_name + def check_in_block(block, room_number) block.block_rooms_collection.each do |room| if room.room_number == room_number return true end end - end - end - raise ArgumentError.new("Room number #{room_number} not included in #{block_name} block.") - return false + raise ArgumentError.new("Room number #{room_number} not included in #{block.block_name} block.") end def new_reservation_in_block(check_in, check_out, block_name, room_number = 0, room_rate = 180) block_room_booking = Hotel::Booking.new(check_in, check_out, room_number, room_rate) - # check_in = Date.parse(check_in) - # check_out = Date.parse(check_out) - - validate_block_dates(check_in, check_out, block_name) - check_in_block(block_name, room_number) - check_block_room_available(block_name, room_number) + check_in = Date.parse(check_in) + check_out = Date.parse(check_out) + block = match_block(block_name) + block.validate_block_dates(check_in, check_out, block) + check_in_block(block, room_number) + check_block_room_available(block, room_number) - add_block_booking_to_block(block_name, block_room_booking) + add_block_booking_to_block(block, block_room_booking) @all_reservations << block_room_booking return block_room_booking @@ -157,39 +151,26 @@ def match_block(block_name) this_block = block end end + + if this_block == nil + raise ArgumentError("Block #{block_name} does not exist.") + else return this_block - end + end - def validate_block_dates(check_in, check_out, block_name) - block = match_block(block_name) - date_range = block.date_range - # block.validate_block_dates(check_in, check_out) - if check_in >= block.check_in && check_out <= block.check_out - return true - else - raise ArgumentError.new("Cannot reserve for those dates - dates must be the same as block dates.") - return false - end end - def add_block_booking_to_block(block_name, block_room_booking) - @blocks_collection.each do |block| - if block.block_name == block_name - block.booked << block_room_booking - end - end + + def add_block_booking_to_block(block, block_room_booking) + block.booked << block_room_booking end - def check_block_room_available(block_name, room_number) - @blocks_collection.each do |block| - if block.block_name == block_name + def check_block_room_available(block, room_number) block.booked.each do |booking| if booking.room_number == room_number raise ArgumentError.new("Unable to book. Room number #{room_number} has already been booked.") end end - end - end return true end @@ -211,7 +192,7 @@ def list_blocked_rooms_by_date(date) if date.class != Date date = Date.parse(date) end - # date = Date.parse(date) + blocks_list = [] @blocks_collection.each do |block| if date >= block.dates[0] && date < block.dates[-1] @@ -229,53 +210,3 @@ def clear_reservations #Using this for testing purposes end end -#I don't think I"ll need this but keep for now and hasn't been tested# -# def assign_block_room(check_in, check_out, room_number) -# date_range = DateRange.new(check_in, check_out).dates -# block_name. -# date_range[0...-1].each do |date| -# list_reservations_by_date(date).each do |booking| -# if booking.room_number == room_number -# raise ArgumentError.new("Room number #{room_number} is not available for those dates.") -# end -# end -# end -# end - - -#Not required and not yet incorporated nor tested -# def validate_room_number #THIS DOESN"T WORK YET -# validation = false -# @rooms_collection.each do |room| -# unless validation == true -# if room.room_number == @room_number -# validation = true -# else validation = false -# end -# end -# end -# if validation == false -# raise ArgumentError.new("#{room_number} is not a valid room number at this property.") -# return false -# else -# return true -# end -# end - -#Not required and not yet incorporated nor tested -# def assign_room_number #DOESN"T WORK YET -# unless @room_number > 0 -# @rooms_collection.each do |room| -# if available? -# @room_number = room.room_number -# return @room_number -# else @room_number = nil -# end -# end -# if @room_number == nil -# raise ArgumentError.new("No rooms available for those dates.") -# end -# end -# #room_number = @rooms_collection -# #end -# end From f468b3e008b0a54b94f162412a62ac6f0d35bb7a Mon Sep 17 00:00:00 2001 From: Kimberley Zell Date: Sun, 1 Oct 2017 23:06:21 -0700 Subject: [PATCH 43/43] Corrected file names but now rake not working. Have corrected filenames in the spec_helper file and have restarted both Atom and terminal but it's still not working. Wrote additional tests under reservations_specs. --- lib/{DateRange.rb => date_range.rb} | 0 specs/{Block-specs.rb => block_specs.rb} | 0 specs/{Booking-specs.rb => booking_specs.rb} | 0 ...DateRange-specs.rb => date_range_specs.rb} | 0 ...vations-specs.rb => reservations_specs.rb} | 56 +++++++++++++++++-- specs/{Room-specs.rb => room_specs.rb} | 0 specs/spec_helper.rb | 10 ++-- 7 files changed, 55 insertions(+), 11 deletions(-) rename lib/{DateRange.rb => date_range.rb} (100%) rename specs/{Block-specs.rb => block_specs.rb} (100%) rename specs/{Booking-specs.rb => booking_specs.rb} (100%) rename specs/{DateRange-specs.rb => date_range_specs.rb} (100%) rename specs/{Reservations-specs.rb => reservations_specs.rb} (79%) rename specs/{Room-specs.rb => room_specs.rb} (100%) diff --git a/lib/DateRange.rb b/lib/date_range.rb similarity index 100% rename from lib/DateRange.rb rename to lib/date_range.rb diff --git a/specs/Block-specs.rb b/specs/block_specs.rb similarity index 100% rename from specs/Block-specs.rb rename to specs/block_specs.rb diff --git a/specs/Booking-specs.rb b/specs/booking_specs.rb similarity index 100% rename from specs/Booking-specs.rb rename to specs/booking_specs.rb diff --git a/specs/DateRange-specs.rb b/specs/date_range_specs.rb similarity index 100% rename from specs/DateRange-specs.rb rename to specs/date_range_specs.rb diff --git a/specs/Reservations-specs.rb b/specs/reservations_specs.rb similarity index 79% rename from specs/Reservations-specs.rb rename to specs/reservations_specs.rb index bd4695611..118ced34c 100644 --- a/specs/Reservations-specs.rb +++ b/specs/reservations_specs.rb @@ -55,15 +55,59 @@ describe 'check availability' do before do - @new_hotel.clear_reservations - @new_reservation1 = @new_hotel.new_reservation("2018-01-01", "2018-01-05", 1) + @new_hotel_check = Hotel::Reservations.new + @new_hotel_check.new_reservation("2018-01-01", "2018-01-05", 1) end - # after do - # @new_hotel.clear_reservations - # end + it 'must must raise argument error if room is not available' do - proc{ new_reservation2 = @new_hotel.new_reservation("2018-01-01", "2018-01-04", 1) }.must_raise ArgumentError + proc{ new_reservation2 = @new_hotel_check.new_reservation("2018-01-01", "2018-01-04", 1) }.must_raise ArgumentError + end + + it 'must not allow a room to be booked for the same dates as another booking' do + proc{ new_reservation3 = @new_hotel_check.new_reservation("2018-01-01", "2018-01-05", 1)}.must_raise ArgumentError + end + + it 'must not allow dates to overlap with check-in date of another reservation' do + proc{ new_reservation4 = @new_hotel_check.new_reservation("2017-12-25", "2018-01-02", 1)}.must_raise ArgumentError + end + + it 'must not allow dates to overlap with end of another reservation (excluding check-out date)' do + proc{ new_reservation5 = @new_hotel_check.new_reservation("2018-01-04", "2018-01-06", 1)}.must_raise ArgumentError + end + + it 'must not allow a reservation to be booked when dates are completely contained within another reservation' do + proc{ new_reservation6 = @new_hotel_check.new_reservation("2018-01-02", "2018-01-03", 1)}.must_raise ArgumentError + end + + it 'must not allow a reservation to be booked which completely contains the dates of anothe reservation' do + proc{ new_reservation7 = @new_hotel_check.new_reservation("2017-12-25", "2018-01-10", 1)}.must_raise ArgumentError end + + it 'must allow a reservation to be booked if dates are completely before another reservation' do + new_reservation8 = @new_hotel_check.new_reservation("2017-12-20", "2017-12-31", 1) + new_reservation8.must_be_instance_of Hotel::Booking + end + + it 'must allow a reservation to be booked if dates are completely after another reservation' do + new_reservation9 = @new_hotel_check.new_reservation("2018-01-15", "2018-01-28", 1) + new_reservation9.must_be_instance_of Hotel::Booking + end + + it 'must allow a reservation to be booked when reservation begins on previous reservation check out date' do + new_reservation10 = @new_hotel_check.new_reservation("2018-01-28", "2018-02-20", 1) + new_reservation10.must_be_instance_of Hotel::Booking + end + + it 'must allow a reservation to be booked when it ends on another reservations check-in date' do + new_reservation11 = @new_hotel_check.new_reservation("2018-03-20", "2018-03-22", 1) + + new_reservation12 = @new_hotel_check.new_reservation("2018-03-02", "2018-03-20", 1) + + new_reservation12.must_be_instance_of Hotel::Booking + end + + + end describe 'list rooms available by date' do diff --git a/specs/Room-specs.rb b/specs/room_specs.rb similarity index 100% rename from specs/Room-specs.rb rename to specs/room_specs.rb diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index 61c877602..c4f788cf4 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -8,8 +8,8 @@ require 'pry' require 'date' -require_relative '../lib/Room.rb' -require_relative '../lib/Reservations.rb' -require_relative '../lib/Booking.rb' -require_relative '../lib/DateRange.rb' -require_relative '../lib/Block.rb' +require_relative '../lib/room.rb' +require_relative '../lib/reservations.rb' +require_relative '../lib/booking.rb' +require_relative '../lib/date_range.rb' +require_relative '../lib/block.rb'