From 04b264fc2c3b321dbb533e7e6f5ae60bc0cc2cc1 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Mon, 2 Mar 2020 16:03:16 -0800 Subject: [PATCH 01/18] Created and added DateRange class and tests, set up the environment via require and require_relative test files needed to run the minitests --- lib/date_range.rb | 13 +++++++++++++ test/date_range_test.rb | 33 +++++++++++++++++++++++++++++++++ test/test_helper.rb | 10 ++++++++-- 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 lib/date_range.rb create mode 100644 test/date_range_test.rb diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..a3e2f8056 --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,13 @@ +require 'date' + +module Hotel + class DateRange + attr_reader :start_date, :end_date + def initialize(start_date, end_date) + raise(ArgumentError, "The end date #{end_date} is smaller or same as the start date #{start_date}.") unless end_date > start_date + @start_date = start_date + @end_date = end_date + end + + end +end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100644 index 000000000..6ea5d524e --- /dev/null +++ b/test/date_range_test.rb @@ -0,0 +1,33 @@ +require_relative "test_helper" +require 'date' + +describe "date" do + describe "initialize" do + it "should create an instance of DateRange when given a start_date and end_date" do + start_date = Date.new(2020, 2, 2) + end_date = Date.new(2020, 2, 12) + date = Hotel::DateRange.new(start_date, end_date) + expect(date).must_be_kind_of Hotel::DateRange + end + it "should keep track of start and end date" do + start_date = Date.new(2020, 2, 2) + end_date = Date.new(2020, 2, 12) + + date = Hotel::DateRange.new(start_date, end_date) + expect(date.start_date).must_equal start_date + expect(date.end_date).must_equal end_date + end + it "raises an ArgumentError if end_date is before start_date" do + start_date = Date.new(2020, 2, 2) + end_date = start_date - 3 + expect{ Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError + end + it "Raises an ArgumentError for 0-length date range" do + start_date = Date.new(2020, 2, 2) + end_date = start_date + expect{ Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError + end + + + end +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..45ab099d8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,8 +1,14 @@ -# Add simplecov +require 'simplecov' +SimpleCov.start do + add_filter 'test/' # Tests should not be checked for coverage. +end require "minitest" require "minitest/autorun" require "minitest/reporters" Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -# require_relative your lib files here! +require_relative '../lib/date_range' +require_relative '../lib/reservation' +require_relative '../lib/front_desk' + From 1c3207fc86371b27a75ec066700cab0a231bacbc Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Tue, 3 Mar 2020 10:51:03 -0800 Subject: [PATCH 02/18] Added Reservation class, and wrote tests to instantiate the Reservation class. --- lib/date_range.rb | 6 ++++++ lib/reservation.rb | 12 ++++++++++++ test/date_range_test.rb | 30 ++++++++++++++++++++++++------ test/reservation_test.rb | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 lib/reservation.rb create mode 100644 test/reservation_test.rb diff --git a/lib/date_range.rb b/lib/date_range.rb index a3e2f8056..42ae69dea 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -8,6 +8,12 @@ def initialize(start_date, end_date) @start_date = start_date @end_date = end_date end + def overlap?(another_date_range) + return false + end + def duration + return #how many nights + end end end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..a49300364 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,12 @@ +module Hotel + class Reservation + attr_reader :start_date, :end_date, :room, :guest_name + #start and end date are positional arguments- their position is important but room (string) and guest name can be keyword arguments + def initialize(start_date, end_date, room:[], guest_name:) + @start_date = start_date + @end_date = end_date + @room = room #the room list must match with room lists, raise an argument if invalid room number is given + @guest_name = guest_name.to_s + end + end +end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 6ea5d524e..c7b8387e7 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -3,13 +3,13 @@ describe "date" do describe "initialize" do - it "should create an instance of DateRange when given a start_date and end_date" do + it "Should create an instance of DateRange when given a start_date and end_date" do start_date = Date.new(2020, 2, 2) end_date = Date.new(2020, 2, 12) date = Hotel::DateRange.new(start_date, end_date) expect(date).must_be_kind_of Hotel::DateRange end - it "should keep track of start and end date" do + it "Should keep track of start and end date" do start_date = Date.new(2020, 2, 2) end_date = Date.new(2020, 2, 12) @@ -17,7 +17,7 @@ expect(date.start_date).must_equal start_date expect(date.end_date).must_equal end_date end - it "raises an ArgumentError if end_date is before start_date" do + it "Raises an ArgumentError if end_date is before start_date" do start_date = Date.new(2020, 2, 2) end_date = start_date - 3 expect{ Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError @@ -26,8 +26,26 @@ start_date = Date.new(2020, 2, 2) end_date = start_date expect{ Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError - end - - + end end + # describe "include?" do + # before do + # start_date = Date.new(2020, 2, 2) + # end_date = Date.new(2020, 2, 12) + # @date = Hotel::DateRange.new(start_date, end_date) + # end + # it "Should return true for the same date range" do + # start_date = @date.start_date + # end_date = @date.end_date + + # test_range = Hotel::DateRange.new(start_date, end_date) + # expect(@date.overlap?(test_range)).must_equal true + # end + # #TODO + # it "" do + + # end + # end + + end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..99f374e62 --- /dev/null +++ b/test/reservation_test.rb @@ -0,0 +1,38 @@ +require_relative "test_helper" + +describe "Reservation" do + describe "Initialize" do + before do + @start_date = Date.new(2020, 2, 2) + @end_date = @start_date + 10 + @room = ["3"] + @guest_name = "Mair Heshmati" + @reserve = Hotel::Reservation.new(@start_date, @end_date, room: @room, guest_name: @guest_name) + end + + it "should create an instance of Reservation" do + expect(@reserve).must_be_kind_of Hotel::Reservation + end + + it "Takes in and keeps track of the start and end date, the desired room number and guest name" do + expect(@reserve).must_respond_to :start_date + expect(@reserve.start_date).must_equal @start_date + + expect(@reserve).must_respond_to :end_date + expect(@reserve.end_date).must_equal @end_date + + expect(@reserve).must_respond_to :room + expect(@reserve.room).must_equal @room + + expect(@reserve).must_respond_to :guest_name + expect(@reserve.guest_name).must_equal @guest_name + end + it "Should check the data type of each attribute" do + # expect(@reserve.start_date).must_be_kind_of Date #must make sure it's an instance of Date in method as well + # expect(@reserve.end_date).must_be_kind_of Date + + expect(@reserve.room).must_be_kind_of Array + expect(@reserve.guest_name).must_be_kind_of String + end + end +end From 28a098d267618f9ff7bbddc8f26d053350495a91 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Tue, 3 Mar 2020 12:40:54 -0800 Subject: [PATCH 03/18] Modified the attr_reader method for start_date and end_date so that it is an instance variable in the Reservation class while an instance method in the DateRange class. updated tests accordingly --- lib/reservation.rb | 13 ++++++++++--- test/date_range_test.rb | 2 +- test/reservation_test.rb | 21 +++++++++------------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index a49300364..761c4a793 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,12 +1,19 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :room, :guest_name + attr_reader :room, :guest_name #start and end date are positional arguments- their position is important but room (string) and guest name can be keyword arguments - def initialize(start_date, end_date, room:[], guest_name:) + def initialize(start_date, end_date, room:, guest_name:) @start_date = start_date @end_date = end_date - @room = room #the room list must match with room lists, raise an argument if invalid room number is given + @room = room.to_s #the room list must match with room lists, raise an argument if invalid room number is given @guest_name = guest_name.to_s end + def reservation_dates(start_date, end_date) + date_range = Hotel::DateRange.new(@start_date, @end_date) + end + + + + end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index c7b8387e7..1c3b0a260 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -1,7 +1,7 @@ require_relative "test_helper" require 'date' -describe "date" do +describe "DateRange" do describe "initialize" do it "Should create an instance of DateRange when given a start_date and end_date" do start_date = Date.new(2020, 2, 2) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 99f374e62..0c0647a3c 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -5,9 +5,10 @@ before do @start_date = Date.new(2020, 2, 2) @end_date = @start_date + 10 - @room = ["3"] + @room = "3" @guest_name = "Mair Heshmati" @reserve = Hotel::Reservation.new(@start_date, @end_date, room: @room, guest_name: @guest_name) + @reservation_dates = Hotel::DateRange.new(@start_date, @end_date) end it "should create an instance of Reservation" do @@ -15,11 +16,9 @@ end it "Takes in and keeps track of the start and end date, the desired room number and guest name" do - expect(@reserve).must_respond_to :start_date - expect(@reserve.start_date).must_equal @start_date - - expect(@reserve).must_respond_to :end_date - expect(@reserve.end_date).must_equal @end_date + expect(@reserve.instance_variable_get(:@start_date)).must_equal @start_date + expect(@reserve.instance_variable_get(:@end_date)).must_equal @end_date + #make sure the start and end date is being set as instance variables expect(@reserve).must_respond_to :room expect(@reserve.room).must_equal @room @@ -27,12 +26,10 @@ expect(@reserve).must_respond_to :guest_name expect(@reserve.guest_name).must_equal @guest_name end - it "Should check the data type of each attribute" do - # expect(@reserve.start_date).must_be_kind_of Date #must make sure it's an instance of Date in method as well - # expect(@reserve.end_date).must_be_kind_of Date - - expect(@reserve.room).must_be_kind_of Array - expect(@reserve.guest_name).must_be_kind_of String + + it "Should instantiate an instance of DateRange given start and end date" do + expect(@reserve).must_respond_to :reservation_dates + expect(@reserve.reservation_dates(@start_date, @end_date)).must_be_kind_of Hotel::DateRange end end end From fc4f91f98e25b29bd884a54a39d5d75c0f081cbe Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Tue, 3 Mar 2020 12:55:34 -0800 Subject: [PATCH 04/18] Added the .duration method and wrote tests for DateRange class --- lib/date_range.rb | 4 +++- test/date_range_test.rb | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 42ae69dea..9cb7517a2 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -12,7 +12,9 @@ def overlap?(another_date_range) return false end def duration - return #how many nights + total_duration = (@end_date - @start_date).to_i + total_duration -= 1 + return total_duration end end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 1c3b0a260..16dd04a4c 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -28,6 +28,22 @@ expect{ Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError end end + describe "duration" do + before do + @start_date = Date.new(2020, 2, 2) + @end_date = Date.new(2020, 2, 12) + @date = Hotel::DateRange.new(@start_date, @end_date) + @duration = (@end_date - @start_date).to_i + @duration -= 1 + end + it "Should have the .duration method" do + expect(@date).must_respond_to :duration + end + + it "Should calculate the correct amount of durations" do + expect(@duration).must_equal 9 + end + end # describe "include?" do # before do # start_date = Date.new(2020, 2, 2) From 9c7d2410e462ed70d859d0998cdd8b7a4e1a5b8a Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Tue, 3 Mar 2020 14:08:18 -0800 Subject: [PATCH 05/18] created cost in Reservation and wrote tests --- lib/reservation.rb | 13 +++++++++++-- test/reservation_test.rb | 25 ++++++++++++++++--------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 761c4a793..5e4349f91 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -9,10 +9,19 @@ def initialize(start_date, end_date, room:, guest_name:) @guest_name = guest_name.to_s end def reservation_dates(start_date, end_date) - date_range = Hotel::DateRange.new(@start_date, @end_date) + #instantiate DateRange with the given start and end date + return Hotel::DateRange.new(@start_date, @end_date) end - + def cost + #call for how many nights (duration method in DateRange) to calculate the total cost + return reservation_dates(@start_date, @end_date).duration * 200 + end + + def self.all + all_reservations = [] + + end end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 0c0647a3c..7c2e17cc2 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,16 +1,16 @@ require_relative "test_helper" describe "Reservation" do - describe "Initialize" do before do - @start_date = Date.new(2020, 2, 2) - @end_date = @start_date + 10 - @room = "3" - @guest_name = "Mair Heshmati" - @reserve = Hotel::Reservation.new(@start_date, @end_date, room: @room, guest_name: @guest_name) - @reservation_dates = Hotel::DateRange.new(@start_date, @end_date) - end + @start_date = Date.new(2020, 2, 2) + @end_date = @start_date + 10 + @room = "3" + @guest_name = "Mair Heshmati" + @reserve = Hotel::Reservation.new(@start_date, @end_date, room: @room, guest_name: @guest_name) + @reservation_dates = Hotel::DateRange.new(@start_date, @end_date) + end + describe "Initialize" do it "should create an instance of Reservation" do expect(@reserve).must_be_kind_of Hotel::Reservation end @@ -26,10 +26,17 @@ expect(@reserve).must_respond_to :guest_name expect(@reserve.guest_name).must_equal @guest_name end - + it "Should instantiate an instance of DateRange given start and end date" do expect(@reserve).must_respond_to :reservation_dates expect(@reserve.reservation_dates(@start_date, @end_date)).must_be_kind_of Hotel::DateRange end end + describe "cost" do + it "Calculates the correct amount of cost for reservation duration" do + expect(@reserve.cost).must_equal 1800 + end + + + end end From bde53d4d53454c8c0d951500dde99f872abb920f Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Tue, 3 Mar 2020 14:09:55 -0800 Subject: [PATCH 06/18] wrote duration method for DateRange and tests --- lib/date_range.rb | 8 +++++--- test/date_range_test.rb | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 9cb7517a2..b3a3ed11d 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -8,14 +8,16 @@ def initialize(start_date, end_date) @start_date = start_date @end_date = end_date end - def overlap?(another_date_range) - return false - end + def duration total_duration = (@end_date - @start_date).to_i total_duration -= 1 return total_duration end + def overlap?(another_date_range) + return false + end + end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 16dd04a4c..bc5021b28 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -39,10 +39,12 @@ it "Should have the .duration method" do expect(@date).must_respond_to :duration end - + it "Should calculate the correct amount of durations" do expect(@duration).must_equal 9 end + + #add more edge case tests here? end # describe "include?" do # before do From 651618f06878860e7d50fad93f46bf665b6ccb84 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Tue, 3 Mar 2020 15:18:40 -0800 Subject: [PATCH 07/18] added .all_dates to DateRange class and wrote tests for it- cleaned up some of the reservation_dates tests for the Reservation class --- lib/date_range.rb | 40 +++++++++++++++++------------- lib/reservation.rb | 9 ++----- test/date_range_test.rb | 53 ++++++++++++++++++++++++++-------------- test/reservation_test.rb | 2 +- 4 files changed, 60 insertions(+), 44 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index b3a3ed11d..93f6a5295 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,23 +1,29 @@ -require 'date' +require "date" module Hotel - class DateRange - attr_reader :start_date, :end_date - def initialize(start_date, end_date) - raise(ArgumentError, "The end date #{end_date} is smaller or same as the start date #{start_date}.") unless end_date > start_date - @start_date = start_date - @end_date = end_date - end + class DateRange + attr_reader :start_date, :end_date - def duration - total_duration = (@end_date - @start_date).to_i - total_duration -= 1 - return total_duration - end + def initialize(start_date, end_date) + raise(ArgumentError, "The end date #{end_date} is smaller or same as the start date #{start_date}.") unless end_date > start_date + @start_date = start_date + @end_date = end_date + end + + def duration + total_duration = (@end_date - @start_date).to_i + total_duration -= 1 + return total_duration + end - def overlap?(another_date_range) - return false - end + def all_dates + return (@start_date..@end_date).map do |date| + date + end + end + def overlap?(another_date_range) + return false end -end \ No newline at end of file + end +end diff --git a/lib/reservation.rb b/lib/reservation.rb index 5e4349f91..3fbff7a31 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -8,19 +8,14 @@ def initialize(start_date, end_date, room:, guest_name:) @room = room.to_s #the room list must match with room lists, raise an argument if invalid room number is given @guest_name = guest_name.to_s end - def reservation_dates(start_date, end_date) + def reservation_dates #instantiate DateRange with the given start and end date return Hotel::DateRange.new(@start_date, @end_date) end def cost #call for how many nights (duration method in DateRange) to calculate the total cost - return reservation_dates(@start_date, @end_date).duration * 200 - end - - def self.all - all_reservations = [] - + return reservation_dates.duration * 200 end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index bc5021b28..1b57fcf00 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -2,20 +2,24 @@ require 'date' describe "DateRange" do + before do + @start_date = Date.new(2020, 2, 2) + @end_date = Date.new(2020, 2, 12) + @date = Hotel::DateRange.new(@start_date, @end_date) + @duration = (@end_date - @start_date).to_i + @duration -= 1 + @all_dates = (@start_date..@end_date).map do |day| + day + end + end + describe "initialize" do it "Should create an instance of DateRange when given a start_date and end_date" do - start_date = Date.new(2020, 2, 2) - end_date = Date.new(2020, 2, 12) - date = Hotel::DateRange.new(start_date, end_date) - expect(date).must_be_kind_of Hotel::DateRange + expect(@date).must_be_kind_of Hotel::DateRange end it "Should keep track of start and end date" do - start_date = Date.new(2020, 2, 2) - end_date = Date.new(2020, 2, 12) - - date = Hotel::DateRange.new(start_date, end_date) - expect(date.start_date).must_equal start_date - expect(date.end_date).must_equal end_date + expect(@date.start_date).must_equal @start_date + expect(@date.end_date).must_equal @end_date end it "Raises an ArgumentError if end_date is before start_date" do start_date = Date.new(2020, 2, 2) @@ -29,22 +33,33 @@ end end describe "duration" do - before do - @start_date = Date.new(2020, 2, 2) - @end_date = Date.new(2020, 2, 12) - @date = Hotel::DateRange.new(@start_date, @end_date) - @duration = (@end_date - @start_date).to_i - @duration -= 1 - end it "Should have the .duration method" do expect(@date).must_respond_to :duration end it "Should calculate the correct amount of durations" do - expect(@duration).must_equal 9 + expect(@date.duration).must_equal 9 end - #add more edge case tests here? + end + describe "all_dates" do + it "Should have the .all_dates method" do + expect(@date).must_respond_to :all_dates + end + + it "Should iterate through date range and give an array of all dates" do + expect(@date.all_dates).must_equal @all_dates + end + + it "Should give an array of all the dates within the date range" do + expect(@date.all_dates).must_be_kind_of Array + end + + it "Should include date that exists within date range" do + expect(@date.all_dates).must_include Date.new(2020, 2, 10) + end + + end # describe "include?" do # before do diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 7c2e17cc2..b2cfa9d17 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -29,7 +29,7 @@ it "Should instantiate an instance of DateRange given start and end date" do expect(@reserve).must_respond_to :reservation_dates - expect(@reserve.reservation_dates(@start_date, @end_date)).must_be_kind_of Hotel::DateRange + expect(@reserve.reservation_dates).must_be_kind_of Hotel::DateRange end end describe "cost" do From f385e12477ca1518a94d36e7f853ef22c79b9303 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Tue, 3 Mar 2020 15:19:52 -0800 Subject: [PATCH 08/18] created and implemented some instance variables in the FrontDesk class- FrontDesk test are yet to be written --- lib/front_desk.rb | 32 ++++++++++++++++++++++++++++++++ test/front_desk_test.rb | 13 +++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 lib/front_desk.rb create mode 100644 test/front_desk_test.rb diff --git a/lib/front_desk.rb b/lib/front_desk.rb new file mode 100644 index 000000000..78df91364 --- /dev/null +++ b/lib/front_desk.rb @@ -0,0 +1,32 @@ +module Hotel + class FrontDesk + def initialize + @all_rooms = [] + 20.times do |i| + @all_rooms << "#{i + 1}" + end + + @all_reservations = [] + end + + #gives a copy of all rooms within the hotel + def list_of_all_rooms + return @all_rooms.clone + end + + #reserve a room by giving a date range, guest name, and which room to stay in + def reserve_room(start_date, end_date, guest_name, room) + raise(ArgumentError, "This room #{room} does not exist in our hotel:(") unless @all_rooms.include? room + @all_reservations << Hotel::Reservation(start_date, end_date, guest_name, room) + end + + def list_of_reservations(date) + @all_reservations.find_all do |reservation| + reservation + end + end + + def list_of_availble_rooms(start_date, end_date) + end + end +end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb new file mode 100644 index 000000000..8e155ff27 --- /dev/null +++ b/test/front_desk_test.rb @@ -0,0 +1,13 @@ +require_relative "test_helper" + +describe "front_desk" do + #attributes list of all 20 rooms + + + #methods + #list_availble_rooms(date) + #list_availble_rooms(start_date - end_date) + #reserve_room(start_date - end_date) + #list_reservations(date) + +end \ No newline at end of file From abad59ab24bb345ee88fa3afcd779020c26f23b2 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Wed, 4 Mar 2020 09:32:12 -0800 Subject: [PATCH 09/18] made a room class, update some method within FrontDesk and Reservation to implement the Room class method and instance variable- work in progress. no new tests written for any of the new changes --- lib/date_range.rb | 2 +- lib/front_desk.rb | 26 ++++++++++---- lib/reservation.rb | 3 +- lib/room.rb | 16 +++++++++ test/date_range_test.rb | 29 +++++----------- test/front_desk_test.rb | 75 ++++++++++++++++++++++++++++++++++++----- test/room_test.rb | 0 test/test_helper.rb | 2 ++ 8 files changed, 115 insertions(+), 38 deletions(-) create mode 100644 lib/room.rb create mode 100644 test/room_test.rb diff --git a/lib/date_range.rb b/lib/date_range.rb index 93f6a5295..f9f107838 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -17,7 +17,7 @@ def duration end def all_dates - return (@start_date..@end_date).map do |date| + return (@start_date...@end_date).map do |date| date end end diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 78df91364..3951bad2d 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -3,7 +3,7 @@ class FrontDesk def initialize @all_rooms = [] 20.times do |i| - @all_rooms << "#{i + 1}" + @all_rooms << Hotel::Room.new("room: #{i + 1}") end @all_reservations = [] @@ -11,22 +11,34 @@ def initialize #gives a copy of all rooms within the hotel def list_of_all_rooms - return @all_rooms.clone + return @all_rooms.clone end - #reserve a room by giving a date range, guest name, and which room to stay in + #reserve a room by giving a date range, guest name, and which room to stay in def reserve_room(start_date, end_date, guest_name, room) raise(ArgumentError, "This room #{room} does not exist in our hotel:(") unless @all_rooms.include? room - @all_reservations << Hotel::Reservation(start_date, end_date, guest_name, room) + + new_res = Hotel::Reservation.new(start_date, end_date, guest_name: guest_name, room: Hotel::Room.new(room)) + #adding the new reservation to the total reservations array + #adding the new reservation to the list of that room's reservations + #### should the list of reservations of the hotel be accessible to the front desk or should this be happening in the room class + + @all_reservations << new_res + :room.room_reservations << new_res + end def list_of_reservations(date) - @all_reservations.find_all do |reservation| - reservation - end + return @all_reservations.find_all do |reservation| + reservation.reservation_dates.all_dates.each do |day| #this has high time complexity so might change it? + date == day + end + end end def list_of_availble_rooms(start_date, end_date) + + end end end diff --git a/lib/reservation.rb b/lib/reservation.rb index 3fbff7a31..a0c71b622 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -5,9 +5,10 @@ class Reservation def initialize(start_date, end_date, room:, guest_name:) @start_date = start_date @end_date = end_date - @room = room.to_s #the room list must match with room lists, raise an argument if invalid room number is given + @room = Hotel::Room.new(room) @guest_name = guest_name.to_s end + def reservation_dates #instantiate DateRange with the given start and end date return Hotel::DateRange.new(@start_date, @end_date) diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..74c423898 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,16 @@ +module Hotel + class Room + attr_reader :room_number + attr_accessor :room_reservations + def initialize (room_number) + @room_number = room_number + @room_reservations = [] + end + + def dates_unavailable + @room_reservations.reservation_dates.all_dates.each + end + + + end +end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 1b57fcf00..7d7953991 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -8,7 +8,7 @@ @date = Hotel::DateRange.new(@start_date, @end_date) @duration = (@end_date - @start_date).to_i @duration -= 1 - @all_dates = (@start_date..@end_date).map do |day| + @all_dates = (@start_date...@end_date).map do |day| day end end @@ -58,27 +58,16 @@ it "Should include date that exists within date range" do expect(@date.all_dates).must_include Date.new(2020, 2, 10) end - - end - # describe "include?" do - # before do - # start_date = Date.new(2020, 2, 2) - # end_date = Date.new(2020, 2, 12) - # @date = Hotel::DateRange.new(start_date, end_date) - # end - # it "Should return true for the same date range" do - # start_date = @date.start_date - # end_date = @date.end_date - - # test_range = Hotel::DateRange.new(start_date, end_date) - # expect(@date.overlap?(test_range)).must_equal true - # end - # #TODO - # it "" do + # it "Should not include the last day of date range aka move out date" do + # expect(@date.all_dates).wont_include @end_date + # end ??????????? + - # end - # end + + + end + end \ No newline at end of file diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 8e155ff27..400c8b938 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -1,13 +1,70 @@ require_relative "test_helper" -describe "front_desk" do - #attributes list of all 20 rooms - +describe "front_desk" do + before do + @moody_moon_hotel = Hotel::FrontDesk.new() + @all_rooms = [] + 20.times do |i| + @all_rooms << "#{i + 1}" + end + + @all_reservations = [] + end + describe "initiate" do + it "Should be instantiated with no given Arguments" do + expect(@moody_moon_hotel).must_be_kind_of Hotel::FrontDesk + end + end + + describe "all_reservations instance variable" do + it "Should be an empty array at the beggining" do + expect(@moody_moon_hotel.instance_variable_get(:@all_reservations)).must_be_kind_of Array + expect(@moody_moon_hotel.instance_variable_get(:@all_reservations)).must_be_empty + end + end + + describe "list_of_all_rooms" do + it "Should have a method list_of_all_rooms" do + expect(@moody_moon_hotel).must_respond_to :list_of_all_rooms + end + + it "Should give an array of all the rooms in the hotel" do + expect(@moody_moon_hotel.list_of_all_rooms).must_equal @all_rooms + end + end - #methods - #list_availble_rooms(date) - #list_availble_rooms(start_date - end_date) - #reserve_room(start_date - end_date) - #list_reservations(date) + describe "reserve_room" do + before do + + end + it "Should create an instance of Reservation when given start_date, end_date, guest_name, room " do + start_date = Date.new(2020, 2, 1) + end_date = Date.new(2020, 2, 3) + guest_name = "Moody McMoon" + room = "2" + @moody_moon_hotel.reserve_room(start_date, end_date, guest_name, room).each do |res| + expect(res).must_be_kind_of Hotel::Reservation + end + + end + it "Should return an array containing all of the reservations" do + + end -end \ No newline at end of file + it "Should raise an ArgumentError when given a wrong room number" do + start_date = Date.new(2020, 2, 1) + end_date = Date.new(2020, 2, 3) + guest_name = "Moody McMoon" + room = "99" + expect{@moody_moon_hotel.reserve_room(start_date, end_date, guest_name, room)}.must_raise ArgumentError + end + end + #attributes list of all 20 rooms + + #methods + #list_availble_rooms(date) + #list_availble_rooms(start_date - end_date) + #reserve_room(start_date - end_date) + #list_reservations(date) + +end diff --git a/test/room_test.rb b/test/room_test.rb new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_helper.rb b/test/test_helper.rb index 45ab099d8..eb091d111 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,6 +9,8 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new require_relative '../lib/date_range' +require_relative '../lib/room' require_relative '../lib/reservation' require_relative '../lib/front_desk' + From 7af4c600e1414b6658862512566ac3f5202ccaa9 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Wed, 4 Mar 2020 16:25:48 -0800 Subject: [PATCH 10/18] Finished wave 2- still no tests written. wrote add_reservation_to_room and dates_unavailable to Room to add all room reservations and return an array of all the dates the room has been booked respectively. wrote and modified list_of_reservations(date) and list_of_available_rooms(start_date, end_date) respectively to FrontDesk. --- lib/date_range.rb | 13 +++++-------- lib/front_desk.rb | 35 ++++++++++++++++++++++------------- lib/reservation.rb | 38 ++++++++++++++++++-------------------- lib/room.rb | 31 ++++++++++++++++++++----------- 4 files changed, 65 insertions(+), 52 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index f9f107838..922e16e51 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -10,20 +10,17 @@ def initialize(start_date, end_date) @end_date = end_date end - def duration - total_duration = (@end_date - @start_date).to_i - total_duration -= 1 - return total_duration - end - + #return an array of all the dates within the range- excluding the last day aka the day the guest leaves def all_dates return (@start_date...@end_date).map do |date| date end end - def overlap?(another_date_range) - return false + def duration + return all_dates.length end + + end end diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 3951bad2d..cb2008b4d 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -3,7 +3,7 @@ class FrontDesk def initialize @all_rooms = [] 20.times do |i| - @all_rooms << Hotel::Room.new("room: #{i + 1}") + @all_rooms << Hotel::Room.new("room #{i + 1}") #instantiate Room object end @all_reservations = [] @@ -17,28 +17,37 @@ def list_of_all_rooms #reserve a room by giving a date range, guest name, and which room to stay in def reserve_room(start_date, end_date, guest_name, room) raise(ArgumentError, "This room #{room} does not exist in our hotel:(") unless @all_rooms.include? room - - new_res = Hotel::Reservation.new(start_date, end_date, guest_name: guest_name, room: Hotel::Room.new(room)) - #adding the new reservation to the total reservations array - #adding the new reservation to the list of that room's reservations - #### should the list of reservations of the hotel be accessible to the front desk or should this be happening in the room class - - @all_reservations << new_res - :room.room_reservations << new_res + raise(ArgumentError, "This room #{room} is unavailable for reservation for given dates #{start_date} - #{end_date}") unless list_of_availble_rooms(start_date, end_date).include? room + new_res = Hotel::Reservation.new(start_date, end_date, guest_name: guest_name, room: room) + #raise an argumentErro when the start_date and/or the end_date of a reservation for a room already exits aka if the room is not available for those dates + + reservation_room = @all_rooms.find do |room_object| + room_object == room + end + #add reservation to room's reservation_list + reservation_room.add_reservation_to_room(new_res) + #add this reservation to all_reservations in hotel + @all_reservations << new_res end + #return an array of all Reservations with matching date requested def list_of_reservations(date) - return @all_reservations.find_all do |reservation| - reservation.reservation_dates.all_dates.each do |day| #this has high time complexity so might change it? + return @all_reservations.select do |reservation| + reservation.reservation_dates.all_dates.any? do |day| #this has high time complexity so might change it? date == day end end + + return end + #returns an array of all available rooms for the give date range def list_of_availble_rooms(start_date, end_date) - - + reserved_rooms = @all_rooms.select do |room| + room.dates_unavailable.any? (start_date...end_date) + end + return @all_rooms - reserved_rooms end end end diff --git a/lib/reservation.rb b/lib/reservation.rb index a0c71b622..f9d424021 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,24 +1,22 @@ module Hotel - class Reservation - attr_reader :room, :guest_name - #start and end date are positional arguments- their position is important but room (string) and guest name can be keyword arguments - def initialize(start_date, end_date, room:, guest_name:) - @start_date = start_date - @end_date = end_date - @room = Hotel::Room.new(room) - @guest_name = guest_name.to_s - end - - def reservation_dates - #instantiate DateRange with the given start and end date - return Hotel::DateRange.new(@start_date, @end_date) - end + class Reservation + attr_reader :room, :guest_name + #start and end date are positional arguments- their position is important but room (string) and guest name can be keyword arguments + def initialize(start_date, end_date, room:, guest_name:) + @start_date = start_date + @end_date = end_date + @room = room + @guest_name = guest_name.to_s + end - def cost - #call for how many nights (duration method in DateRange) to calculate the total cost - return reservation_dates.duration * 200 - end + #instantiate DateRange with the given start and end date + def reservation_dates + return Hotel::DateRange.new(@start_date, @end_date) + end - + #call for how many nights (duration method in DateRange) to calculate the total cost + def cost + return reservation_dates.duration * 200 end -end \ No newline at end of file + end +end diff --git a/lib/room.rb b/lib/room.rb index 74c423898..80f3d6e6f 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,16 +1,25 @@ module Hotel - class Room - attr_reader :room_number - attr_accessor :room_reservations - def initialize (room_number) - @room_number = room_number - @room_reservations = [] - end + class Room + attr_reader :room_number, :room_reservations - def dates_unavailable - @room_reservations.reservation_dates.all_dates.each - end + def initialize(room_number) + @room_number = room_number + @room_reservations = [] + end + def add_reservation_to_room(reservation) + @room_reservations << reservation + end + + #return an array of all the dates room was booked/is unavailable + def dates_unavailable + dates_booked = @room_reservations.each do |reservation| + reservation.reservation_dates.all_dates.select do |day| + day + end + return dates_booked.flatten + end end -end \ No newline at end of file + end +end From 6d1fcbc140207f31f14de203cdc86ae898c7470d Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Fri, 6 Mar 2020 18:28:22 -0800 Subject: [PATCH 11/18] finalized DateRange class and its tests, has two method for returning date range dates and the duration of the stay respectively --- lib/date_range.rb | 7 +-- test/date_range_test.rb | 111 +++++++++++++++++++--------------------- 2 files changed, 53 insertions(+), 65 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 922e16e51..630328ca7 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -10,17 +10,12 @@ def initialize(start_date, end_date) @end_date = end_date end - #return an array of all the dates within the range- excluding the last day aka the day the guest leaves def all_dates - return (@start_date...@end_date).map do |date| - date - end + return (@start_date...@end_date).to_a end def duration return all_dates.length end - - end end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 7d7953991..c15137225 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -1,73 +1,66 @@ require_relative "test_helper" -require 'date' -describe "DateRange" do - before do - @start_date = Date.new(2020, 2, 2) - @end_date = Date.new(2020, 2, 12) - @date = Hotel::DateRange.new(@start_date, @end_date) - @duration = (@end_date - @start_date).to_i - @duration -= 1 - @all_dates = (@start_date...@end_date).map do |day| - day - end - end +describe "DateRange" do + before do + @start_date = Date.new(2020, 2, 2) + @end_date = Date.new(2020, 2, 5) + @date = Hotel::DateRange.new(@start_date, @end_date) + @all_dates = [Date.new(2020, 2, 2), Date.new(2020, 2, 3), Date.new(2020, 2, 4)] + end - describe "initialize" do - it "Should create an instance of DateRange when given a start_date and end_date" do - expect(@date).must_be_kind_of Hotel::DateRange - end - it "Should keep track of start and end date" do - expect(@date.start_date).must_equal @start_date - expect(@date.end_date).must_equal @end_date - end - it "Raises an ArgumentError if end_date is before start_date" do - start_date = Date.new(2020, 2, 2) - end_date = start_date - 3 - expect{ Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError - end - it "Raises an ArgumentError for 0-length date range" do - start_date = Date.new(2020, 2, 2) - end_date = start_date - expect{ Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError - end + describe "initialize" do + it "Should create an instance of DateRange when given a start_date and end_date" do + expect(@date).must_be_instance_of Hotel::DateRange end - describe "duration" do - it "Should have the .duration method" do - expect(@date).must_respond_to :duration - end - - it "Should calculate the correct amount of durations" do - expect(@date.duration).must_equal 9 - end - #add more edge case tests here? + it "Should keep track of start and end date" do + expect(@date.start_date).must_equal @start_date + expect(@date.end_date).must_equal @end_date end - describe "all_dates" do - it "Should have the .all_dates method" do - expect(@date).must_respond_to :all_dates - end - - it "Should iterate through date range and give an array of all dates" do - expect(@date.all_dates).must_equal @all_dates - end + it "Raises an ArgumentError if end_date is before start_date" do + start_date = Date.new(2020, 2, 2) + end_date = start_date - 3 + expect { Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError + end + it "Raises an ArgumentError for 0-length date range" do + start_date = Date.new(2020, 2, 2) + end_date = start_date + expect { Hotel::DateRange.new(start_date, end_date) }.must_raise ArgumentError + end + end - it "Should give an array of all the dates within the date range" do - expect(@date.all_dates).must_be_kind_of Array - end + describe "duration" do + it "Should have the .duration method" do + expect(@date).must_respond_to :duration + end - it "Should include date that exists within date range" do - expect(@date.all_dates).must_include Date.new(2020, 2, 10) - end - - # it "Should not include the last day of date range aka move out date" do - # expect(@date.all_dates).wont_include @end_date - # end ??????????? + it "Should calculate the correct amount of durations" do + expect(@date.duration).must_equal 3 + end + end + describe "all_dates" do + it "Should have the .all_dates method" do + expect(@date).must_respond_to :all_dates + end + it "Should iterate through date range and give an array of all dates" do + expect(@date.all_dates).must_equal @all_dates + end + it "Should give an array of all the dates within the date range" do + expect(@date.all_dates).must_be_kind_of Array + end + it "Should include date that exists within date range" do + expect(@date.all_dates).must_include Date.new(2020, 2, 3) end - + it "Should not include the departure date" do + expect(@date.all_dates).wont_include @end_date + end -end \ No newline at end of file + it "Should include the arrival date" do + expect(@date.all_dates).must_include @start_date + end + end +end From 7d2e64960f99a0231e5c008ccb042fe5dc2fbcdd Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Fri, 6 Mar 2020 18:29:51 -0800 Subject: [PATCH 12/18] finished wave 2- room has a method to return the dates it's reserved and a method to add room's reservation to it's own list --- lib/room.rb | 12 +++----- test/room_test.rb | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/lib/room.rb b/lib/room.rb index 80f3d6e6f..2bb49d6e6 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -8,18 +8,16 @@ def initialize(room_number) end def add_reservation_to_room(reservation) + raise(ArgumentError, "this reservation#{reservation} is not for #{@room_number}.") unless reservation.room == @room_number @room_reservations << reservation end - #return an array of all the dates room was booked/is unavailable + #return an array of all the dates room was booked/is unavailable def dates_unavailable - dates_booked = @room_reservations.each do |reservation| - reservation.reservation_dates.all_dates.select do |day| - day - end - return dates_booked.flatten - + dates_booked = @room_reservations.map do |reservation| + reservation.reservation_dates.all_dates end + return dates_booked.flatten end end end diff --git a/test/room_test.rb b/test/room_test.rb index e69de29bb..259730f46 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -0,0 +1,77 @@ +require_relative "test_helper" + +describe "Room" do + before do + @my_room = Hotel::Room.new("room 1") + + @patrick_reservation = Hotel::Reservation.new( + start_date = Date.new(2020, 2, 2), + end_date = start_date + 3, + room: "room 1", + guest_name: "patrick star", + ) + + @spongebob_reservation = Hotel::Reservation.new( + start_date = Date.new(2020, 2, 5), + end_date = start_date + 1, + room: "room 1", + guest_name: "spongebob squarepants", + ) + + @my_room.add_reservation_to_room(@patrick_reservation) + @my_room.add_reservation_to_room(@spongebob_reservation) + end + + describe "Initialize" do + it "Should be initialized when given a room number" do + expect(@my_room).must_be_instance_of Hotel::Room + end + + it "Should have room_number and room_reservations (array) as instance variables" do + expect(@my_room).must_respond_to :room_number + expect(@my_room.room_number).must_equal "room 1" + + expect(@my_room).must_respond_to :room_reservations + expect(@my_room.room_reservations).must_be_kind_of Array + end + end + + describe "add_reservation_to_room(reservation)" do + it "The room_reservations should be an array of Reservation class" do + @my_room.room_reservations.each do |reservation| + expect(reservation).must_be_instance_of Hotel::Reservation + end + end + it "Should include room's reservations" do + expect(@my_room.room_reservations).must_include @spongebob_reservation + expect(@my_room.room_reservations.length).must_equal 2 + end + + it "Should add new Reservation instances to the array list of room_reservations" do + start_date = Date.new(2020, 3, 15) + end_date = start_date + 1 + squidward_reservation = Hotel::Reservation.new(start_date, end_date, room: "room 1", guest_name: "squidward tentacles") + expect(@my_room.add_reservation_to_room(squidward_reservation)).must_include squidward_reservation + expect(@my_room.room_reservations.length).must_equal 3 + end + + it "Should raise an ArgumentError if a reservation not for that room class is passed in as a parameter" do + start_date = Date.new(2020, 3, 20) + end_date = start_date + 1 + mr_krab_reservation = Hotel::Reservation.new(start_date, end_date, room: "room 6", guest_name: "my krabs") + expect{@my_room.add_reservation_to_room(mr_krab_reservation)}.must_raise ArgumentError + end + end + + describe "dates_unavailable" do + it "should return an array of all dates the room is has been reserved for" do + dates_reserved = [Date.new(2020, 2, 2), Date.new(2020, 2, 3), Date.new(2020, 2, 4), Date.new(2020, 2, 5) ] + expect(@my_room.dates_unavailable).must_equal dates_reserved + + end + it "Dates of reservation must be unique" do + expect(@my_room.dates_unavailable.uniq!).must_be_nil + end + end +end + From 120647c51dfeaf5499d94e21546662487577cc1a Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Fri, 6 Mar 2020 18:31:40 -0800 Subject: [PATCH 13/18] finished wave 2 - reservation calculates the cost, has a helper method that call on DateRange object. room is inputted as a string and not a Room instance --- lib/reservation.rb | 5 +---- test/reservation_test.rb | 43 +++++++++++++++++++++++----------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index f9d424021..5db550ee6 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,20 +1,17 @@ module Hotel class Reservation attr_reader :room, :guest_name - #start and end date are positional arguments- their position is important but room (string) and guest name can be keyword arguments def initialize(start_date, end_date, room:, guest_name:) @start_date = start_date @end_date = end_date @room = room @guest_name = guest_name.to_s end - - #instantiate DateRange with the given start and end date + def reservation_dates return Hotel::DateRange.new(@start_date, @end_date) end - #call for how many nights (duration method in DateRange) to calculate the total cost def cost return reservation_dates.duration * 200 end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index b2cfa9d17..2d243f30f 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,24 +1,23 @@ require_relative "test_helper" describe "Reservation" do - before do - @start_date = Date.new(2020, 2, 2) - @end_date = @start_date + 10 - @room = "3" - @guest_name = "Mair Heshmati" - @reserve = Hotel::Reservation.new(@start_date, @end_date, room: @room, guest_name: @guest_name) - @reservation_dates = Hotel::DateRange.new(@start_date, @end_date) - end + before do + @start_date = Date.new(2020, 2, 2) + @end_date = @start_date + 3 + @room = "room 3" + @guest_name = "Mair Heshmati" + @reserve = Hotel::Reservation.new(@start_date, @end_date, room: @room, guest_name: @guest_name) + end describe "Initialize" do it "should create an instance of Reservation" do - expect(@reserve).must_be_kind_of Hotel::Reservation + expect(@reserve).must_be_instance_of Hotel::Reservation end it "Takes in and keeps track of the start and end date, the desired room number and guest name" do expect(@reserve.instance_variable_get(:@start_date)).must_equal @start_date expect(@reserve.instance_variable_get(:@end_date)).must_equal @end_date - #make sure the start and end date is being set as instance variables + #make sure the start and end date is being set as instance variables expect(@reserve).must_respond_to :room expect(@reserve.room).must_equal @room @@ -26,17 +25,25 @@ expect(@reserve).must_respond_to :guest_name expect(@reserve.guest_name).must_equal @guest_name end - - it "Should instantiate an instance of DateRange given start and end date" do + end + describe "reservation_dates" do + it "Should instantiate an instance of DateRange given start and end date" do expect(@reserve).must_respond_to :reservation_dates - expect(@reserve.reservation_dates).must_be_kind_of Hotel::DateRange + expect(@reserve.reservation_dates).must_be_instance_of Hotel::DateRange end - end - describe "cost" do - it "Calculates the correct amount of cost for reservation duration" do - expect(@reserve.cost).must_equal 1800 + + it "Should have the correct arrival date" do + expect(@reserve.reservation_dates.start_date).must_equal @start_date end - + it "should have the correct departure date" do + expect(@reserve.reservation_dates.end_date).must_equal @end_date + end + end + + describe "cost" do + it "Calculates the correct amount of cost for reservation duration" do + expect(@reserve.cost).must_equal 600 + end end end From ab3f7b182614fec221389f2494714aabf24b4028 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Fri, 6 Mar 2020 18:33:55 -0800 Subject: [PATCH 14/18] finished wave 2- front desk methods include: making a reservation, seeing reservations for a specific date, and list of rooms available given a date range- tests are written but code base needs refactoring to dry up the code --- lib/front_desk.rb | 47 ++++++++-------- test/front_desk_test.rb | 122 +++++++++++++++++++++++++++------------- test/test_helper.rb | 1 + 3 files changed, 107 insertions(+), 63 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index cb2008b4d..ceb70b714 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,5 +1,7 @@ module Hotel class FrontDesk + attr_reader :all_rooms, :all_reservations + def initialize @all_rooms = [] 20.times do |i| @@ -9,45 +11,44 @@ def initialize @all_reservations = [] end - #gives a copy of all rooms within the hotel - def list_of_all_rooms - return @all_rooms.clone + def list_of_available_rooms(start_date, end_date) + test_date_range = (start_date...end_date).to_a + return @all_rooms.reject do |room| + (room.dates_unavailable & test_date_range).length > 0 + end end - #reserve a room by giving a date range, guest name, and which room to stay in - def reserve_room(start_date, end_date, guest_name, room) - raise(ArgumentError, "This room #{room} does not exist in our hotel:(") unless @all_rooms.include? room - raise(ArgumentError, "This room #{room} is unavailable for reservation for given dates #{start_date} - #{end_date}") unless list_of_availble_rooms(start_date, end_date).include? room - - new_res = Hotel::Reservation.new(start_date, end_date, guest_name: guest_name, room: room) - #raise an argumentErro when the start_date and/or the end_date of a reservation for a room already exits aka if the room is not available for those dates + def reserve_room(start_date, end_date, guest_name:, room:) + given_date_range = (start_date...end_date).to_a + raise(ArgumentError, "This room #{room} does not exist in our hotel:(") unless @all_rooms.any? do |individual_room| + individual_room.room_number == room + end + + reservation_room = @all_rooms.find do |room_object| - room_object == room + room_object.room_number == room end + raise(ArgumentError, "This room #{room} is unavailable for reservation for given dates #{start_date} - #{end_date}") unless (reservation_room.dates_unavailable & given_date_range).length == 0 + #raise an argumentErro when the start_date and/or the end_date of a reservation for a room already exits aka if the room is not available for those dates + + + new_res = Hotel::Reservation.new(start_date, end_date, guest_name: guest_name, room: room) #add reservation to room's reservation_list reservation_room.add_reservation_to_room(new_res) + #add this reservation to all_reservations in hotel @all_reservations << new_res + + return new_res end - #return an array of all Reservations with matching date requested def list_of_reservations(date) return @all_reservations.select do |reservation| - reservation.reservation_dates.all_dates.any? do |day| #this has high time complexity so might change it? + reservation.reservation_dates.all_dates.any? do |day| date == day end end - - return - end - - #returns an array of all available rooms for the give date range - def list_of_availble_rooms(start_date, end_date) - reserved_rooms = @all_rooms.select do |room| - room.dates_unavailable.any? (start_date...end_date) - end - return @all_rooms - reserved_rooms end end end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 400c8b938..26a9a98cc 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -2,69 +2,111 @@ describe "front_desk" do before do - @moody_moon_hotel = Hotel::FrontDesk.new() - @all_rooms = [] - 20.times do |i| - @all_rooms << "#{i + 1}" + @pineapple_villa = Hotel::FrontDesk.new() + + @start_date = Date.new(2020, 2, 2) + @end_date = @start_date + 3 + + @spongebob_reservation = @pineapple_villa.reserve_room(@start_date, @end_date, guest_name: "spongebob squarepants", room: "room 2") + + @patrick_reservation = @pineapple_villa.reserve_room(@start_date, @end_date, guest_name: "patrick star", room: "room 1") + + @room_1 = @pineapple_villa.all_rooms.find do |room_object| + room_object.room_number == "room 1" + end + + @room_2 = @pineapple_villa.all_rooms.find do |room_object| + room_object.room_number == "room 2" end - @all_reservations = [] + @list_of_reservation_for_given_date = @pineapple_villa.list_of_reservations(@start_date) end + describe "initiate" do it "Should be instantiated with no given Arguments" do - expect(@moody_moon_hotel).must_be_kind_of Hotel::FrontDesk + expect(@pineapple_villa).must_be_instance_of Hotel::FrontDesk end end - describe "all_reservations instance variable" do - it "Should be an empty array at the beggining" do - expect(@moody_moon_hotel.instance_variable_get(:@all_reservations)).must_be_kind_of Array - expect(@moody_moon_hotel.instance_variable_get(:@all_reservations)).must_be_empty + describe "instance variable" do + it "Should have all_reservations that is an array of all hotel reservations" do + expect(@pineapple_villa).must_respond_to :all_reservations + expect(@pineapple_villa.all_reservations).must_be_kind_of Array + #TODO check for Reservation Instance + end + + it "Should have a list of all rooms" do + expect(@pineapple_villa).must_respond_to :all_rooms + expect(@pineapple_villa.all_rooms.length).must_equal 20 + end + + it "all_rooms should contain instances of Room object" do + @pineapple_villa.all_rooms.each do |room| + expect(room).must_be_instance_of Hotel::Room + end end end - describe "list_of_all_rooms" do - it "Should have a method list_of_all_rooms" do - expect(@moody_moon_hotel).must_respond_to :list_of_all_rooms + describe "list_of_available_rooms(start_date, end_date)" do + it "Should return an array of all available rooms given that date range" do + start_date = Date.new(2020, 2, 14) + end_date = start_date + 1 + expect(@pineapple_villa.list_of_available_rooms(start_date, end_date).length).must_equal 20 end - it "Should give an array of all the rooms in the hotel" do - expect(@moody_moon_hotel.list_of_all_rooms).must_equal @all_rooms + it "Should reject all the rooms reserved within the date range given" do + start_date = Date.new(2020, 2, 3) + end_date = Date.new(2020, 2, 5) + expect(@pineapple_villa.list_of_available_rooms(start_date, end_date)).wont_include @room_1 + expect(@pineapple_villa.list_of_available_rooms(start_date, end_date)).wont_include @room_2 + expect(@pineapple_villa.list_of_available_rooms(start_date, end_date).length).must_equal 18 end end describe "reserve_room" do - before do - + before do end it "Should create an instance of Reservation when given start_date, end_date, guest_name, room " do - start_date = Date.new(2020, 2, 1) - end_date = Date.new(2020, 2, 3) - guest_name = "Moody McMoon" - room = "2" - @moody_moon_hotel.reserve_room(start_date, end_date, guest_name, room).each do |res| - expect(res).must_be_kind_of Hotel::Reservation - end + expect(@spongebob_reservation).must_be_kind_of Hotel::Reservation + expect(@pineapple_villa.all_reservations).must_include @spongebob_reservation + end + it "Should raise an ArgumentError when given a wrong room number" do + start_date = Date.new(2020, 2, 1) + end_date = Date.new(2020, 2, 3) + guest_name = "Sandy Cheeks" + room = "room 99" + expect { @pineapple_villa.reserve_room(start_date, end_date, guest_name: guest_name, room: room) }.must_raise ArgumentError end - it "Should return an array containing all of the reservations" do - + + it "Should raise an ArgumentError if the date range is taken for that room" do + start_date = Date.new(2020, 2, 3) + end_date = start_date + 1 + guest_name = "Sandy Cheeks" + room = "room 2" + expect { @pineapple_villa.reserve_room(start_date, end_date, guest_name: guest_name, room: room) }.must_raise ArgumentError end - - it "Should raise an ArgumentError when given a wrong room number" do - start_date = Date.new(2020, 2, 1) - end_date = Date.new(2020, 2, 3) - guest_name = "Moody McMoon" - room = "99" - expect{@moody_moon_hotel.reserve_room(start_date, end_date, guest_name, room)}.must_raise ArgumentError + + it "should add the reservation to the rooms reservation list" do + expect(@room_1.room_reservations).must_include @patrick_reservation + expect(@room_2.room_reservations).must_include @spongebob_reservation end - end - #attributes list of all 20 rooms - #methods - #list_availble_rooms(date) - #list_availble_rooms(start_date - end_date) - #reserve_room(start_date - end_date) - #list_reservations(date) + it "the reservation list of a room must be for that room only" do + @room_1.room_reservations.each do |reservation| + expect(reservation.room).must_equal "room 1" + end + end + + it "Should add the reservation to the Hotel's total reservations" do + expect(@pineapple_villa.all_reservations).must_include @spongebob_reservation + expect(@pineapple_villa.all_reservations).must_include @patrick_reservation + end + end + describe "list_of_reservations(date)" do + it "Should return a list of Reservations for that date" do + expect(@list_of_reservation_for_given_date).must_equal [@spongebob_reservation, @patrick_reservation] + end + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index eb091d111..038f61672 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -5,6 +5,7 @@ require "minitest" require "minitest/autorun" require "minitest/reporters" +require "minitest/skip_dsl" # skips the skips Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new From b5c50d022f783f61ff200da5a6426f0464b301e7 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Sat, 7 Mar 2020 13:35:27 -0800 Subject: [PATCH 15/18] added a new method to Room to check if room is available for reservation given a start and end date --- lib/date_range.rb | 2 ++ lib/room.rb | 14 ++++++++-- test/date_range_test.rb | 5 +--- test/room_test.rb | 57 ++++++++++++++++++++++++----------------- 4 files changed, 49 insertions(+), 29 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 630328ca7..8ac4d6df2 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -10,6 +10,8 @@ def initialize(start_date, end_date) @end_date = end_date end + #for future refactoring- does_match_date(date) + #this method will elaborate on the current method so it takes a date and returns a true or flase depending on if that date exists/overlaps all the days in the date range def all_dates return (@start_date...@end_date).to_a end diff --git a/lib/room.rb b/lib/room.rb index 2bb49d6e6..d23cf4003 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -12,12 +12,22 @@ def add_reservation_to_room(reservation) @room_reservations << reservation end - #return an array of all the dates room was booked/is unavailable + #refactoring + #combine dates_unavailable and is_available_during method so the method only outputs true or false depending on it's availability def dates_unavailable dates_booked = @room_reservations.map do |reservation| reservation.reservation_dates.all_dates end - return dates_booked.flatten + return dates_booked.flatten + end + + def is_available_during(start_date, end_date) + test_date_range = (start_date...end_date).to_a + if (dates_unavailable & test_date_range).length > 0 + return false + else + return true + end end end end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index c15137225..2eb4af1f7 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -43,11 +43,8 @@ expect(@date).must_respond_to :all_dates end - it "Should iterate through date range and give an array of all dates" do + it "Should give an array of all dates" do expect(@date.all_dates).must_equal @all_dates - end - - it "Should give an array of all the dates within the date range" do expect(@date.all_dates).must_be_kind_of Array end diff --git a/test/room_test.rb b/test/room_test.rb index 259730f46..a6732fede 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -38,40 +38,51 @@ describe "add_reservation_to_room(reservation)" do it "The room_reservations should be an array of Reservation class" do - @my_room.room_reservations.each do |reservation| - expect(reservation).must_be_instance_of Hotel::Reservation - end + @my_room.room_reservations.each do |reservation| + expect(reservation).must_be_instance_of Hotel::Reservation + end end - it "Should include room's reservations" do - expect(@my_room.room_reservations).must_include @spongebob_reservation - expect(@my_room.room_reservations.length).must_equal 2 + it "Should include room's reservations" do + expect(@my_room.room_reservations).must_include @spongebob_reservation + expect(@my_room.room_reservations.length).must_equal 2 end - it "Should add new Reservation instances to the array list of room_reservations" do - start_date = Date.new(2020, 3, 15) - end_date = start_date + 1 - squidward_reservation = Hotel::Reservation.new(start_date, end_date, room: "room 1", guest_name: "squidward tentacles") - expect(@my_room.add_reservation_to_room(squidward_reservation)).must_include squidward_reservation - expect(@my_room.room_reservations.length).must_equal 3 + it "Should add new Reservation instances to the array list of room_reservations" do + start_date = Date.new(2020, 3, 15) + end_date = start_date + 1 + squidward_reservation = Hotel::Reservation.new(start_date, end_date, room: "room 1", guest_name: "squidward tentacles") + expect(@my_room.add_reservation_to_room(squidward_reservation)).must_include squidward_reservation + expect(@my_room.room_reservations.length).must_equal 3 end - it "Should raise an ArgumentError if a reservation not for that room class is passed in as a parameter" do - start_date = Date.new(2020, 3, 20) - end_date = start_date + 1 - mr_krab_reservation = Hotel::Reservation.new(start_date, end_date, room: "room 6", guest_name: "my krabs") - expect{@my_room.add_reservation_to_room(mr_krab_reservation)}.must_raise ArgumentError + it "Should raise an ArgumentError if a reservation not for that room class is passed in as a parameter" do + start_date = Date.new(2020, 3, 20) + end_date = start_date + 1 + mr_krab_reservation = Hotel::Reservation.new(start_date, end_date, room: "room 6", guest_name: "my krabs") + expect { @my_room.add_reservation_to_room(mr_krab_reservation) }.must_raise ArgumentError end end - describe "dates_unavailable" do + describe "dates_unavailable" do it "should return an array of all dates the room is has been reserved for" do - dates_reserved = [Date.new(2020, 2, 2), Date.new(2020, 2, 3), Date.new(2020, 2, 4), Date.new(2020, 2, 5) ] - expect(@my_room.dates_unavailable).must_equal dates_reserved + dates_reserved = [Date.new(2020, 2, 2), Date.new(2020, 2, 3), Date.new(2020, 2, 4), Date.new(2020, 2, 5)] + expect(@my_room.dates_unavailable).must_equal dates_reserved + end + it "Dates of reservation must be unique" do + expect(@my_room.dates_unavailable.uniq!).must_be_nil + end + end + describe "is_available_during(start_date, end_date" do + it "Should return false if the room is reservared within that date range" do + start_date = Date.new(2020, 2, 2) + end_date = start_date + 1 + expect(@my_room.is_available_during(start_date, end_date)).must_equal false end - it "Dates of reservation must be unique" do - expect(@my_room.dates_unavailable.uniq!).must_be_nil + it "Should return true if the room is available for the given start and end date" do + start_date = Date.new(2020, 3, 19) + end_date = start_date + 1 + expect(@my_room.is_available_during(start_date, end_date)).must_equal true end end end - From 27acec1dcd145f355d5994548d3bfd6ee639a61b Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Sat, 7 Mar 2020 13:36:10 -0800 Subject: [PATCH 16/18] used the is_available_during method from room to dry up the code in front_desk class --- lib/front_desk.rb | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index ceb70b714..bd3c62951 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -12,34 +12,25 @@ def initialize end def list_of_available_rooms(start_date, end_date) - test_date_range = (start_date...end_date).to_a - return @all_rooms.reject do |room| - (room.dates_unavailable & test_date_range).length > 0 + return @all_rooms.select do |room| + room.is_available_during(start_date, end_date) end end def reserve_room(start_date, end_date, guest_name:, room:) - given_date_range = (start_date...end_date).to_a raise(ArgumentError, "This room #{room} does not exist in our hotel:(") unless @all_rooms.any? do |individual_room| individual_room.room_number == room end - - reservation_room = @all_rooms.find do |room_object| room_object.room_number == room end - raise(ArgumentError, "This room #{room} is unavailable for reservation for given dates #{start_date} - #{end_date}") unless (reservation_room.dates_unavailable & given_date_range).length == 0 - #raise an argumentErro when the start_date and/or the end_date of a reservation for a room already exits aka if the room is not available for those dates - + raise(ArgumentError, "This room #{room} is unavailable for reservation for given dates #{start_date} - #{end_date}") unless reservation_room.is_available_during(start_date, end_date) new_res = Hotel::Reservation.new(start_date, end_date, guest_name: guest_name, room: room) - #add reservation to room's reservation_list - reservation_room.add_reservation_to_room(new_res) - #add this reservation to all_reservations in hotel + reservation_room.add_reservation_to_room(new_res) @all_reservations << new_res - return new_res end From 4a29680a6428c54007c759c2a4d881825b66313b Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Sun, 8 Mar 2020 17:19:07 -0700 Subject: [PATCH 17/18] final refactoring- no major changes in method or testing --- test/front_desk_test.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 26a9a98cc..a7ca5ca21 100644 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -32,7 +32,9 @@ it "Should have all_reservations that is an array of all hotel reservations" do expect(@pineapple_villa).must_respond_to :all_reservations expect(@pineapple_villa.all_reservations).must_be_kind_of Array - #TODO check for Reservation Instance + @pineapple_villa.all_reservations.each do |reservation| + expect(reservation).must_be_instance_of Hotel::Reservation + end end it "Should have a list of all rooms" do From 62a8ef6c7a7e1faa2d96b9583cba81056d03fd66 Mon Sep 17 00:00:00 2001 From: Maryam Heshmati Date: Sun, 8 Mar 2020 17:28:31 -0700 Subject: [PATCH 18/18] added a text file for what needs to be refactored --- refactors.txt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 refactors.txt diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..4e081a20d --- /dev/null +++ b/refactors.txt @@ -0,0 +1,13 @@ +change the method in date range to does_match(date) - this will return true or false depening if the date is included in the date range array +combine the dates_unavailable and is_available_during methods into one method +room probably doesn't need to keep track of it's reservations- only reservation should know about room since room doesn't change whereas reservation does + +overall- keep methods that belong to a class within that class to iliminate the dependency between classes + + + + + + + +write wave 3- make a block reservation class