From 9b566a26d8e4cd92305d1f328644179624e38fa5 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Tue, 4 Sep 2018 14:57:20 -0700 Subject: [PATCH 01/47] added room class and test to check if it creates and instance of room --- lib/room.rb | 20 ++++++++++++++++++++ spec/room_spec.rb | 14 ++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 lib/room.rb create mode 100644 spec/room_spec.rb diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..243bd58a8 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,20 @@ +require 'pry' + + +module Hotel + class Room + attr_reader :room_number, :status + ROOM_NUMBERS = [*1..20] + + def initialize(room_number, status=:AVAILABLE) + @room_number = room_number + @status = status + + unless ROOM_NUMBERS.include?(@room_number) + raise ArgumentError, "Room number does not exit in the hotel" + end + end + + + end +end diff --git a/spec/room_spec.rb b/spec/room_spec.rb new file mode 100644 index 000000000..cbe6507f3 --- /dev/null +++ b/spec/room_spec.rb @@ -0,0 +1,14 @@ +require_relative 'spec_helper.rb' + +describe Hotel do + describe 'initialize' do + before do + @room = Hotel::Room.new(1) + end + + it 'creates a new instance of room' do + expect(@room).must_be_kind_of Hotel::Room + end + + end +end From 34f6bf734c8207cdcc3786e6c195ce763d7d4ad9 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Tue, 4 Sep 2018 14:58:54 -0700 Subject: [PATCH 02/47] updated Guardfile per Dan, and updated spec/spec_helper --- Guardfile | 2 +- spec/spec_helper.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Guardfile b/Guardfile index 6760f9177..fa59fc3ef 100644 --- a/Guardfile +++ b/Guardfile @@ -1,4 +1,4 @@ -guard :minitest, bundler: false, rubygems: false do +guard :minitest, bundler: false, autorun: false, rubygems: false do # with Minitest::Spec watch(%r{^spec/(.*)_spec\.rb$}) watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4d1e3fdc8..c5e3ee68a 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,6 @@ +require 'simplecov' +SimpleCov.start + require 'minitest' require 'minitest/autorun' require 'minitest/reporters' @@ -6,3 +9,4 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # Require_relative your lib files here! +require_relative '../lib/room.rb' From 12c7fe76a13295d0a71b967c990c96f99c9f1298 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Tue, 4 Sep 2018 16:53:10 -0700 Subject: [PATCH 03/47] Added methods to add rooms and list rooms --- lib/rooms_list.rb | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 lib/rooms_list.rb diff --git a/lib/rooms_list.rb b/lib/rooms_list.rb new file mode 100644 index 000000000..83304c72f --- /dev/null +++ b/lib/rooms_list.rb @@ -0,0 +1,41 @@ +require_relative 'room' + +module Hotel + class RoomsList + attr_reader :rooms, :add_rooms, :list_rooms + def initialize + @rooms = [] + end + + def add_rooms(room) + @rooms << room + end + + def list_rooms + + # return @rooms.select { |r| r.room_number } + + list = "" + @rooms.each_with_index do |room, i| + each_room = "\n#{i + 1}. Room #{room.room_number}" + list << each_room + end + + return list + end + + end +end + + +room_1 = Hotel::Room.new(1) +room_2 = Hotel::Room.new(2) +room_3 = Hotel::Room.new(3) + +a = Hotel::RoomsList.new() + +a.add_rooms(room_1) +a.add_rooms(room_2) +a.add_rooms(room_3) + +puts a.list_rooms From e45590036d5166f565f46a11215b4c8a00adea1e Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Tue, 4 Sep 2018 16:54:04 -0700 Subject: [PATCH 04/47] added initiliaze test for rooms list class --- spec/rooms_list_spec.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 spec/rooms_list_spec.rb diff --git a/spec/rooms_list_spec.rb b/spec/rooms_list_spec.rb new file mode 100644 index 000000000..40ec2329a --- /dev/null +++ b/spec/rooms_list_spec.rb @@ -0,0 +1,26 @@ +require_relative 'spec_helper.rb' + +describe "Rooms List Class" do + describe 'initialize' do + before do + room_1 = Hotel::Room.new(1) + room_2 = Hotel::Room.new(2) + room_3 = Hotel::Room.new(3) + + @hotel_rooms = Hotel::RoomsList.new() + + @hotel_rooms.add_rooms(room_1) + @hotel_rooms.add_rooms(room_2) + @hotel_rooms.add_rooms(room_3) + end + + it 'Creates an array of rooms' do + expect(@hotel_rooms.rooms).must_be_instance_of Array + end + + it 'Adds an instance of a room' do + expect(@hotel_rooms.rooms[0]).must_be_instance_of Hotel::Room + + end + end +end From 4615f8ecd1bb6f9ad1d03dc5f8dd52c8068e52ae Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Tue, 4 Sep 2018 17:38:02 -0700 Subject: [PATCH 05/47] removed room class and tests, do not need the room clas --- lib/room.rb | 20 -------------------- spec/room_spec.rb | 14 -------------- 2 files changed, 34 deletions(-) delete mode 100644 lib/room.rb delete mode 100644 spec/room_spec.rb diff --git a/lib/room.rb b/lib/room.rb deleted file mode 100644 index 243bd58a8..000000000 --- a/lib/room.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'pry' - - -module Hotel - class Room - attr_reader :room_number, :status - ROOM_NUMBERS = [*1..20] - - def initialize(room_number, status=:AVAILABLE) - @room_number = room_number - @status = status - - unless ROOM_NUMBERS.include?(@room_number) - raise ArgumentError, "Room number does not exit in the hotel" - end - end - - - end -end diff --git a/spec/room_spec.rb b/spec/room_spec.rb deleted file mode 100644 index cbe6507f3..000000000 --- a/spec/room_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require_relative 'spec_helper.rb' - -describe Hotel do - describe 'initialize' do - before do - @room = Hotel::Room.new(1) - end - - it 'creates a new instance of room' do - expect(@room).must_be_kind_of Hotel::Room - end - - end -end From 4848108acc5e899298ca2210fb319f818ee72048 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 14:51:48 -0700 Subject: [PATCH 06/47] deleted rooms_list file and the spec file --- lib/rooms_list.rb | 41 ----------------------------------------- spec/rooms_list_spec.rb | 26 -------------------------- 2 files changed, 67 deletions(-) delete mode 100644 lib/rooms_list.rb delete mode 100644 spec/rooms_list_spec.rb diff --git a/lib/rooms_list.rb b/lib/rooms_list.rb deleted file mode 100644 index 83304c72f..000000000 --- a/lib/rooms_list.rb +++ /dev/null @@ -1,41 +0,0 @@ -require_relative 'room' - -module Hotel - class RoomsList - attr_reader :rooms, :add_rooms, :list_rooms - def initialize - @rooms = [] - end - - def add_rooms(room) - @rooms << room - end - - def list_rooms - - # return @rooms.select { |r| r.room_number } - - list = "" - @rooms.each_with_index do |room, i| - each_room = "\n#{i + 1}. Room #{room.room_number}" - list << each_room - end - - return list - end - - end -end - - -room_1 = Hotel::Room.new(1) -room_2 = Hotel::Room.new(2) -room_3 = Hotel::Room.new(3) - -a = Hotel::RoomsList.new() - -a.add_rooms(room_1) -a.add_rooms(room_2) -a.add_rooms(room_3) - -puts a.list_rooms diff --git a/spec/rooms_list_spec.rb b/spec/rooms_list_spec.rb deleted file mode 100644 index 40ec2329a..000000000 --- a/spec/rooms_list_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative 'spec_helper.rb' - -describe "Rooms List Class" do - describe 'initialize' do - before do - room_1 = Hotel::Room.new(1) - room_2 = Hotel::Room.new(2) - room_3 = Hotel::Room.new(3) - - @hotel_rooms = Hotel::RoomsList.new() - - @hotel_rooms.add_rooms(room_1) - @hotel_rooms.add_rooms(room_2) - @hotel_rooms.add_rooms(room_3) - end - - it 'Creates an array of rooms' do - expect(@hotel_rooms.rooms).must_be_instance_of Array - end - - it 'Adds an instance of a room' do - expect(@hotel_rooms.rooms[0]).must_be_instance_of Hotel::Room - - end - end -end From cab2a8860a24e2429de358d89e1e0fee41744048 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 14:52:55 -0700 Subject: [PATCH 07/47] Added Duration class that calculates nights booked --- lib/duration.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 lib/duration.rb diff --git a/lib/duration.rb b/lib/duration.rb new file mode 100644 index 000000000..bd02641a5 --- /dev/null +++ b/lib/duration.rb @@ -0,0 +1,14 @@ +module Hotel + class Duration + + def initialize(start_date, end_date) + @start_date = Date.parse + @end_date = Date.parse + end + + def number_of_nights + return (@end_date - @start_date).to_i + end + + end +end From 53bceddc1c06e04298a3a6b4d1efca69f0ebfe0b Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 14:54:18 -0700 Subject: [PATCH 08/47] added duration and room_number as instance variables --- lib/reservation.rb | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 lib/reservation.rb diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..bc4e87f7d --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,41 @@ +require 'date' +require 'awesome_print' +require_relative 'duration' + +=begin +This will keep track of all the reservations + +1. create method for available/unavailable rooms based on date range + +2. + +=end + + +module Hotel + class Reservation + + PRICE_PER_NIGHT = 200.00 + attr_reader :id, :duration, :room_number + + + def initialize(id, duration, room_number) + @id = id + @duration = duration + @room_number = room_number + end + + + def total_cost + return (@duration.number_of_nights * PRICE_PER_NIGHT).round(2) + end + + end + +end + +# b = Hotel::Duration.new('2018-09-01', '2018-09-05') +# c = b.total_duration +# ap c +# a = Hotel::Reservation.new(1,c) +# puts a.total_cost From ff9f0c9ffaf9847b12cff0e35c6881304aef0bcd Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 14:55:46 -0700 Subject: [PATCH 09/47] added list rooms method --- lib/room_booker.rb | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 lib/room_booker.rb diff --git a/lib/room_booker.rb b/lib/room_booker.rb new file mode 100644 index 000000000..7763bc79a --- /dev/null +++ b/lib/room_booker.rb @@ -0,0 +1,31 @@ +module Hotel + class RoomBooker + attr_reader :rooms, :reservations + + def initialize + # All my rooms + @rooms = (1..20).to_a + # List of reservations. Organized by room? + @reservations = [] + + # If we need reservations for a particular room: + # @reservations.select { |res| res.room_number == room_number } + end + + def list_rooms + return @rooms + end + + # def make_reservation(start_date, end_date) + # + # reservation = Reservation.new(...) + # @reservations << reservation + # end + + + + end +end + +# a = Hotel::RoomBooker.new() +# puts a.list_rooms From ec586b71dd556efa563f83d209147a0aaefb1a24 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 14:56:31 -0700 Subject: [PATCH 10/47] created spec files for each class --- spec/duration_spec.rb | 1 + spec/reservation_spec.rb | 1 + spec/room_booker_spec.rb | 20 ++++++++++++++++++++ spec/spec_helper.rb | 4 +++- 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 spec/duration_spec.rb create mode 100644 spec/reservation_spec.rb create mode 100644 spec/room_booker_spec.rb diff --git a/spec/duration_spec.rb b/spec/duration_spec.rb new file mode 100644 index 000000000..ae9c220ea --- /dev/null +++ b/spec/duration_spec.rb @@ -0,0 +1 @@ +require_relative 'spec_helper' diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb new file mode 100644 index 000000000..ae9c220ea --- /dev/null +++ b/spec/reservation_spec.rb @@ -0,0 +1 @@ +require_relative 'spec_helper' diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb new file mode 100644 index 000000000..982a6836b --- /dev/null +++ b/spec/room_booker_spec.rb @@ -0,0 +1,20 @@ +require_relative 'spec_helper' + +describe "Room Booker Class" do + describe "initialize" do + let (:booking_system) { + Hotel::RoomBooker.new() + } + + it 'Creates an array of room numbers' do + expect(booking_system.rooms).must_be_instance_of Array + end + + it 'Creates an array of reservation instances' do + expect(:booking_system).must_be_instance_of Hotel::Reservation + end + + + + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c5e3ee68a..8e1530694 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -9,4 +9,6 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # Require_relative your lib files here! -require_relative '../lib/room.rb' +require_relative '../lib/duration.rb' +require_relative '../lib/reservation.rb' +require_relative '../lib/room_booker.rb' From 2e480d35ebd6f5d5ab63c7672ddb2af2ea722640 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 15:14:42 -0700 Subject: [PATCH 11/47] Added test for initializing reservation --- spec/reservation_spec.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index ae9c220ea..981e44e3e 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -1 +1,13 @@ require_relative 'spec_helper' + +describe "Reservation Class" do + describe "initailize" do + let (:duration) { Hotel::Duration.new('2018-09-01', '2018-09-05') } + let (:reservation) { Hotel::Reservation.new(1, duration, 20) } + + it 'stores duration as an object' do + expect(reservation.duration).must_be_instance_of Hotel::Duration + + end + end +end From 415878c447e7670d663f249683085a62a589407d Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 15:30:00 -0700 Subject: [PATCH 12/47] added test for calculates total cost of stay correctly --- spec/reservation_spec.rb | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 981e44e3e..846cc2b7a 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -1,13 +1,23 @@ +require 'pry' + require_relative 'spec_helper' describe "Reservation Class" do + let (:duration) { Hotel::Duration.new('2018-09-01', '2018-09-05') } + let (:reservation) { Hotel::Reservation.new(1, duration, 20) } + describe "initailize" do - let (:duration) { Hotel::Duration.new('2018-09-01', '2018-09-05') } - let (:reservation) { Hotel::Reservation.new(1, duration, 20) } + it 'Stores duration as an object' do + expect(reservation.duration).must_be_kind_of Hotel::Duration + end - it 'stores duration as an object' do - expect(reservation.duration).must_be_instance_of Hotel::Duration + describe "total_cost" do + it 'Calculates total cost of an entire stay' do + expect(reservation.total_cost).must_equal 800.00 end + + it + end end end From 29fe0493dda414bcbde8db3ad73747ac1b30ba5c Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 15:33:01 -0700 Subject: [PATCH 13/47] Fixed start_time and end_time - was not parsing correctly --- lib/duration.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/duration.rb b/lib/duration.rb index bd02641a5..3632c2565 100644 --- a/lib/duration.rb +++ b/lib/duration.rb @@ -1,9 +1,11 @@ +require 'date' + module Hotel class Duration def initialize(start_date, end_date) - @start_date = Date.parse - @end_date = Date.parse + @start_date = Date.parse(start_date) + @end_date = Date.parse(end_date) end def number_of_nights From e51bd13e3721664b0bc8e73467d911476c7d576f Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 22:27:41 -0700 Subject: [PATCH 14/47] added test to check if invalid dates raises an argument error --- spec/room_booker_spec.rb | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 982a6836b..bdf3d608b 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -1,20 +1,46 @@ require_relative 'spec_helper' -describe "Room Booker Class" do - describe "initialize" do - let (:booking_system) { - Hotel::RoomBooker.new() - } +describe "RoomBooker Class" do + let (:booking_system) { Hotel::RoomBooker.new() } + describe "initialize" do it 'Creates an array of room numbers' do - expect(booking_system.rooms).must_be_instance_of Array + expect(booking_system.rooms).must_be_kind_of Array end it 'Creates an array of reservation instances' do - expect(:booking_system).must_be_instance_of Hotel::Reservation + expect(booking_system).must_be_kind_of Hotel::Reservation end + end + + describe "list_rooms method" do + it 'Returns an array of room numbers' do + expect(booking_system.list_rooms).must_be_kind_of Array + end + end + + describe "check_valid_dates method" do + it 'Raises an ArgumentError for invalid date ranges' do + expect{ + booking_system.check_valid_dates('2018-09-05', '2018-09-01') + }.must_raise ArgumentError + expect{ + booking_system.check_valid_dates('', '2018-09-01') + }.must_raise ArgumentError + expect{ + booking_system.check_valid_dates('2018-09-01', '') + }.must_raise ArgumentError + + expect{ + booking_system.check_valid_dates('', '') + }.must_raise ArgumentError + + end end + + + end From 9830b463f0ebb3aa68875de074d77f0db12a5373 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 5 Sep 2018 22:40:12 -0700 Subject: [PATCH 15/47] added is_overlapping method --- lib/duration.rb | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/duration.rb b/lib/duration.rb index 3632c2565..3fd7a5c4a 100644 --- a/lib/duration.rb +++ b/lib/duration.rb @@ -1,5 +1,5 @@ require 'date' - +require 'room_booker' module Hotel class Duration @@ -12,5 +12,34 @@ def number_of_nights return (@end_date - @start_date).to_i end + def is_overlapping(start_booked_date, end_booked_date) + reservation_date_range = (@start_date...@end_date) + booked_dated_range = (Date.parse(start_booked_date)...Date.parse(end_booked_date)) + + return reservation_date_range.include?(booked_dated_range) ? true : false + + end + + + + + + #checking overlapping dates? + # input two dates to compare + # output (boolean) + + + #finding_available_room + #input start/end date + #output available room + + + #edge cases + #testing edge cases for date ranges + + + #think...what if there's no available rooms + #what if (9/1-9/5) reservations: (9/1-9/2), (9/4-9/5), (9/1-9/1) (start, end) + end end From c975f72b97ff13ebe2f312ad4e2b0c1aea1f4ded Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Thu, 6 Sep 2018 14:53:49 -0700 Subject: [PATCH 16/47] renamed Duration class to DateRange class --- lib/duration.rb | 45 ------------------------------------------- spec/duration_spec.rb | 1 - 2 files changed, 46 deletions(-) delete mode 100644 lib/duration.rb delete mode 100644 spec/duration_spec.rb diff --git a/lib/duration.rb b/lib/duration.rb deleted file mode 100644 index 3fd7a5c4a..000000000 --- a/lib/duration.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'date' -require 'room_booker' -module Hotel - class Duration - - def initialize(start_date, end_date) - @start_date = Date.parse(start_date) - @end_date = Date.parse(end_date) - end - - def number_of_nights - return (@end_date - @start_date).to_i - end - - def is_overlapping(start_booked_date, end_booked_date) - reservation_date_range = (@start_date...@end_date) - booked_dated_range = (Date.parse(start_booked_date)...Date.parse(end_booked_date)) - - return reservation_date_range.include?(booked_dated_range) ? true : false - - end - - - - - - #checking overlapping dates? - # input two dates to compare - # output (boolean) - - - #finding_available_room - #input start/end date - #output available room - - - #edge cases - #testing edge cases for date ranges - - - #think...what if there's no available rooms - #what if (9/1-9/5) reservations: (9/1-9/2), (9/4-9/5), (9/1-9/1) (start, end) - - end -end diff --git a/spec/duration_spec.rb b/spec/duration_spec.rb deleted file mode 100644 index ae9c220ea..000000000 --- a/spec/duration_spec.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative 'spec_helper' From bf85cc581f79348dcb9ce9d90ad5f8f4f0d301a3 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Thu, 6 Sep 2018 14:54:31 -0700 Subject: [PATCH 17/47] moved check_valid_dates to the DateRange class --- lib/reservation.rb | 27 +++++++++++++-------------- spec/reservation_spec.rb | 18 ++++++++++-------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index bc4e87f7d..e93597755 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,35 +1,34 @@ -require 'date' require 'awesome_print' -require_relative 'duration' +require_relative 'date_range' =begin -This will keep track of all the reservations - -1. create method for available/unavailable rooms based on date range - -2. - +1. This will keep track of one reservation =end - module Hotel class Reservation + # TODO: change duration to start/end dates PRICE_PER_NIGHT = 200.00 - attr_reader :id, :duration, :room_number + attr_reader :date_range, :room_number - def initialize(id, duration, room_number) - @id = id - @duration = duration + def initialize(date_range, room_number) + @date_range = date_range + # @start_date = Date.parse(start_date) + # @end_date = Date.parse(end_date) @room_number = room_number end + def number_of_nights + return (@date_range.end_date - @date_range.start_date).to_i + end def total_cost - return (@duration.number_of_nights * PRICE_PER_NIGHT).round(2) + return ("%.2f" % (number_of_nights * PRICE_PER_NIGHT)).to_f end + end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 846cc2b7a..0fbb80770 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -3,21 +3,23 @@ require_relative 'spec_helper' describe "Reservation Class" do - let (:duration) { Hotel::Duration.new('2018-09-01', '2018-09-05') } - let (:reservation) { Hotel::Reservation.new(1, duration, 20) } + let (:date_range) { Hotel::DateRange.new('2018-09-01', '2018-09-05') } + let (:reservation) { Hotel::Reservation.new(date_range, 20)} - describe "initailize" do - it 'Stores duration as an object' do - expect(reservation.duration).must_be_kind_of Hotel::Duration - end + # describe "initialize" do + # it 'Stores duration as an object' do + # expect(reservation.duration).must_be_kind_of Hotel::Duration + # end describe "total_cost" do it 'Calculates total cost of an entire stay' do + # binding.pry expect(reservation.total_cost).must_equal 800.00 end - it - end + it 'Correctly formats the cost to two decimal places' do + end + end end From dd76228615e27c10241b80f41b5c9c2fd3e4b2d7 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Thu, 6 Sep 2018 14:55:35 -0700 Subject: [PATCH 18/47] updating class names to DateRange --- lib/date_range.rb | 67 ++++++++++++++++++++++++++++++++ spec/date_range_spec.rb | 85 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 lib/date_range.rb create mode 100644 spec/date_range_spec.rb diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..4f20f0ee3 --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,67 @@ +require 'date' +require_relative 'room_booker' + +module Hotel + class DateRange + attr_reader :start_date, :end_date + + # TODO: change class name to date range? + + def initialize(start_date, end_date) + @start_date = Date.parse(start_date) + @end_date = Date.parse(end_date) + end + + + def check_valid_dates + + # TODO: + # - refactor to raise .. if .. + # - move this to duration class? + + while @start_date == nil || @end_date == nil + raise ArgumentError, "Invalid dates entered" + end + + while (@end_date - @start_date) <= 0 + raise ArgumentError, "End date cannot be before start date" + end + end + + + def dates_overlap?(start_booked_date, end_booked_date) + + + dates_ranges = @reservations.select { |r| r.date_range } + + reservation_date_range = (@start_date...@end_date) + booked_dated_range = ( + Date.parse(start_booked_date)...Date.parse(end_booked_date) + ) + return reservation_date_range.include?(booked_dated_range) ? true : false + end + + + + + + + #checking overlapping dates? + # input two dates to compare + # output (boolean) + + + #finding_available_room + #input start/end date + #output available room + + + #edge cases + #testing edge cases for date ranges + + + #think...what if there's no available rooms + #what if (9/1-9/5) reservations: (9/1-9/2), (9/4-9/5), (9/1-9/1) (start, end) + + end +end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb new file mode 100644 index 000000000..ff71543cf --- /dev/null +++ b/spec/date_range_spec.rb @@ -0,0 +1,85 @@ +require_relative 'spec_helper' + +describe 'DateRange Class' do + let (:date_range) { Hotel::DateRange.new('2018-09-01', '2018-09-05') } + + describe 'Initializer' do + it 'Creates an instance of DateRange' do + expect(date_range).must_be_kind_of Hotel::DateRange + end + + describe "check_valid_dates method" do + it 'Raises an ArgumentError for invalid date ranges' do + + expect{ + date_range.check_valid_dates('2018-09-05', '2018-09-01') + }.must_raise ArgumentError + + expect{ + date_range.check_valid_dates('', '2018-09-01') + }.must_raise ArgumentError + + expect{ + date_range.check_valid_dates('2018-09-01', '') + }.must_raise ArgumentError + + expect{ + date_range.check_valid_dates('', '') + }.must_raise ArgumentError + + end + end + + describe 'dates_overlap? method' do + it 'overlaps if both date range are the same' do + expect(date_range.dates_overlap?('2018-09-01', '2018-09-05')).must_equal true + end + + it 'overlaps if reservation date range overlaps in the front of booked date range' do + expect(date_range.dates_overlap?('2018-08-31', '2018-09-02')).must_equal true + end + + it 'overlaps if reservation date range overlaps in the back of booked dates range' do + expect(date_range.dates_overlap?('2018-09-04', '2018-09-07')).must_equal true + end + + it 'overlaps if reservation date range are contained within the booked dates range' do + expect(date_range.dates_overlap?('2018-09-02', '2018-09-03')).must_equal true + end + + it 'overlaps if the reservation date range are completely containing of the booked dates range' do + expect(date_range.dates_overlap?('2018-08-30', '2018-09-07')).must_equal true + end + + it 'does not overlap if reservation date range are completely before the booked dates' do + expect(date_range.dates_overlap?('2018-08-25', '2018-08-30')).must_equal false + end + + it 'does not overlap if reservation date range are completely before the booked dates' do + expect(date_range.dates_overlap?('2018-08-25', '2018-08-30')).must_equal false + end + + it 'does not overlap if reservation date range are completely after the booked dates' do + expect(date_range.dates_overlap?('2018-09-10', '2018-09-15')).must_equal false + end + + it 'does not overlap if reservation date range ends on check-in date of booked date range' do + expect(date_range.dates_overlap?('2018-08-30', '2018-09-01')).must_equal false + end + + it 'does not overlap if reservation date ranges starts on check-out date of the booked date range' do + expect(date_range.dates_overlap?('2018-08-25', '2018-08-30')).must_equal false + end + + + + + end + + + + + + + end +end From c23a885817abd4672e373b16d2db8ef46154fe01 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Thu, 6 Sep 2018 14:57:03 -0700 Subject: [PATCH 19/47] modified make_reservation method with new DateRange instance --- lib/room_booker.rb | 44 ++++++++++++++++++++++++++++++++-------- spec/room_booker_spec.rb | 21 ------------------- spec/spec_helper.rb | 2 +- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 7763bc79a..099515204 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -1,27 +1,55 @@ +require_relative 'reservation' +require_relative 'date_range' + module Hotel class RoomBooker attr_reader :rooms, :reservations + # TODO: Change class name to booking system? + def initialize # All my rooms @rooms = (1..20).to_a # List of reservations. Organized by room? @reservations = [] - - # If we need reservations for a particular room: - # @reservations.select { |res| res.room_number == room_number } end def list_rooms return @rooms end - # def make_reservation(start_date, end_date) - # - # reservation = Reservation.new(...) - # @reservations << reservation - # end + def make_reservation(start_date, end_date) + check_valid_dates + + #think...what if there's no available rooms, raise an exception + + date_range = Hotel::DateRange.new(start_date, end_date) + reservation = Reservation.new(date_range, find_available_room) + + @reservations << reservation + end + + # If we need reservations for a particular room: + # @reservations.select { |res| res.room_number == room_number } + def list_reservations_by_date(start_date, end_date) + start_date = Date.parse(start_date) + end_date = Date.parse(end_date) + end + + + + def find_available_room + # begin + + if dates_overlap?(dates_array) + raise ArgumentError + else + @reservations + end + + # rescue + end end diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index bdf3d608b..48ab1c4a2 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -19,27 +19,6 @@ end end - describe "check_valid_dates method" do - it 'Raises an ArgumentError for invalid date ranges' do - - expect{ - booking_system.check_valid_dates('2018-09-05', '2018-09-01') - }.must_raise ArgumentError - - expect{ - booking_system.check_valid_dates('', '2018-09-01') - }.must_raise ArgumentError - - expect{ - booking_system.check_valid_dates('2018-09-01', '') - }.must_raise ArgumentError - - expect{ - booking_system.check_valid_dates('', '') - }.must_raise ArgumentError - - end - end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8e1530694..bd32a1b46 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -9,6 +9,6 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # Require_relative your lib files here! -require_relative '../lib/duration.rb' +require_relative '../lib/date_range.rb' require_relative '../lib/reservation.rb' require_relative '../lib/room_booker.rb' From 97cbd7cfdd5a86a36f6ce0450709c9e88a018233 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Thu, 6 Sep 2018 17:46:41 -0700 Subject: [PATCH 20/47] restructured and moved around methods and tests --- lib/date_range.rb | 19 ++++--- lib/room_booker.rb | 39 +++++++++------ spec/date_range_spec.rb | 104 ++++++++++++++++++++++----------------- spec/reservation_spec.rb | 3 +- spec/room_booker_spec.rb | 16 +++--- 5 files changed, 105 insertions(+), 76 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 4f20f0ee3..cda247144 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -6,6 +6,7 @@ class DateRange attr_reader :start_date, :end_date # TODO: change class name to date range? + # change start_date t0 check-in def initialize(start_date, end_date) @start_date = Date.parse(start_date) @@ -28,18 +29,20 @@ def check_valid_dates end end + def dates_overlap?(date_range) + booked_dates = (date_range.start_date...date_range.end_date) + new_dates = (@start_date...@end_date) - def dates_overlap?(start_booked_date, end_booked_date) + if booked_dates.include?(new_dates) + return true + else + return false + end + + end - dates_ranges = @reservations.select { |r| r.date_range } - reservation_date_range = (@start_date...@end_date) - booked_dated_range = ( - Date.parse(start_booked_date)...Date.parse(end_booked_date) - ) - return reservation_date_range.include?(booked_dated_range) ? true : false - end diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 099515204..052fe7e17 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -3,29 +3,25 @@ module Hotel class RoomBooker - attr_reader :rooms, :reservations + attr_reader :room, :reservations # TODO: Change class name to booking system? def initialize # All my rooms - @rooms = (1..20).to_a + @room = (1..20).to_a # List of reservations. Organized by room? @reservations = [] end def list_rooms - return @rooms + return @room end - def make_reservation(start_date, end_date) - check_valid_dates - #think...what if there's no available rooms, raise an exception - - date_range = Hotel::DateRange.new(start_date, end_date) + def make_reservation(date_range) + #think...what if there's no available rooms, raise an exception reservation = Reservation.new(date_range, find_available_room) - @reservations << reservation end @@ -34,24 +30,35 @@ def make_reservation(start_date, end_date) def list_reservations_by_date(start_date, end_date) start_date = Date.parse(start_date) - end_date = Date.parse(end_date) + end_date = Date.parse(end_date) end - def find_available_room - # begin - if dates_overlap?(dates_array) - raise ArgumentError + return 0 if @reservations.empty? + + unavailable_rooms = [] + available_rooms = [] + + @reservations.each do |res| + if date_overlaps?(res.date_range) + unavailable_rooms << res.room else - @reservations + available_rooms << res.room end + end + + return available_rooms.first - # rescue end + + + + + end end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index ff71543cf..68f068845 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -1,76 +1,92 @@ require_relative 'spec_helper' describe 'DateRange Class' do - let (:date_range) { Hotel::DateRange.new('2018-09-01', '2018-09-05') } + before do + @date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') + @reservation_1 = Hotel::RoomBooker.new().make_reservation(@date_range_1) + end + + let (:date_range_2) { Hotel::DateRange.new('2018-09-01', '2018-09-05') } + let (:reservation_2) { + Hotel::RoomBooker.new().make_reservation(date_range_2) + } + + let (:date_range_3) { Hotel::DateRange.new('2018-08-31', '2018-09-02') } + let (:date_range_4) { Hotel::DateRange.new('2018-09-04', '2018-09-07') } + let (:date_range_5) { Hotel::DateRange.new('2018-09-02', '2018-09-03') } + let (:date_range_6) { Hotel::DateRange.new('2018-08-30', '2018-09-10') } + let (:date_range_7) { Hotel::DateRange.new('2018-08-25', '2018-08-30') } + let (:date_range_8) { Hotel::DateRange.new('2018-09-10', '2018-09-15') } + let (:date_range_9) { Hotel::DateRange.new('2018-08-30', '2018-09-01') } + let (:date_range_10) { Hotel::DateRange.new('2018-09-05', '2018-09-10') } describe 'Initializer' do it 'Creates an instance of DateRange' do - expect(date_range).must_be_kind_of Hotel::DateRange + expect(@date_range_1).must_be_kind_of Hotel::DateRange end + end describe "check_valid_dates method" do it 'Raises an ArgumentError for invalid date ranges' do expect{ - date_range.check_valid_dates('2018-09-05', '2018-09-01') + @date_range_1.check_valid_dates('2018-09-05', '2018-09-01') }.must_raise ArgumentError expect{ - date_range.check_valid_dates('', '2018-09-01') + @date_range_1.check_valid_dates('', '2018-09-01') }.must_raise ArgumentError expect{ - date_range.check_valid_dates('2018-09-01', '') + @date_range_1.check_valid_dates('2018-09-01', '') }.must_raise ArgumentError expect{ - date_range.check_valid_dates('', '') + @date_range_1.check_valid_dates('', '') }.must_raise ArgumentError end end - describe 'dates_overlap? method' do - it 'overlaps if both date range are the same' do - expect(date_range.dates_overlap?('2018-09-01', '2018-09-05')).must_equal true - end - - it 'overlaps if reservation date range overlaps in the front of booked date range' do - expect(date_range.dates_overlap?('2018-08-31', '2018-09-02')).must_equal true - end - - it 'overlaps if reservation date range overlaps in the back of booked dates range' do - expect(date_range.dates_overlap?('2018-09-04', '2018-09-07')).must_equal true - end - - it 'overlaps if reservation date range are contained within the booked dates range' do - expect(date_range.dates_overlap?('2018-09-02', '2018-09-03')).must_equal true - end - - it 'overlaps if the reservation date range are completely containing of the booked dates range' do - expect(date_range.dates_overlap?('2018-08-30', '2018-09-07')).must_equal true - end - - it 'does not overlap if reservation date range are completely before the booked dates' do - expect(date_range.dates_overlap?('2018-08-25', '2018-08-30')).must_equal false - end - it 'does not overlap if reservation date range are completely before the booked dates' do - expect(date_range.dates_overlap?('2018-08-25', '2018-08-30')).must_equal false - end - - it 'does not overlap if reservation date range are completely after the booked dates' do - expect(date_range.dates_overlap?('2018-09-10', '2018-09-15')).must_equal false - end - - it 'does not overlap if reservation date range ends on check-in date of booked date range' do - expect(date_range.dates_overlap?('2018-08-30', '2018-09-01')).must_equal false - end + describe 'dates_overlap? method' do - it 'does not overlap if reservation date ranges starts on check-out date of the booked date range' do - expect(date_range.dates_overlap?('2018-08-25', '2018-08-30')).must_equal false + it 'overlaps if both date range are the same' do + # binding.pry + expect(date_range_2.dates_overlap?(@reservation_1.reservations.date_range)).must_equal true end + # it 'overlaps if reservation date range overlaps in the front of booked date range' do + # expect(date_range_3.dates_overlap?()).must_equal true + # end + # + # it 'overlaps if reservation date range overlaps in the back of booked dates range' do + # expect(date_range_4.dates_overlap?).must_equal true + # end + # + # it 'overlaps if reservation date range are contained within the booked dates range' do + # expect(date_range_5.dates_overlap?).must_equal true + # end + # + # it 'overlaps if the reservation date range are completely containing the booked dates range' do + # expect(date_range_6.dates_overlap?).must_equal true + # end + # + # it 'does not overlap if reservation date range are completely before the booked dates' do + # expect(date_range_7.dates_overlap?).must_equal false + # end + # + # it 'does not overlap if reservation date range are completely after the booked dates' do + # expect(date_range_8.dates_overlap?).must_equal false + # end + # + # it 'does not overlap if reservation date range ends on check-in date of booked date range' do + # expect(date_range_9.dates_overlap?).must_equal false + # end + # + # it 'does not overlap if reservation date ranges starts on check-out date of the booked date range' do + # expect(date_range_10.dates_overlap?).must_equal false + # end @@ -81,5 +97,5 @@ - end + end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 0fbb80770..4fee397ed 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -1,6 +1,5 @@ -require 'pry' - require_relative 'spec_helper' +require 'pry' describe "Reservation Class" do let (:date_range) { Hotel::DateRange.new('2018-09-01', '2018-09-05') } diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 48ab1c4a2..1587cfb7d 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -1,25 +1,29 @@ require_relative 'spec_helper' describe "RoomBooker Class" do - let (:booking_system) { Hotel::RoomBooker.new() } + before do + @date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') + @reservation_1 = Hotel::RoomBooker.new() + @reservation_1.make_reservation(@date_range_1) + end + - describe "initialize" do + describe "Initializer" do it 'Creates an array of room numbers' do - expect(booking_system.rooms).must_be_kind_of Array + expect(@reservation_1.room).must_be_kind_of Array end it 'Creates an array of reservation instances' do - expect(booking_system).must_be_kind_of Hotel::Reservation + expect(@reservation_1.reservations[0]).must_be_kind_of Hotel::Reservation end end describe "list_rooms method" do it 'Returns an array of room numbers' do - expect(booking_system.list_rooms).must_be_kind_of Array + expect(@reservation_1.list_rooms).must_be_kind_of Array end end - end From 9f94a4cf94dcd57ee68b24e3da60fa1558a5fca0 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Fri, 7 Sep 2018 14:38:30 -0700 Subject: [PATCH 21/47] added and passed all tests for overlap dates method --- lib/date_range.rb | 41 ++++++++++++++++++++---- spec/date_range_spec.rb | 71 ++++++++++++++++++++++------------------- 2 files changed, 72 insertions(+), 40 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index cda247144..9a59798d8 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,5 +1,6 @@ require 'date' require_relative 'room_booker' +require 'pry' module Hotel class DateRange @@ -30,19 +31,48 @@ def check_valid_dates end def dates_overlap?(date_range) - booked_dates = (date_range.start_date...date_range.end_date) - new_dates = (@start_date...@end_date) - if booked_dates.include?(new_dates) + booked_dates = [*date_range.start_date..date_range.end_date] + new_dates = [*@start_date..@end_date] + + # completely containing + if new_dates.first < booked_dates.first && new_dates.last > booked_dates.last + return true + # back end + elsif new_dates.first < booked_dates.last && new_dates.last > booked_dates.last + return true + # in the middle + elsif new_dates.first > booked_dates.first && new_dates.last < booked_dates.last + return true + # in the front + elsif new_dates.first < booked_dates.first && new_dates.last > booked_dates.first return true - else + # completely before + elsif new_dates.last < booked_dates.first return false + # completely after + elsif new_dates.first > booked_dates.last + return false + # ends on check-in date + elsif new_dates.last == booked_dates.first + return false + # same dates + elsif new_dates.first == booked_dates.first || new_dates.last == booked_dates.first + return true end + return false end + end +end + +# +# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +# +# reservation_1.dates_overlap? @@ -65,6 +95,3 @@ def dates_overlap?(date_range) #think...what if there's no available rooms #what if (9/1-9/5) reservations: (9/1-9/2), (9/4-9/5), (9/1-9/1) (start, end) - - end -end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index 68f068845..055b13d95 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -3,7 +3,8 @@ describe 'DateRange Class' do before do @date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') - @reservation_1 = Hotel::RoomBooker.new().make_reservation(@date_range_1) + @reservation_1 = Hotel::RoomBooker.new() + @reservation_1.make_reservation(@date_range_1) end let (:date_range_2) { Hotel::DateRange.new('2018-09-01', '2018-09-05') } @@ -15,6 +16,7 @@ let (:date_range_4) { Hotel::DateRange.new('2018-09-04', '2018-09-07') } let (:date_range_5) { Hotel::DateRange.new('2018-09-02', '2018-09-03') } let (:date_range_6) { Hotel::DateRange.new('2018-08-30', '2018-09-10') } + let (:date_range_7) { Hotel::DateRange.new('2018-08-25', '2018-08-30') } let (:date_range_8) { Hotel::DateRange.new('2018-09-10', '2018-09-15') } let (:date_range_9) { Hotel::DateRange.new('2018-08-30', '2018-09-01') } @@ -50,43 +52,46 @@ describe 'dates_overlap? method' do + before do + @date_range = @reservation_1.reservations[0].date_range + end it 'overlaps if both date range are the same' do # binding.pry - expect(date_range_2.dates_overlap?(@reservation_1.reservations.date_range)).must_equal true + expect(date_range_2.dates_overlap?(@date_range)).must_equal true end - # it 'overlaps if reservation date range overlaps in the front of booked date range' do - # expect(date_range_3.dates_overlap?()).must_equal true - # end - # - # it 'overlaps if reservation date range overlaps in the back of booked dates range' do - # expect(date_range_4.dates_overlap?).must_equal true - # end - # - # it 'overlaps if reservation date range are contained within the booked dates range' do - # expect(date_range_5.dates_overlap?).must_equal true - # end - # - # it 'overlaps if the reservation date range are completely containing the booked dates range' do - # expect(date_range_6.dates_overlap?).must_equal true - # end - # - # it 'does not overlap if reservation date range are completely before the booked dates' do - # expect(date_range_7.dates_overlap?).must_equal false - # end - # - # it 'does not overlap if reservation date range are completely after the booked dates' do - # expect(date_range_8.dates_overlap?).must_equal false - # end - # - # it 'does not overlap if reservation date range ends on check-in date of booked date range' do - # expect(date_range_9.dates_overlap?).must_equal false - # end - # - # it 'does not overlap if reservation date ranges starts on check-out date of the booked date range' do - # expect(date_range_10.dates_overlap?).must_equal false - # end + it 'overlaps if new date range overlaps in the front of booked date range' do + expect(date_range_3.dates_overlap?(@date_range)).must_equal true + end + + it 'overlaps if new date range overlaps in the back of booked dates range' do + expect(date_range_4.dates_overlap?(@date_range)).must_equal true + end + + it 'overlaps if new date range is contained within the booked dates range' do + expect(date_range_5.dates_overlap?(@date_range)).must_equal true + end + + it 'overlaps if the new date range are completely containing the booked dates range' do + expect(date_range_6.dates_overlap?((@date_range))).must_equal true + end + + it 'does not overlap if new date range are completely before the booked dates' do + expect(date_range_7.dates_overlap?(@date_range)).must_equal false + end + + it 'does not overlap if new date range are completely after the booked dates' do + expect(date_range_8.dates_overlap?(@date_range)).must_equal false + end + + it 'does not overlap if new date range ends on check-in date of booked date range' do + expect(date_range_9.dates_overlap?(@date_range)).must_equal false + end + + it 'does not overlap if new date ranges starts on check-out date of the booked date range' do + expect(date_range_10.dates_overlap?(@date_range)).must_equal false + end From a0ddc1da92c0c48f2dce036ab9d8b8af5875a86e Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Fri, 7 Sep 2018 15:21:33 -0700 Subject: [PATCH 22/47] added test for find_available_room method --- lib/room_booker.rb | 15 +++++++-------- spec/room_booker_spec.rb | 22 +++++++++++++++++++++- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 052fe7e17..47dfafa3a 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -18,25 +18,25 @@ def list_rooms return @room end - - def make_reservation(date_range) + def make_reservation(date_range, room=nil) #think...what if there's no available rooms, raise an exception - reservation = Reservation.new(date_range, find_available_room) + room_number = find_available_room + reservation = Reservation.new(date_range, room_number) @reservations << reservation end # If we need reservations for a particular room: # @reservations.select { |res| res.room_number == room_number } - def list_reservations_by_date(start_date, end_date) - start_date = Date.parse(start_date) - end_date = Date.parse(end_date) + def list_reservations_by_date(date_range) + return @reservations.select { |res| res.date_range == date_range } + end def find_available_room - return 0 if @reservations.empty? + return 1 if @reservations.empty? unavailable_rooms = [] available_rooms = [] @@ -50,7 +50,6 @@ def find_available_room end return available_rooms.first - end diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 1587cfb7d..0e57e2bcf 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -7,7 +7,6 @@ @reservation_1.make_reservation(@date_range_1) end - describe "Initializer" do it 'Creates an array of room numbers' do expect(@reservation_1.room).must_be_kind_of Array @@ -24,6 +23,27 @@ end end + # describe 'list_reservations_by_date method' do + # it '' do + # end + + describe 'find_available_room method' do + before do + @date_range_2 = Hotel::DateRange.new('2018-09-01', '2018-09-05') + @reservation_2 = Hotel::RoomBooker.new() + end + + it 'Returns 1 if the reservations are empty' do + expect(@reservation_2.find_available_room).must_equal 1 + end + + it 'Returns the first available room' do + end + + end + + + end From b4aaf204509eb9741d168219bef6110bd46c8dec Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Fri, 7 Sep 2018 15:27:34 -0700 Subject: [PATCH 23/47] added test for list_reservations_by_date method --- lib/room_booker.rb | 1 - spec/room_booker_spec.rb | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/room_booker.rb b/lib/room_booker.rb index 47dfafa3a..e7c1f3ce9 100644 --- a/lib/room_booker.rb +++ b/lib/room_booker.rb @@ -33,7 +33,6 @@ def list_reservations_by_date(date_range) end - def find_available_room return 1 if @reservations.empty? diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb index 0e57e2bcf..c57bee2c2 100644 --- a/spec/room_booker_spec.rb +++ b/spec/room_booker_spec.rb @@ -23,9 +23,11 @@ end end - # describe 'list_reservations_by_date method' do - # it '' do - # end + describe 'list_reservations_by_date method' do + it 'Returns an array' do + expect(@reservation_1.list_reservations_by_date(@date_range_1)).must_be_kind_of Array + end + end describe 'find_available_room method' do before do @@ -37,8 +39,9 @@ expect(@reservation_2.find_available_room).must_equal 1 end - it 'Returns the first available room' do - end + # it 'Returns the first available room' do + # end + end From 3998e00dee6ba9aa052649224ad42a4e6a4dcb50 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Fri, 7 Sep 2018 15:45:05 -0700 Subject: [PATCH 24/47] renamed RoomBooker class to BookingSystem class --- lib/room_booker.rb | 64 ---------------------------------------- spec/room_booker_spec.rb | 52 -------------------------------- 2 files changed, 116 deletions(-) delete mode 100644 lib/room_booker.rb delete mode 100644 spec/room_booker_spec.rb diff --git a/lib/room_booker.rb b/lib/room_booker.rb deleted file mode 100644 index e7c1f3ce9..000000000 --- a/lib/room_booker.rb +++ /dev/null @@ -1,64 +0,0 @@ -require_relative 'reservation' -require_relative 'date_range' - -module Hotel - class RoomBooker - attr_reader :room, :reservations - - # TODO: Change class name to booking system? - - def initialize - # All my rooms - @room = (1..20).to_a - # List of reservations. Organized by room? - @reservations = [] - end - - def list_rooms - return @room - end - - def make_reservation(date_range, room=nil) - #think...what if there's no available rooms, raise an exception - room_number = find_available_room - reservation = Reservation.new(date_range, room_number) - @reservations << reservation - end - - # If we need reservations for a particular room: - # @reservations.select { |res| res.room_number == room_number } - - def list_reservations_by_date(date_range) - return @reservations.select { |res| res.date_range == date_range } - - end - - def find_available_room - - return 1 if @reservations.empty? - - unavailable_rooms = [] - available_rooms = [] - - @reservations.each do |res| - if date_overlaps?(res.date_range) - unavailable_rooms << res.room - else - available_rooms << res.room - end - end - - return available_rooms.first - end - - - - - - - - end -end - -# a = Hotel::RoomBooker.new() -# puts a.list_rooms diff --git a/spec/room_booker_spec.rb b/spec/room_booker_spec.rb deleted file mode 100644 index c57bee2c2..000000000 --- a/spec/room_booker_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require_relative 'spec_helper' - -describe "RoomBooker Class" do - before do - @date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') - @reservation_1 = Hotel::RoomBooker.new() - @reservation_1.make_reservation(@date_range_1) - end - - describe "Initializer" do - it 'Creates an array of room numbers' do - expect(@reservation_1.room).must_be_kind_of Array - end - - it 'Creates an array of reservation instances' do - expect(@reservation_1.reservations[0]).must_be_kind_of Hotel::Reservation - end - end - - describe "list_rooms method" do - it 'Returns an array of room numbers' do - expect(@reservation_1.list_rooms).must_be_kind_of Array - end - end - - describe 'list_reservations_by_date method' do - it 'Returns an array' do - expect(@reservation_1.list_reservations_by_date(@date_range_1)).must_be_kind_of Array - end - end - - describe 'find_available_room method' do - before do - @date_range_2 = Hotel::DateRange.new('2018-09-01', '2018-09-05') - @reservation_2 = Hotel::RoomBooker.new() - end - - it 'Returns 1 if the reservations are empty' do - expect(@reservation_2.find_available_room).must_equal 1 - end - - # it 'Returns the first available room' do - # end - - - end - - - - - -end From daae5bf613a52a6024418e3f8628b8b34cbb5047 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Fri, 7 Sep 2018 15:45:54 -0700 Subject: [PATCH 25/47] modified all files that contained previous RoomBooker class to BookingSystem --- lib/booking_system.rb | 61 +++++++++++++++++++++++++++++++++++++++++ lib/date_range.rb | 3 +- lib/reservation.rb | 6 ---- spec/booking_system.rb | 52 +++++++++++++++++++++++++++++++++++ spec/date_range_spec.rb | 4 +-- spec/spec_helper.rb | 2 +- 6 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 lib/booking_system.rb create mode 100644 spec/booking_system.rb diff --git a/lib/booking_system.rb b/lib/booking_system.rb new file mode 100644 index 000000000..03593474a --- /dev/null +++ b/lib/booking_system.rb @@ -0,0 +1,61 @@ +require_relative 'reservation' +require_relative 'date_range' + +module Hotel + class BookingSystem + attr_reader :room, :reservations + + # TODO: Change class name to booking system? + + def initialize + # All my rooms + @room = (1..20).to_a + # List of reservations. Organized by room? + @reservations = [] + end + + def list_rooms + return @room + end + + def make_reservation(date_range, room=nil) + #think...what if there's no available rooms, raise an exception + room_number = find_available_room + reservation = Reservation.new(date_range, room_number) + @reservations << reservation + end + + # If we need reservations for a particular room: + # @reservations.select { |res| res.room_number == room_number } + + def list_reservations_by_date(date_range) + return @reservations.select { |res| res.date_range == date_range } + + end + + def find_available_room + + return 1 if @reservations.empty? + + unavailable_rooms = [] + available_rooms = [] + + @reservations.each do |res| + if date_overlaps?(res.date_range) + unavailable_rooms << res.room + else + available_rooms << res.room + end + end + + return available_rooms.first + end + + + + + + + + end +end diff --git a/lib/date_range.rb b/lib/date_range.rb index 9a59798d8..dfc057e33 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,5 +1,4 @@ require 'date' -require_relative 'room_booker' require 'pry' module Hotel @@ -56,7 +55,7 @@ def dates_overlap?(date_range) # ends on check-in date elsif new_dates.last == booked_dates.first return false - # same dates + # same dates elsif new_dates.first == booked_dates.first || new_dates.last == booked_dates.first return true end diff --git a/lib/reservation.rb b/lib/reservation.rb index e93597755..66f0f300f 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,9 +1,3 @@ -require 'awesome_print' -require_relative 'date_range' - -=begin -1. This will keep track of one reservation -=end module Hotel class Reservation diff --git a/spec/booking_system.rb b/spec/booking_system.rb new file mode 100644 index 000000000..d43ac1e27 --- /dev/null +++ b/spec/booking_system.rb @@ -0,0 +1,52 @@ +require_relative 'spec_helper' + +describe "BookingSystem Class" do + before do + @date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') + @reservation_1 = Hotel::BookingSystem.new() + @reservation_1.make_reservation(@date_range_1) + end + + describe "Initializer" do + it 'Creates an array of room numbers' do + expect(@reservation_1.room).must_be_kind_of Array + end + + it 'Creates an array of reservation instances' do + expect(@reservation_1.reservations[0]).must_be_kind_of Hotel::Reservation + end + end + + describe "list_rooms method" do + it 'Returns an array of room numbers' do + expect(@reservation_1.list_rooms).must_be_kind_of Array + end + end + + describe 'list_reservations_by_date method' do + it 'Returns an array' do + expect(@reservation_1.list_reservations_by_date(@date_range_1)).must_be_kind_of Array + end + end + + describe 'find_available_room method' do + before do + @date_range_2 = Hotel::DateRange.new('2018-09-01', '2018-09-05') + @reservation_2 = Hotel::BookingSystem.new() + end + + it 'Returns 1 if the reservations are empty' do + expect(@reservation_2.find_available_room).must_equal 1 + end + + # it 'Returns the first available room' do + # end + + + end + + + + + +end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index 055b13d95..c89d64770 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -3,13 +3,13 @@ describe 'DateRange Class' do before do @date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') - @reservation_1 = Hotel::RoomBooker.new() + @reservation_1 = Hotel::BookingSystem.new() @reservation_1.make_reservation(@date_range_1) end let (:date_range_2) { Hotel::DateRange.new('2018-09-01', '2018-09-05') } let (:reservation_2) { - Hotel::RoomBooker.new().make_reservation(date_range_2) + Hotel::BookingSystem.new().make_reservation(date_range_2) } let (:date_range_3) { Hotel::DateRange.new('2018-08-31', '2018-09-02') } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index bd32a1b46..548d38c15 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -11,4 +11,4 @@ # Require_relative your lib files here! require_relative '../lib/date_range.rb' require_relative '../lib/reservation.rb' -require_relative '../lib/room_booker.rb' +require_relative '../lib/booking_system.rb' From 404ba28de06c06375a7938d6c39efa787d409a1c Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Fri, 7 Sep 2018 16:57:02 -0700 Subject: [PATCH 26/47] added a date_range parameter to the find_available_room method --- lib/booking_system.rb | 10 ++++--- ...oking_system.rb => booking_system_spec.rb} | 27 ++++++++++++++++--- 2 files changed, 31 insertions(+), 6 deletions(-) rename spec/{booking_system.rb => booking_system_spec.rb} (61%) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 03593474a..2cbb4dfc2 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -20,7 +20,7 @@ def list_rooms def make_reservation(date_range, room=nil) #think...what if there's no available rooms, raise an exception - room_number = find_available_room + room_number = find_available_room(date_range) reservation = Reservation.new(date_range, room_number) @reservations << reservation end @@ -33,7 +33,7 @@ def list_reservations_by_date(date_range) end - def find_available_room + def find_available_room(date_range) return 1 if @reservations.empty? @@ -41,7 +41,8 @@ def find_available_room available_rooms = [] @reservations.each do |res| - if date_overlaps?(res.date_range) + + if date_range.dates_overlap?(res.date_range) unavailable_rooms << res.room else available_rooms << res.room @@ -59,3 +60,6 @@ def find_available_room end end + +# a = Hotel::RoomBooker.new() +# puts a.list_rooms diff --git a/spec/booking_system.rb b/spec/booking_system_spec.rb similarity index 61% rename from spec/booking_system.rb rename to spec/booking_system_spec.rb index d43ac1e27..418dedbec 100644 --- a/spec/booking_system.rb +++ b/spec/booking_system_spec.rb @@ -17,6 +17,9 @@ end end + describe 'make_reservation method' do + end + describe "list_rooms method" do it 'Returns an array of room numbers' do expect(@reservation_1.list_rooms).must_be_kind_of Array @@ -24,9 +27,27 @@ end describe 'list_reservations_by_date method' do - it 'Returns an array' do - expect(@reservation_1.list_reservations_by_date(@date_range_1)).must_be_kind_of Array + before do + 9.times do + @reservation_1.make_reservation(@date_range_1) + end + end + + it 'Returns an array of reservation instances' do + expect(@reservation.list_reservations_by_date(@date_range_1)).must_be_kind_of Array + end + + it 'Returns the correct length of the array' do + expect(@reservation.list_reservations_by_date(@date_range_1).length).must_equal 10 end + + it 'Correctly returns the first reservation for that date range' do + end + + it 'Correctly returns the last reservation for that date range' do + end + + end describe 'find_available_room method' do @@ -36,7 +57,7 @@ end it 'Returns 1 if the reservations are empty' do - expect(@reservation_2.find_available_room).must_equal 1 + expect(@reservation_2.find_available_room(@date_range_2)).must_equal 1 end # it 'Returns the first available room' do From bd5a54cf4245591f04226a465485eeffc4517317 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Fri, 7 Sep 2018 18:20:20 -0700 Subject: [PATCH 27/47] fixed logic on find_available_room method --- lib/booking_system.rb | 24 ++++++++++++++--------- lib/date_range.rb | 3 +++ spec/booking_system_spec.rb | 39 +++++++++++++++++++++++-------------- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 2cbb4dfc2..cfe62c7fe 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -18,34 +18,40 @@ def list_rooms return @room end - def make_reservation(date_range, room=nil) + def make_reservation(date_range) #think...what if there's no available rooms, raise an exception - room_number = find_available_room(date_range) - reservation = Reservation.new(date_range, room_number) + room = find_available_room(date_range) + reservation = Reservation.new(date_range, room) @reservations << reservation end # If we need reservations for a particular room: # @reservations.select { |res| res.room_number == room_number } - def list_reservations_by_date(date_range) + def reservations_by_date(date_range) return @reservations.select { |res| res.date_range == date_range } - end def find_available_room(date_range) + # TODO: refactor? + return 1 if @reservations.empty? unavailable_rooms = [] available_rooms = [] @reservations.each do |res| - if date_range.dates_overlap?(res.date_range) - unavailable_rooms << res.room - else - available_rooms << res.room + unavailable_rooms << res.room_number + end + end + + @room.each do |r| + unavailable_rooms.each do |unavailable_room| + if r != unavailable_room + available_rooms << r + end end end diff --git a/lib/date_range.rb b/lib/date_range.rb index dfc057e33..430c423d6 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -34,6 +34,9 @@ def dates_overlap?(date_range) booked_dates = [*date_range.start_date..date_range.end_date] new_dates = [*@start_date..@end_date] + + # TODO: refactor this + # completely containing if new_dates.first < booked_dates.first && new_dates.last > booked_dates.last return true diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index 418dedbec..0faa1eba3 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -3,45 +3,54 @@ describe "BookingSystem Class" do before do @date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') - @reservation_1 = Hotel::BookingSystem.new() - @reservation_1.make_reservation(@date_range_1) + @date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') + @date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') + @reservation = Hotel::BookingSystem.new() + + 5.times do + @reservation.make_reservation(@date_range_1) + end + + 2.times do + @reservation.make_reservation(@date_range_2) + end + + 3.times do + @reservation.make_reservation(@date_range_3) + end end describe "Initializer" do it 'Creates an array of room numbers' do - expect(@reservation_1.room).must_be_kind_of Array + expect(@reservation.room).must_be_kind_of Array end it 'Creates an array of reservation instances' do - expect(@reservation_1.reservations[0]).must_be_kind_of Hotel::Reservation + expect(@reservation.reservations[0]).must_be_kind_of Hotel::Reservation end end - describe 'make_reservation method' do - end + # describe 'make_reservation method' do + # end describe "list_rooms method" do it 'Returns an array of room numbers' do - expect(@reservation_1.list_rooms).must_be_kind_of Array + expect(@reservation.list_rooms).must_be_kind_of Array end end - describe 'list_reservations_by_date method' do - before do - 9.times do - @reservation_1.make_reservation(@date_range_1) - end - end + describe 'reservations_by_date method' do it 'Returns an array of reservation instances' do - expect(@reservation.list_reservations_by_date(@date_range_1)).must_be_kind_of Array + expect(@reservation.reservations_by_date(@date_range_1)).must_be_kind_of Array end it 'Returns the correct length of the array' do - expect(@reservation.list_reservations_by_date(@date_range_1).length).must_equal 10 + expect(@reservation.reservations_by_date(@date_range_1).length).must_equal 10 end it 'Correctly returns the first reservation for that date range' do + expect(@reservation).reservations_by_date(@date_range_2) end it 'Correctly returns the last reservation for that date range' do From 4d0e0c65fe5507fd9dbeb5dee7502c9c560ecd80 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sat, 8 Sep 2018 17:37:40 -0700 Subject: [PATCH 28/47] finally added correct available room to a reservation --- lib/booking_system.rb | 79 +++++++++++++++++++++++++++++++------ spec/booking_system_spec.rb | 36 ++++++++++++----- 2 files changed, 94 insertions(+), 21 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index cfe62c7fe..962229c79 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -12,6 +12,7 @@ def initialize @room = (1..20).to_a # List of reservations. Organized by room? @reservations = [] + end def list_rooms @@ -20,15 +21,17 @@ def list_rooms def make_reservation(date_range) #think...what if there's no available rooms, raise an exception + room = find_available_room(date_range) reservation = Reservation.new(date_range, room) + @reservations << reservation end # If we need reservations for a particular room: # @reservations.select { |res| res.room_number == room_number } - def reservations_by_date(date_range) + def list_reservations_by_date(date_range) return @reservations.select { |res| res.date_range == date_range } end @@ -38,34 +41,86 @@ def find_available_room(date_range) return 1 if @reservations.empty? + + puts 'BEFORE RESERVATIONS LOOP' unavailable_rooms = [] + puts "unavailable rooms:" + puts "#{unavailable_rooms}" + puts "available rooms" available_rooms = [] + puts "#{available_rooms}" + puts + puts @reservations.each do |res| if date_range.dates_overlap?(res.date_range) + # binding.pry unavailable_rooms << res.room_number - end - end + else - @room.each do |r| - unavailable_rooms.each do |unavailable_room| - if r != unavailable_room - available_rooms << r - end end end + puts "AFTER RESERVATIONS LOOP" + puts "unavailable rooms:" + puts "#{unavailable_rooms}" + puts "available rooms" + puts "#{available_rooms}" + puts + puts + + + available_rooms = @room.reject { |r| unavailable_rooms.include?(r) } + + # binding.pry + + # @room.each do |r| + # unavailable_rooms.each do |unavailable_room| + # if r != unavailable_room + # available_rooms << r + # + # end + # end + # end + + puts "AFTER ROOM LOOP" + puts "unavailable rooms:" + puts "#{unavailable_rooms}" + puts "available rooms" + puts "#{available_rooms}" + puts + puts + puts "ROOM ARRAY" + puts "#{@room}" + puts "*" * 50 return available_rooms.first - end + end + + end +end +date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') +date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +reservation = Hotel::BookingSystem.new() +5.times do + reservation.make_reservation(date_range_1) +end +2.times do + reservation.make_reservation(date_range_2) +end - end +3.times do + reservation.make_reservation(date_range_3) end -# a = Hotel::RoomBooker.new() -# puts a.list_rooms + +array = reservation.reservations +array.each_with_index do |res, i| + puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +end diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index 0faa1eba3..648e1b644 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -1,4 +1,5 @@ require_relative 'spec_helper' +require 'date' describe "BookingSystem Class" do before do @@ -23,34 +24,52 @@ describe "Initializer" do it 'Creates an array of room numbers' do expect(@reservation.room).must_be_kind_of Array + expect(@reservation.room.length).must_equal 20 end it 'Creates an array of reservation instances' do - expect(@reservation.reservations[0]).must_be_kind_of Hotel::Reservation + expect(@reservation.reservations.length).must_equal 10 + all_rervations = @reservation.reservations + all_rervations.each do |r| + expect(r).must_be_kind_of Hotel::Reservation + end end end - # describe 'make_reservation method' do - # end - describe "list_rooms method" do it 'Returns an array of room numbers' do expect(@reservation.list_rooms).must_be_kind_of Array + expect(@reservation.room.length).must_equal 20 end end - describe 'reservations_by_date method' do + describe 'make_reservation method' do + end + + describe 'list_reservations_by_date method' do + let (:reservations_list) { @reservation.list_reservations_by_date(@date_range_2) + } it 'Returns an array of reservation instances' do - expect(@reservation.reservations_by_date(@date_range_1)).must_be_kind_of Array + res_by_date = @reservation.list_reservations_by_date(@date_range_1) + expect(res_by_date).must_be_kind_of Array end it 'Returns the correct length of the array' do - expect(@reservation.reservations_by_date(@date_range_1).length).must_equal 10 + expect(@reservation.list_reservations_by_date(@date_range_1).length).must_equal 5 + end + + it 'Correctly returns the reservations for that date range' do + expect(reservations_list).must_equal reservations_list end it 'Correctly returns the first reservation for that date range' do - expect(@reservation).reservations_by_date(@date_range_2) + first = reservations_list.first + date = Date.parse('2018-09-15') + + binding.pry + expect(first.room_number).must_equal 6 + expect(first.date_range.start_date).must_equal date end it 'Correctly returns the last reservation for that date range' do @@ -61,7 +80,6 @@ describe 'find_available_room method' do before do - @date_range_2 = Hotel::DateRange.new('2018-09-01', '2018-09-05') @reservation_2 = Hotel::BookingSystem.new() end From 1cf82b4a4cd63b7a3f6736ab4090f349079c6199 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sat, 8 Sep 2018 18:27:44 -0700 Subject: [PATCH 29/47] added tests for correctly listing reservations by date --- lib/booking_system.rb | 101 ++++++++++++++++++++---------------- spec/booking_system_spec.rb | 63 +++++++++++++++++----- 2 files changed, 106 insertions(+), 58 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 962229c79..aba1ef04e 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -5,6 +5,8 @@ module Hotel class BookingSystem attr_reader :room, :reservations + @@available_rooms = [] + # TODO: Change class name to booking system? def initialize @@ -42,15 +44,15 @@ def find_available_room(date_range) return 1 if @reservations.empty? - puts 'BEFORE RESERVATIONS LOOP' + # puts 'BEFORE RESERVATIONS LOOP' unavailable_rooms = [] - puts "unavailable rooms:" - puts "#{unavailable_rooms}" - puts "available rooms" + # puts "unavailable rooms:" + # puts "#{unavailable_rooms}" + # puts "available rooms" available_rooms = [] - puts "#{available_rooms}" - puts - puts + # puts "#{available_rooms}" + # puts + # puts @reservations.each do |res| if date_range.dates_overlap?(res.date_range) @@ -61,16 +63,17 @@ def find_available_room(date_range) end end - puts "AFTER RESERVATIONS LOOP" - puts "unavailable rooms:" - puts "#{unavailable_rooms}" - puts "available rooms" - puts "#{available_rooms}" - puts - puts + # puts "AFTER RESERVATIONS LOOP" + # puts "unavailable rooms:" + # puts "#{unavailable_rooms}" + # puts "available rooms" + # puts "#{available_rooms}" + # puts + # puts available_rooms = @room.reject { |r| unavailable_rooms.include?(r) } + @@available_rooms = available_rooms # binding.pry @@ -83,44 +86,50 @@ def find_available_room(date_range) # end # end - puts "AFTER ROOM LOOP" - puts "unavailable rooms:" - puts "#{unavailable_rooms}" - puts "available rooms" - puts "#{available_rooms}" - puts - puts - puts "ROOM ARRAY" - puts "#{@room}" - puts "*" * 50 + # puts "AFTER ROOM LOOP" + # puts "unavailable rooms:" + # puts "#{unavailable_rooms}" + # puts "available rooms" + # puts "#{available_rooms}" + # puts + # puts + # puts "ROOM ARRAY" + # puts "#{@room}" + # puts "*" * 50 return available_rooms.first end + def self.available_rooms + return @@available_rooms + end - end -end - -date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') -date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') -date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') -reservation = Hotel::BookingSystem.new() - -5.times do - reservation.make_reservation(date_range_1) -end - -2.times do - reservation.make_reservation(date_range_2) -end -3.times do - reservation.make_reservation(date_range_3) + end end - -array = reservation.reservations -array.each_with_index do |res, i| - puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" -end +# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +# date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') +# date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +# reservation = Hotel::BookingSystem.new() +# +# 5.times do +# reservation.make_reservation(date_range_1) +# end +# +# 2.times do +# reservation.make_reservation(date_range_2) +# end +# +# 3.times do +# reservation.make_reservation(date_range_3) +# end +# +# +# array = reservation.reservations +# array.each_with_index do |res, i| +# puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# end +# +# puts "#{Hotel::BookingSystem.available_rooms}" diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index 648e1b644..6afeb1764 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -47,32 +47,71 @@ end describe 'list_reservations_by_date method' do - let (:reservations_list) { @reservation.list_reservations_by_date(@date_range_2) + let (:reservations_list_1) { + @reservation.list_reservations_by_date(@date_range_1) + } + + let (:reservations_list_2) { + @reservation.list_reservations_by_date(@date_range_2) + } + + let (:reservations_list_3) { + @reservation.list_reservations_by_date(@date_range_3) } it 'Returns an array of reservation instances' do - res_by_date = @reservation.list_reservations_by_date(@date_range_1) - expect(res_by_date).must_be_kind_of Array + expect(reservations_list_1).must_be_kind_of Array + reservations_list_1.each do |r| + expect(r).must_be_kind_of Hotel::Reservation + end end it 'Returns the correct length of the array' do - expect(@reservation.list_reservations_by_date(@date_range_1).length).must_equal 5 + expect(reservations_list_1.length).must_equal 5 end it 'Correctly returns the reservations for that date range' do - expect(reservations_list).must_equal reservations_list + expect(reservations_list_1).must_equal reservations_list_1 end - it 'Correctly returns the first reservation for that date range' do - first = reservations_list.first - date = Date.parse('2018-09-15') + it 'Correctly returns the first reservation on the list for that date range' do + first_on_list_1 = reservations_list_1.first + date_1 = @date_range_1.start_date + + first_on_list_2= reservations_list_2.first + date_2 = @date_range_2.start_date + + first_on_list_3 = reservations_list_3.first + date_3 = @date_range_3.start_date - binding.pry - expect(first.room_number).must_equal 6 - expect(first.date_range.start_date).must_equal date + expect(first_on_list_1.room_number).must_equal 1 + expect(first_on_list_1.date_range.start_date).must_equal date_1 + + expect(first_on_list_2.room_number).must_equal 1 + expect(first_on_list_2.date_range.start_date).must_equal date_2 + + expect(first_on_list_3.room_number).must_equal 6 + expect(first_on_list_3.date_range.start_date).must_equal date_3 end - it 'Correctly returns the last reservation for that date range' do + it 'Correctly returns the last reservation on the list for that date range' do + last_on_list_1 = reservations_list_1.last + date_1 = @date_range_1.start_date + + last_on_list_2= reservations_list_2.last + date_2 = @date_range_2.start_date + + last_on_list_3 = reservations_list_3.last + date_3 = @date_range_3.start_date + + expect(last_on_list_1.room_number).must_equal 5 + expect(last_on_list_1.date_range.start_date).must_equal date_1 + + expect(last_on_list_2.room_number).must_equal 2 + expect(last_on_list_2.date_range.start_date).must_equal date_2 + + expect(last_on_list_3.room_number).must_equal 8 + expect(last_on_list_3.date_range.start_date).must_equal date_3 end From 84a19a2b454f1918a7fbd34c4c72cb50309df284 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sat, 8 Sep 2018 21:16:29 -0700 Subject: [PATCH 30/47] added list available rooms method for a date range --- lib/booking_system.rb | 72 +++++++++++++++++++++++++------------ spec/booking_system_spec.rb | 18 ++++++---- 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index aba1ef04e..7ef0354a5 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -5,7 +5,6 @@ module Hotel class BookingSystem attr_reader :room, :reservations - @@available_rooms = [] # TODO: Change class name to booking system? @@ -24,7 +23,8 @@ def list_rooms def make_reservation(date_range) #think...what if there's no available rooms, raise an exception - room = find_available_room(date_range) + room = find_available_rooms(date_range)[0] + reservation = Reservation.new(date_range, room) @reservations << reservation @@ -33,15 +33,15 @@ def make_reservation(date_range) # If we need reservations for a particular room: # @reservations.select { |res| res.room_number == room_number } - def list_reservations_by_date(date_range) + def list_reservations(date_range) return @reservations.select { |res| res.date_range == date_range } end - def find_available_room(date_range) + def find_available_rooms(date_range) # TODO: refactor? - - return 1 if @reservations.empty? + room_1 = [1] + return room_1 if @reservations.empty? # puts 'BEFORE RESERVATIONS LOOP' @@ -49,7 +49,6 @@ def find_available_room(date_range) # puts "unavailable rooms:" # puts "#{unavailable_rooms}" # puts "available rooms" - available_rooms = [] # puts "#{available_rooms}" # puts # puts @@ -73,7 +72,7 @@ def find_available_room(date_range) available_rooms = @room.reject { |r| unavailable_rooms.include?(r) } - @@available_rooms = available_rooms + # binding.pry @@ -96,37 +95,64 @@ def find_available_room(date_range) # puts "ROOM ARRAY" # puts "#{@room}" # puts "*" * 50 - return available_rooms.first + return available_rooms end - def self.available_rooms - return @@available_rooms + def list_available_rooms(date_range) + return @room if @reservations.empty? + + return find_available_rooms(date_range) + # def self.available_rooms + # return @@available_rooms + # end end end end -# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') -# date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') -# date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') -# reservation = Hotel::BookingSystem.new() +date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') +date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') +reservation = Hotel::BookingSystem.new() +reservation_1 = Hotel::BookingSystem.new() + +5.times do + reservation.make_reservation(date_range_1) +end + +2.times do + reservation.make_reservation(date_range_2) +end + +3.times do + reservation.make_reservation(date_range_3) +end + +puts "#{reservation.list_available_rooms(date_range_1)}" +puts "#{reservation_1.list_available_rooms(date_range_1)}" +puts "#{reservation.list_available_rooms(date_range_4)}" + + # -# 5.times do -# reservation.make_reservation(date_range_1) +# puts reservation.list_reservations(date_range_1).first.room_number +# puts reservation.list_reservations(date_range_1).last.room_number + +# reservation.list_reservations(date_range_1).each_with_index do |res, i| +# puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" # end +# # # -# 2.times do -# reservation.make_reservation(date_range_2) +# reservation.list_reservations(date_range_2).each_with_index do |res, i| +# puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" # end # -# 3.times do -# reservation.make_reservation(date_range_3) +# reservation.list_reservations(date_range_3).each_with_index do |res, i| +# puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" # end -# -# # array = reservation.reservations # array.each_with_index do |res, i| # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index 6afeb1764..520f63159 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -44,19 +44,25 @@ end describe 'make_reservation method' do + it 'Assigns the correct first available room to the reservation' do + end + + it '' do + end + end - describe 'list_reservations_by_date method' do + describe 'list_reservations method' do let (:reservations_list_1) { - @reservation.list_reservations_by_date(@date_range_1) + @reservation.list_reservations(@date_range_1) } let (:reservations_list_2) { - @reservation.list_reservations_by_date(@date_range_2) + @reservation.list_reservations(@date_range_2) } let (:reservations_list_3) { - @reservation.list_reservations_by_date(@date_range_3) + @reservation.list_reservations(@date_range_3) } it 'Returns an array of reservation instances' do @@ -117,13 +123,13 @@ end - describe 'find_available_room method' do + describe 'find_available_rooms method' do before do @reservation_2 = Hotel::BookingSystem.new() end it 'Returns 1 if the reservations are empty' do - expect(@reservation_2.find_available_room(@date_range_2)).must_equal 1 + expect(@reservation_2.find_available_rooms(@date_range_2).first).must_equal 1 end # it 'Returns the first available room' do From ea0071f03f740ee176629fd2f7311025550a2f1f Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sat, 8 Sep 2018 23:23:27 -0700 Subject: [PATCH 31/47] added error handling for when booking a room that is not available --- lib/booking_system.rb | 77 ++++++++++++++++++++----------------- spec/booking_system_spec.rb | 18 +++++++-- 2 files changed, 57 insertions(+), 38 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 7ef0354a5..eed37f562 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -23,7 +23,7 @@ def list_rooms def make_reservation(date_range) #think...what if there's no available rooms, raise an exception - room = find_available_rooms(date_range)[0] + room = find_available_rooms(date_range).first reservation = Reservation.new(date_range, room) @@ -57,8 +57,6 @@ def find_available_rooms(date_range) if date_range.dates_overlap?(res.date_range) # binding.pry unavailable_rooms << res.room_number - else - end end @@ -70,34 +68,39 @@ def find_available_rooms(date_range) # puts # puts + begin - available_rooms = @room.reject { |r| unavailable_rooms.include?(r) } - + available_rooms = @room.reject { |r| unavailable_rooms.include?(r) } - # binding.pry + raise "No rooms available for those dates." if available_rooms.empty? - # @room.each do |r| - # unavailable_rooms.each do |unavailable_room| - # if r != unavailable_room - # available_rooms << r - # - # end - # end - # end + rescue RuntimeError => exception + puts "Please try another hotel. #{exception.message}" - # puts "AFTER ROOM LOOP" - # puts "unavailable rooms:" - # puts "#{unavailable_rooms}" - # puts "available rooms" - # puts "#{available_rooms}" - # puts - # puts - # puts "ROOM ARRAY" - # puts "#{@room}" - # puts "*" * 50 - return available_rooms + # binding.pry + # @room.each do |r| + # unavailable_rooms.each do |unavailable_room| + # if r != unavailable_room + # available_rooms << r + # + # end + # end + # end + + # puts "AFTER ROOM LOOP" + # puts "unavailable rooms:" + # puts "#{unavailable_rooms}" + # puts "available rooms" + # puts "#{available_rooms}" + # puts + # puts + # puts "ROOM ARRAY" + # puts "#{@room}" + # puts "*" * 50 + end + return available_rooms end def list_available_rooms(date_range) @@ -109,6 +112,8 @@ def list_available_rooms(date_range) # end end + + end end @@ -120,21 +125,23 @@ def list_available_rooms(date_range) reservation = Hotel::BookingSystem.new() reservation_1 = Hotel::BookingSystem.new() -5.times do +20.times do reservation.make_reservation(date_range_1) end -2.times do - reservation.make_reservation(date_range_2) -end +# 2.times do +# reservation.make_reservation(date_range_2) +# end +# +# 3.times do +# reservation.make_reservation(date_range_3) +# end -3.times do - reservation.make_reservation(date_range_3) -end +puts reservation.find_available_rooms(date_range_1) -puts "#{reservation.list_available_rooms(date_range_1)}" -puts "#{reservation_1.list_available_rooms(date_range_1)}" -puts "#{reservation.list_available_rooms(date_range_4)}" +# puts "#{reservation.list_available_rooms(date_range_1)}" +# puts "#{reservation_1.list_available_rooms(date_range_1)}" +# puts "#{reservation.list_available_rooms(date_range_4)}" # diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index 520f63159..a3527b88c 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -124,12 +124,24 @@ end describe 'find_available_rooms method' do - before do - @reservation_2 = Hotel::BookingSystem.new() + let (:reservation_2) { Hotel::BookingSystem.new() } + let (:reservation_3) { Hotel::BookingSystem.new() } + let (:hotel_full) { + 20.times do + hotel_full.make_reservation(@date_range_1) + end + } + + it 'Returns an array of available rooms for the date range' do + end it 'Returns 1 if the reservations are empty' do - expect(@reservation_2.find_available_rooms(@date_range_2).first).must_equal 1 + expect(reservation_2.find_available_rooms(@date_range_1).first).must_equal 1 + end + + it 'Raises an exception when there are no available rooms' do + end # it 'Returns the first available room' do From cb0bd73feaf49c266ba383be8eab497a409a69bc Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 9 Sep 2018 20:11:44 -0700 Subject: [PATCH 32/47] added block room class --- lib/block_room.rb | 108 ++++++++++++++++++++++++++++++++++++++++ spec/block_room_spec.rb | 24 +++++++++ 2 files changed, 132 insertions(+) create mode 100644 lib/block_room.rb create mode 100644 spec/block_room_spec.rb diff --git a/lib/block_room.rb b/lib/block_room.rb new file mode 100644 index 000000000..3409bf452 --- /dev/null +++ b/lib/block_room.rb @@ -0,0 +1,108 @@ +require_relative 'booking_system' + +module Hotel + class BlockRoom + + attr_reader :block_rooms + + def initialize + super + @block_rooms = nil + end + + def find_available_rooms(date_range) + super # do i need this line + puts "super before" + p super + puts + + super == [1] ? rooms = [*1..5] : rooms = super[0..4] + + puts "super after" + p super + puts + + puts "available rooms" + p rooms + puts + + @block_rooms = rooms + + return rooms + end + + #(is this private?) + def make_reservation(date_range) + #think...what if there's no available rooms, raise an exception + room = find_available_rooms(date_range).first + + reservation = Reservation.new(date_range, room) + @reservations << reservation + end + + + + + + end +end + + +# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +# # date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') +# # date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +# # date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') +# reservation_1 = Hotel::BookingSystem.new() +# +# reservation = Hotel::BlockRoom.new() +# # reservation_1 = Hotel::BookingSystem.new() +# +# 5.times do +# reservation_1.make_reservation(date_range_1) +# end +# +# puts "This is the 5 first reservations" +# p reservation_1.reservations[0].room_number +# p reservation_1.reservations[1].room_number +# p reservation_1.reservations[2].room_number +# p reservation_1.reservations[3].room_number +# p reservation_1.reservations[4].room_number +# puts +# +# +# 5.times do +# reservation.make_reservation(date_range_1) +# end +# +# puts "This should include all previous reservations" +# # reservation.each_with_index do |room, index| +# # p room.reservations[i] +# # end +# +# p reservation.reservations[1].room_number +# p reservation.reservations[2].room_number +# p reservation.reservations[3].room_number +# p reservation.reservations[4].room_number +# p reservation.reservations[5].room_number +# # p reservation.reservations[6].room_number +# # p reservation.reservations[7].room_number +# # p reservation.reservations[8].room_number +# # p reservation.reservations[9].room_number +# # 2.times do +# # reservation.make_reservation(date_range_2) +# # end +# # +# # 3.times do +# # reservation.make_reservation(date_range_3) +# # end +# # +# +# reservation.find_available_rooms(date_range_1) +# +# puts "block rooms" +# p reservation.block_rooms +# p reservation.reservations[1].block_room_cost +# # puts reservation.find_available_rooms(date_range_1).class +# # puts "#{reservation.list_available_rooms(date_range_1)}" +# # puts "#{reservation_1.list_available_rooms(date_range_1)}" +# # puts "#{reservation.list_available_rooms(date_range_4)}" diff --git a/spec/block_room_spec.rb b/spec/block_room_spec.rb new file mode 100644 index 000000000..2bfd94336 --- /dev/null +++ b/spec/block_room_spec.rb @@ -0,0 +1,24 @@ +require_relative 'spec_helper' + + +describe 'BlockRoom class' do + describe 'Initializer' do + + before do + @block_room = Hotel::BlockRoom.new() + end + + it 'Creates an instance of BlockRoom' do + expect(@block_room).must_be_kind_of Hotel::BlockRoom + end + + it 'Correctly calculates a discounted rate for the room block reservation' do + end + + + + + + +end +end From 45d390b04c52f4f9f45effbac0602fb5aa61c805 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 9 Sep 2018 20:22:41 -0700 Subject: [PATCH 33/47] removed TODO notes and misc comments on files to clean up code --- lib/booking_system.rb | 102 +++++++----------------------------- lib/date_range.rb | 54 +++++++------------ lib/reservation.rb | 9 ++-- spec/booking_system_spec.rb | 20 ++++--- spec/date_range_spec.rb | 10 ++-- spec/reservation_spec.rb | 19 +++++-- spec/spec_helper.rb | 1 + 7 files changed, 77 insertions(+), 138 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index eed37f562..ac2912927 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -5,15 +5,9 @@ module Hotel class BookingSystem attr_reader :room, :reservations - - # TODO: Change class name to booking system? - def initialize - # All my rooms @room = (1..20).to_a - # List of reservations. Organized by room? @reservations = [] - end def list_rooms @@ -21,113 +15,55 @@ def list_rooms end def make_reservation(date_range) - #think...what if there's no available rooms, raise an exception room = find_available_rooms(date_range).first - reservation = Reservation.new(date_range, room) - @reservations << reservation end - # If we need reservations for a particular room: - # @reservations.select { |res| res.room_number == room_number } def list_reservations(date_range) return @reservations.select { |res| res.date_range == date_range } end - def find_available_rooms(date_range) - # TODO: refactor? - room_1 = [1] - return room_1 if @reservations.empty? + def find_available_rooms(date_range) + return [1] if @reservations.empty? - # puts 'BEFORE RESERVATIONS LOOP' unavailable_rooms = [] - # puts "unavailable rooms:" - # puts "#{unavailable_rooms}" - # puts "available rooms" - # puts "#{available_rooms}" - # puts - # puts - @reservations.each do |res| if date_range.dates_overlap?(res.date_range) - # binding.pry unavailable_rooms << res.room_number end end - # puts "AFTER RESERVATIONS LOOP" - # puts "unavailable rooms:" - # puts "#{unavailable_rooms}" - # puts "available rooms" - # puts "#{available_rooms}" - # puts - # puts - - begin - - available_rooms = @room.reject { |r| unavailable_rooms.include?(r) } - - raise "No rooms available for those dates." if available_rooms.empty? - - rescue RuntimeError => exception - puts "Please try another hotel. #{exception.message}" - - - # binding.pry - - # @room.each do |r| - # unavailable_rooms.each do |unavailable_room| - # if r != unavailable_room - # available_rooms << r - # - # end - # end - # end - - # puts "AFTER ROOM LOOP" - # puts "unavailable rooms:" - # puts "#{unavailable_rooms}" - # puts "available rooms" - # puts "#{available_rooms}" - # puts - # puts - # puts "ROOM ARRAY" - # puts "#{@room}" - # puts "*" * 50 - end + available_rooms = @room.reject { |r| unavailable_rooms.include?(r) } + + raise StandardError, "No rooms available for those dates." if available_rooms.empty? + return available_rooms end def list_available_rooms(date_range) return @room if @reservations.empty? - return find_available_rooms(date_range) - # def self.available_rooms - # return @@available_rooms - # end end - - end end -date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') -date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') -date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') -date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') -reservation = Hotel::BookingSystem.new() -reservation_1 = Hotel::BookingSystem.new() - -20.times do - reservation.make_reservation(date_range_1) -end +# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +# date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') +# date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +# date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') +# reservation = Hotel::BookingSystem.new() +# reservation_1 = Hotel::BookingSystem.new() +# +# 20.times do +# reservation.make_reservation(date_range_1) +# end # 2.times do # reservation.make_reservation(date_range_2) @@ -136,9 +72,9 @@ def list_available_rooms(date_range) # 3.times do # reservation.make_reservation(date_range_3) # end - -puts reservation.find_available_rooms(date_range_1) - +# +# puts reservation.find_available_rooms(date_range_1) +# puts reservation.find_available_rooms(date_range_1).class # puts "#{reservation.list_available_rooms(date_range_1)}" # puts "#{reservation_1.list_available_rooms(date_range_1)}" # puts "#{reservation.list_available_rooms(date_range_4)}" diff --git a/lib/date_range.rb b/lib/date_range.rb index 430c423d6..dd4b4f75b 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -6,67 +6,53 @@ class DateRange attr_reader :start_date, :end_date # TODO: change class name to date range? - # change start_date t0 check-in + # change start_date t0 check-in def initialize(start_date, end_date) @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) end - def check_valid_dates - # TODO: - # - refactor to raise .. if .. - # - move this to duration class? + raise StandardError, "Invalid dates entered" if @start_date == nil || @end_date == nil - while @start_date == nil || @end_date == nil - raise ArgumentError, "Invalid dates entered" - end - while (@end_date - @start_date) <= 0 - raise ArgumentError, "End date cannot be before start date" - end + raise StandardError, "End date cannot be before start date" if (@end_date - @start_date) <= 0 end def dates_overlap?(date_range) - booked_dates = [*date_range.start_date..date_range.end_date] new_dates = [*@start_date..@end_date] - - # TODO: refactor this - # completely containing if new_dates.first < booked_dates.first && new_dates.last > booked_dates.last return true - # back end + # back end elsif new_dates.first < booked_dates.last && new_dates.last > booked_dates.last return true - # in the middle + # in the middle elsif new_dates.first > booked_dates.first && new_dates.last < booked_dates.last return true - # in the front + # in the front elsif new_dates.first < booked_dates.first && new_dates.last > booked_dates.first return true - # completely before + # completely before elsif new_dates.last < booked_dates.first return false - # completely after + # completely after elsif new_dates.first > booked_dates.last return false - # ends on check-in date + # ends on check-in date elsif new_dates.last == booked_dates.first return false - # same dates + # same dates elsif new_dates.first == booked_dates.first || new_dates.last == booked_dates.first return true end return false end - - end end @@ -81,19 +67,19 @@ def dates_overlap?(date_range) - #checking overlapping dates? - # input two dates to compare - # output (boolean) +#checking overlapping dates? +# input two dates to compare +# output (boolean) - #finding_available_room - #input start/end date - #output available room +#finding_available_room +#input start/end date +#output available room - #edge cases - #testing edge cases for date ranges +#edge cases +#testing edge cases for date ranges - #think...what if there's no available rooms - #what if (9/1-9/5) reservations: (9/1-9/2), (9/4-9/5), (9/1-9/1) (start, end) +#think...what if there's no available rooms +#what if (9/1-9/5) reservations: (9/1-9/2), (9/4-9/5), (9/1-9/1) (start, end) diff --git a/lib/reservation.rb b/lib/reservation.rb index 66f0f300f..af2fc4a2f 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,13 +4,12 @@ class Reservation # TODO: change duration to start/end dates PRICE_PER_NIGHT = 200.00 - attr_reader :date_range, :room_number + BLOCK_ROOM_DISCOUNT = 0.15 # 15% discounted rate + attr_reader :date_range, :room_number def initialize(date_range, room_number) @date_range = date_range - # @start_date = Date.parse(start_date) - # @end_date = Date.parse(end_date) @room_number = room_number end @@ -22,6 +21,10 @@ def total_cost return ("%.2f" % (number_of_nights * PRICE_PER_NIGHT)).to_f end + def block_room_cost + return (total_cost - (total_cost * BLOCK_ROOM_DISCOUNT)) + end + end diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index a3527b88c..d0d545e7b 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -126,23 +126,27 @@ describe 'find_available_rooms method' do let (:reservation_2) { Hotel::BookingSystem.new() } let (:reservation_3) { Hotel::BookingSystem.new() } - let (:hotel_full) { - 20.times do - hotel_full.make_reservation(@date_range_1) - end - } it 'Returns an array of available rooms for the date range' do end it 'Returns 1 if the reservations are empty' do + expect(reservation_2.reservations).must_be_empty expect(reservation_2.find_available_rooms(@date_range_1).first).must_equal 1 end - it 'Raises an exception when there are no available rooms' do - - end + # TODO - fix this test + # it 'Raises an exception when there are no available rooms' do + # hotel_booked = Hotel::BookingSystem.new() + # + # 20.times do + # hotel_booked.make_reservation(@date_range_1) + # # binding.pry + # end + # + # expect{hotel_booked.find_available_rooms(@date_range_1)}.must_raise StandardError + # end # it 'Returns the first available room' do # end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index c89d64770..9d1a9264c 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -29,23 +29,23 @@ end describe "check_valid_dates method" do - it 'Raises an ArgumentError for invalid date ranges' do + it 'Raises an StandardError for invalid date ranges' do expect{ @date_range_1.check_valid_dates('2018-09-05', '2018-09-01') - }.must_raise ArgumentError + }.must_raise StandardError expect{ @date_range_1.check_valid_dates('', '2018-09-01') - }.must_raise ArgumentError + }.must_raise StandardError expect{ @date_range_1.check_valid_dates('2018-09-01', '') - }.must_raise ArgumentError + }.must_raise StandardError expect{ @date_range_1.check_valid_dates('', '') - }.must_raise ArgumentError + }.must_raise StandardError end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 4fee397ed..3024dc896 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -3,12 +3,21 @@ describe "Reservation Class" do let (:date_range) { Hotel::DateRange.new('2018-09-01', '2018-09-05') } - let (:reservation) { Hotel::Reservation.new(date_range, 20)} + let (:reservation) { Hotel::Reservation.new(date_range, 1)} - # describe "initialize" do - # it 'Stores duration as an object' do - # expect(reservation.duration).must_be_kind_of Hotel::Duration - # end + describe "Initializer" do + it 'Is an instance of Reservation' do + expect(reservation).must_be_kind_of Hotel::Reservation + end + + it 'Takes date range as an instance of DateRange' do + expect(reservation.date_range).must_be_kind_of Hotel::DateRange + end + + it 'Takes room number as an integer' do + + end + end describe "total_cost" do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 548d38c15..7ab96d3dc 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,3 +12,4 @@ require_relative '../lib/date_range.rb' require_relative '../lib/reservation.rb' require_relative '../lib/booking_system.rb' +require_relative '../lib/block_room.rb' From 058ea1b2b97ee26c56b8a8243b2b68fc0787ddd2 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 9 Sep 2018 22:24:24 -0700 Subject: [PATCH 34/47] added more tests to the BookingSystem class --- lib/block_room.rb | 42 +++----------------- lib/booking_system.rb | 48 ++++++++++++---------- lib/date_range.rb | 36 ++--------------- lib/reservation.rb | 16 -------- spec/booking_system_spec.rb | 79 ++++++++++++++++++++++--------------- spec/date_range_spec.rb | 19 ++++----- spec/reservation_spec.rb | 13 ++++-- 7 files changed, 99 insertions(+), 154 deletions(-) diff --git a/lib/block_room.rb b/lib/block_room.rb index 3409bf452..9cac91bca 100644 --- a/lib/block_room.rb +++ b/lib/block_room.rb @@ -3,46 +3,14 @@ module Hotel class BlockRoom - attr_reader :block_rooms + attr_reader :date_range, :block_rooms, :rate - def initialize - super - @block_rooms = nil + def initialize(date_range, block_rooms, rate) + @date_range = date_range + @block_rooms = block_rooms + @rate = rate end - def find_available_rooms(date_range) - super # do i need this line - puts "super before" - p super - puts - - super == [1] ? rooms = [*1..5] : rooms = super[0..4] - - puts "super after" - p super - puts - - puts "available rooms" - p rooms - puts - - @block_rooms = rooms - - return rooms - end - - #(is this private?) - def make_reservation(date_range) - #think...what if there's no available rooms, raise an exception - room = find_available_rooms(date_range).first - - reservation = Reservation.new(date_range, room) - @reservations << reservation - end - - - - end end diff --git a/lib/booking_system.rb b/lib/booking_system.rb index ac2912927..b2e995859 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -3,54 +3,62 @@ module Hotel class BookingSystem - attr_reader :room, :reservations + + attr_reader :rooms, :reservations, :block_rooms def initialize - @room = (1..20).to_a + @rooms = (1..20).to_a @reservations = [] + @block_rooms = [] end + def list_rooms - return @room + return @rooms end - def make_reservation(date_range) - room = find_available_rooms(date_range).first - reservation = Reservation.new(date_range, room) - @reservations << reservation + def list_reservations(date_range) + return @reservations.select { |res| res.date_range == date_range } end - def list_reservations(date_range) - return @reservations.select { |res| res.date_range == date_range } + def list_available_rooms(date_range) + return @rooms if @reservations.empty? + return find_available_rooms(date_range) end def find_available_rooms(date_range) - return [1] if @reservations.empty? + return @rooms if @reservations.empty? - unavailable_rooms = [] - @reservations.each do |res| - if date_range.dates_overlap?(res.date_range) - unavailable_rooms << res.room_number - end - end + unavailable_rooms = @reservations.map { |res| res.room_number if date_range.dates_overlap?(res.date_range) } - available_rooms = @room.reject { |r| unavailable_rooms.include?(r) } + available_rooms = @rooms.reject { |r| unavailable_rooms.include?(r) } raise StandardError, "No rooms available for those dates." if available_rooms.empty? return available_rooms end - def list_available_rooms(date_range) - return @room if @reservations.empty? - return find_available_rooms(date_range) + def make_reservation(date_range) + + room = find_available_rooms(date_range).first + reservation = Reservation.new(date_range, room) + @reservations << reservation end + def make_block_reservation + end + + def block_room_cost + return (total_cost - (total_cost * BLOCK_ROOM_DISCOUNT)) + end + + + end end diff --git a/lib/date_range.rb b/lib/date_range.rb index dd4b4f75b..15f3b34b2 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,13 +1,9 @@ require 'date' -require 'pry' module Hotel class DateRange attr_reader :start_date, :end_date - # TODO: change class name to date range? - # change start_date t0 check-in - def initialize(start_date, end_date) @start_date = Date.parse(start_date) @end_date = Date.parse(end_date) @@ -17,11 +13,11 @@ def check_valid_dates raise StandardError, "Invalid dates entered" if @start_date == nil || @end_date == nil - raise StandardError, "End date cannot be before start date" if (@end_date - @start_date) <= 0 end def dates_overlap?(date_range) + booked_dates = [*date_range.start_date..date_range.end_date] new_dates = [*@start_date..@end_date] @@ -53,33 +49,7 @@ def dates_overlap?(date_range) return false end - end -end - - -# -# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') -# -# reservation_1.dates_overlap? - - - - -#checking overlapping dates? -# input two dates to compare -# output (boolean) - - -#finding_available_room -#input start/end date -#output available room - - -#edge cases -#testing edge cases for date ranges - - -#think...what if there's no available rooms -#what if (9/1-9/5) reservations: (9/1-9/2), (9/4-9/5), (9/1-9/1) (start, end) + end +end diff --git a/lib/reservation.rb b/lib/reservation.rb index af2fc4a2f..601e539ac 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,10 +1,6 @@ - module Hotel class Reservation - # TODO: change duration to start/end dates - PRICE_PER_NIGHT = 200.00 - BLOCK_ROOM_DISCOUNT = 0.15 # 15% discounted rate attr_reader :date_range, :room_number @@ -21,17 +17,5 @@ def total_cost return ("%.2f" % (number_of_nights * PRICE_PER_NIGHT)).to_f end - def block_room_cost - return (total_cost - (total_cost * BLOCK_ROOM_DISCOUNT)) - end - - end - end - -# b = Hotel::Duration.new('2018-09-01', '2018-09-05') -# c = b.total_duration -# ap c -# a = Hotel::Reservation.new(1,c) -# puts a.total_cost diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index d0d545e7b..0bb568c76 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -1,5 +1,6 @@ require_relative 'spec_helper' require 'date' +require 'pry' describe "BookingSystem Class" do before do @@ -23,8 +24,8 @@ describe "Initializer" do it 'Creates an array of room numbers' do - expect(@reservation.room).must_be_kind_of Array - expect(@reservation.room.length).must_equal 20 + expect(@reservation.rooms).must_be_kind_of Array + expect(@reservation.rooms.length).must_equal 20 end it 'Creates an array of reservation instances' do @@ -34,22 +35,18 @@ expect(r).must_be_kind_of Hotel::Reservation end end + + # it 'Creates an array of block rooms' do + # #length = 5 + # #appropriate room numbers + # end end describe "list_rooms method" do it 'Returns an array of room numbers' do expect(@reservation.list_rooms).must_be_kind_of Array - expect(@reservation.room.length).must_equal 20 - end - end - - describe 'make_reservation method' do - it 'Assigns the correct first available room to the reservation' do - end - - it '' do + expect(@reservation.rooms.length).must_equal 20 end - end describe 'list_reservations method' do @@ -119,43 +116,61 @@ expect(last_on_list_3.room_number).must_equal 8 expect(last_on_list_3.date_range.start_date).must_equal date_3 end + end + describe 'list_available_rooms method' do + let (:reservation_2) { Hotel::BookingSystem.new() } + it 'Correcly lists the available rooms by date' do + expect(@reservation.list_available_rooms(@date_range_1)).must_equal [*9..20] + end + + it 'Returns all the rooms if there are no reservations' do + expect(reservation_2.list_available_rooms(@date_range_1)).must_equal [*1..20] + end end describe 'find_available_rooms method' do - let (:reservation_2) { Hotel::BookingSystem.new() } let (:reservation_3) { Hotel::BookingSystem.new() } - it 'Returns an array of available rooms for the date range' do - + it 'Returns 1 if there have been no reservations made' do + expect(reservation_3.reservations).must_be_empty + expect(reservation_3.find_available_rooms(@date_range_1).first).must_equal 1 end - it 'Returns 1 if the reservations are empty' do - expect(reservation_2.reservations).must_be_empty - expect(reservation_2.find_available_rooms(@date_range_1).first).must_equal 1 + it 'Correctly returns an array of available rooms for the date range' do + expect(@reservation.find_available_rooms(@date_range_1)).must_equal [*9..20] end - # TODO - fix this test - # it 'Raises an exception when there are no available rooms' do - # hotel_booked = Hotel::BookingSystem.new() - # - # 20.times do - # hotel_booked.make_reservation(@date_range_1) - # # binding.pry - # end - # - # expect{hotel_booked.find_available_rooms(@date_range_1)}.must_raise StandardError - # end - - # it 'Returns the first available room' do - # end + it 'Raises an error if there are no available rooms for the date range' do + hotel_booked = Hotel::BookingSystem.new() + 20.times do + hotel_booked.make_reservation(@date_range_1) + end + expect{hotel_booked.find_available_rooms(@date_range_1)}.must_raise StandardError + end end + describe 'make_reservation method' do + it 'Creates an instance of Reservation' do + expect(@reservation.make_reservation(@date_range_1).last).must_be_kind_of Hotel::Reservation + end + + it 'Adds the correct available room to the reservation' do + # binding.pry + expect(@reservation.make_reservation(@date_range_1).last.room_number).must_equal 9 + + end + # it 'Assigns the correct first available room to the reservation' do + # reservation = + # expect(@reservation.make_reservation(@date_range_1)).must_equal 9 + # end + end + end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index 9d1a9264c..c5d0219ae 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -26,10 +26,15 @@ it 'Creates an instance of DateRange' do expect(@date_range_1).must_be_kind_of Hotel::DateRange end + + it 'Stores start date and end date as date objects' do + expect(@date_range_1.start_date).must_be_kind_of Date + expect(@date_range_1.end_date).must_be_kind_of Date + end end describe "check_valid_dates method" do - it 'Raises an StandardError for invalid date ranges' do + it 'Raises a StandardError for invalid date ranges' do expect{ @date_range_1.check_valid_dates('2018-09-05', '2018-09-01') @@ -57,7 +62,6 @@ end it 'overlaps if both date range are the same' do - # binding.pry expect(date_range_2.dates_overlap?(@date_range)).must_equal true end @@ -92,15 +96,6 @@ it 'does not overlap if new date ranges starts on check-out date of the booked date range' do expect(date_range_10.dates_overlap?(@date_range)).must_equal false end - - - end - - - - - - - + end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 3024dc896..360d6892c 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -15,19 +15,24 @@ end it 'Takes room number as an integer' do + expect(reservation.room_number).must_equal 1 + end + end + describe 'number_of_nights method' do + it 'Returns the correct number of nights' do + expect(reservation.number_of_nights).must_equal 4 end end describe "total_cost" do - it 'Calculates total cost of an entire stay' do - # binding.pry expect(reservation.total_cost).must_equal 800.00 end - it 'Correctly formats the cost to two decimal places' do - end + # it 'Correctly formats the cost to two decimal places' do + # expect(reservation.total_cost).myst + # end end end From f240dd9fe0b82185e78da6f5d357c181c2191be7 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 9 Sep 2018 23:13:02 -0700 Subject: [PATCH 35/47] added refactors.txt file q --- 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..e3c177647 --- /dev/null +++ b/refactors.txt @@ -0,0 +1,3 @@ +Changes to make in the future: +- Change start_date and end_date to check_in and check_out +- From 318a5e7151c4477f8276fbe04eef58ba1d4484c4 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Mon, 10 Sep 2018 08:44:36 -0700 Subject: [PATCH 36/47] added methods for making block room reservations --- lib/block_room.rb | 77 ++++++------------------------------- lib/booking_system.rb | 62 ++++++++++++++++++++--------- refactors.txt | 4 +- spec/block_room_spec.rb | 14 ++++--- spec/booking_system_spec.rb | 14 +++---- 5 files changed, 72 insertions(+), 99 deletions(-) diff --git a/lib/block_room.rb b/lib/block_room.rb index 9cac91bca..662f219b8 100644 --- a/lib/block_room.rb +++ b/lib/block_room.rb @@ -1,76 +1,21 @@ -require_relative 'booking_system' - module Hotel class BlockRoom + BLOCK_ROOM_RATE = 100.00 + attr_reader :date_range, :block_rooms - attr_reader :date_range, :block_rooms, :rate - - def initialize(date_range, block_rooms, rate) + def initialize(date_range, block_rooms) @date_range = date_range @block_rooms = block_rooms - @rate = rate end + def block_dates_duration + return (@date_range.end_date - @date_range.start_date).to_i + end - end -end + def block_cost + return ("%.2f" % (block_dates_duration * BLOCK_ROOM_RATE)).to_f + end -# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') -# # date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') -# # date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') -# # date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') -# reservation_1 = Hotel::BookingSystem.new() -# -# reservation = Hotel::BlockRoom.new() -# # reservation_1 = Hotel::BookingSystem.new() -# -# 5.times do -# reservation_1.make_reservation(date_range_1) -# end -# -# puts "This is the 5 first reservations" -# p reservation_1.reservations[0].room_number -# p reservation_1.reservations[1].room_number -# p reservation_1.reservations[2].room_number -# p reservation_1.reservations[3].room_number -# p reservation_1.reservations[4].room_number -# puts -# -# -# 5.times do -# reservation.make_reservation(date_range_1) -# end -# -# puts "This should include all previous reservations" -# # reservation.each_with_index do |room, index| -# # p room.reservations[i] -# # end -# -# p reservation.reservations[1].room_number -# p reservation.reservations[2].room_number -# p reservation.reservations[3].room_number -# p reservation.reservations[4].room_number -# p reservation.reservations[5].room_number -# # p reservation.reservations[6].room_number -# # p reservation.reservations[7].room_number -# # p reservation.reservations[8].room_number -# # p reservation.reservations[9].room_number -# # 2.times do -# # reservation.make_reservation(date_range_2) -# # end -# # -# # 3.times do -# # reservation.make_reservation(date_range_3) -# # end -# # -# -# reservation.find_available_rooms(date_range_1) -# -# puts "block rooms" -# p reservation.block_rooms -# p reservation.reservations[1].block_room_cost -# # puts reservation.find_available_rooms(date_range_1).class -# # puts "#{reservation.list_available_rooms(date_range_1)}" -# # puts "#{reservation_1.list_available_rooms(date_range_1)}" -# # puts "#{reservation.list_available_rooms(date_range_4)}" + end +end diff --git a/lib/booking_system.rb b/lib/booking_system.rb index b2e995859..6e70ae4c3 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -1,4 +1,5 @@ require_relative 'reservation' +require_relative 'block_room' require_relative 'date_range' module Hotel @@ -12,23 +13,19 @@ def initialize @block_rooms = [] end - def list_rooms return @rooms end - def list_reservations(date_range) return @reservations.select { |res| res.date_range == date_range } end - def list_available_rooms(date_range) return @rooms if @reservations.empty? return find_available_rooms(date_range) end - def find_available_rooms(date_range) return @rooms if @reservations.empty? @@ -47,41 +44,70 @@ def make_reservation(date_range) room = find_available_rooms(date_range).first reservation = Reservation.new(date_range, room) @reservations << reservation + return reservation end + def reserve_block_rooms(date_range) - def make_block_reservation + rooms = find_available_rooms(date_range) + block_reservation = BlockRoom.new(date_range, rooms) + @block_rooms << block_reservation + return block_reservation end - def block_room_cost - return (total_cost - (total_cost * BLOCK_ROOM_DISCOUNT)) + def find_block(date_range) + raise StandardError, "No block rooms found for those dates" if @block_rooms.empty? + + return @block_rooms.select { |block| block.date_range == date_range } end + def find_room_in_block(date_range) + found_block = find_block(date_range) + room_block_rooms = found_block.first.block_rooms + + available_rooms = find_available_rooms(date_range) + + room = available_rooms.select { |room| room if room_block_rooms.include? available_rooms } + + return room + end + + def make_reservation_from_block(date_range) + + room = find_room_in_block(date_range).first + reservation = Reservation.new(date_range, room) + @reservations << reservation + return reservation + end end end -# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') # date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') -# date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') # date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') -# reservation = Hotel::BookingSystem.new() +reservation = Hotel::BookingSystem.new() + # reservation_1 = Hotel::BookingSystem.new() # -# 20.times do -# reservation.make_reservation(date_range_1) -# end +10.times do + reservation.make_reservation(date_range_1) +end -# 2.times do -# reservation.make_reservation(date_range_2) -# end +3.times do + reservation.reserve_block_rooms(date_range_3) +end +# +# +# reservation.reserve_block_rooms(date_range_3) # # 3.times do -# reservation.make_reservation(date_range_3) +# block_room.make_reservation_from_block(date_range_3) # end # -# puts reservation.find_available_rooms(date_range_1) +puts reservation.block_rooms.first.room_number # puts reservation.find_available_rooms(date_range_1).class # puts "#{reservation.list_available_rooms(date_range_1)}" # puts "#{reservation_1.list_available_rooms(date_range_1)}" diff --git a/refactors.txt b/refactors.txt index e3c177647..ebdaf6cb1 100644 --- a/refactors.txt +++ b/refactors.txt @@ -1,3 +1,5 @@ Changes to make in the future: - Change start_date and end_date to check_in and check_out -- +- If more attributes added to rooms (like different prices, suites, King vs Queen beds, etc), create a separate Room class. +- Refactor the dates_overlap? method +- Work on BlockRoom class/methods + Tests diff --git a/spec/block_room_spec.rb b/spec/block_room_spec.rb index 2bfd94336..bc1564fcc 100644 --- a/spec/block_room_spec.rb +++ b/spec/block_room_spec.rb @@ -1,24 +1,26 @@ require_relative 'spec_helper' - describe 'BlockRoom class' do describe 'Initializer' do before do - @block_room = Hotel::BlockRoom.new() + @date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') + @block_room = Hotel::BlockRoom.new(@date_range_1, [1,2,3,4,5]) end it 'Creates an instance of BlockRoom' do expect(@block_room).must_be_kind_of Hotel::BlockRoom end - it 'Correctly calculates a discounted rate for the room block reservation' do + it 'Takes date range as an instance of DateRange' do + expect(@block_room.date_range).must_be_kind_of Hotel::DateRange end + it 'Takes block rooms as an array' do + expect(@block_room.block_rooms).must_equal [*1..5] + end + end - - -end end diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index 0bb568c76..432d21a64 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -155,20 +155,18 @@ describe 'make_reservation method' do it 'Creates an instance of Reservation' do - expect(@reservation.make_reservation(@date_range_1).last).must_be_kind_of Hotel::Reservation + expect(@reservation.make_reservation(@date_range_1)).must_be_kind_of Hotel::Reservation end it 'Adds the correct available room to the reservation' do - # binding.pry - expect(@reservation.make_reservation(@date_range_1).last.room_number).must_equal 9 - + expect(@reservation.make_reservation(@date_range_1).room_number).must_equal 9 end + it 'Adds each instance of reservation into the the @reservations instance variable' do + new_res = @reservation.make_reservation(@date_range_1) - # it 'Assigns the correct first available room to the reservation' do - # reservation = - # expect(@reservation.make_reservation(@date_range_1)).must_equal 9 - # end + expect(@reservation.reservations.length).must_equal 11 + end end From bf7a0c81af556e7a0eb4ed6a7e6bf6e43d65bf1a Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Mon, 10 Sep 2018 21:55:08 -0700 Subject: [PATCH 37/47] added method to find available rooms for all reservations including block rooms --- lib/booking_system.rb | 34 +++++++++++++++++++--------------- lib/date_range.rb | 2 ++ spec/reservation_spec.rb | 4 ---- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 6e70ae4c3..897518e68 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -27,20 +27,30 @@ def list_available_rooms(date_range) end def find_available_rooms(date_range) - return @rooms if @reservations.empty? - unavailable_rooms = @reservations.map { |res| res.room_number if date_range.dates_overlap?(res.date_range) } - available_rooms = @rooms.reject { |r| unavailable_rooms.include?(r) } + unavailable_rooms_block = @block_rooms.map { |res| res.block_rooms if date_range.dates_overlap?(res.date_range)}.flatten - raise StandardError, "No rooms available for those dates." if available_rooms.empty? + all_unavailable_rooms = unavailable_rooms + unavailable_rooms_block + available_rooms = @rooms.reject { |r| all_unavailable_rooms.include?(r) } + raise StandardError, "No rooms available for those dates." if available_rooms.empty? return available_rooms end - def make_reservation(date_range) + #combine the two methods above? + # def find_available_block_rooms(date_range) + # return @rooms.first(5) if @block_rooms.empty? + # + # + # available_block_rooms = @rooms.reject { |r| unavailable_rooms_block.include?(r) } + # + # raise StandardError, "No rooms available for those dates." if available_block_rooms.empty? + # return available_block_rooms + # end + def make_reservation(date_range) room = find_available_rooms(date_range).first reservation = Reservation.new(date_range, room) @reservations << reservation @@ -48,8 +58,7 @@ def make_reservation(date_range) end def reserve_block_rooms(date_range) - - rooms = find_available_rooms(date_range) + rooms = find_available_rooms(date_range).first(5) block_reservation = BlockRoom.new(date_range, rooms) @block_rooms << block_reservation return block_reservation @@ -57,23 +66,18 @@ def reserve_block_rooms(date_range) def find_block(date_range) raise StandardError, "No block rooms found for those dates" if @block_rooms.empty? - return @block_rooms.select { |block| block.date_range == date_range } end def find_room_in_block(date_range) found_block = find_block(date_range) room_block_rooms = found_block.first.block_rooms - available_rooms = find_available_rooms(date_range) - room = available_rooms.select { |room| room if room_block_rooms.include? available_rooms } - return room end def make_reservation_from_block(date_range) - room = find_room_in_block(date_range).first reservation = Reservation.new(date_range, room) @reservations << reservation @@ -96,8 +100,8 @@ def make_reservation_from_block(date_range) reservation.make_reservation(date_range_1) end -3.times do - reservation.reserve_block_rooms(date_range_3) +2.times do + reservation.reserve_block_rooms(date_range_1) end # # @@ -107,7 +111,7 @@ def make_reservation_from_block(date_range) # block_room.make_reservation_from_block(date_range_3) # end # -puts reservation.block_rooms.first.room_number +p reservation # puts reservation.find_available_rooms(date_range_1).class # puts "#{reservation.list_available_rooms(date_range_1)}" # puts "#{reservation_1.list_available_rooms(date_range_1)}" diff --git a/lib/date_range.rb b/lib/date_range.rb index 15f3b34b2..f370697a2 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -21,6 +21,8 @@ def dates_overlap?(date_range) booked_dates = [*date_range.start_date..date_range.end_date] new_dates = [*@start_date..@end_date] + #TODO: refactor + # completely containing if new_dates.first < booked_dates.first && new_dates.last > booked_dates.last return true diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 360d6892c..05f7ac78f 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -30,9 +30,5 @@ expect(reservation.total_cost).must_equal 800.00 end - # it 'Correctly formats the cost to two decimal places' do - # expect(reservation.total_cost).myst - # end - end end From f500703e6c27ada83a5c6bb54a8a8bcac9e19317 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 12 Sep 2018 23:27:05 -0700 Subject: [PATCH 38/47] added tests for reserving block rooms --- lib/booking_system.rb | 105 ++++++++++++++++-------------------- spec/booking_system_spec.rb | 18 ++++--- 2 files changed, 58 insertions(+), 65 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 897518e68..7476ef7ee 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -39,17 +39,6 @@ def find_available_rooms(date_range) return available_rooms end - #combine the two methods above? - # def find_available_block_rooms(date_range) - # return @rooms.first(5) if @block_rooms.empty? - # - # - # available_block_rooms = @rooms.reject { |r| unavailable_rooms_block.include?(r) } - # - # raise StandardError, "No rooms available for those dates." if available_block_rooms.empty? - # return available_block_rooms - # end - def make_reservation(date_range) room = find_available_rooms(date_range).first reservation = Reservation.new(date_range, room) @@ -73,8 +62,8 @@ def find_room_in_block(date_range) found_block = find_block(date_range) room_block_rooms = found_block.first.block_rooms available_rooms = find_available_rooms(date_range) - room = available_rooms.select { |room| room if room_block_rooms.include? available_rooms } - return room + rooms = available_rooms.select { |room| room if room_block_rooms.include? available_rooms } + return rooms end def make_reservation_from_block(date_range) @@ -88,55 +77,55 @@ def make_reservation_from_block(date_range) end end -date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') -# date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') -date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') -# date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') -reservation = Hotel::BookingSystem.new() - -# reservation_1 = Hotel::BookingSystem.new() -# -10.times do - reservation.make_reservation(date_range_1) -end - -2.times do - reservation.reserve_block_rooms(date_range_1) -end -# -# -# reservation.reserve_block_rooms(date_range_3) -# -# 3.times do -# block_room.make_reservation_from_block(date_range_3) +# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +# # # date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') +# # date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +# # # date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') +# reservation = Hotel::BookingSystem.new() +# # +# # # reservation_1 = Hotel::BookingSystem.new() +# # # +# 10.times do +# reservation.make_reservation(date_range_1) # end # -p reservation -# puts reservation.find_available_rooms(date_range_1).class -# puts "#{reservation.list_available_rooms(date_range_1)}" -# puts "#{reservation_1.list_available_rooms(date_range_1)}" -# puts "#{reservation.list_available_rooms(date_range_4)}" - - -# -# puts reservation.list_reservations(date_range_1).first.room_number -# puts reservation.list_reservations(date_range_1).last.room_number - -# reservation.list_reservations(date_range_1).each_with_index do |res, i| -# puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# 2.times do +# reservation.reserve_block_rooms(date_range_1) # end # # # -# reservation.list_reservations(date_range_2).each_with_index do |res, i| -# puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" -# end +# # reservation.reserve_block_rooms(date_range_1) +# +# # 3.times do +# # block_room.make_reservation_from_block(date_range_1) +# # end +# # # +# p reservation +# # puts reservation.find_available_rooms(date_range_1).class +# # puts "#{reservation.list_available_rooms(date_range_1)}" +# # puts "#{reservation_1.list_available_rooms(date_range_1)}" +# # puts "#{reservation.list_available_rooms(date_range_4)}" # -# reservation.list_reservations(date_range_3).each_with_index do |res, i| -# puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" -# end -# array = reservation.reservations -# array.each_with_index do |res, i| -# puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" -# end # -# puts "#{Hotel::BookingSystem.available_rooms}" +# # +# # puts reservation.list_reservations(date_range_1).first.room_number +# # puts reservation.list_reservations(date_range_1).last.room_number +# +# # reservation.list_reservations(date_range_1).each_with_index do |res, i| +# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# # end +# # # +# # +# # reservation.list_reservations(date_range_2).each_with_index do |res, i| +# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# # end +# # +# # reservation.list_reservations(date_range_3).each_with_index do |res, i| +# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# # end +# # array = reservation.reservations +# # array.each_with_index do |res, i| +# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# # end +# # +# # puts "#{Hotel::BookingSystem.available_rooms}" diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index 432d21a64..b74f63561 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -9,6 +9,7 @@ @date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') @reservation = Hotel::BookingSystem.new() + 5.times do @reservation.make_reservation(@date_range_1) end @@ -20,6 +21,8 @@ 3.times do @reservation.make_reservation(@date_range_3) end + + @reservation.reserve_block_rooms(@date_range_1) end describe "Initializer" do @@ -36,10 +39,11 @@ end end - # it 'Creates an array of block rooms' do - # #length = 5 - # #appropriate room numbers - # end + it 'Creates an array of block room instances' do + expect(@reservation.block_rooms).must_be_kind_of Array + expect(@reservation.block_rooms.first).must_be_kind_of Hotel::BlockRoom + expect(@reservation.block_rooms.first.block_rooms).must_equal [*9..13] + end end describe "list_rooms method" do @@ -122,7 +126,7 @@ let (:reservation_2) { Hotel::BookingSystem.new() } it 'Correcly lists the available rooms by date' do - expect(@reservation.list_available_rooms(@date_range_1)).must_equal [*9..20] + expect(@reservation.list_available_rooms(@date_range_1)).must_equal [*14..20] end it 'Returns all the rooms if there are no reservations' do @@ -139,7 +143,7 @@ end it 'Correctly returns an array of available rooms for the date range' do - expect(@reservation.find_available_rooms(@date_range_1)).must_equal [*9..20] + expect(@reservation.find_available_rooms(@date_range_1)).must_equal [*14..20] end it 'Raises an error if there are no available rooms for the date range' do @@ -159,7 +163,7 @@ end it 'Adds the correct available room to the reservation' do - expect(@reservation.make_reservation(@date_range_1).room_number).must_equal 9 + expect(@reservation.make_reservation(@date_range_1).room_number).must_equal 14 end it 'Adds each instance of reservation into the the @reservations instance variable' do From c2ab0f472582d12bb6737b404cd35dc4928a28e3 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Wed, 26 Sep 2018 13:40:44 -0700 Subject: [PATCH 39/47] finish comprehension questions --- design-activity.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..ac2c98be9 --- /dev/null +++ b/design-activity.md @@ -0,0 +1,76 @@ +1. What classes does each implementation include? Are the lists the same? + + Both implementations include the same three classes, CartEntry, ShoppingCart, and Order. Yes, each implementation returns the same list. + + +2. Write down a sentence to describe each class. + + The CartEntry class creates an instance of an order item, which has the attributes unit price and quantity. In the second implementation, it contains the method price, which calculates the price of the item by multiplying the price of the item by the quantity of items ordered. + + The ShoppingCart class creates an instance of a cart, which stores an array of cart item objects as an instance variable `@entries`. The second implementation contains the method price, which calculates the total of all cart items in the shopping cart. + + The Order class creates an instance of an order, which stores an instance of a shopping cart object as an instance variable `@cart`. It's behavior calculates the total price of the order by getting the sum of each cart item in the shopping cart and multiplying the sum with a constant sales tax variable. + + + +3. 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 stores an instance of ShoppingCart object, which we can use to calculate the total price of a cart including the sales tax. Each ShoppingCart stores instances of CartEntry, and we can get the total price of the shopping cart by calling the method price on the cart (this method gets the subtotal of the cart without taxes). The CartEntry class stores an instance of a cart item which has the attributes unit price and quantity. We can get the price of a cart item entry by calling on the price method which multiplies the price of the item by the quantity ordered. + + In other words, an Order has one shopping cart, a ShoppingCart has many cart entries, and a CartEntry has one entry item. + + +4. What data does each class store? How (if at all) does this differ between the two implementations? + + The CartEntry class stores a cart entry item. + The ShoppingCart class stores instances of CartEntry objects. + The Order class stores an instance of ShoppingCart. + + Both implementations store the same data, but the behaviors of the classes differ. The second implementation wraps the attributes in an instance method, while the first implementation uses the attr_accessor to access the instance variables of the class. + +5. What methods does each class have? How (if at all) does this differ between the two implementations? + + **Implementation A** + --- | CartEntry | ShoppingCart | Order + --- | --- | --- | --- + Methods | `initialize`, `attr_accessor` | `initialize`, `attr_accessor` | `initialize`, `total_price` + + **Implementation B** + --- | CartEntry | ShoppingCart | Order + --- | --- | --- | --- + Methods | `initialize`, `price` | `initialize`, `price` | `initialize`, `total_price` + + The two implementations differ in that the second implementation wraps the instance variables in an instance method and calls on that instance method to determine price in each class. On the other hand, the first implementation calls on the attr_accessor method from the other classes to determine the price in just one class, the Order class. + + +6. 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? + + First implementation: price is retained in Order + Second implementation: price is delegated to lower level classes, ShoppingCart and CartEntry + + + * Does total_price directly manipulate the instance variables of other classes? + + First implementation: directly manipulates the instance variables of other classes + Second implementation: does not manipulate the instance variables, but uses the instance methods to get price + + +7. If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + + The second implementation is easier to change because we can add a conditional to the `price` method to lower the unit price if quantity is greater than or equal to a set amount. + + The first implementation would be harder to change because all the logic is in the Order class, and is too dependent on the CartEntry and ShoppingCart classes. + + + +8. Which implementation better adheres to the single responsibility principle? + + Implementation B better adheres to the single responsibility principle because each class has one responsibility and the classes the dependencies on each other are minimal. They are loosely coupled, and implementing changes are easier compared to Implementation A. + + + +9. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? + + Implementation B is more loosely coupled. From 3339c380b5a2df09ffc5d9d6f8fe5055e708c322 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 30 Sep 2018 14:36:52 -0700 Subject: [PATCH 40/47] refactored logic for date_range --- lib/date_range.rb | 28 ++++------------------------ spec/booking_system_spec.rb | 14 +++++++++++++- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index f370697a2..3f18f9db4 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -21,37 +21,17 @@ def dates_overlap?(date_range) booked_dates = [*date_range.start_date..date_range.end_date] new_dates = [*@start_date..@end_date] - #TODO: refactor - # completely containing - if new_dates.first < booked_dates.first && new_dates.last > booked_dates.last + if !(new_dates.first >= booked_dates.last || new_dates.last <= booked_dates.first) + # dates overlap return true - # back end - elsif new_dates.first < booked_dates.last && new_dates.last > booked_dates.last - return true - # in the middle - elsif new_dates.first > booked_dates.first && new_dates.last < booked_dates.last - return true - # in the front - elsif new_dates.first < booked_dates.first && new_dates.last > booked_dates.first - return true - # completely before - elsif new_dates.last < booked_dates.first - return false - # completely after - elsif new_dates.first > booked_dates.last - return false - # ends on check-in date - elsif new_dates.last == booked_dates.first - return false - # same dates - elsif new_dates.first == booked_dates.first || new_dates.last == booked_dates.first + elsif new_dates.first < booked_dates.first && new_dates.last >= booked_dates.last + # dates are containing return true end return false end - end end diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index b74f63561..bd728b822 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -166,13 +166,25 @@ expect(@reservation.make_reservation(@date_range_1).room_number).must_equal 14 end - it 'Adds each instance of reservation into the the @reservations instance variable' do + it 'Adds each instance of reservation into the @reservations instance variable' do new_res = @reservation.make_reservation(@date_range_1) expect(@reservation.reservations.length).must_equal 11 end end + describe 'reserve_block_rooms method' do + end + + describe 'find_block method' do + end + + describe 'find_room_in_block method' do + end + + describe 'make_reservation_from_block' do + end + end From 705e444525af17f554ba37d9c35d199544316f6c Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 30 Sep 2018 15:01:04 -0700 Subject: [PATCH 41/47] removed list rooms method, redundant code --- lib/booking_system.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 7476ef7ee..2e8b0259b 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -13,10 +13,6 @@ def initialize @block_rooms = [] end - def list_rooms - return @rooms - end - def list_reservations(date_range) return @reservations.select { |res| res.date_range == date_range } end From 79db25da4b3807e11c8ebd8b8e835098f318bc57 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 30 Sep 2018 15:24:20 -0700 Subject: [PATCH 42/47] changed test for listing rooms using attr reader --- spec/booking_system_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/booking_system_spec.rb b/spec/booking_system_spec.rb index bd728b822..deca596aa 100644 --- a/spec/booking_system_spec.rb +++ b/spec/booking_system_spec.rb @@ -48,7 +48,7 @@ describe "list_rooms method" do it 'Returns an array of room numbers' do - expect(@reservation.list_rooms).must_be_kind_of Array + expect(@reservation.rooms).must_be_kind_of Array expect(@reservation.rooms.length).must_equal 20 end end From 3452bfc3ed62350a32aeabf223f36136907a73e5 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 30 Sep 2018 17:03:41 -0700 Subject: [PATCH 43/47] updated design-activity answers --- design-activity.md | 52 +++++++++++++++++++++++++++++++++++++++-- lib/booking_system.rb | 41 +++++++++++++++++++++----------- lib/date_range.rb | 44 +++++++++++++++++----------------- spec/date_range_spec.rb | 2 +- 4 files changed, 101 insertions(+), 38 deletions(-) diff --git a/design-activity.md b/design-activity.md index ac2c98be9..bc6facda0 100644 --- a/design-activity.md +++ b/design-activity.md @@ -67,10 +67,58 @@ 8. Which implementation better adheres to the single responsibility principle? - Implementation B better adheres to the single responsibility principle because each class has one responsibility and the classes the dependencies on each other are minimal. They are loosely coupled, and implementing changes are easier compared to Implementation A. + Implementation B better adheres to the single responsibility principle because each class has one responsibility and the class's dependencies on each other are minimal. They are loosely coupled, and implementing changes are easier compared to Implementation A. 9. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? - Implementation B is more loosely coupled. + Implementation B is more loosely coupled. + + + +## Improvements on Hotel + + + + + +### Class Responsibilities: + +* Reservation: + - Responsible for holding one reservation instance + - BookingSystem calls on the reservation's instance variable `date_range`, but thought it was appropriate because `date_range` is an instance of class DateRange. This way, I can call on a method on DateRange and do the work there instead of in the BookingSystem class. + +* DateRange: + - Responsible for validating available dates + - Instance variables are not directly manipulated, methods used to validate dates + +* BookingSystem: + - Responsible for creating all reservations (room and blocks) + - Knows about all other class, but the other classes know little about each other + +* BlockRoom: + - Responsible for holding a block of rooms with a discounted rate + - Like Reservation, the instance variable `date_range` in BlockRoom is called in BookingSystem + + +## Hotel Refactors: + * Updated logic of the `dates_overlap` method + * Added custom error exception within the DateRange and BookingSystem class + * Removed `list_rooms` method since the method was redundant and attr_reader returns the same thing + * Fixed logic error in BookingSystem method `find_available_rooms` where nils were being populated in the array diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 2e8b0259b..7fbc82b5f 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -1,9 +1,11 @@ require_relative 'reservation' require_relative 'block_room' require_relative 'date_range' +require 'awesome_print' module Hotel class BookingSystem + class ValidateRoomsError < StandardError ; end attr_reader :rooms, :reservations, :block_rooms @@ -24,14 +26,24 @@ def list_available_rooms(date_range) def find_available_rooms(date_range) return @rooms if @reservations.empty? - unavailable_rooms = @reservations.map { |res| res.room_number if date_range.dates_overlap?(res.date_range) } - unavailable_rooms_block = @block_rooms.map { |res| res.block_rooms if date_range.dates_overlap?(res.date_range)}.flatten + unavailable_rooms = @reservations.map { + |res| res.room_number if date_range.dates_overlap?(res.date_range) + }.flatten.compact + + + unavailable_rooms_block = @block_rooms.map { + |res| res.block_rooms if date_range.dates_overlap?(res.date_range) + }.flatten.compact + all_unavailable_rooms = unavailable_rooms + unavailable_rooms_block - available_rooms = @rooms.reject { |r| all_unavailable_rooms.include?(r) } - raise StandardError, "No rooms available for those dates." if available_rooms.empty? + available_rooms = @rooms.reject { + |r| all_unavailable_rooms.include?(r) + } + + raise ValidateRoomsError, "No rooms available for those dates." if available_rooms.empty? return available_rooms end @@ -50,7 +62,7 @@ def reserve_block_rooms(date_range) end def find_block(date_range) - raise StandardError, "No block rooms found for those dates" if @block_rooms.empty? + raise ValidateRoomsError, "No block rooms found for those dates" if @block_rooms.empty? return @block_rooms.select { |block| block.date_range == date_range } end @@ -74,30 +86,31 @@ def make_reservation_from_block(date_range) end # date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') -# # # date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') -# # date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') -# # # date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') +# # # # date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') +# # # date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +# # # # date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') # reservation = Hotel::BookingSystem.new() -# # -# # # reservation_1 = Hotel::BookingSystem.new() # # # +# # # # reservation_1 = Hotel::BookingSystem.new() +# # # # # 10.times do # reservation.make_reservation(date_range_1) # end # -# 2.times do +# 1.times do # reservation.reserve_block_rooms(date_range_1) # end -# # # -# # reservation.reserve_block_rooms(date_range_1) + +# reservation.reserve_block_rooms(date_range_1) # # # 3.times do # # block_room.make_reservation_from_block(date_range_1) # # end # # # # p reservation -# # puts reservation.find_available_rooms(date_range_1).class + +p reservation.find_available_rooms(date_range_1) # # puts "#{reservation.list_available_rooms(date_range_1)}" # # puts "#{reservation_1.list_available_rooms(date_range_1)}" # # puts "#{reservation.list_available_rooms(date_range_4)}" diff --git a/lib/date_range.rb b/lib/date_range.rb index 3f18f9db4..d2f4cd9d6 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -2,36 +2,38 @@ module Hotel class DateRange - attr_reader :start_date, :end_date + class ValidateDatesError < StandardError ; end - def initialize(start_date, end_date) - @start_date = Date.parse(start_date) - @end_date = Date.parse(end_date) - end + attr_reader :start_date, :end_date - def check_valid_dates + def initialize(start_date, end_date) + @start_date = Date.parse(start_date) + @end_date = Date.parse(end_date) + end - raise StandardError, "Invalid dates entered" if @start_date == nil || @end_date == nil + def check_valid_dates - raise StandardError, "End date cannot be before start date" if (@end_date - @start_date) <= 0 - end + raise ValidateDatesError, "Invalid dates entered" if @start_date == nil || @end_date == nil - def dates_overlap?(date_range) + raise ValidateDatesError, "End date cannot be before start date" if (@end_date - @start_date) <= 0 + end - booked_dates = [*date_range.start_date..date_range.end_date] - new_dates = [*@start_date..@end_date] + def dates_overlap?(date_range) + booked_dates = [*date_range.start_date..date_range.end_date] + new_dates = [*@start_date..@end_date] - if !(new_dates.first >= booked_dates.last || new_dates.last <= booked_dates.first) - # dates overlap - return true - elsif new_dates.first < booked_dates.first && new_dates.last >= booked_dates.last - # dates are containing - return true - end - return false - end + if !(new_dates.first >= booked_dates.last || new_dates.last <= booked_dates.first) + # dates overlap + return true + elsif new_dates.first < booked_dates.first && new_dates.last >= booked_dates.last + # dates are containing + return true + end + + return false + end end end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index c5d0219ae..5905100ab 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -97,5 +97,5 @@ expect(date_range_10.dates_overlap?(@date_range)).must_equal false end end - + end From 10c0f76599ecb9636b5853c93bfeb690607f676a Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 30 Sep 2018 17:05:07 -0700 Subject: [PATCH 44/47] update header on design-activity --- design-activity.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/design-activity.md b/design-activity.md index bc6facda0..fc7b03b8d 100644 --- a/design-activity.md +++ b/design-activity.md @@ -1,3 +1,5 @@ +# Comprehension Questions + 1. What classes does each implementation include? Are the lists the same? Both implementations include the same three classes, CartEntry, ShoppingCart, and Order. Yes, each implementation returns the same list. From d77addaa8ead591be49cee5f5d099eab0b0408a9 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 30 Sep 2018 17:16:52 -0700 Subject: [PATCH 45/47] format edits to design-activity --- design-activity.md | 78 +++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/design-activity.md b/design-activity.md index fc7b03b8d..7d3aba720 100644 --- a/design-activity.md +++ b/design-activity.md @@ -1,81 +1,73 @@ # Comprehension Questions -1. What classes does each implementation include? Are the lists the same? +#### 1. What classes does each implementation include? Are the lists the same? +Both implementations include the same three classes, CartEntry, ShoppingCart, and Order. Yes, each implementation returns the same list. - Both implementations include the same three classes, CartEntry, ShoppingCart, and Order. Yes, each implementation returns the same list. +####2. Write down a sentence to describe each class. +The CartEntry class creates an instance of an order item, which has the attributes unit price and quantity. In the second implementation, it contains the method price, which calculates the price of the item by multiplying the price of the item by the quantity of items ordered. -2. Write down a sentence to describe each class. +The ShoppingCart class creates an instance of a cart, which stores an array of cart item objects as an instance variable `@entries`. The second implementation contains the method price, which calculates the total of all cart items in the shopping cart. - The CartEntry class creates an instance of an order item, which has the attributes unit price and quantity. In the second implementation, it contains the method price, which calculates the price of the item by multiplying the price of the item by the quantity of items ordered. +The Order class creates an instance of an order, which stores an instance of a shopping cart object as an instance variable `@cart`. It's behavior calculates the total price of the order by getting the sum of each cart item in the shopping cart and multiplying the sum with a constant sales tax variable. - The ShoppingCart class creates an instance of a cart, which stores an array of cart item objects as an instance variable `@entries`. The second implementation contains the method price, which calculates the total of all cart items in the shopping cart. - The Order class creates an instance of an order, which stores an instance of a shopping cart object as an instance variable `@cart`. It's behavior calculates the total price of the order by getting the sum of each cart item in the shopping cart and multiplying the sum with a constant sales tax variable. - - -3. 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 stores an instance of ShoppingCart object, which we can use to calculate the total price of a cart including the sales tax. Each ShoppingCart stores instances of CartEntry, and we can get the total price of the shopping cart by calling the method price on the cart (this method gets the subtotal of the cart without taxes). The CartEntry class stores an instance of a cart item which has the attributes unit price and quantity. We can get the price of a cart item entry by calling on the price method which multiplies the price of the item by the quantity ordered. +####3. 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 stores an instance of ShoppingCart object, which we can use to calculate the total price of a cart including the sales tax. Each ShoppingCart stores instances of CartEntry, and we can get the total price of the shopping cart by calling the method price on the cart (this method gets the subtotal of the cart without taxes). The CartEntry class stores an instance of a cart item which has the attributes unit price and quantity. We can get the price of a cart item entry by calling on the price method which multiplies the price of the item by the quantity ordered. In other words, an Order has one shopping cart, a ShoppingCart has many cart entries, and a CartEntry has one entry item. -4. What data does each class store? How (if at all) does this differ between the two implementations? - - The CartEntry class stores a cart entry item. - The ShoppingCart class stores instances of CartEntry objects. - The Order class stores an instance of ShoppingCart. +####4. What data does each class store? How (if at all) does this differ between the two implementations? - Both implementations store the same data, but the behaviors of the classes differ. The second implementation wraps the attributes in an instance method, while the first implementation uses the attr_accessor to access the instance variables of the class. +The CartEntry class stores a cart entry item. +The ShoppingCart class stores instances of CartEntry objects. +The Order class stores an instance of ShoppingCart. -5. What methods does each class have? How (if at all) does this differ between the two implementations? +Both implementations store the same data, but the behaviors of the classes differ. The second implementation wraps the attributes in an instance method, while the first implementation uses the attr_accessor to access the instance variables of the class. - **Implementation A** - --- | CartEntry | ShoppingCart | Order - --- | --- | --- | --- - Methods | `initialize`, `attr_accessor` | `initialize`, `attr_accessor` | `initialize`, `total_price` +####5. What methods does each class have? How (if at all) does this differ between the two implementations? - **Implementation B** - --- | CartEntry | ShoppingCart | Order - --- | --- | --- | --- - Methods | `initialize`, `price` | `initialize`, `price` | `initialize`, `total_price` +**Implementation A** +| --- | CartEntry | ShoppingCart | Order | +| --- | --- | --- | --- | +| Methods | `initialize`, `attr_accessor` | `initialize`, `attr_accessor` | `initialize`, `total_price` | - The two implementations differ in that the second implementation wraps the instance variables in an instance method and calls on that instance method to determine price in each class. On the other hand, the first implementation calls on the attr_accessor method from the other classes to determine the price in just one class, the Order class. +**Implementation B** +| --- | CartEntry | ShoppingCart | Order | +| --- | --- | --- | --- | +| Methods | `initialize`, `price` | `initialize`, `price` | `initialize`, `total_price` | +The two implementations differ in that the second implementation wraps the instance variables in an instance method and calls on that instance method to determine price in each class. On the other hand, the first implementation calls on the attr_accessor method from the other classes to determine the price in just one class, the Order class. -6. 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? +####6. 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? - First implementation: price is retained in Order +- First implementation: price is retained in Order Second implementation: price is delegated to lower level classes, ShoppingCart and CartEntry +* Does total_price directly manipulate the instance variables of other classes? - * Does total_price directly manipulate the instance variables of other classes? - - First implementation: directly manipulates the instance variables of other classes +- First implementation: directly manipulates the instance variables of other classes Second implementation: does not manipulate the instance variables, but uses the instance methods to get price -7. If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? - - The second implementation is easier to change because we can add a conditional to the `price` method to lower the unit price if quantity is greater than or equal to a set amount. - - The first implementation would be harder to change because all the logic is in the Order class, and is too dependent on the CartEntry and ShoppingCart classes. - +####7. If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? +The second implementation is easier to change because we can add a conditional to the `price` method to lower the unit price if quantity is greater than or equal to a set amount. +The first implementation would be harder to change because all the logic is in the Order class, and is too dependent on the CartEntry and ShoppingCart classes. -8. Which implementation better adheres to the single responsibility principle? - Implementation B better adheres to the single responsibility principle because each class has one responsibility and the class's dependencies on each other are minimal. They are loosely coupled, and implementing changes are easier compared to Implementation A. +####8. Which implementation better adheres to the single responsibility principle? +Implementation B better adheres to the single responsibility principle because each class has one responsibility and the class's dependencies on each other are minimal. They are loosely coupled, and implementing changes are easier compared to Implementation A. -9. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? - Implementation B is more loosely coupled. +####9. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? +Implementation B is more loosely coupled. From 88b2c8ce83eb22e50a99f587545bebff9d9686de Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 30 Sep 2018 17:24:07 -0700 Subject: [PATCH 46/47] format table on design-activity --- design-activity.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/design-activity.md b/design-activity.md index 7d3aba720..e4ab4a3d6 100644 --- a/design-activity.md +++ b/design-activity.md @@ -4,7 +4,7 @@ Both implementations include the same three classes, CartEntry, ShoppingCart, and Order. Yes, each implementation returns the same list. -####2. Write down a sentence to describe each class. +#### 2. Write down a sentence to describe each class. The CartEntry class creates an instance of an order item, which has the attributes unit price and quantity. In the second implementation, it contains the method price, which calculates the price of the item by multiplying the price of the item by the quantity of items ordered. The ShoppingCart class creates an instance of a cart, which stores an array of cart item objects as an instance variable `@entries`. The second implementation contains the method price, which calculates the total of all cart items in the shopping cart. @@ -13,13 +13,13 @@ The Order class creates an instance of an order, which stores an instance of a s -####3. How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. +#### 3. 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 stores an instance of ShoppingCart object, which we can use to calculate the total price of a cart including the sales tax. Each ShoppingCart stores instances of CartEntry, and we can get the total price of the shopping cart by calling the method price on the cart (this method gets the subtotal of the cart without taxes). The CartEntry class stores an instance of a cart item which has the attributes unit price and quantity. We can get the price of a cart item entry by calling on the price method which multiplies the price of the item by the quantity ordered. In other words, an Order has one shopping cart, a ShoppingCart has many cart entries, and a CartEntry has one entry item. -####4. What data does each class store? How (if at all) does this differ between the two implementations? +#### 4. What data does each class store? How (if at all) does this differ between the two implementations? The CartEntry class stores a cart entry item. The ShoppingCart class stores instances of CartEntry objects. @@ -27,22 +27,22 @@ The Order class stores an instance of ShoppingCart. Both implementations store the same data, but the behaviors of the classes differ. The second implementation wraps the attributes in an instance method, while the first implementation uses the attr_accessor to access the instance variables of the class. -####5. What methods does each class have? How (if at all) does this differ between the two implementations? +#### 5. What methods does each class have? How (if at all) does this differ between the two implementations? -**Implementation A** -| --- | CartEntry | ShoppingCart | Order | + +|**Implementation A** | CartEntry | ShoppingCart | Order | | --- | --- | --- | --- | | Methods | `initialize`, `attr_accessor` | `initialize`, `attr_accessor` | `initialize`, `total_price` | -**Implementation B** -| --- | CartEntry | ShoppingCart | Order | + +| **Implementation B** | CartEntry | ShoppingCart | Order | | --- | --- | --- | --- | | Methods | `initialize`, `price` | `initialize`, `price` | `initialize`, `total_price` | The two implementations differ in that the second implementation wraps the instance variables in an instance method and calls on that instance method to determine price in each class. On the other hand, the first implementation calls on the attr_accessor method from the other classes to determine the price in just one class, the Order class. -####6. Consider the Order#total_price method. In each implementation: +#### 6. 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? - First implementation: price is retained in Order @@ -54,19 +54,19 @@ The two implementations differ in that the second implementation wraps the insta Second implementation: does not manipulate the instance variables, but uses the instance methods to get price -####7. If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? +#### 7. If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? The second implementation is easier to change because we can add a conditional to the `price` method to lower the unit price if quantity is greater than or equal to a set amount. The first implementation would be harder to change because all the logic is in the Order class, and is too dependent on the CartEntry and ShoppingCart classes. -####8. Which implementation better adheres to the single responsibility principle? +#### 8. Which implementation better adheres to the single responsibility principle? Implementation B better adheres to the single responsibility principle because each class has one responsibility and the class's dependencies on each other are minimal. They are loosely coupled, and implementing changes are easier compared to Implementation A. -####9. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? +#### 9. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? Implementation B is more loosely coupled. @@ -111,7 +111,7 @@ Do you still agree with your previous assesment, or could your refactor be furth - Like Reservation, the instance variable `date_range` in BlockRoom is called in BookingSystem -## Hotel Refactors: +### Hotel Refactors: * Updated logic of the `dates_overlap` method * Added custom error exception within the DateRange and BookingSystem class * Removed `list_rooms` method since the method was redundant and attr_reader returns the same thing From 81953e9e2eec9b037a7f1155a987560a90e03c11 Mon Sep 17 00:00:00 2001 From: Katrina Aganon Date: Sun, 30 Sep 2018 18:33:54 -0700 Subject: [PATCH 47/47] add more format changes to design-activity --- .gitignore | 56 +++++++++++++++++++++++++++++++++++++++++++ design-activity.md | 30 ++++++++++------------- lib/booking_system.rb | 54 ----------------------------------------- 3 files changed, 68 insertions(+), 72 deletions(-) diff --git a/.gitignore b/.gitignore index 5e1422c9c..f5bec6af3 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,59 @@ build-iPhoneSimulator/ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: .rvmrc + + + +# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') +# # # # date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') +# # # date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') +# # # # date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') +# reservation = Hotel::BookingSystem.new() +# # # +# # # # reservation_1 = Hotel::BookingSystem.new() +# # # # +# 10.times do +# reservation.make_reservation(date_range_1) +# end +# +# 1.times do +# reservation.reserve_block_rooms(date_range_1) +# end +# + +# reservation.reserve_block_rooms(date_range_1) +# +# # 3.times do +# # block_room.make_reservation_from_block(date_range_1) +# # end +# # # +# p reservation + +# p reservation.find_available_rooms(date_range_1) +# # puts "#{reservation.list_available_rooms(date_range_1)}" +# # puts "#{reservation_1.list_available_rooms(date_range_1)}" +# # puts "#{reservation.list_available_rooms(date_range_4)}" +# +# +# # +# # puts reservation.list_reservations(date_range_1).first.room_number +# # puts reservation.list_reservations(date_range_1).last.room_number +# +# # reservation.list_reservations(date_range_1).each_with_index do |res, i| +# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# # end +# # # +# # +# # reservation.list_reservations(date_range_2).each_with_index do |res, i| +# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# # end +# # +# # reservation.list_reservations(date_range_3).each_with_index do |res, i| +# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# # end +# # array = reservation.reservations +# # array.each_with_index do |res, i| +# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" +# # end +# # +# # puts "#{Hotel::BookingSystem.available_rooms}" diff --git a/design-activity.md b/design-activity.md index e4ab4a3d6..34e7f1e0c 100644 --- a/design-activity.md +++ b/design-activity.md @@ -1,7 +1,7 @@ # Comprehension Questions #### 1. What classes does each implementation include? Are the lists the same? -Both implementations include the same three classes, CartEntry, ShoppingCart, and Order. Yes, each implementation returns the same list. +Both implementations include the same three classes, CartEntry, ShoppingCart, and Order. Yes, each implementation returns the same list in the Order class. The other classes however does not return the same list because Implementation B has instance methods that call on the `price` method for each class. Implementation A only has attributes in the other two classes. #### 2. Write down a sentence to describe each class. @@ -9,7 +9,7 @@ The CartEntry class creates an instance of an order item, which has the attribut The ShoppingCart class creates an instance of a cart, which stores an array of cart item objects as an instance variable `@entries`. The second implementation contains the method price, which calculates the total of all cart items in the shopping cart. -The Order class creates an instance of an order, which stores an instance of a shopping cart object as an instance variable `@cart`. It's behavior calculates the total price of the order by getting the sum of each cart item in the shopping cart and multiplying the sum with a constant sales tax variable. +The Order class creates an instance of an order, which stores an instance of a shopping cart object as an instance variable `@cart`. It calculates the total price of the order by getting the subtotal of the cart and adding the subtotal with the subtotal multiplied by the sales tax. @@ -45,13 +45,13 @@ The two implementations differ in that the second implementation wraps the insta #### 6. 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? -- First implementation: price is retained in Order - Second implementation: price is delegated to lower level classes, ShoppingCart and CartEntry + - First implementation: price is retained in Order + - Second implementation: price is delegated to lower level classes, ShoppingCart and CartEntry * Does total_price directly manipulate the instance variables of other classes? -- First implementation: directly manipulates the instance variables of other classes - Second implementation: does not manipulate the instance variables, but uses the instance methods to get price + - First implementation: directly manipulates the instance variables of other classes + - Second implementation: does not manipulate the instance variables, but uses the instance methods to get price #### 7. If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? @@ -71,7 +71,7 @@ Implementation B is more loosely coupled. -## Improvements on Hotel +## Improvements on Hotel Project - -### Class Responsibilities: - +### Notes on Class Responsibilities: * Reservation: - Responsible for holding one reservation instance - BookingSystem calls on the reservation's instance variable `date_range`, but thought it was appropriate because `date_range` is an instance of class DateRange. This way, I can call on a method on DateRange and do the work there instead of in the BookingSystem class. @@ -112,7 +106,7 @@ Do you still agree with your previous assesment, or could your refactor be furth ### Hotel Refactors: - * Updated logic of the `dates_overlap` method - * Added custom error exception within the DateRange and BookingSystem class - * Removed `list_rooms` method since the method was redundant and attr_reader returns the same thing - * Fixed logic error in BookingSystem method `find_available_rooms` where nils were being populated in the array + * Updated logic of the `dates_overlap` method in DateRange class. Helps clean up code/readability + * Created custom error exceptions within the DateRange and BookingSystem class, instead of raising StandardError + * Removed `list_rooms` method in the BookingSystem class since the method was redundant and attr_reader returns the same thing + * Fixed logic error in BookingSystem method `find_available_rooms` where there were nil inputs being populated in the array diff --git a/lib/booking_system.rb b/lib/booking_system.rb index 7fbc82b5f..bd81eb2e9 100644 --- a/lib/booking_system.rb +++ b/lib/booking_system.rb @@ -84,57 +84,3 @@ def make_reservation_from_block(date_range) end end - -# date_range_1 = Hotel::DateRange.new('2018-09-01', '2018-09-05') -# # # # date_range_2 = Hotel::DateRange.new('2018-09-15', '2018-09-20') -# # # date_range_3 = Hotel::DateRange.new('2018-08-29', '2018-09-02') -# # # # date_range_4 = Hotel::DateRange.new('2018-10-01', '2018-10-20') -# reservation = Hotel::BookingSystem.new() -# # # -# # # # reservation_1 = Hotel::BookingSystem.new() -# # # # -# 10.times do -# reservation.make_reservation(date_range_1) -# end -# -# 1.times do -# reservation.reserve_block_rooms(date_range_1) -# end -# - -# reservation.reserve_block_rooms(date_range_1) -# -# # 3.times do -# # block_room.make_reservation_from_block(date_range_1) -# # end -# # # -# p reservation - -p reservation.find_available_rooms(date_range_1) -# # puts "#{reservation.list_available_rooms(date_range_1)}" -# # puts "#{reservation_1.list_available_rooms(date_range_1)}" -# # puts "#{reservation.list_available_rooms(date_range_4)}" -# -# -# # -# # puts reservation.list_reservations(date_range_1).first.room_number -# # puts reservation.list_reservations(date_range_1).last.room_number -# -# # reservation.list_reservations(date_range_1).each_with_index do |res, i| -# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" -# # end -# # # -# # -# # reservation.list_reservations(date_range_2).each_with_index do |res, i| -# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" -# # end -# # -# # reservation.list_reservations(date_range_3).each_with_index do |res, i| -# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" -# # end -# # array = reservation.reservations -# # array.each_with_index do |res, i| -# # puts "#{i}. Room ##{res.room_number}, Start Date: #{res.date_range.start_date}" -# # end -# # -# # puts "#{Hotel::BookingSystem.available_rooms}"