From 68c32d213dcbe255d114a7e5238d3658c964ce1e Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Tue, 3 Sep 2019 13:41:12 -0700 Subject: [PATCH 01/20] Initial files created for classes --- lib/hotel.rb | 8 ++++++++ lib/reservation.rb | 1 + 2 files changed, 9 insertions(+) create mode 100644 lib/hotel.rb create mode 100644 lib/reservation.rb diff --git a/lib/hotel.rb b/lib/hotel.rb new file mode 100644 index 000000000..c9ff7a7b7 --- /dev/null +++ b/lib/hotel.rb @@ -0,0 +1,8 @@ +# coordinates management of hotel + + + + + + +# is room available method, look at given dates and see if room is available for those dates \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..061aa3efb --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1 @@ +# tracks reservations that are made \ No newline at end of file From 71e3bc8c020d96e0a42121bd87be4e02249b6e3e Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Tue, 3 Sep 2019 14:16:38 -0700 Subject: [PATCH 02/20] Added test files for each class to teset folder --- test/hotel_test.rb | 0 test/reservation_test.rb | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/hotel_test.rb create mode 100644 test/reservation_test.rb diff --git a/test/hotel_test.rb b/test/hotel_test.rb new file mode 100644 index 000000000..e69de29bb diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..e69de29bb From 1e1d64d02f78d870245569b5917aef6f2c5ea5fb Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Tue, 3 Sep 2019 16:08:09 -0700 Subject: [PATCH 03/20] Test helper file updated to include simplecov and tests added for initialization --- .gitignore | 2 ++ lib/hotel.rb | 24 ++++++++++++++++++------ lib/reservation.rb | 36 +++++++++++++++++++++++++++++++++++- test/hotel_test.rb | 22 ++++++++++++++++++++++ test/reservation_test.rb | 24 ++++++++++++++++++++++++ test/test_helper.rb | 17 ++++++++++++----- 6 files changed, 113 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 5e1422c9c..1ded4cf46 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +coverage + *.gem *.rbc /.config diff --git a/lib/hotel.rb b/lib/hotel.rb index c9ff7a7b7..a7ab9017c 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -1,8 +1,20 @@ # coordinates management of hotel - - - - - -# is room available method, look at given dates and see if room is available for those dates \ No newline at end of file +class Hotel + attr_reader :rooms, :reservations + + def initialize(reservations: nil) + @rooms = [*1..20] + @reservations = reservations || [] + end + + def res_by_date(date) + @resevations.find { |reservtion| start_date == date} # or end_date == date + end + + def cost_of_res(res_id) + + # is room available method, look at given dates and see if room is available for those dates + end + +end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb index 061aa3efb..495bf78cd 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1 +1,35 @@ -# tracks reservations that are made \ No newline at end of file +require 'date' +# tracks reservations that are made +class Reservation + attr_reader :room, :user_id, :start_date, :end_date + + ROOM_COST = 200 + @@all = [] + + def initialize(room:, user_id:, start_date:, end_date:) + @room = room + @user_id = user_id + @start_date = Date.parse(start_date) + @end_date = Date.parse(end_date) + @reservation_id = [1,2,3,4,5].sample # add random id or sequential + if start_date == nil || end_date == nil || end_date <= start_date + raise ArgumentError.new("Please enter a valid date range") + end + + @@all << self + end + + def self.all + @@all + end + + + + + # tracking for blocks, reservation needs to reference block id + + + + + +end \ No newline at end of file diff --git a/test/hotel_test.rb b/test/hotel_test.rb index e69de29bb..fa2587fbc 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -0,0 +1,22 @@ +require_relative 'test_helper' + +describe "Hotel class" do + + describe "Hotel instantiation" do + before do + @hotel = Hotel.new() + end + + it "is an instance of Hotel" do + expect(@hotel).must_be_kind_of Hotel + end + + it "is set up for specific attributes and data types" do + [:rooms, :reservations].each do |prop| + expect(@hotel).must_respond_to prop + end + expect(@hotel.rooms).must_be_kind_of Array + expect(@hotel.reservations).must_be_kind_of Array + end + end +end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index e69de29bb..c3a883237 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -0,0 +1,24 @@ +require_relative 'test_helper' + +describe "Reservation class" do + + describe "Reservation instantiation" do + before do + @reservation = Reservation.new(room: 5, user_id: 34, start_date:"5/05/2019", end_date:"5/09/2019") + end + + it "is an instance of Reservation" do + expect(@reservation).must_be_kind_of Reservation + end + + it "is set up for specific attributes and data types" do + [:room, :user_id, :start_date, :end_date].each do |prop| + expect(@reservation).must_respond_to prop + end + expect(@reservation.room).must_be_kind_of Integer + expect(@reservation.user_id).must_be_kind_of Integer + expect(@reservation.start_date).must_be_kind_of Date + expect(@reservation.end_date).must_be_kind_of Date + end + end +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..ab61f9332 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,8 +1,15 @@ -# Add simplecov -require "minitest" -require "minitest/autorun" -require "minitest/reporters" +require 'simplecov' +SimpleCov.start do + add_filter 'test/' # Tests should not be counted toward coverage. +end + +require 'minitest' +require 'minitest/autorun' +require 'minitest/reporters' +require 'simplecov' +require 'date' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -# require_relative your lib files here! +require_relative '../lib/hotel.rb' +require_relative '../lib/reservation.rb' From 76d75ed1a58c835de4ce21a6902ee7ceb88587fe Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 4 Sep 2019 14:59:53 -0700 Subject: [PATCH 04/20] Wave 1 complete --- lib/hotel.rb | 6 ++---- lib/reservation.rb | 15 +++++++++------ test/hotel_test.rb | 4 ++++ test/reservation_test.rb | 20 ++++++++++++++++++++ test/test_helper.rb | 2 ++ 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index a7ab9017c..5cb754798 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -12,9 +12,7 @@ def res_by_date(date) @resevations.find { |reservtion| start_date == date} # or end_date == date end - def cost_of_res(res_id) - - # is room available method, look at given dates and see if room is available for those dates - end + + # is room available method, look at given dates and see if room is available for those dates end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb index 495bf78cd..6c300d044 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,17 +1,20 @@ require 'date' # tracks reservations that are made class Reservation - attr_reader :room, :user_id, :start_date, :end_date - + attr_reader :room, :user_id, :start_date, :end_date, :block, :reservation_id, :cost ROOM_COST = 200 + @@rooms = [*1..20] @@all = [] - def initialize(room:, user_id:, start_date:, end_date:) - @room = room + def initialize(user_id:, start_date:, end_date:, block:false) + @room = @@rooms.sample @user_id = user_id - @start_date = Date.parse(start_date) - @end_date = Date.parse(end_date) + @start_date = Date.strptime(start_date, "%m/%d/%Y") + @end_date = Date.strptime(end_date, "%m/%d/%Y") + @block = block @reservation_id = [1,2,3,4,5].sample # add random id or sequential + @cost = ROOM_COST * (@end_date - @start_date).to_i# unless it's a block + if start_date == nil || end_date == nil || end_date <= start_date raise ArgumentError.new("Please enter a valid date range") end diff --git a/test/hotel_test.rb b/test/hotel_test.rb index fa2587fbc..fa9a8791d 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -18,5 +18,9 @@ expect(@hotel.rooms).must_be_kind_of Array expect(@hotel.reservations).must_be_kind_of Array end + + it "has the correct number of rooms" do + expect(@hotel.rooms).must_be_kind_of Array + end end end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index c3a883237..ad25d2bce 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -20,5 +20,25 @@ expect(@reservation.start_date).must_be_kind_of Date expect(@reservation.end_date).must_be_kind_of Date end + + it "calculates resevation cost correctly for non-block booking" do + expect(@reservation.cost).must_equal 800 + end + end + + describe "Validates reservations dates" do + it "does not allow end date before start date" do + expect { Reservation.new(room: 5, user_id: 34, start_date:"5/09/2019", end_date:"5/08/2019") }.must_raise ArgumentError + end + + it "does not allow end date and start date to be the same" do + expect { Reservation.new(room: 5, user_id: 34, start_date:"5/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError + end + + it"does not allow invalid dates" do + expect { Reservation.new(room: 5, user_id: 34, start_date:"14/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError + end + end + end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index ab61f9332..bd3e12abf 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -6,9 +6,11 @@ require 'minitest' require 'minitest/autorun' require 'minitest/reporters' +require 'minitest/skip_dsl' require 'simplecov' require 'date' + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new require_relative '../lib/hotel.rb' From 808c96248dafad682ba5828cd60de533f434e0cc Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Fri, 6 Sep 2019 11:57:19 -0700 Subject: [PATCH 05/20] Initial date check method set up --- lib/hotel.rb | 3 +-- lib/reservation.rb | 49 ++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 5cb754798..d449ba74d 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -1,10 +1,9 @@ # coordinates management of hotel class Hotel - attr_reader :rooms, :reservations + attr_reader :reservations def initialize(reservations: nil) - @rooms = [*1..20] @reservations = reservations || [] end diff --git a/lib/reservation.rb b/lib/reservation.rb index 6c300d044..8661ac7aa 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -26,13 +26,54 @@ def self.all @@all end + def self.list_occupied_rooms + occupied_rooms = @@all.map do |reservation| + reservation.room + end + end + def self.list_available_rooms + occupied_rooms = self.list_occupied_rooms + rooms = @@rooms + occupied_rooms.each do |room| + rooms.delete(room) + end + return rooms + end + def self.list_occupied_rooms_with_date(start_date, end_date) + start_date = Date.strptime(start_date, "%m/%d/%Y") + end_date = Date.strptime(end_date, "%m/%d/%Y") + reservations = @@all.map + occupied_rooms = [] + # is equal to or greater than??? + until start_date == end_date do + reservations.each do |reservation| + # 5/5/19 - 5/8/19 conflicts with 5/7/19 to 5/9/2019 X + # 5/5/19 - 5/8/19 conflicts with 5/3/19 to 5/7/2019 X + # 5/5/19 - 5/8/19 conflicts with 5/3/19 to 5/10/19 O + # 5/5/19 - 5/8/19 conflicts with 5/5/19 to 5/8/19 X + if (start_date >= reservation.start_date && start_date < reservation.end_date) || (end_date > reservation.start_date && end_date <= reservation.end_date) + occupied_rooms.push(reservation.room) + end + start_date += 1 + end + end + rooms = @@rooms + occupied_rooms.each do |room| + rooms.delete(room) + end + return rooms + end + def self.list_available_rooms_with_date(start_date, end_date) + occupied_rooms = self.list_occupied_rooms + rooms = @@rooms + occupied_rooms.each do |room| + rooms.delete(room) + end + return rooms + end # tracking for blocks, reservation needs to reference block id - - - - end \ No newline at end of file From 4361289fe5cd46025329efcab1bc949906e326eb Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Sun, 8 Sep 2019 17:58:57 -0700 Subject: [PATCH 06/20] Date check method completetd in reservation class, restructuring project and moving to hotel class --- lib/hotel.rb | 62 ++++++++++++++++++++++++++++++++++---- lib/reservation.rb | 65 +++++----------------------------------- test/hotel_test.rb | 22 +++++++++++++- test/reservation_test.rb | 12 ++++---- 4 files changed, 90 insertions(+), 71 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index d449ba74d..4635d3f65 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -1,17 +1,67 @@ -# coordinates management of hotel +require_relative 'reservation' class Hotel - attr_reader :reservations + attr_reader :reservations, :rooms def initialize(reservations: nil) @reservations = reservations || [] + @rooms = [*1..20] end - def res_by_date(date) - @resevations.find { |reservtion| start_date == date} # or end_date == date + # def self.make_reservation(start_date:, end_date:, block:false) + def make_reservation(start_date:, end_date:, block:false) + reservation = Reservation.new(start_date:start_date, end_date:end_date, block:block) + reservations.push(reservation) + return reservation end + def list_rooms(start_date, end_date) + puts Hotel.list_available_rooms(start_date, end_date) + end - # is room available method, look at given dates and see if room is available for those dates + def self.list_available_rooms(start_date, end_date) + if start_date.class == String + start_date = Date.strptime(start_date, "%m/%d/%Y") + end + if end_date.class == String + end_date = Date.strptime(end_date, "%m/%d/%Y") + end + # if @reservations.length > 1 + # reservations = @reservations.map do |reservation| + # reservation + # end + # end + occupied_rooms = [] + # if @reservations.length > 0 + puts @reservations != nil + if @reservations != nil + @reservations.each do |reservation| + puts reservation + date = start_date.dup + until date == end_date do + puts if (start_date >= reservation.start_date && start_date < reservation.end_date) || (end_date > reservation.start_date && end_date <= reservation.end_date) + if (start_date >= reservation.start_date && start_date < reservation.end_date) || (end_date > reservation.start_date && end_date <= reservation.end_date) + occupied_rooms.push(reservation.room) + break + end + date += 1 + end + end + end + rooms = [*1..20] + puts "rooms: " + p rooms + puts "occupied: " + p occupied_rooms + occupied_rooms.each do |room| + rooms.delete(room) + end + puts "rooms: " + p rooms + if rooms == nil + raise ArgumentError.new("Sorry! We are currently all booked for those days, pleae try again.") + end + return rooms + end -end \ No newline at end of file +end diff --git a/lib/reservation.rb b/lib/reservation.rb index 8661ac7aa..ca060498e 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,79 +1,28 @@ require 'date' -# tracks reservations that are made +require_relative 'hotel' + class Reservation attr_reader :room, :user_id, :start_date, :end_date, :block, :reservation_id, :cost ROOM_COST = 200 - @@rooms = [*1..20] - @@all = [] + # @@rooms = [*1..20] - def initialize(user_id:, start_date:, end_date:, block:false) - @room = @@rooms.sample - @user_id = user_id + def initialize(start_date:, end_date:, block:false) @start_date = Date.strptime(start_date, "%m/%d/%Y") - @end_date = Date.strptime(end_date, "%m/%d/%Y") + @end_date = Date.strptime(end_date, "%m/%d/%Y") + @room = Hotel.list_available_rooms(@start_date, @end_date).sample @block = block @reservation_id = [1,2,3,4,5].sample # add random id or sequential - @cost = ROOM_COST * (@end_date - @start_date).to_i# unless it's a block + @cost = ROOM_COST * (@end_date - @start_date).to_i # unless it's a block, then discount if start_date == nil || end_date == nil || end_date <= start_date raise ArgumentError.new("Please enter a valid date range") end - @@all << self end def self.all @@all end - def self.list_occupied_rooms - occupied_rooms = @@all.map do |reservation| - reservation.room - end - end - - def self.list_available_rooms - occupied_rooms = self.list_occupied_rooms - rooms = @@rooms - occupied_rooms.each do |room| - rooms.delete(room) - end - return rooms - end - - def self.list_occupied_rooms_with_date(start_date, end_date) - start_date = Date.strptime(start_date, "%m/%d/%Y") - end_date = Date.strptime(end_date, "%m/%d/%Y") - reservations = @@all.map - occupied_rooms = [] - # is equal to or greater than??? - until start_date == end_date do - reservations.each do |reservation| - # 5/5/19 - 5/8/19 conflicts with 5/7/19 to 5/9/2019 X - # 5/5/19 - 5/8/19 conflicts with 5/3/19 to 5/7/2019 X - # 5/5/19 - 5/8/19 conflicts with 5/3/19 to 5/10/19 O - # 5/5/19 - 5/8/19 conflicts with 5/5/19 to 5/8/19 X - if (start_date >= reservation.start_date && start_date < reservation.end_date) || (end_date > reservation.start_date && end_date <= reservation.end_date) - occupied_rooms.push(reservation.room) - end - start_date += 1 - end - end - rooms = @@rooms - occupied_rooms.each do |room| - rooms.delete(room) - end - return rooms - end - - def self.list_available_rooms_with_date(start_date, end_date) - occupied_rooms = self.list_occupied_rooms - rooms = @@rooms - occupied_rooms.each do |room| - rooms.delete(room) - end - return rooms - end - # tracking for blocks, reservation needs to reference block id end \ No newline at end of file diff --git a/test/hotel_test.rb b/test/hotel_test.rb index fa9a8791d..f20e3f9f2 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -19,8 +19,28 @@ expect(@hotel.reservations).must_be_kind_of Array end + # Rooms belongs in hotel it "has the correct number of rooms" do expect(@hotel.rooms).must_be_kind_of Array end end -end \ No newline at end of file + + describe "Assigns rooms correctly" do + it "removes booked room from eligible room list" do + @reservation = Hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + room = @reservation.room + available_rooms = Hotel.list_available_rooms("5/05/2019", "5/09/2019") + + expect(available_rooms.include?(room)).must_equal false + end + + it "raises argument error when there are no rooms available" do + + expect { 21.times do + Hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + end }.must_raise ArgumentError + end + + end +end + diff --git a/test/reservation_test.rb b/test/reservation_test.rb index ad25d2bce..c1e1ce911 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -4,7 +4,7 @@ describe "Reservation instantiation" do before do - @reservation = Reservation.new(room: 5, user_id: 34, start_date:"5/05/2019", end_date:"5/09/2019") + @reservation = Reservation.new(start_date:"5/05/2019", end_date:"5/09/2019") end it "is an instance of Reservation" do @@ -12,7 +12,7 @@ end it "is set up for specific attributes and data types" do - [:room, :user_id, :start_date, :end_date].each do |prop| + [:user_id, :start_date, :end_date].each do |prop| expect(@reservation).must_respond_to prop end expect(@reservation.room).must_be_kind_of Integer @@ -21,7 +21,7 @@ expect(@reservation.end_date).must_be_kind_of Date end - it "calculates resevation cost correctly for non-block booking" do + it "calculates reservation cost correctly for non-block booking" do expect(@reservation.cost).must_equal 800 end @@ -29,15 +29,15 @@ describe "Validates reservations dates" do it "does not allow end date before start date" do - expect { Reservation.new(room: 5, user_id: 34, start_date:"5/09/2019", end_date:"5/08/2019") }.must_raise ArgumentError + expect { Reservation.new(start_date:"5/09/2019", end_date:"5/08/2019") }.must_raise ArgumentError end it "does not allow end date and start date to be the same" do - expect { Reservation.new(room: 5, user_id: 34, start_date:"5/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError + expect { Reservation.new(start_date:"5/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError end it"does not allow invalid dates" do - expect { Reservation.new(room: 5, user_id: 34, start_date:"14/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError + expect { Reservation.new(start_date:"14/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError end end From 17bff67cf3946f341d430dba945b803b78a1041b Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Sun, 8 Sep 2019 18:29:30 -0700 Subject: [PATCH 07/20] finished converting date check method to hotel, removed all class variables --- lib/hotel.rb | 30 ++++++++++-------------------- lib/reservation.rb | 6 +++--- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 4635d3f65..4a70234f6 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -8,9 +8,9 @@ def initialize(reservations: nil) @rooms = [*1..20] end - # def self.make_reservation(start_date:, end_date:, block:false) def make_reservation(start_date:, end_date:, block:false) - reservation = Reservation.new(start_date:start_date, end_date:end_date, block:block) + room = list_available_rooms(start_date, end_date).sample + reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, block:block) reservations.push(reservation) return reservation end @@ -19,27 +19,23 @@ def list_rooms(start_date, end_date) puts Hotel.list_available_rooms(start_date, end_date) end - def self.list_available_rooms(start_date, end_date) + def get_reservations + return @reservations + end + + def list_available_rooms(start_date, end_date) if start_date.class == String start_date = Date.strptime(start_date, "%m/%d/%Y") end if end_date.class == String end_date = Date.strptime(end_date, "%m/%d/%Y") end - # if @reservations.length > 1 - # reservations = @reservations.map do |reservation| - # reservation - # end - # end occupied_rooms = [] - # if @reservations.length > 0 - puts @reservations != nil - if @reservations != nil - @reservations.each do |reservation| - puts reservation + reservations = get_reservations + if reservations != nil + reservations.each do |reservation| date = start_date.dup until date == end_date do - puts if (start_date >= reservation.start_date && start_date < reservation.end_date) || (end_date > reservation.start_date && end_date <= reservation.end_date) if (start_date >= reservation.start_date && start_date < reservation.end_date) || (end_date > reservation.start_date && end_date <= reservation.end_date) occupied_rooms.push(reservation.room) break @@ -49,15 +45,9 @@ def self.list_available_rooms(start_date, end_date) end end rooms = [*1..20] - puts "rooms: " - p rooms - puts "occupied: " - p occupied_rooms occupied_rooms.each do |room| rooms.delete(room) end - puts "rooms: " - p rooms if rooms == nil raise ArgumentError.new("Sorry! We are currently all booked for those days, pleae try again.") end diff --git a/lib/reservation.rb b/lib/reservation.rb index ca060498e..0e3b08ba9 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,14 +2,14 @@ require_relative 'hotel' class Reservation - attr_reader :room, :user_id, :start_date, :end_date, :block, :reservation_id, :cost + attr_reader :room, :start_date, :end_date, :block, :reservation_id, :cost ROOM_COST = 200 # @@rooms = [*1..20] - def initialize(start_date:, end_date:, block:false) + def initialize(start_date:, end_date:, room:, block:false) @start_date = Date.strptime(start_date, "%m/%d/%Y") @end_date = Date.strptime(end_date, "%m/%d/%Y") - @room = Hotel.list_available_rooms(@start_date, @end_date).sample + @room = room @block = block @reservation_id = [1,2,3,4,5].sample # add random id or sequential @cost = ROOM_COST * (@end_date - @start_date).to_i # unless it's a block, then discount From 13fe08a56941540cd0391c71f2bc1c5f277870c8 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Sun, 8 Sep 2019 20:39:31 -0700 Subject: [PATCH 08/20] Wave 2 Reserveation complete, added tests --- lib/reservation.rb | 7 ------- test/reservation_test.rb | 9 ++++----- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 0e3b08ba9..3a4efda36 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,7 +4,6 @@ class Reservation attr_reader :room, :start_date, :end_date, :block, :reservation_id, :cost ROOM_COST = 200 - # @@rooms = [*1..20] def initialize(start_date:, end_date:, room:, block:false) @start_date = Date.strptime(start_date, "%m/%d/%Y") @@ -17,12 +16,6 @@ def initialize(start_date:, end_date:, room:, block:false) if start_date == nil || end_date == nil || end_date <= start_date raise ArgumentError.new("Please enter a valid date range") end - - end - - def self.all - @@all end - end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index c1e1ce911..ce3fe0592 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -4,19 +4,19 @@ describe "Reservation instantiation" do before do - @reservation = Reservation.new(start_date:"5/05/2019", end_date:"5/09/2019") + @reservation = Reservation.new(start_date:"5/05/2019", end_date:"5/09/2019", room:5) end it "is an instance of Reservation" do expect(@reservation).must_be_kind_of Reservation end - it "is set up for specific attributes and data types" do - [:user_id, :start_date, :end_date].each do |prop| + it "has correct attributes" do + [:start_date, :end_date].each do |prop| expect(@reservation).must_respond_to prop end expect(@reservation.room).must_be_kind_of Integer - expect(@reservation.user_id).must_be_kind_of Integer + expect(@reservation.reservation_id).must_be_kind_of Integer expect(@reservation.start_date).must_be_kind_of Date expect(@reservation.end_date).must_be_kind_of Date end @@ -40,5 +40,4 @@ expect { Reservation.new(start_date:"14/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError end end - end \ No newline at end of file From fbc21542d5546241df26d541d9a833d96e831764 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Mon, 9 Sep 2019 00:36:37 -0700 Subject: [PATCH 09/20] added missed requirement, find reservations by date - method and tests added --- lib/hotel.rb | 36 +++++++++++++++++++++--------- lib/reservation.rb | 3 ++- test/hotel_test.rb | 48 +++++++++++++++++++++++++++++++--------- test/reservation_test.rb | 8 +++++-- 4 files changed, 70 insertions(+), 25 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 4a70234f6..5fe906ade 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -15,12 +15,27 @@ def make_reservation(start_date:, end_date:, block:false) return reservation end - def list_rooms(start_date, end_date) - puts Hotel.list_available_rooms(start_date, end_date) - end - - def get_reservations - return @reservations + def find_reservations_by_date(start_date, end_date) + if start_date.class == String + start_date = Date.strptime(start_date, "%m/%d/%Y") + end + if end_date.class == String + end_date = Date.strptime(end_date, "%m/%d/%Y") + end + found_reservations = [] + if @reservations != nil + @reservations.each do |reservation| + date = start_date.dup + until date == end_date do + if (start_date >= reservation.start_date && start_date < reservation.end_date) || (end_date > reservation.start_date && end_date <= reservation.end_date) + found_reservations.push(reservation) + break + end + date += 1 + end + end + end + return found_reservations end def list_available_rooms(start_date, end_date) @@ -31,9 +46,8 @@ def list_available_rooms(start_date, end_date) end_date = Date.strptime(end_date, "%m/%d/%Y") end occupied_rooms = [] - reservations = get_reservations - if reservations != nil - reservations.each do |reservation| + if @reservations != nil + @reservations.each do |reservation| date = start_date.dup until date == end_date do if (start_date >= reservation.start_date && start_date < reservation.end_date) || (end_date > reservation.start_date && end_date <= reservation.end_date) @@ -44,11 +58,11 @@ def list_available_rooms(start_date, end_date) end end end - rooms = [*1..20] + rooms = @rooms.dup occupied_rooms.each do |room| rooms.delete(room) end - if rooms == nil + if rooms.length == 0 raise ArgumentError.new("Sorry! We are currently all booked for those days, pleae try again.") end return rooms diff --git a/lib/reservation.rb b/lib/reservation.rb index 3a4efda36..2e1c2dc46 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,6 +4,7 @@ class Reservation attr_reader :room, :start_date, :end_date, :block, :reservation_id, :cost ROOM_COST = 200 + DISCOUNT = 0.20 def initialize(start_date:, end_date:, room:, block:false) @start_date = Date.strptime(start_date, "%m/%d/%Y") @@ -11,7 +12,7 @@ def initialize(start_date:, end_date:, room:, block:false) @room = room @block = block @reservation_id = [1,2,3,4,5].sample # add random id or sequential - @cost = ROOM_COST * (@end_date - @start_date).to_i # unless it's a block, then discount + @cost = @block == false ? ROOM_COST * (@end_date - @start_date).to_i : ROOM_COST * DISCOUNT * (@end_date - @start_date).to_i if start_date == nil || end_date == nil || end_date <= start_date raise ArgumentError.new("Please enter a valid date range") diff --git a/test/hotel_test.rb b/test/hotel_test.rb index f20e3f9f2..0b1023dc5 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -11,36 +11,62 @@ expect(@hotel).must_be_kind_of Hotel end - it "is set up for specific attributes and data types" do + it "has correct attributes" do [:rooms, :reservations].each do |prop| expect(@hotel).must_respond_to prop end expect(@hotel.rooms).must_be_kind_of Array + expect(@hotel.rooms.length).must_equal 20 expect(@hotel.reservations).must_be_kind_of Array end - - # Rooms belongs in hotel - it "has the correct number of rooms" do - expect(@hotel.rooms).must_be_kind_of Array - end end - describe "Assigns rooms correctly" do + describe "Makes reservations correctly and finds appropriate rooms" do it "removes booked room from eligible room list" do - @reservation = Hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel = Hotel.new + @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") room = @reservation.room - available_rooms = Hotel.list_available_rooms("5/05/2019", "5/09/2019") + available_rooms = hotel.list_available_rooms("5/05/2019", "5/09/2019") expect(available_rooms.include?(room)).must_equal false end it "raises argument error when there are no rooms available" do - + hotel = Hotel.new expect { 21.times do - Hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") end }.must_raise ArgumentError end + it "instantiates Reservation" do + hotel = Hotel.new + @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + + expect(@reservation).must_be_kind_of Reservation + end + end + + describe "Find reservation by date" do + it "lists all reservation for a date range" do + hotel = Hotel.new + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + found_reservations = hotel.find_reservations_by_date("5/05/2019","5/09/2019") + + expect(found_reservations.length).must_equal 3 + end + + it "does not list reservations outside of date range" do + hotel = Hotel.new + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/09/2019", end_date:"5/10/2019") + found_reservations = hotel.find_reservations_by_date("5/05/2019","5/09/2019") + + expect(found_reservations.length).must_equal 3 + end end end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index ce3fe0592..ff32d7378 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -36,8 +36,12 @@ expect { Reservation.new(start_date:"5/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError end - it"does not allow invalid dates" do + it "does not allow invalid dates" do expect { Reservation.new(start_date:"14/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError end + + it "confirms reservation is at least one day" do + expect { Reservation.new(start_date:"5/08/2019", end_date:"5/08/2019") }.must_raise ArgumentError + end end -end \ No newline at end of file +end \ No newline at end of file From 43bd6111e4bba1bc1a6a1647d54ed89b64d21bbb Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Mon, 9 Sep 2019 00:47:23 -0700 Subject: [PATCH 10/20] Updated reservation_id tracking to incremental number --- lib/hotel.rb | 3 ++- lib/reservation.rb | 4 ++-- test/hotel_test.rb | 20 ++++++++++---------- test/reservation_test.rb | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 5fe906ade..126faed7e 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -9,8 +9,9 @@ def initialize(reservations: nil) end def make_reservation(start_date:, end_date:, block:false) + id = @reservations.length + 1 room = list_available_rooms(start_date, end_date).sample - reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, block:block) + reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, block:block, reservation_id:id) reservations.push(reservation) return reservation end diff --git a/lib/reservation.rb b/lib/reservation.rb index 2e1c2dc46..a8bea2e37 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -6,12 +6,12 @@ class Reservation ROOM_COST = 200 DISCOUNT = 0.20 - def initialize(start_date:, end_date:, room:, block:false) + def initialize(start_date:, end_date:, room:, block:false, reservation_id:) @start_date = Date.strptime(start_date, "%m/%d/%Y") @end_date = Date.strptime(end_date, "%m/%d/%Y") @room = room @block = block - @reservation_id = [1,2,3,4,5].sample # add random id or sequential + @reservation_id = reservation_id @cost = @block == false ? ROOM_COST * (@end_date - @start_date).to_i : ROOM_COST * DISCOUNT * (@end_date - @start_date).to_i if start_date == nil || end_date == nil || end_date <= start_date diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 0b1023dc5..6d4491e6f 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -24,7 +24,7 @@ describe "Makes reservations correctly and finds appropriate rooms" do it "removes booked room from eligible room list" do hotel = Hotel.new - @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) room = @reservation.room available_rooms = hotel.list_available_rooms("5/05/2019", "5/09/2019") @@ -34,13 +34,13 @@ it "raises argument error when there are no rooms available" do hotel = Hotel.new expect { 21.times do - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) end }.must_raise ArgumentError end it "instantiates Reservation" do hotel = Hotel.new - @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) expect(@reservation).must_be_kind_of Reservation end @@ -49,9 +49,9 @@ describe "Find reservation by date" do it "lists all reservation for a date range" do hotel = Hotel.new - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:2) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:3) found_reservations = hotel.find_reservations_by_date("5/05/2019","5/09/2019") expect(found_reservations.length).must_equal 3 @@ -59,10 +59,10 @@ it "does not list reservations outside of date range" do hotel = Hotel.new - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") - hotel.make_reservation(start_date:"5/09/2019", end_date:"5/10/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:2) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:3) + hotel.make_reservation(start_date:"5/09/2019", end_date:"5/10/2019", reservation_id:4) found_reservations = hotel.find_reservations_by_date("5/05/2019","5/09/2019") expect(found_reservations.length).must_equal 3 diff --git a/test/reservation_test.rb b/test/reservation_test.rb index ff32d7378..18854ddcc 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -4,7 +4,7 @@ describe "Reservation instantiation" do before do - @reservation = Reservation.new(start_date:"5/05/2019", end_date:"5/09/2019", room:5) + @reservation = Reservation.new(start_date:"5/05/2019", end_date:"5/09/2019", room:5, reservation_id:1) end it "is an instance of Reservation" do From 682a058bb57d1bc9792b35f21a9e93627f0cc271 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Mon, 9 Sep 2019 01:21:17 -0700 Subject: [PATCH 11/20] Hotel block class file added --- lib/block.rb | 20 ++++++++++++++++++++ lib/hotel.rb | 3 ++- lib/reservation.rb | 1 - test/test_helper.rb | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 lib/block.rb diff --git a/lib/block.rb b/lib/block.rb new file mode 100644 index 000000000..d6725b1af --- /dev/null +++ b/lib/block.rb @@ -0,0 +1,20 @@ +require 'date' + +class Block + attr_reader :rooms, :start_date, :end_date, :reservation_id + + def initialize(start_date:, end_date:, rooms:, reservation_id:) + @start_date = Date.strptime(start_date, "%m/%d/%Y") + @end_date = Date.strptime(end_date, "%m/%d/%Y") + @rooms = rooms + @reservation_id = reservation_id + + if start_date == nil || end_date == nil || end_date <= start_date + raise ArgumentError.new("Please enter a valid date range") + end + if rooms.length > 5 + raise ArgumentError.new("Maximum of 5 rooms allowed") + end + end + +end \ No newline at end of file diff --git a/lib/hotel.rb b/lib/hotel.rb index 126faed7e..ff949c14e 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -1,4 +1,5 @@ require_relative 'reservation' +require_relative 'block' class Hotel attr_reader :reservations, :rooms @@ -8,7 +9,7 @@ def initialize(reservations: nil) @rooms = [*1..20] end - def make_reservation(start_date:, end_date:, block:false) + def make_reservation(start_date:, end_date:, block:false, reservation_id:) id = @reservations.length + 1 room = list_available_rooms(start_date, end_date).sample reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, block:block, reservation_id:id) diff --git a/lib/reservation.rb b/lib/reservation.rb index a8bea2e37..fa06c613a 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,5 +1,4 @@ require 'date' -require_relative 'hotel' class Reservation attr_reader :room, :start_date, :end_date, :block, :reservation_id, :cost diff --git a/test/test_helper.rb b/test/test_helper.rb index bd3e12abf..3c304d687 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -15,3 +15,4 @@ require_relative '../lib/hotel.rb' require_relative '../lib/reservation.rb' +# require_relative '../lib/block.rb' From b18b07996dce54c2f3a15494c14e9d7afd90bcce Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Tue, 10 Sep 2019 11:40:31 -0700 Subject: [PATCH 12/20] Block booking added to hotel class and intiaties new instance of block --- lib/block.rb | 16 ++++------------ lib/hotel.rb | 46 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index d6725b1af..09c405492 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,20 +1,12 @@ require 'date' class Block - attr_reader :rooms, :start_date, :end_date, :reservation_id + attr_reader :reservations, :block_id - def initialize(start_date:, end_date:, rooms:, reservation_id:) - @start_date = Date.strptime(start_date, "%m/%d/%Y") - @end_date = Date.strptime(end_date, "%m/%d/%Y") - @rooms = rooms - @reservation_id = reservation_id + def initialize(reservations, block_id) + @reservations = reservations + @block_id = block_id - if start_date == nil || end_date == nil || end_date <= start_date - raise ArgumentError.new("Please enter a valid date range") - end - if rooms.length > 5 - raise ArgumentError.new("Maximum of 5 rooms allowed") - end end end \ No newline at end of file diff --git a/lib/hotel.rb b/lib/hotel.rb index ff949c14e..174fe8bd8 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -2,21 +2,51 @@ require_relative 'block' class Hotel - attr_reader :reservations, :rooms + attr_reader :reservations, :rooms, :blocks - def initialize(reservations: nil) + def initialize(reservations: nil, blocks:nil) @reservations = reservations || [] + @blocks = blocks || [] @rooms = [*1..20] end - def make_reservation(start_date:, end_date:, block:false, reservation_id:) - id = @reservations.length + 1 - room = list_available_rooms(start_date, end_date).sample - reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, block:block, reservation_id:id) - reservations.push(reservation) - return reservation + def book_block + end + def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil, block_reservation:nil) + # need if booking from block + if hold_block != false && hold_block.to_s.match(/[1-5]/) == nil # || ( || ) + raise ArgumentError.new("If you want hold a block of rooms, enter the number of rooms to hold.") + elsif hold_block == false + id = @reservations.length + 1 + room = list_available_rooms(start_date, end_date).sample + reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, reservation_id:id) + reservations.push(reservation) + return reservation + elsif hold_block.to_s.match(/[1-5]/) != nil + reservation_block = {} + available_count = list_available_rooms(start_date, end_date).length + if available_count < hold_block + raise ArgumentError.new("Not enough rooms available for this block") + end + hold_block.times do + id = @reservations.length + 1 + room = list_available_rooms(start_date, end_date).sample + reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, reservation_id:id) + # either push all or none if all rooms available + reservations.push(reservation) + reservation_block[reservation] = "Not booked" + end + id = @blocks.length + 1 + block = new.Block(block:reservation_block, block_id:id) + return block + # elsif block_id != nil + # # resrerve a room for block + end + end + + def find_reservations_by_date(start_date, end_date) if start_date.class == String start_date = Date.strptime(start_date, "%m/%d/%Y") From 5fd6105df828b74f2918069053da973a484edec2 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 00:57:37 -0700 Subject: [PATCH 13/20] finished implementing block method, confirming all tests pass --- lib/block.rb | 2 +- lib/hotel.rb | 25 +++++++++++++++-------- test/hotel_test.rb | 50 ++++++++++++++++++++++++++++++++++++---------- 3 files changed, 57 insertions(+), 20 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index 09c405492..3bce3668c 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -3,7 +3,7 @@ class Block attr_reader :reservations, :block_id - def initialize(reservations, block_id) + def initialize(reservations:, block_id:) @reservations = reservations @block_id = block_id diff --git a/lib/hotel.rb b/lib/hotel.rb index 174fe8bd8..857bc86d8 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -14,17 +14,19 @@ def book_block end - def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil, block_reservation:nil) - # need if booking from block + def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil) if hold_block != false && hold_block.to_s.match(/[1-5]/) == nil # || ( || ) - raise ArgumentError.new("If you want hold a block of rooms, enter the number of rooms to hold.") - elsif hold_block == false + raise ArgumentError.new("If you want hold a block of rooms, enter the number of rooms (maximum of 5) to hold.") + elsif hold_block == false && block_id == nil id = @reservations.length + 1 room = list_available_rooms(start_date, end_date).sample reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, reservation_id:id) reservations.push(reservation) return reservation elsif hold_block.to_s.match(/[1-5]/) != nil + if block_id != nil + raise ArgumentError.new("Please make hotel block before booking a room ") + end reservation_block = {} available_count = list_available_rooms(start_date, end_date).length if available_count < hold_block @@ -39,14 +41,21 @@ def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil, blo reservation_block[reservation] = "Not booked" end id = @blocks.length + 1 - block = new.Block(block:reservation_block, block_id:id) + block = Block.new(reservations:reservation_block, block_id:id) + blocks.push(block) return block - # elsif block_id != nil - # # resrerve a room for block + elsif block_id.to_s.match(/[1-5]/) != nil + block = blocks.find{|block| block.block_id == block_id } + reservations = block.reservations + reservation = reservations.find{|reservation, status| status == "Not booked"} + if reservation == nil + raise ArgumentError.new("This block has been fully booked") + end + puts reservation.class# reservation.key = "Booked" + reservations[reservation[0]] = "Booked" end end - def find_reservations_by_date(start_date, end_date) if start_date.class == String start_date = Date.strptime(start_date, "%m/%d/%Y") diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 6d4491e6f..cba515fd8 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -21,10 +21,10 @@ end end - describe "Makes reservations correctly and finds appropriate rooms" do + describe "Makes solo reservations correctly and finds appropriate rooms" do it "removes booked room from eligible room list" do hotel = Hotel.new - @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) + @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") room = @reservation.room available_rooms = hotel.list_available_rooms("5/05/2019", "5/09/2019") @@ -34,13 +34,13 @@ it "raises argument error when there are no rooms available" do hotel = Hotel.new expect { 21.times do - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") end }.must_raise ArgumentError end it "instantiates Reservation" do hotel = Hotel.new - @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) + @reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") expect(@reservation).must_be_kind_of Reservation end @@ -49,9 +49,9 @@ describe "Find reservation by date" do it "lists all reservation for a date range" do hotel = Hotel.new - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:2) - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:3) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") found_reservations = hotel.find_reservations_by_date("5/05/2019","5/09/2019") expect(found_reservations.length).must_equal 3 @@ -59,14 +59,42 @@ it "does not list reservations outside of date range" do hotel = Hotel.new - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:1) - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:2) - hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", reservation_id:3) - hotel.make_reservation(start_date:"5/09/2019", end_date:"5/10/2019", reservation_id:4) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019") + hotel.make_reservation(start_date:"5/09/2019", end_date:"5/10/2019") found_reservations = hotel.find_reservations_by_date("5/05/2019","5/09/2019") expect(found_reservations.length).must_equal 3 end end + + describe "Makes block reservations correctly" do + it "holds rooms for block" do + hotel = Hotel.new + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:3) + rooms_available = hotel.list_available_rooms("5/05/2019", "5/09/2019") + + expect(hotel.blocks[0].reservations.length).must_equal 3 + expect(hotel.reservations.length).must_equal 3 + expect(rooms_available.length).must_equal 17 + end + + it "raises argument error if block is for more than five rooms" do + hotel = Hotel.new + expect { hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:6) }.must_raise ArgumentError + end + + it "raises argument error if reservation and block are passed in together" do + hotel = Hotel.new + + expect { hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:3, block_id:2) }.must_raise ArgumentError + end + + it "removes blocked room for availability once booked" do + + + end + end end From c96075b4924d90992a35254add5589a473b7a026 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 09:52:16 -0700 Subject: [PATCH 14/20] All tests passing refactoring class structure --- lib/hotel.rb | 4 ++-- lib/reservation.rb | 2 +- test/hotel_test.rb | 21 ++++++++++++++++++--- test/reservation_test.rb | 2 +- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 857bc86d8..687903c1b 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -36,7 +36,6 @@ def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil) id = @reservations.length + 1 room = list_available_rooms(start_date, end_date).sample reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, reservation_id:id) - # either push all or none if all rooms available reservations.push(reservation) reservation_block[reservation] = "Not booked" end @@ -51,8 +50,9 @@ def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil) if reservation == nil raise ArgumentError.new("This block has been fully booked") end - puts reservation.class# reservation.key = "Booked" + puts reservation.class reservations[reservation[0]] = "Booked" + return reservations[reservation[0]] end end diff --git a/lib/reservation.rb b/lib/reservation.rb index fa06c613a..54d8a7e92 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -13,7 +13,7 @@ def initialize(start_date:, end_date:, room:, block:false, reservation_id:) @reservation_id = reservation_id @cost = @block == false ? ROOM_COST * (@end_date - @start_date).to_i : ROOM_COST * DISCOUNT * (@end_date - @start_date).to_i - if start_date == nil || end_date == nil || end_date <= start_date + if end_date <= start_date || start_date == nil || end_date == nil raise ArgumentError.new("Please enter a valid date range") end end diff --git a/test/hotel_test.rb b/test/hotel_test.rb index cba515fd8..0e93fcac9 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -91,10 +91,25 @@ expect { hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:3, block_id:2) }.must_raise ArgumentError end - it "removes blocked room for availability once booked" do + it "removes blocked room from availability once booked" do + hotel = Hotel.new + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:3) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:4) + reservation = hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) + + expect(reservation).must_equal "Booked" + end + + it "does not allow room from block to be blocked if all are gone" do + hotel = Hotel.new + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:3) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:4) + expect{ 4.times do hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) end }.must_raise ArgumentError + + end end end -end - + + \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 18854ddcc..c08a9b387 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -29,7 +29,7 @@ describe "Validates reservations dates" do it "does not allow end date before start date" do - expect { Reservation.new(start_date:"5/09/2019", end_date:"5/08/2019") }.must_raise ArgumentError + expect { Reservation.new(start_date:"5/14/2019", end_date:"5/08/2019") }.must_raise ArgumentError end it "does not allow end date and start date to be the same" do From c8f8183002bd567a87e3740643cf041685a0a4ff Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 10:14:21 -0700 Subject: [PATCH 15/20] Added block test file and required file in test helper, refactoring done: --- lib/block.rb | 1 - lib/hotel.rb | 8 ++++---- lib/reservation.rb | 2 +- test/block_test.rb | 24 ++++++++++++++++++++++++ test/hotel_test.rb | 7 +++++++ test/reservation_test.rb | 6 ++++++ test/test_helper.rb | 2 +- 7 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 test/block_test.rb diff --git a/lib/block.rb b/lib/block.rb index 3bce3668c..c5e035025 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -6,7 +6,6 @@ class Block def initialize(reservations:, block_id:) @reservations = reservations @block_id = block_id - end end \ No newline at end of file diff --git a/lib/hotel.rb b/lib/hotel.rb index 687903c1b..8787ec26b 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -10,9 +10,6 @@ def initialize(reservations: nil, blocks:nil) @rooms = [*1..20] end - def book_block - - end def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil) if hold_block != false && hold_block.to_s.match(/[1-5]/) == nil # || ( || ) @@ -35,7 +32,7 @@ def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil) hold_block.times do id = @reservations.length + 1 room = list_available_rooms(start_date, end_date).sample - reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, reservation_id:id) + reservation = Reservation.new(start_date:start_date, end_date:end_date, room:room, reservation_id:id, block:true) reservations.push(reservation) reservation_block[reservation] = "Not booked" end @@ -45,6 +42,9 @@ def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil) return block elsif block_id.to_s.match(/[1-5]/) != nil block = blocks.find{|block| block.block_id == block_id } + if block == nil + raise ArgumentError.new("This block does not exist yet, please reserve the block first") + end reservations = block.reservations reservation = reservations.find{|reservation, status| status == "Not booked"} if reservation == nil diff --git a/lib/reservation.rb b/lib/reservation.rb index 54d8a7e92..d4907c4e9 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -11,7 +11,7 @@ def initialize(start_date:, end_date:, room:, block:false, reservation_id:) @room = room @block = block @reservation_id = reservation_id - @cost = @block == false ? ROOM_COST * (@end_date - @start_date).to_i : ROOM_COST * DISCOUNT * (@end_date - @start_date).to_i + @cost = @block == false ? ROOM_COST * (@end_date - @start_date).to_i : ROOM_COST * (1-DISCOUNT) * (@end_date - @start_date).to_i if end_date <= start_date || start_date == nil || end_date == nil raise ArgumentError.new("Please enter a valid date range") diff --git a/test/block_test.rb b/test/block_test.rb new file mode 100644 index 000000000..1e0368de3 --- /dev/null +++ b/test/block_test.rb @@ -0,0 +1,24 @@ +require_relative 'test_helper' + +describe "Block class" do + + describe "Block instantiation" do + before do + @hotel = Hotel.new + @block = @hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:4) + end + + it "is an instance of Reservation" do + expect(@block).must_be_kind_of Block + end + + it "has correct attributes" do + [:reservations, :block_id].each do |prop| + expect(@block).must_respond_to prop + end + expect(@block.reservations).must_be_kind_of Hash + expect(@block.block_id).must_be_kind_of Integer + end + + end +end \ No newline at end of file diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 0e93fcac9..8a0c622f5 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -109,6 +109,13 @@ expect{ 4.times do hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) end }.must_raise ArgumentError end + + it "does not allow blocks rooms to be booked before they are reserved" do + hotel = Hotel.new + + expect{ hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) }.must_raise ArgumentError + + end end end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index c08a9b387..457dd4af5 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -4,7 +4,9 @@ describe "Reservation instantiation" do before do + @hotel = Hotel.new @reservation = Reservation.new(start_date:"5/05/2019", end_date:"5/09/2019", room:5, reservation_id:1) + @block = @hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:4) end it "is an instance of Reservation" do @@ -25,6 +27,10 @@ expect(@reservation.cost).must_equal 800 end + it "calculates reservation cost correctly for block booking" do + expect(@hotel.reservations[2].cost).must_equal 640 + end + end describe "Validates reservations dates" do diff --git a/test/test_helper.rb b/test/test_helper.rb index 3c304d687..655516040 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -15,4 +15,4 @@ require_relative '../lib/hotel.rb' require_relative '../lib/reservation.rb' -# require_relative '../lib/block.rb' +require_relative '../lib/block.rb' From dfa94af110ddae098524e5e6fcc6e636a439321b Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 10:22:52 -0700 Subject: [PATCH 16/20] Added refactors.txt file --- refactors.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 refactors.txt diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..379bbd16e --- /dev/null +++ b/refactors.txt @@ -0,0 +1,3 @@ +List of changes that I would like to make: + - I would like to break apart my make_reservation class in to separate methods that are called my an “overall” make_reservation class. Currently, that class contains a lot of ifs/elses that make it confusing to follow and update when needed + - I would like to combine my block and reservation classes into one because there is very limited differences between the two. \ No newline at end of file From f78e3490b246a5d4344b57bd3570e96e09300a86 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 10:54:06 -0700 Subject: [PATCH 17/20] Added missed requirement to check block availability --- lib/hotel.rb | 27 +++++++++++++++++++++++-- test/hotel_test.rb | 49 ++++++++++++++++++++++++++++++++++++---------- 2 files changed, 64 insertions(+), 12 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 8787ec26b..f9671c7f8 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -12,7 +12,7 @@ def initialize(reservations: nil, blocks:nil) def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil) - if hold_block != false && hold_block.to_s.match(/[1-5]/) == nil # || ( || ) + if hold_block != false && hold_block.to_s.match(/[1-5]/) == nil raise ArgumentError.new("If you want hold a block of rooms, enter the number of rooms (maximum of 5) to hold.") elsif hold_block == false && block_id == nil id = @reservations.length + 1 @@ -50,7 +50,6 @@ def make_reservation(start_date:, end_date:, hold_block:false, block_id:nil) if reservation == nil raise ArgumentError.new("This block has been fully booked") end - puts reservation.class reservations[reservation[0]] = "Booked" return reservations[reservation[0]] end @@ -79,6 +78,30 @@ def find_reservations_by_date(start_date, end_date) return found_reservations end + def check_block_availability(block_id:) + if block_id.to_s.match(/[1-5]/) != nil + block = @blocks.find{|block| block.block_id == block_id } + if block == nil + raise ArgumentError.new("This block does not exist yet, please reserve the block first") + end + reservations = block.reservations + available_in_block = reservations.select{|reservation, status| status == "Not booked"} + puts available_in_block + puts available_in_block.class + if available_in_block.length == 0 + raise ArgumentError.new("This block has been fully booked, there are 0 rooms available") + end + available_reservations = [] + available_in_block.each do |reservation, status| + available_reservations.push(reservation) + end + available_rooms = available_reservations.map do |reservation| + reservation.room + end + return available_rooms + end + end + def list_available_rooms(start_date, end_date) if start_date.class == String start_date = Date.strptime(start_date, "%m/%d/%Y") diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 8a0c622f5..94cecc974 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -106,17 +106,46 @@ hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:3) hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:4) - expect{ 4.times do hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) end }.must_raise ArgumentError - - end + expect{ 4.times do + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) + end }.must_raise ArgumentError + + end + + it "does not allow blocks rooms to be booked before they are reserved" do + hotel = Hotel.new + + expect{ hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) }.must_raise ArgumentError - it "does not allow blocks rooms to be booked before they are reserved" do - hotel = Hotel.new - - expect{ hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) }.must_raise ArgumentError - - end end end - \ No newline at end of file + describe "Find availability of block" do + it "lists all rooms available for a block" do + hotel = Hotel.new + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:4) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:3) + + result1 = hotel.check_block_availability(block_id:1) + result2 = hotel.check_block_availability(block_id:2) + + expect(result1.length).must_equal 4 + expect(result2.length).must_equal 3 + end + + it "raises error if block does not exist" do + hotel = Hotel.new + + expect{ hotel.check_block_availability(block_id:1) }.must_raise ArgumentError + end + + it "raises error if there are no rooms available" do + hotel = Hotel.new + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", hold_block:2) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) + hotel.make_reservation(start_date:"5/05/2019", end_date:"5/09/2019", block_id:1) + + expect{ hotel.check_block_availability(block_id:1) }.must_raise ArgumentError + end + end +end From df1e341c839174e4ab670c0112537d84c41d39a6 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Wed, 11 Sep 2019 10:56:30 -0700 Subject: [PATCH 18/20] Updated future changes in refactors.txt --- refactors.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/refactors.txt b/refactors.txt index 379bbd16e..ad5bd1dfe 100644 --- a/refactors.txt +++ b/refactors.txt @@ -1,3 +1,3 @@ List of changes that I would like to make: - I would like to break apart my make_reservation class in to separate methods that are called my an “overall” make_reservation class. Currently, that class contains a lot of ifs/elses that make it confusing to follow and update when needed - - I would like to combine my block and reservation classes into one because there is very limited differences between the two. \ No newline at end of file + - I would like to combine my block and reservation classes into one because there are limited differences between the two and this sticks to single the single responsibility of making reservations for rooms \ No newline at end of file From 889597a3360bcf97a0c297a88a01eb9fb28f7087 Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Sun, 29 Sep 2019 15:30:46 -0700 Subject: [PATCH 19/20] Added design activity file --- design-activity.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..e69de29bb From a48cec1da708e7f7a24084493e8d127e642250aa Mon Sep 17 00:00:00 2001 From: Brianna Kemp Date: Tue, 1 Oct 2019 18:03:39 -0700 Subject: [PATCH 20/20] Hotel method refactoring --- design-activity.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/design-activity.md b/design-activity.md index e69de29bb..dc95d007a 100644 --- a/design-activity.md +++ b/design-activity.md @@ -0,0 +1,53 @@ +- What classes does each implementation include? Are the lists the same? + +Implementations A and B have the same classes: CartEntry, ShoppingCart, and Order. + +- Write down a sentence to describe each class. + +CartEntry: This object is a specific item, it's price and quantity are stored +ShoppingCart: A list of all items in a cart +Order: A shopping cart of items + +- How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. + +The Order class is instantiated with a ShoppingCart class. The ShoppingCart stores an array of entries made up of the CartEntry class. + +Order is one-to-one with ShoppingCart +ShoppingCart is one-to-many with CartEntry + +- What data does each class store? How (if at all) does this differ between the two implementations? + +There is no difference in the data stored, the initialize methods are unchanged between the implementation: +CartEntry stores unit_price and quantity +ShoppingCart stores entries +Order stores cart + +- What methods does each class have? How (if at all) does this differ between the two implementations? + +CartEntry: has a price method in implementation B and no methods in implementation A +Shopping Cart: has a price method in implementation B and no methods in implementation A +Order: has a total_price method - this is the same for both implementations + +- 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 implementation A the logic to compute price is retained in Order; however, in implementation B the logic is in ShoppingCart and CartEntry + +- Does total_price directly manipulate the instance variables of other classes? + +Total_price directly manipulates the instance variables in implementation A, but not B + +- If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + +This would change either the total_price method in implementation A of the price method of CartEntry is implementation B. Implementation B would be easier to modify. + +- Which implementation better adheres to the single responsibility principle? + +Implementation B + +- Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? + +Implementation B (fewer dependencies) + +Describe in design-activity.md what changes you would need to make to improve this design, and how the resulting design would be an improvement. +