From 2446ce0e0de042a6d804c11031e0051a971aaff8 Mon Sep 17 00:00:00 2001 From: Yaz Date: Tue, 3 Mar 2020 15:50:36 -0800 Subject: [PATCH 01/22] Added class DateRange to Hotel, wrote and passed tests for initialize and basic overlap? test --- lib/date_range.rb | 35 ++++++++++++++++++ test/date_range_test.rb | 82 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 lib/date_range.rb create mode 100755 test/date_range_test.rb diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..b42b78f9f --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,35 @@ +require 'date' +module Hotel + class InvalidDateRange < StandardError + end + class DateRange + attr_reader :start_date, :end_date, :nights + + def initialize(start_date, end_date) + if start_date.instance_of? String + @start_date = Date.parse(start_date) + @end_date = Date.parse(end_date) + else + @start_date = start_date + @end_date = end_date + end + if @end_date - @start_date <= 0 + raise InvalidDateRange.new("End date must be after start date.") + end + @nights = Array.new((@end_date - @start_date).to_i) + @nights[0] = @start_date + index = 1 + + while @nights.last == nil + @nights[index] = @start_date + index + index += 1 + end + + end + + def overlap?(other) + return self.nights.include? other.start_date + end + + end +end diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100755 index 000000000..d67f86691 --- /dev/null +++ b/test/date_range_test.rb @@ -0,0 +1,82 @@ +require_relative "test_helper" + +describe Hotel::DateRange do + describe "consructor" do + it "Can be initialized with two dates" do + start_date = Date.new(2017, 01, 01) + end_date = start_date + 3 + + range = Hotel::DateRange.new(start_date, end_date) + + expect(range.start_date).must_equal start_date + expect(range.end_date).must_equal end_date + end + + it "is an an error for negative-length ranges" do + end + + it "is an error to create a 0-length range" do + end + end + + describe "overlap?" do + before do + start_date = Date.new(2017, 01, 01) + end_date = start_date + 3 + + @range = Hotel::DateRange.new(start_date, end_date) + end + + it "returns true for the same range" do + start_date = @range.start_date + end_date = @range.end_date + test_range = Hotel::DateRange.new(start_date, end_date) + + expect(@range.overlap?(test_range)).must_equal true + end + + xit "returns true for a contained range" do + # cont_start = Date.new(2017, 01, 02) + # cont_end = Date.new(2017, 01, 03) + # contained_range = (cont_start, cont_end) + # expect(@range.overlap?(contained_range)).must_equal true + end + + xit "returns true for a range that overlaps in front" do + end + + xit "returns true for a range that overlaps in the back" do + end + + xit "returns true for a containing range" do + end + + xit "returns false for a range starting on the end_date date" do + end + + xit "returns false for a range ending on the start_date date" do + end + + xit "returns false for a range completely before" do + end + + xit "returns false for a date completely after" do + end + end + + xdescribe "include?" do + it "reutrns false if the date is clearly out" do + end + + it "returns true for dates in the range" do + end + + it "returns false for the end_date date" do + end + end + + xdescribe "nights" do + it "returns the correct number of nights" do + end + end +end From 3aa96d69c02b8d86cfa426e44d941b994bd0f256 Mon Sep 17 00:00:00 2001 From: Yaz Date: Tue, 3 Mar 2020 18:32:12 -0800 Subject: [PATCH 02/22] In DateRage and date_range_tests: Added methods include?, num_nights and added case coverage to overlap?. Covered and tested all nominal and some edge cases. --- lib/date_range.rb | 23 +++++++-- test/date_range_test.rb | 109 ++++++++++++++++++++++++++++++++++------ 2 files changed, 114 insertions(+), 18 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index b42b78f9f..80cb4aafa 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,6 +1,7 @@ require 'date' module Hotel - class InvalidDateRange < StandardError + class InvalidDateRangeError < StandardError + end class DateRange attr_reader :start_date, :end_date, :nights @@ -14,7 +15,7 @@ def initialize(start_date, end_date) @end_date = end_date end if @end_date - @start_date <= 0 - raise InvalidDateRange.new("End date must be after start date.") + raise InvalidDateRangeError.new("End date must be after start date.") end @nights = Array.new((@end_date - @start_date).to_i) @nights[0] = @start_date @@ -28,7 +29,23 @@ def initialize(start_date, end_date) end def overlap?(other) - return self.nights.include? other.start_date + if self.nights.include?(other.start_date) || + self.nights.include?(other.nights.last) + return true + elsif other.nights.include?(self.start_date) || + other.nights.include?(self.nights.last) + return true + else + return false + end + end + + def include?(date) + return nights.include? date + end + + def num_nights + return nights.length end end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index d67f86691..9d542bc70 100755 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -13,9 +13,15 @@ end it "is an an error for negative-length ranges" do + start_date = Date.new(2017, 01, 01) + end_date = start_date - 3 + expect{Hotel::DateRange.new(start_date, end_date)}.must_raise Hotel::InvalidDateRangeError end it "is an error to create a 0-length range" do + start_date = Date.new(2017, 01, 01) + end_date = start_date + expect{Hotel::DateRange.new(start_date, end_date)}.must_raise Hotel::InvalidDateRangeError end end @@ -23,7 +29,6 @@ before do start_date = Date.new(2017, 01, 01) end_date = start_date + 3 - @range = Hotel::DateRange.new(start_date, end_date) end @@ -35,48 +40,122 @@ expect(@range.overlap?(test_range)).must_equal true end - xit "returns true for a contained range" do - # cont_start = Date.new(2017, 01, 02) - # cont_end = Date.new(2017, 01, 03) - # contained_range = (cont_start, cont_end) - # expect(@range.overlap?(contained_range)).must_equal true + it "returns true for a contained range" do + cont_start = Date.new(2017, 01, 02) + cont_end = Date.new(2017, 01, 03) + contained_range = Hotel::DateRange.new(cont_start, cont_end) + expect(@range.overlap?(contained_range)).must_equal true end - xit "returns true for a range that overlaps in front" do + it "returns true for a range that overlaps in front" do + cont_start = Date.new(2016, 12, 31) + cont_end = Date.new(2017, 01, 02) + contained_range = Hotel::DateRange.new(cont_start, cont_end) + expect(@range.overlap?(contained_range)).must_equal true end - xit "returns true for a range that overlaps in the back" do + it "returns true for a range that overlaps in the back" do + cont_start = Date.new(2017, 01, 03) + cont_end = Date.new(2017, 01, 07) + contained_range = Hotel::DateRange.new(cont_start, cont_end) + expect(@range.overlap?(contained_range)).must_equal true end - xit "returns true for a containing range" do + it "returns true for a containing range" do + cont_start = Date.new(2016, 12, 30) + cont_end = Date.new(2017, 01, 07) + contained_range = Hotel::DateRange.new(cont_start, cont_end) + expect(@range.overlap?(contained_range)).must_equal true end - xit "returns false for a range starting on the end_date date" do + it "returns false for a range starting on the end_date date" do + cont_start = Date.new(2017, 01, 04) + cont_end = Date.new(2017, 01, 07) + contained_range = Hotel::DateRange.new(cont_start, cont_end) + expect(@range.overlap?(contained_range)).must_equal false end - xit "returns false for a range ending on the start_date date" do + it "returns false for a range ending on the start_date date" do + cont_start = Date.new(2016, 12, 29) + cont_end = Date.new(2017, 01, 01) + contained_range = Hotel::DateRange.new(cont_start, cont_end) + expect(@range.overlap?(contained_range)).must_equal false end - xit "returns false for a range completely before" do + it "returns false for a range completely before" do + cont_start = Date.new(2016, 12, 25) + cont_end = Date.new(2016, 12, 31) + contained_range = Hotel::DateRange.new(cont_start, cont_end) + expect(@range.overlap?(contained_range)).must_equal false end - xit "returns false for a date completely after" do + it "returns false for a date completely after" do + cont_start = Date.new(2017, 12, 25) + cont_end = Date.new(2017, 12, 31) + contained_range = Hotel::DateRange.new(cont_start, cont_end) + expect(@range.overlap?(contained_range)).must_equal false end end - xdescribe "include?" do + describe "include?" do + before do + start_date = Date.new(2017, 01, 01) + end_date = start_date + 3 + @range = Hotel::DateRange.new(start_date, end_date) + end it "reutrns false if the date is clearly out" do + target = Date.new(2016, 01, 01) + expect(@range.include?(target)).must_equal false end it "returns true for dates in the range" do + target = Date.new(2017, 01, 01) + expect(@range.include?(target)).must_equal true end it "returns false for the end_date date" do + target = Date.new(2016, 01, 04) + expect(@range.include?(target)).must_equal false end end - xdescribe "nights" do + describe "nights" do it "returns the correct number of nights" do + cont_start = Date.new(2016, 12, 25) + cont_end = Date.new(2016, 12, 31) + range = Hotel::DateRange.new(cont_start, cont_end) + expect(range.num_nights).must_equal 6 + + cont_start = Date.new(2016, 12, 29) + cont_end = Date.new(2017, 01, 01) + range = Hotel::DateRange.new(cont_start, cont_end) + expect(range.num_nights).must_equal 3 + + cont_start = Date.new(2017, 01, 04) + cont_end = Date.new(2017, 01, 07) + range = Hotel::DateRange.new(cont_start, cont_end) + expect(range.num_nights).must_equal 3 + + cont_start = Date.new(2016, 12, 30) + cont_end = Date.new(2017, 01, 07) + range = Hotel::DateRange.new(cont_start, cont_end) + expect(range.num_nights).must_equal 8 + + cont_start = Date.new(2016, 12, 31) + cont_end = Date.new(2017, 01, 02) + range = Hotel::DateRange.new(cont_start, cont_end) + expect(range.num_nights).must_equal 2 + + cont_start = Date.new(2017, 01, 02) + cont_end = Date.new(2017, 01, 03) + range = Hotel::DateRange.new(cont_start, cont_end) + expect(range.num_nights).must_equal 1 + + cont_start = Date.new(2017, 01, 01) + cont_end = Date.new(2017, 02, 01) + range = Hotel::DateRange.new(cont_start, cont_end) + expect(range.num_nights).must_equal 31 + end end end From b444395ca966c9ebda034e4382033ce92049875d Mon Sep 17 00:00:00 2001 From: Yaz Date: Tue, 3 Mar 2020 18:43:16 -0800 Subject: [PATCH 03/22] Changed string argument > Date.parse case in date_range constructor to throw error instead - wrote test and passed. --- lib/date_range.rb | 9 ++++----- test/date_range_test.rb | 8 ++++++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 80cb4aafa..704e407cf 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,21 +1,20 @@ require 'date' module Hotel - class InvalidDateRangeError < StandardError + class InvalidDateError < StandardError end class DateRange attr_reader :start_date, :end_date, :nights def initialize(start_date, end_date) - if start_date.instance_of? String - @start_date = Date.parse(start_date) - @end_date = Date.parse(end_date) + if !(start_date.instance_of? Date) + raise InvalidDateError.new("End and start dates must be instances of Date.") else @start_date = start_date @end_date = end_date end if @end_date - @start_date <= 0 - raise InvalidDateRangeError.new("End date must be after start date.") + raise InvalidDateError.new("End date must be after start date.") end @nights = Array.new((@end_date - @start_date).to_i) @nights[0] = @start_date diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 9d542bc70..3edaa9576 100755 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -12,16 +12,20 @@ expect(range.end_date).must_equal end_date end + it "raises error for arguments that are not instances of Date" do + expect{Hotel::DateRange.new("3rd Feb 2017", "4th Feb 2017")}.must_raise Hotel::InvalidDateError + end + it "is an an error for negative-length ranges" do start_date = Date.new(2017, 01, 01) end_date = start_date - 3 - expect{Hotel::DateRange.new(start_date, end_date)}.must_raise Hotel::InvalidDateRangeError + expect{Hotel::DateRange.new(start_date, end_date)}.must_raise Hotel::InvalidDateError end it "is an error to create a 0-length range" do start_date = Date.new(2017, 01, 01) end_date = start_date - expect{Hotel::DateRange.new(start_date, end_date)}.must_raise Hotel::InvalidDateRangeError + expect{Hotel::DateRange.new(start_date, end_date)}.must_raise Hotel::InvalidDateError end end From 5d85ff3d36e9aa7bba402bfe82294e2cd4343f41 Mon Sep 17 00:00:00 2001 From: Yaz Date: Wed, 4 Mar 2020 14:52:58 -0800 Subject: [PATCH 04/22] Created class Reservation and its init, with tests in reservation_tests.rb. --- lib/reservation.rb | 13 +++++++++++++ test/reservation_test.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 lib/reservation.rb create mode 100755 test/reservation_test.rb diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..0cad59731 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,13 @@ +require_relative 'date_range' +module Hotel + class Reservation < DateRange + attr_reader :cost, :room + def initialize(start_date, end_date, room) + super(start_date, end_date) + # TODO figure out how to use a nightly cost constant + # across the module + @room = room + @cost = self.num_nights * 200 + end + end +end diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100755 index 000000000..67877b452 --- /dev/null +++ b/test/reservation_test.rb @@ -0,0 +1,26 @@ +require_relative "test_helper" + +describe Hotel::Reservation do + describe "constructor" do + start_date = Date.new(2017, 01, 01) + end_date = start_date + 3 + reservation = Hotel::Reservation.new(start_date, end_date, nil) + describe "cost" do + it "returns a number" do + expect(reservation.cost).must_be_kind_of Numeric + end + it "returns correct number" do + expect(reservation.cost).must_equal 600 + end + end + + describe "nights" do + it "returns a number" do + expect(reservation.num_nights).must_be_kind_of Numeric + end + it "returns correct number" do + expect(reservation.num_nights).must_equal 3 + end + end + end +end From 2dad181bd35885681b6840c3bf7853a10170e7ed Mon Sep 17 00:00:00 2001 From: Yaz Date: Wed, 4 Mar 2020 14:55:42 -0800 Subject: [PATCH 05/22] Expanded error checking for invalid dates in constructor --- lib/date_range.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 704e407cf..e48e97da0 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -7,7 +7,7 @@ class DateRange attr_reader :start_date, :end_date, :nights def initialize(start_date, end_date) - if !(start_date.instance_of? Date) + if !(start_date.instance_of? Date || end_date.instance_of? Date) raise InvalidDateError.new("End and start dates must be instances of Date.") else @start_date = start_date From d30f7d935421031fe726c6a88b174805f30dad94 Mon Sep 17 00:00:00 2001 From: Yaz Date: Wed, 4 Mar 2020 16:15:00 -0800 Subject: [PATCH 06/22] fixed error in DateRange left in last commit --- lib/date_range.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index e48e97da0..f1116073f 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -7,7 +7,7 @@ class DateRange attr_reader :start_date, :end_date, :nights def initialize(start_date, end_date) - if !(start_date.instance_of? Date || end_date.instance_of? Date) + if !(start_date.instance_of?(Date) || end_date.instance_of?(Date)) raise InvalidDateError.new("End and start dates must be instances of Date.") else @start_date = start_date From 07a200f824631f2f3f27b74d844a772ad2ee73ef Mon Sep 17 00:00:00 2001 From: Yaz Date: Wed, 4 Mar 2020 16:15:39 -0800 Subject: [PATCH 07/22] Front desk scaffolding and init, with basic tests --- lib/front_desk.rb | 17 ++++++++++++++ test/front_desk_test.rb | 50 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 lib/front_desk.rb create mode 100755 test/front_desk_test.rb diff --git a/lib/front_desk.rb b/lib/front_desk.rb new file mode 100644 index 000000000..e4714335b --- /dev/null +++ b/lib/front_desk.rb @@ -0,0 +1,17 @@ +module Hotel + class FrontDesk + attr_reader :reservations + def initialize + @rooms = {} + @reservations = [] + end + + def rooms + return @rooms.keys + end + + def reserve_room(start_date, end_date) + end + + end +end \ No newline at end of file diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb new file mode 100755 index 000000000..2fca02ea6 --- /dev/null +++ b/test/front_desk_test.rb @@ -0,0 +1,50 @@ +require_relative "test_helper" + +describe Hotel::FrontDesk do + before do + @front_desk = Hotel::FrontDesk.new + @date = Date.parse("2020-08-04") + end + describe "wave 1" do + describe "rooms" do + it "returns a list" do + rooms = @front_desk.rooms + expect(rooms).must_be_kind_of Array + end + end + describe "reserve_room" do + it "takes two Date objects and returns a Reservation" do + start_date = @date + end_date = start_date + 3 + + reservation = @front_desk.reserve_room(start_date, end_date) + + expect(reservation).must_be_kind_of Hotel::Reservation + end + end + + xdescribe "reservations" do + it "takes a Date and returns a list of Reservations" do + reservation_list = @front_desk.reservations(@date) + + expect(reservation_list).must_be_kind_of Array + reservation_list.each do |res| + res.must_be_kind_of Reservation + end + end + end + end + + xdescribe "wave 2" do + describe "available_rooms" do + it "takes two dates and returns a list" do + start_date = @date + end_date = start_date + 3 + + room_list = @front_desk.available_rooms(start_date, end_date) + + expect(room_list).must_be_kind_of Array + end + end + end +end From e0bd4f005168cd8918febd536708ec9850732028 Mon Sep 17 00:00:00 2001 From: Yaz Date: Wed, 4 Mar 2020 16:17:33 -0800 Subject: [PATCH 08/22] forgot to save front_desk.rb before last commit, lol --- lib/front_desk.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index e4714335b..c59fb8b85 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -2,7 +2,9 @@ module Hotel class FrontDesk attr_reader :reservations def initialize - @rooms = {} + @rooms = { + + } @reservations = [] end @@ -11,6 +13,11 @@ def rooms end def reserve_room(start_date, end_date) + new_reserv = nil + end + + private + def find_room() end end From b730bc22fcdc1b81284d20589245de5f4c4e86c5 Mon Sep 17 00:00:00 2001 From: Yaz Date: Wed, 4 Mar 2020 22:48:37 -0800 Subject: [PATCH 09/22] Added new class Room, with methods #available? and #add. Wrote tests for Room constructor and methods, all passed. Editted FrontDesk to reflect these changes - though FrontDesk is still not fleshed out. --- lib/front_desk.rb | 14 ++----------- lib/room.rb | 30 ++++++++++++++++++++++++++++ test/room_test.rb | 48 +++++++++++++++++++++++++++++++++++++++++++++ test/test_helper.rb | 10 +++++++++- 4 files changed, 89 insertions(+), 13 deletions(-) create mode 100644 lib/room.rb create mode 100644 test/room_test.rb diff --git a/lib/front_desk.rb b/lib/front_desk.rb index c59fb8b85..c9a897825 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,24 +1,14 @@ module Hotel class FrontDesk - attr_reader :reservations + attr_reader :rooms, :reservations def initialize - @rooms = { - - } + @rooms = [] @reservations = [] end - def rooms - return @rooms.keys - end - def reserve_room(start_date, end_date) new_reserv = nil end - private - def find_room() - end - end end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..aeb819ab3 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,30 @@ +module Hotel + class Room + attr_reader :id, :reservations + + def initialize(id) + @id = id + @reservations = [] + end + + def available?(reservation) + if reservations.length == 0 + return true + end + if reservations.none? {|r| !(r.overlap?(reservation))} + return false + else + return true + end + end + + def add(reservation) + if self.available?(reservation) + @reservations << reservation + else + raise ArgumentError.new("That room isn't available.") + end + end + + end +end diff --git a/test/room_test.rb b/test/room_test.rb new file mode 100644 index 000000000..716be9da7 --- /dev/null +++ b/test/room_test.rb @@ -0,0 +1,48 @@ +require_relative "test_helper" + +describe Hotel::Room do + describe "constructor" do + room1 = Hotel::Room.new(1) + it "creates a room" do + expect(room1).must_be_kind_of Hotel::Room + end + it "has correct id" do + expect(room1.id).must_equal 1 + end + it "has an array called reservations" do + expect(room1.reservations).must_be_kind_of Array + end + end + describe "available? + add" do + before do + @room20 = Hotel::Room.new(20) + @reservation1 = Hotel::Reservation.new(Date.new(2020, 01,01),Date.new(2020,01,03),20) + @reservation2 = Hotel::Reservation.new(Date.new(2020, 01,01),Date.new(2020,01,04),20) + @reservation3 = Hotel::Reservation.new(Date.new(2020, 01,03),Date.new(2020,01,05),20) + @reservation4 = Hotel::Reservation.new(Date.new(2020, 02,01),Date.new(2020,02,03),20) + end + it "adds a reservation" do + @room20.add(@reservation1) + expect(@room20.reservations[0]).must_equal @reservation1 + end + it "*adds another, unconflicting reservation to room" do + @room20.add(@reservation1) + @room20.add(@reservation3) + expect(@room20.reservations[1]).must_equal @reservation3 + end + it "raises error if attempt to add overlapping reservation" do + @room20.add(@reservation1) + expect{@room20.add(@reservation2)}.must_raise ArgumentError + expect(@room20.reservations.include?(@reservation2)).must_equal false + end + it "returns false when not available" do + @room20.add(@reservation1) + expect(@room20.available?(@reservation2)).must_equal false + end + it "returns true when available" do + @room20.add(@reservation1) + expect(@room20.available?(@reservation4)).must_equal true + end + end + +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..cc819bd19 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,8 +1,16 @@ -# Add simplecov +require 'simplecov' +SimpleCov.start + require "minitest" require "minitest/autorun" require "minitest/reporters" +require "minitest/skip_dsl" +require "date" Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # require_relative your lib files here! +require_relative "../lib/front_desk.rb" +require_relative "../lib/reservation.rb" +require_relative "../lib/date_range.rb" +require_relative "../lib/room.rb" \ No newline at end of file From a09d0655743f7d8ef70792d5aa27aac0a604bfbc Mon Sep 17 00:00:00 2001 From: Yaz Date: Thu, 5 Mar 2020 14:51:53 -0800 Subject: [PATCH 10/22] Added method #reserve_room(start_date, end_date) to FrontDesk, with passing tests in front_desk_tests.rb. Note that scafolding for FrontDesk previously included a room id as a parameter to reserve_room - that is now gone. Also added private helper method in FrontDesk: find_room, which replaces the method get_room(id). Additionally, changed functionality of DateRange overlap? to be less complex. --- lib/date_range.rb | 27 +++++++++++++++++++-------- lib/front_desk.rb | 28 ++++++++++++++++++++++++++-- test/front_desk_test.rb | 5 +++-- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index f1116073f..12dd6df80 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -28,17 +28,28 @@ def initialize(start_date, end_date) end def overlap?(other) - if self.nights.include?(other.start_date) || - self.nights.include?(other.nights.last) - return true - elsif other.nights.include?(self.start_date) || - other.nights.include?(self.nights.last) - return true - else - return false + # TO DO: get help comparing the complexity + # of these two different solutions + + # if self.nights.include?(other.start_date) || + # self.nights.include?(other.nights.last) + # return true + # elsif other.nights.include?(self.start_date) || + # other.nights.include?(self.nights.last) + # return true + # else + # return false + # end + other.nights.each do |night| + # this uses #include? not ruby enumerable + if self.include? night + return true + end end + return false end + # TO DO: is this redundant, or is this good encapsulation? def include?(date) return nights.include? date end diff --git a/lib/front_desk.rb b/lib/front_desk.rb index c9a897825..06f5d0211 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,13 +1,37 @@ +require_relative 'room' module Hotel class FrontDesk attr_reader :rooms, :reservations def initialize @rooms = [] - @reservations = [] + (1..20).each do |n| + @rooms << Room.new(n) + end + # fill @rooms with rooms 1-20, consecutively end def reserve_room(start_date, end_date) - new_reserv = nil + room = find_room + reservation = Reservation.new(start_date, end_date, room.id) + room.add(reservation) + return reservation + end + + private + # to do: refactor + def find_room + room = rooms.find {|room| + room.reservations.length == 0 + } + if room == nil + room = rooms.find {|room| + room.available? + } + end + if room == nil + raise ArgumentError.new("No rooms are availble") + end + return room end end diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 2fca02ea6..a2300a9bd 100755 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -13,13 +13,14 @@ end end describe "reserve_room" do - it "takes two Date objects and returns a Reservation" do + it "takes two Date objects and returns a Reservation, adds reservation to room" do start_date = @date end_date = start_date + 3 reservation = @front_desk.reserve_room(start_date, end_date) - expect(reservation).must_be_kind_of Hotel::Reservation + room = @front_desk.rooms.find {|room| room.reservations.length > 0} + expect(room.reservations.include? reservation).must_equal true end end From 093c30907f0fc31e935d908909597f597d5946e5 Mon Sep 17 00:00:00 2001 From: Yaz Date: Thu, 5 Mar 2020 17:33:01 -0800 Subject: [PATCH 11/22] Successfully implemented Room#get_reservations(start_date, end_date) --- lib/room.rb | 9 +++++++++ test/room_test.rb | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/lib/room.rb b/lib/room.rb index aeb819ab3..3394966b2 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -19,6 +19,7 @@ def available?(reservation) end def add(reservation) + # to do: is this check redundant, since front desk checks if self.available?(reservation) @reservations << reservation else @@ -26,5 +27,13 @@ def add(reservation) end end + def get_reservations(start_date, end_date) + range = DateRange.new(start_date, end_date) + resv_within = reservations.find_all {|reservation| + reservation.nights.all? {|night| range.include?(night)} + } + return resv_within + end + end end diff --git a/test/room_test.rb b/test/room_test.rb index 716be9da7..a7d9db4a2 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -44,5 +44,43 @@ expect(@room20.available?(@reservation4)).must_equal true end end + + describe "returns list of reservations for a specific date range" do + before do + @room15 = Hotel::Room.new(15) + @reservation1 = Hotel::Reservation.new(Date.new(2020, 01,01), Date.new(2020,01,03),15) + @reservation2 = Hotel::Reservation.new(Date.new(2020, 01,03), Date.new(2020,01,04),15) + @reservation3 = Hotel::Reservation.new(Date.new(2020, 01,04), Date.new(2020,01,05),15) + @reservation4 = Hotel::Reservation.new(Date.new(2020, 02,04), Date.new(2020,02,05),15) + @room15.add(@reservation1) + @room15.add(@reservation2) + @room15.add(@reservation3) + @room15.add(@reservation4) + end + it "returns correct reservations for specific date range" do + resvs_within = @room15.get_reservations(Date.new(2020, 01,01), Date.new(2020,01,31)) + expect(resvs_within.include? @reservation1).must_equal true + expect(resvs_within.include? @reservation2).must_equal true + expect(resvs_within.include? @reservation3).must_equal true + expect(resvs_within.include? @reservation4).must_equal false + end + it "returns an array of one reservation if only one found" do + resvs_within = @room15.get_reservations(Date.new(2020, 02,01), Date.new(2020,02,29)) + expect(resvs_within.include? @reservation4).must_equal true + end + it "doesn't include a reservation partly in the specified range" do + @reservation5 = Hotel::Reservation.new(Date.new(2019, 12, 31), Date.new(2020, 01, 05), 15) + @reservation6 = Hotel::Reservation.new(Date.new(2020, 01, 29), Date.new(2020, 02, 02), 15) + @room15.add(@reservation5) + @room15.add(@reservation6) + resvs_within = @room15.get_reservations(Date.new(2020, 01,01), Date.new(2020,01,31)) + expect(resvs_within.include? @reservation5).must_equal false + expect(resvs_within.include? @reservation6).must_equal false + end + it "returns empty array if none found" do + resvs_within = @room15.get_reservations(Date.new(2020, 03,01), Date.new(2020,03,31)) + expect(resvs_within.length).must_equal 0 + end + end end \ No newline at end of file From 6aa96a4274c8a59668e6af1e9070558d000672ba Mon Sep 17 00:00:00 2001 From: Yaz Date: Fri, 6 Mar 2020 11:47:10 -0800 Subject: [PATCH 12/22] Changed Room#available? param to date_range instead of reservation (functionality the same). Updated FrontDesk#reserve_room to reflect this change. Also changed Room#available? to use any? block instead of none? block. Added FrontDesk#get_avail_rooms(start,end) and thourough tests in front_desk_tests (all passing). Updated tests for Room to not trip on Argument error for unavailable room in the process of testing Room#get_reservations(start, end_date). --- .DS_Store | Bin 0 -> 8196 bytes lib/date_range.rb | 16 ++-------------- lib/front_desk.rb | 15 ++++++++++++--- lib/room.rb | 8 +++++--- test/.DS_Store | Bin 0 -> 6148 bytes test/front_desk_test.rb | 34 +++++++++++++++++++++++++++++++++- test/room_test.rb | 11 ++++++----- 7 files changed, 58 insertions(+), 26 deletions(-) create mode 100644 .DS_Store create mode 100644 test/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9d085d08d12da834680340e11f1a5cec93472a24 GIT binary patch literal 8196 zcmeHMO=}ZD7=9;Bn@vhFg3yA3i%=9Sl3=iiAEYr=dr;Jf9#q=hY;3mOWJ0oOurZR0 zM^9eVlUM(SHw7<(c=8_<^bd%>^O4PNc9WZ>>I}?0lX*XO-shd2-Pr&DDYUIDzybhh zSQ(~gv56>5&T6Q{Lwm;}t8RjMS1@f%}8-4^pjN>pb*iW+#qAoEnu`duMScou16sANTF^Dk7 zab4==CH4ghb0G5YLFAQ*JfRSNb@Z=ubs%|xs#Odq2Eq)mvwIxQz$Vz>2F~x~r{kB^ zXt8KI)Wk7uYwz<3M|-~#lv@+!jjHe4z>JQjkQiJSs?Y{AaCM0N2y6J~uzPy%@UaA+ z!-$_69nNIDR$xA2)6t*|6n3BjO)!v=%9=yVGG^RX$a9?0sb9RX>En(yqHlIu4XOXZ zY&dqy&1Alk*i?LaCZTC5Ej5>VRI1WW$u-<|t6(%AuwSbi~A`Ffu<$3{pI`17b009 z(){U~q!&n7;w_tC$k$G(S$AlC6J;!(S$K@etbhe3CbSIOxZrAF1=9)_P}85*BwWMg zXy78S(B1}TbRodI5sN9*vB3=bCG*i*0q!7q5w)bfpRu{cqaUw|Tg;OVmvvYgU{0W+(*|#-y;j3$y8AcOlDw8h!@!Te|7x#|H)32R573! z_^TNp@nWf1zz_!SfTPjGa6repft3}e*B8i5uwg1}oFB&#y*~`GuS;28VqYLiuiN%;s+t4Oz;8YAsfhpp literal 0 HcmV?d00001 diff --git a/lib/date_range.rb b/lib/date_range.rb index 12dd6df80..398b52a54 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -26,20 +26,8 @@ def initialize(start_date, end_date) end end - + def overlap?(other) - # TO DO: get help comparing the complexity - # of these two different solutions - - # if self.nights.include?(other.start_date) || - # self.nights.include?(other.nights.last) - # return true - # elsif other.nights.include?(self.start_date) || - # other.nights.include?(self.nights.last) - # return true - # else - # return false - # end other.nights.each do |night| # this uses #include? not ruby enumerable if self.include? night @@ -48,8 +36,8 @@ def overlap?(other) end return false end + - # TO DO: is this redundant, or is this good encapsulation? def include?(date) return nights.include? date end diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 06f5d0211..6bdb1c0e7 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -11,21 +11,30 @@ def initialize end def reserve_room(start_date, end_date) - room = find_room + date_range = Hotel::DateRange.new(start_date, end_date) + room = find_room(date_range) reservation = Reservation.new(start_date, end_date, room.id) room.add(reservation) return reservation end + def get_avail_rooms(start_date, end_date) + date_range = Hotel::DateRange.new(start_date, end_date) + avail_rooms = rooms.find_all { |room| + room.available?(date_range) + } + return avail_rooms + end + private # to do: refactor - def find_room + def find_room(date_range) room = rooms.find {|room| room.reservations.length == 0 } if room == nil room = rooms.find {|room| - room.available? + room.available?(date_range) } end if room == nil diff --git a/lib/room.rb b/lib/room.rb index 3394966b2..47831a031 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -6,17 +6,19 @@ def initialize(id) @id = id @reservations = [] end - - def available?(reservation) + + def available?(date_range) if reservations.length == 0 return true end - if reservations.none? {|r| !(r.overlap?(reservation))} + # TO DO make this more ready by using any? or all? + if reservations.any? {|r| r.overlap?(date_range)} return false else return true end end + def add(reservation) # to do: is this check redundant, since front desk checks diff --git a/test/.DS_Store b/test/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..058d1facc0315562a1b37c2df57c772e320aaec9 GIT binary patch literal 6148 zcmeHKJxjz;5S;a{I1uDY%U4v(sN>s22oSfRH^JnYqhjK>{w6TyG*q!$_ zyLrhJ*(?BCz208{O8^U+Gv3@y;n&?JII4(|X}re`9`S$yPxL>7*Ph^o`OozG^*fwn zhki3`@A_feGtVFLl6LkU;7X7JQa}nw0VyB_eyf1@USe^aEH4G5fE4&rz`qZT=G+yJ z$?@r+ixGf4XE?xh%o6100diM7CNn}2%SG$s|4f9OaBhIaxmfu8SZA{z8EdoZ1|I literal 0 HcmV?d00001 diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index a2300a9bd..338b835c7 100755 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -5,7 +5,7 @@ @front_desk = Hotel::FrontDesk.new @date = Date.parse("2020-08-04") end - describe "wave 1" do + describe "rooms list" do describe "rooms" do it "returns a list" do rooms = @front_desk.rooms @@ -24,6 +24,38 @@ end end + describe "get_avail_rooms" do + before do + @fd = Hotel::FrontDesk.new + @res1 = @fd.reserve_room(Date.new(2020, 01,01), Date.new(2020,01,03)) + @res2 = @fd.reserve_room(Date.new(2020, 01,03), Date.new(2020,01,04)) + @res3 = @fd.reserve_room(Date.new(2020, 01,04), Date.new(2020,01,05)) + @res4 = @fd.reserve_room(Date.new(2020, 02,04), Date.new(2020,02,05)) + end + it "returns array of rooms" do + avail_rooms = @fd.get_avail_rooms(Date.new(2020, 03,01), Date.new(2020,03,31)) + expect(avail_rooms).must_be_kind_of Array + expect(avail_rooms.any?(Hotel::Room)).must_equal true + expect(avail_rooms.length).must_equal 20 + end + it "contains only rooms available at specified dates" do + rooms = @fd.get_avail_rooms(Date.new(2020, 01,01), Date.new(2020,01,31)) + expect(rooms.length).must_equal 17 + expect(rooms.any? {|room| room.reservations.include?(@res1)}).must_equal false + expect(rooms.any? {|room| room.reservations.include?(@res2)}).must_equal false + expect(rooms.any? {|room| room.reservations.include?(@res3)}).must_equal false + expect(rooms.any? {|room| room.reservations.include?(@res4)}).must_equal true + end + it "does not contain rooms with reserv's overlapping the tail end of date range" do + res5 = @fd.reserve_room(Date.new(2019, 12, 31), Date.new(2020, 01, 05)) + res6 = @fd.reserve_room(Date.new(2020, 01, 29), Date.new(2020, 02, 02)) + rooms = @fd.get_avail_rooms(Date.new(2020, 01,01), Date.new(2020,01,31)) + expect(rooms.any? {|room| room.reservations.include?(res5)}).must_equal false + expect(rooms.any? {|room| room.reservations.include?(res6)}).must_equal false + end + end + + xdescribe "reservations" do it "takes a Date and returns a list of Reservations" do reservation_list = @front_desk.reservations(@date) diff --git a/test/room_test.rb b/test/room_test.rb index a7d9db4a2..6e1a76f23 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -45,7 +45,7 @@ end end - describe "returns list of reservations for a specific date range" do + describe "get_reservations(for a specific date range)" do before do @room15 = Hotel::Room.new(15) @reservation1 = Hotel::Reservation.new(Date.new(2020, 01,01), Date.new(2020,01,03),15) @@ -69,10 +69,11 @@ expect(resvs_within.include? @reservation4).must_equal true end it "doesn't include a reservation partly in the specified range" do - @reservation5 = Hotel::Reservation.new(Date.new(2019, 12, 31), Date.new(2020, 01, 05), 15) - @reservation6 = Hotel::Reservation.new(Date.new(2020, 01, 29), Date.new(2020, 02, 02), 15) - @room15.add(@reservation5) - @room15.add(@reservation6) + reservation5 = Hotel::Reservation.new(Date.new(2019, 12, 24), Date.new(2019, 12, 31), 15) + reservation6 = Hotel::Reservation.new(Date.new(2020, 01, 29), Date.new(2020, 02, 02), 15) + #not passing on following line. Why is Room reistering as not available for a dec reservation?? + @room15.add(reservation5) + @room15.add(reservation6) resvs_within = @room15.get_reservations(Date.new(2020, 01,01), Date.new(2020,01,31)) expect(resvs_within.include? @reservation5).must_equal false expect(resvs_within.include? @reservation6).must_equal false From c22e16df9a83ab9c01c7866385e1c322b1aa4b24 Mon Sep 17 00:00:00 2001 From: Yaz Date: Fri, 6 Mar 2020 12:15:48 -0800 Subject: [PATCH 13/22] added FrontDesk#get_reservations(date) with passing tests --- lib/front_desk.rb | 12 ++++ test/front_desk_test.rb | 139 ++++++++++++++++++++++------------------ 2 files changed, 89 insertions(+), 62 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 6bdb1c0e7..82a7a34d1 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -26,6 +26,18 @@ def get_avail_rooms(start_date, end_date) return avail_rooms end + def get_reservations(date) + reservations_at_date = [] + rooms.each do |room| + room.reservations.each do |reservation| + if reservation.include?(date) + reservations_at_date << reservation + end + end + end + return reservations_at_date + end + private # to do: refactor def find_room(date_range) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 338b835c7..53c0226ef 100755 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -1,83 +1,98 @@ require_relative "test_helper" - +# to do: refactor for more clarity - ex - @fd & @front_desk describe Hotel::FrontDesk do before do @front_desk = Hotel::FrontDesk.new @date = Date.parse("2020-08-04") end - describe "rooms list" do - describe "rooms" do - it "returns a list" do - rooms = @front_desk.rooms - expect(rooms).must_be_kind_of Array - end - end - describe "reserve_room" do - it "takes two Date objects and returns a Reservation, adds reservation to room" do - start_date = @date - end_date = start_date + 3 - reservation = @front_desk.reserve_room(start_date, end_date) - expect(reservation).must_be_kind_of Hotel::Reservation - room = @front_desk.rooms.find {|room| room.reservations.length > 0} - expect(room.reservations.include? reservation).must_equal true - end + describe "rooms" do + it "returns a list" do + rooms = @front_desk.rooms + expect(rooms).must_be_kind_of Array end - describe "get_avail_rooms" do - before do - @fd = Hotel::FrontDesk.new - @res1 = @fd.reserve_room(Date.new(2020, 01,01), Date.new(2020,01,03)) - @res2 = @fd.reserve_room(Date.new(2020, 01,03), Date.new(2020,01,04)) - @res3 = @fd.reserve_room(Date.new(2020, 01,04), Date.new(2020,01,05)) - @res4 = @fd.reserve_room(Date.new(2020, 02,04), Date.new(2020,02,05)) - end - it "returns array of rooms" do - avail_rooms = @fd.get_avail_rooms(Date.new(2020, 03,01), Date.new(2020,03,31)) - expect(avail_rooms).must_be_kind_of Array - expect(avail_rooms.any?(Hotel::Room)).must_equal true - expect(avail_rooms.length).must_equal 20 - end - it "contains only rooms available at specified dates" do - rooms = @fd.get_avail_rooms(Date.new(2020, 01,01), Date.new(2020,01,31)) - expect(rooms.length).must_equal 17 - expect(rooms.any? {|room| room.reservations.include?(@res1)}).must_equal false - expect(rooms.any? {|room| room.reservations.include?(@res2)}).must_equal false - expect(rooms.any? {|room| room.reservations.include?(@res3)}).must_equal false - expect(rooms.any? {|room| room.reservations.include?(@res4)}).must_equal true - end - it "does not contain rooms with reserv's overlapping the tail end of date range" do - res5 = @fd.reserve_room(Date.new(2019, 12, 31), Date.new(2020, 01, 05)) - res6 = @fd.reserve_room(Date.new(2020, 01, 29), Date.new(2020, 02, 02)) - rooms = @fd.get_avail_rooms(Date.new(2020, 01,01), Date.new(2020,01,31)) - expect(rooms.any? {|room| room.reservations.include?(res5)}).must_equal false - expect(rooms.any? {|room| room.reservations.include?(res6)}).must_equal false - end + end + describe "reserve_room" do + it "takes two Date objects and returns a Reservation, adds reservation to room" do + start_date = @date + end_date = start_date + 3 + reservation = @front_desk.reserve_room(start_date, end_date) + expect(reservation).must_be_kind_of Hotel::Reservation + room = @front_desk.rooms.find {|room| room.reservations.length > 0} + expect(room.reservations.include? reservation).must_equal true end + end - xdescribe "reservations" do - it "takes a Date and returns a list of Reservations" do - reservation_list = @front_desk.reservations(@date) - - expect(reservation_list).must_be_kind_of Array - reservation_list.each do |res| - res.must_be_kind_of Reservation - end - end + describe "get_avail_rooms" do + before do + @fd = Hotel::FrontDesk.new + @res1 = @fd.reserve_room(Date.new(2020, 01,01), Date.new(2020,01,03)) + @res2 = @fd.reserve_room(Date.new(2020, 01,03), Date.new(2020,01,04)) + @res3 = @fd.reserve_room(Date.new(2020, 01,04), Date.new(2020,01,05)) + @res4 = @fd.reserve_room(Date.new(2020, 02,04), Date.new(2020,02,05)) + end + it "returns array of rooms" do + avail_rooms = @fd.get_avail_rooms(Date.new(2020, 03,01), Date.new(2020,03,31)) + expect(avail_rooms).must_be_kind_of Array + expect(avail_rooms.any?(Hotel::Room)).must_equal true + expect(avail_rooms.length).must_equal 20 end + it "contains only rooms available at specified dates" do + rooms = @fd.get_avail_rooms(Date.new(2020, 01,01), Date.new(2020,01,31)) + expect(rooms.length).must_equal 17 + expect(rooms.any? {|room| room.reservations.include?(@res1)}).must_equal false + expect(rooms.any? {|room| room.reservations.include?(@res2)}).must_equal false + expect(rooms.any? {|room| room.reservations.include?(@res3)}).must_equal false + expect(rooms.any? {|room| room.reservations.include?(@res4)}).must_equal true + end + it "does not contain rooms with reserv's overlapping the tail end of date range" do + res5 = @fd.reserve_room(Date.new(2019, 12, 31), Date.new(2020, 01, 05)) + res6 = @fd.reserve_room(Date.new(2020, 01, 29), Date.new(2020, 02, 02)) + rooms = @fd.get_avail_rooms(Date.new(2020, 01,01), Date.new(2020,01,31)) + expect(rooms.any? {|room| room.reservations.include?(res5)}).must_equal false + expect(rooms.any? {|room| room.reservations.include?(res6)}).must_equal false + end + end - xdescribe "wave 2" do - describe "available_rooms" do - it "takes two dates and returns a list" do - start_date = @date - end_date = start_date + 3 - room_list = @front_desk.available_rooms(start_date, end_date) + describe "get_reservations" do + before do + @fd = Hotel::FrontDesk.new + @res1 = @fd.reserve_room(Date.new(2020, 01, 01), Date.new(2020, 01, 06)) + @res2 = @fd.reserve_room(Date.new(2020, 01, 02), Date.new(2020, 01, 07)) + @res3 = @fd.reserve_room(Date.new(2020, 01, 03), Date.new(2020, 01, 10)) + @res4 = @fd.reserve_room(Date.new(2020, 02, 04), Date.new(2020, 02, 05)) + end + + it "takes a Date and returns a list of Reservations" do + reservation_list = @front_desk.get_reservations(@date) + expect(reservation_list).must_be_kind_of Array - expect(room_list).must_be_kind_of Array + reservation_list.each do |res| + res.must_be_kind_of Hotel::Reservation end end + + it "includes reservations that include specified date" do + date = Date.new(2020, 01, 05) + reservation_list = @fd.get_reservations(date) + expect(reservation_list.include?(@res1)).must_equal true + expect(reservation_list.include?(@res2)).must_equal true + expect(reservation_list.include?(@res3)).must_equal true + expect(reservation_list.include?(@res4)).must_equal false + end + + it "excludes reservations with end_date equal to specified date" do + date = Date.new(2020, 01, 07) + reservation_list = @fd.get_reservations(date) + expect(reservation_list.include?(@res2)).must_equal false + expect(reservation_list.include?(@res3)).must_equal true + end + end + end + From 0169121df5e36cdcabebb63b019f281bff986b12 Mon Sep 17 00:00:00 2001 From: Yaz Date: Fri, 6 Mar 2020 15:07:53 -0800 Subject: [PATCH 14/22] Added two tests for FrontDesk#reserve_room - raises argument error when no rooms are available, and successfully reserves a room when all rooms have at least one reservation. --- test/front_desk_test.rb | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 53c0226ef..c7fbee847 100755 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -23,6 +23,22 @@ expect(room.reservations.include? reservation).must_equal true end + it "successfully reserves a room when all rooms have at least one reservation" do + (1..20).each do + @front_desk.reserve_room(Date.new(2020, 01,01), Date.new(2020,01,03)) + end + reservation21 = @front_desk.reserve_room(Date.new(2020, 01,03), Date.new(2020,01,04)) + room_with_21 = @front_desk.rooms.find {|room| room.reservations.length == 2} + expect(room_with_21.reservations[1]).must_equal reservation21 + end + + it "raises argument error when no rooms are available" do + (1..20).each do + @front_desk.reserve_room(Date.new(2020, 01,01), Date.new(2020,01,03)) + end + expect{@front_desk.reserve_room(Date.new(2020, 01,01), Date.new(2020,01,03))}.must_raise ArgumentError + end + end describe "get_avail_rooms" do @@ -60,6 +76,7 @@ describe "get_reservations" do before do + @date = Date.new(2020, 01, 05) @fd = Hotel::FrontDesk.new @res1 = @fd.reserve_room(Date.new(2020, 01, 01), Date.new(2020, 01, 06)) @res2 = @fd.reserve_room(Date.new(2020, 01, 02), Date.new(2020, 01, 07)) @@ -72,13 +89,13 @@ expect(reservation_list).must_be_kind_of Array reservation_list.each do |res| - res.must_be_kind_of Hotel::Reservation + expect(res).must_be_kind_of Hotel::Reservation end end it "includes reservations that include specified date" do - date = Date.new(2020, 01, 05) - reservation_list = @fd.get_reservations(date) + + reservation_list = @fd.get_reservations(@date) expect(reservation_list.include?(@res1)).must_equal true expect(reservation_list.include?(@res2)).must_equal true expect(reservation_list.include?(@res3)).must_equal true From 6e549b923800bdf47313c02db703007da1d9561b Mon Sep 17 00:00:00 2001 From: Yaz Date: Fri, 6 Mar 2020 15:29:35 -0800 Subject: [PATCH 15/22] Added files test/block_test.rb and lib/block.rb, basic formatting to pre-existing files --- lib/block.rb | 4 ++++ lib/front_desk.rb | 3 +-- lib/room.rb | 2 -- test/block_test.rb | 5 +++++ test/room_test.rb | 1 - test/test_helper.rb | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 lib/block.rb create mode 100644 test/block_test.rb diff --git a/lib/block.rb b/lib/block.rb new file mode 100644 index 000000000..435c2a8dd --- /dev/null +++ b/lib/block.rb @@ -0,0 +1,4 @@ +module Hotel + class Block + end +end \ No newline at end of file diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 82a7a34d1..d7cf13783 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -2,12 +2,12 @@ module Hotel class FrontDesk attr_reader :rooms, :reservations + def initialize @rooms = [] (1..20).each do |n| @rooms << Room.new(n) end - # fill @rooms with rooms 1-20, consecutively end def reserve_room(start_date, end_date) @@ -39,7 +39,6 @@ def get_reservations(date) end private - # to do: refactor def find_room(date_range) room = rooms.find {|room| room.reservations.length == 0 diff --git a/lib/room.rb b/lib/room.rb index 47831a031..6bc853379 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -11,7 +11,6 @@ def available?(date_range) if reservations.length == 0 return true end - # TO DO make this more ready by using any? or all? if reservations.any? {|r| r.overlap?(date_range)} return false else @@ -21,7 +20,6 @@ def available?(date_range) def add(reservation) - # to do: is this check redundant, since front desk checks if self.available?(reservation) @reservations << reservation else diff --git a/test/block_test.rb b/test/block_test.rb new file mode 100644 index 000000000..23e0be581 --- /dev/null +++ b/test/block_test.rb @@ -0,0 +1,5 @@ +require_relative "test_helper" + +describe Hotel::Block do + +end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 6e1a76f23..0a9f7ad9c 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -71,7 +71,6 @@ it "doesn't include a reservation partly in the specified range" do reservation5 = Hotel::Reservation.new(Date.new(2019, 12, 24), Date.new(2019, 12, 31), 15) reservation6 = Hotel::Reservation.new(Date.new(2020, 01, 29), Date.new(2020, 02, 02), 15) - #not passing on following line. Why is Room reistering as not available for a dec reservation?? @room15.add(reservation5) @room15.add(reservation6) resvs_within = @room15.get_reservations(Date.new(2020, 01,01), Date.new(2020,01,31)) diff --git a/test/test_helper.rb b/test/test_helper.rb index cc819bd19..f65a860f7 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -13,4 +13,5 @@ require_relative "../lib/front_desk.rb" require_relative "../lib/reservation.rb" require_relative "../lib/date_range.rb" -require_relative "../lib/room.rb" \ No newline at end of file +require_relative "../lib/room.rb" +require_relative "../lib/block.rb" \ No newline at end of file From 0ebed568308f4efbbf4facb022f84710a7e6a13b Mon Sep 17 00:00:00 2001 From: Yaz Date: Fri, 6 Mar 2020 17:28:12 -0800 Subject: [PATCH 16/22] Added constructor and method scafolding to Block, added optional parameter rate(with default value 200) to Reservation, and changed error messages in FrontDesk and Room to be more specific. --- lib/block.rb | 25 ++++++++++++++++++++++++- lib/front_desk.rb | 2 +- lib/reservation.rb | 6 ++---- lib/room.rb | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index 435c2a8dd..4474954b9 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,4 +1,27 @@ module Hotel - class Block + class Block < DateRange + def initialize(start_date, end_date, rooms, rate) + super(start_date, end_date) + # range necessary for class state?, or local var better? + @range = DateRange.new(start_date, end_date) + if rooms.any? { |room| !(room.available?(@range))} + raise ArgumentError.new("Room #{room.id} is not available at given date range.") + end + @rate = rate + @reservations = [] + @rooms = rooms + @rooms.each do |room| + room.add(self) + end + + end + + def reserve(room) + end + + def available_rooms + end + + end end \ No newline at end of file diff --git a/lib/front_desk.rb b/lib/front_desk.rb index d7cf13783..771328d9c 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -49,7 +49,7 @@ def find_room(date_range) } end if room == nil - raise ArgumentError.new("No rooms are availble") + raise ArgumentError.new("No rooms are availble in that date range.") end return room end diff --git a/lib/reservation.rb b/lib/reservation.rb index 0cad59731..77f45090c 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,12 +2,10 @@ module Hotel class Reservation < DateRange attr_reader :cost, :room - def initialize(start_date, end_date, room) + def initialize(start_date, end_date, room, rate= 200) super(start_date, end_date) - # TODO figure out how to use a nightly cost constant - # across the module @room = room - @cost = self.num_nights * 200 + @cost = self.num_nights * rate end end end diff --git a/lib/room.rb b/lib/room.rb index 6bc853379..ea67a0d36 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -23,7 +23,7 @@ def add(reservation) if self.available?(reservation) @reservations << reservation else - raise ArgumentError.new("That room isn't available.") + raise ArgumentError.new("Room #{self.id} isn't available for that reservation.") end end From feaf78473ea7b20f6bf0a311a8f9a4d19ef3b0a8 Mon Sep 17 00:00:00 2001 From: Yaz Date: Fri, 6 Mar 2020 21:38:35 -0800 Subject: [PATCH 17/22] Further fleshed out Block constructor and completed Block#reserve(room). Wrote extensive tests in block_tests.rb. --- lib/block.rb | 37 ++++++++++++----- test/block_test.rb | 100 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 126 insertions(+), 11 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index 4474954b9..5bd01661c 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,25 +1,42 @@ module Hotel class Block < DateRange + attr_reader :available_rooms, :reservations, :rate, :available_rooms def initialize(start_date, end_date, rooms, rate) + if rooms.length > 5 + raise ArgumentError.new("Blocks can only be made for 5 rooms or less.") + end super(start_date, end_date) - # range necessary for class state?, or local var better? - @range = DateRange.new(start_date, end_date) - if rooms.any? { |room| !(room.available?(@range))} - raise ArgumentError.new("Room #{room.id} is not available at given date range.") + range = DateRange.new(start_date, end_date) + if rooms.any? { |room| !(room.available?(range))} + raise ArgumentError.new("One of the rooms is not available at given date range.") end @rate = rate @reservations = [] - @rooms = rooms - @rooms.each do |room| + @available_rooms = rooms + @available_rooms.each do |room| room.add(self) end - end def reserve(room) - end - - def available_rooms + if !(available_rooms.include?(room)) + raise ArgumentError.new("Room #{room.id} is not in this Block.") + end + if available_rooms.all?{|room| room == nil} + raise ArgumentError.new("All rooms in block are already reserved.") + end + new_res = Reservation.new(start_date, end_date, room.id, rate) + self.reservations << new_res + # finds the block in room's reservations, turns it into a reservation + # TO DO: is the first conditional necessary? + i = room.reservations.find_index {|reservation| + reservation.class == Block && reservation.nights == self.nights + } + room.reservations[i] = new_res + j = available_rooms.find_index {|r| + r == room + } + available_rooms[j] = nil end diff --git a/test/block_test.rb b/test/block_test.rb index 23e0be581..40ab07021 100644 --- a/test/block_test.rb +++ b/test/block_test.rb @@ -1,5 +1,103 @@ require_relative "test_helper" describe Hotel::Block do - + before do + @fd = Hotel::FrontDesk.new + @rooms = @fd.rooms.slice(0,5) + @start = Date.new(2020, 01, 01) + @end = Date.new(2020, 01, 07) + @rate = 153 + end + + describe "constructor" do + describe "has all the expected state" do + it "rooms" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + expect(block.available_rooms).must_be_kind_of Array + avail_rooms = block.available_rooms + avail_rooms.each_with_index do |room, i| + expect(room).must_equal @rooms[i] + end + end + it "reservations" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + expect(block.reservations).must_be_kind_of Array + end + end + it "raises error if a room in rooms is not available" do + @rooms[4].add(Hotel::Reservation.new(@start, @end, 5, 150)) + expect{Hotel::Block.new(@start, @end, @rooms, @rate)}.must_raise ArgumentError + end + it "raises an error if rooms is > 5" do + @rooms << Hotel::Room.new(6) + expect{Hotel::Block.new(@start, @end, @rooms, @rate)}.must_raise ArgumentError + end + it "reflects changes in rooms included in block" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + @rooms.each do |room| + expect(room.reservations.include?(block)).must_equal true + end + end + + end + + describe "reserve(room)" do + it "raises error if attempting to reserve a room not in block" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + expect{block.reserve(Hotel::Room.new(20))}.must_raise ArgumentError + end + + it "reflects changes in class state: reservations" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + @rooms.each do |room| + block.reserve(room) + end + block.reservations.each_with_index do |reservation, i| + expect(reservation.room).must_equal i + 1 + end + end + + it "reserved room no longer has the block in their reservations, but a reservation instead" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + @rooms.each do |room| + block.reserve(room) + expect(room.reservations.any?(Hotel::Block)).must_equal false + end + + end + it "won't erase another block in making room's block>reservation change" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + start2 = Date.new(2020, 02, 01) + end2 = Date.new(2020, 02, 28) + block2 = Hotel::Block.new(start2, end2, @rooms, @rate) + @rooms.each do |room| + block.reserve(room) + expect(room.reservations.find{|r| r.class == Hotel::Block}).must_equal block2 + end + end + it "removes room from available_rooms" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + @rooms.each_with_index do |room, i| + block.reserve(room) + expect(block.available_rooms.any?{|r| r == room }).must_equal false + end + end + it "effectively adds discounted rate to reservation" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + @rooms.each_with_index do |room, i| + block.reserve(room) + end + block.reservations.each do |r| + expect(r.cost % 153 == 0).must_equal true + end + end + it "raises error if all rooms are booked" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + @rooms.each_with_index do |room, i| + block.reserve(room) + end + expect{block.reserve(@rooms[0])}.must_raise ArgumentError + end + end + end \ No newline at end of file From be30060806018d3d2de0b43db35e4db637488c25 Mon Sep 17 00:00:00 2001 From: Yaz Date: Fri, 6 Mar 2020 22:20:54 -0800 Subject: [PATCH 18/22] added test: block overlap, and refactored Block@available_rooms - removed attr_reader and created a custom reader method that doesn't show user the nil values that booked rooms leave behind --- lib/block.rb | 19 +++++++++++-------- test/block_test.rb | 6 ++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index 5bd01661c..0aba1e09b 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,6 +1,6 @@ module Hotel class Block < DateRange - attr_reader :available_rooms, :reservations, :rate, :available_rooms + attr_reader :reservations, :rate def initialize(start_date, end_date, rooms, rate) if rooms.length > 5 raise ArgumentError.new("Blocks can only be made for 5 rooms or less.") @@ -8,7 +8,7 @@ def initialize(start_date, end_date, rooms, rate) super(start_date, end_date) range = DateRange.new(start_date, end_date) if rooms.any? { |room| !(room.available?(range))} - raise ArgumentError.new("One of the rooms is not available at given date range.") + raise ArgumentError.new("One or more of the rooms is not available at given date range.") end @rate = rate @reservations = [] @@ -19,26 +19,29 @@ def initialize(start_date, end_date, rooms, rate) end def reserve(room) - if !(available_rooms.include?(room)) + if !(@available_rooms.include?(room)) raise ArgumentError.new("Room #{room.id} is not in this Block.") end - if available_rooms.all?{|room| room == nil} + if @available_rooms.all?{|room| room == nil} raise ArgumentError.new("All rooms in block are already reserved.") end new_res = Reservation.new(start_date, end_date, room.id, rate) self.reservations << new_res + # finds the block in room's reservations, turns it into a reservation - # TO DO: is the first conditional necessary? i = room.reservations.find_index {|reservation| - reservation.class == Block && reservation.nights == self.nights + reservation.nights == self.nights } room.reservations[i] = new_res - j = available_rooms.find_index {|r| + j = @available_rooms.find_index {|r| r == room } - available_rooms[j] = nil + @available_rooms[j] = nil end + def available_rooms + return @available_rooms.find_all {|room| room != nil} + end end end \ No newline at end of file diff --git a/test/block_test.rb b/test/block_test.rb index 40ab07021..5cbc95fab 100644 --- a/test/block_test.rb +++ b/test/block_test.rb @@ -65,6 +65,12 @@ end end + it "won't let another block be formed on the same rooms with overlapping range" do + block = Hotel::Block.new(@start, @end, @rooms, @rate) + start2 = Date.new(2020, 01, 03) + end2 = Date.new(2020, 01, 15) + expect{Hotel::Block.new(start2, end2, @rooms, @rate)}.must_raise ArgumentError + end it "won't erase another block in making room's block>reservation change" do block = Hotel::Block.new(@start, @end, @rooms, @rate) start2 = Date.new(2020, 02, 01) From f0fe0af87b300221ec442b354769511d4b2d2ac6 Mon Sep 17 00:00:00 2001 From: Yaz Date: Sat, 7 Mar 2020 00:51:07 -0800 Subject: [PATCH 19/22] Added Room@room_rate. Refactored Room#add and FrontDesk#reserve_room so that FrontDesk contains no direct references to Reservation - only through room. With this refactor, Room#add now has capability to create a reservation with the room_rate, if provided. --- lib/front_desk.rb | 15 ++++++++++----- lib/room.rb | 27 +++++++++++++++++++++------ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 771328d9c..b234ec67b 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,4 +1,3 @@ -require_relative 'room' module Hotel class FrontDesk attr_reader :rooms, :reservations @@ -9,13 +8,19 @@ def initialize @rooms << Room.new(n) end end + # TO DO: refactor so that add takes start,end or range and more Resv.new to Room#add + # def reserve_room(start_date, end_date) + # date_range = Hotel::DateRange.new(start_date, end_date) + # room = find_room(date_range) + # reservation = Reservation.new(start_date, end_date, room.id) + # room.add(reservation) + # return reservation + # end def reserve_room(start_date, end_date) date_range = Hotel::DateRange.new(start_date, end_date) room = find_room(date_range) - reservation = Reservation.new(start_date, end_date, room.id) - room.add(reservation) - return reservation + return room.add(date_range) end def get_avail_rooms(start_date, end_date) @@ -30,7 +35,7 @@ def get_reservations(date) reservations_at_date = [] rooms.each do |room| room.reservations.each do |reservation| - if reservation.include?(date) + if reservation.include?(date) && reservation.class != Block reservations_at_date << reservation end end diff --git a/lib/room.rb b/lib/room.rb index ea67a0d36..c598bc23c 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,12 +1,14 @@ module Hotel class Room - attr_reader :id, :reservations + attr_reader :id, :reservations, :room_rate - def initialize(id) + def initialize(id, room_rate=200) @id = id @reservations = [] + @room_rate = room_rate end - + + # This method checks if room is available for a specific reservation or a general date range def available?(date_range) if reservations.length == 0 return true @@ -17,14 +19,27 @@ def available?(date_range) return true end end - - - def add(reservation) + # TO DO refactor: from FrontDesk#reserve_room, take care of Reservation.new HERE, change method param to + # account for this. Additionally, take advantage of optional room_rate here. + # def add(reservation) + # if self.available?(reservation) + # @reservations << reservation + # else + # raise ArgumentError.new("Room #{self.id} isn't available for that reservation.") + # end + # end + def add(date_range) + if date_range.class != Reservation && date_range.class != Block + reservation = Reservation.new(date_range.start_date, date_range.end_date, self.id, room_rate) + else + reservation = date_range + end if self.available?(reservation) @reservations << reservation else raise ArgumentError.new("Room #{self.id} isn't available for that reservation.") end + return reservation end def get_reservations(start_date, end_date) From 37b5c9e7fdfc920a8d3c00c3f31d2e59e6b741cd Mon Sep 17 00:00:00 2001 From: Yaz Date: Sat, 7 Mar 2020 01:07:52 -0800 Subject: [PATCH 20/22] Formatting, removing shadow variables, addressing instance variable and unused variable warnings in block_test and front_desk_test --- .DS_Store | Bin 8196 -> 8196 bytes lib/block.rb | 2 +- lib/front_desk.rb | 8 ++++---- test/block_test.rb | 2 +- test/front_desk_test.rb | 11 +++++++---- test/room_test.rb | 4 ++-- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/.DS_Store b/.DS_Store index 9d085d08d12da834680340e11f1a5cec93472a24..b9b36c9eefb30c0aa5a98b77aeb413497dff96f6 100644 GIT binary patch delta 504 zcmZp1XmOa}UDU^hRb;$$8H$vCDiRt5$J76v_rbcRfZlH7b3m!zEhB%m0_jJ=!x zp5{E{h$^3gSH2*_FgQ6sw*aVzfr0D5=4OEuMs`y}6CDK;qsjcDPLmCUl`qIJ3{K9^Edc6aU|>_&+$@m7I9XcMbFzVu95XBH*~x)I3LJq~-%svk zKjaAHh)wPn;$njcOr9^K%*?)k0Vpgo`KHhkft++C!x%ViCNB^cW8+noKIO(Sd5^FJ zjCo5~iqT>7SK$gqJyacb>0qaqFr+dRqk2s}>#m;%$K(y7QfyG>1yLEshRtt9rI;ob TXl!Pe_{K6>Ks1(02C4!8jnHR$ diff --git a/lib/block.rb b/lib/block.rb index 0aba1e09b..556549da8 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -22,7 +22,7 @@ def reserve(room) if !(@available_rooms.include?(room)) raise ArgumentError.new("Room #{room.id} is not in this Block.") end - if @available_rooms.all?{|room| room == nil} + if @available_rooms.all?{|r| r == nil} raise ArgumentError.new("All rooms in block are already reserved.") end new_res = Reservation.new(start_date, end_date, room.id, rate) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index b234ec67b..bfaa4e2be 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -45,12 +45,12 @@ def get_reservations(date) private def find_room(date_range) - room = rooms.find {|room| - room.reservations.length == 0 + room = rooms.find {|r| + r.reservations.length == 0 } if room == nil - room = rooms.find {|room| - room.available?(date_range) + room = rooms.find {|r| + r.available?(date_range) } end if room == nil diff --git a/test/block_test.rb b/test/block_test.rb index 5cbc95fab..6e7ca8c2f 100644 --- a/test/block_test.rb +++ b/test/block_test.rb @@ -66,7 +66,7 @@ end it "won't let another block be formed on the same rooms with overlapping range" do - block = Hotel::Block.new(@start, @end, @rooms, @rate) + Hotel::Block.new(@start, @end, @rooms, @rate) start2 = Date.new(2020, 01, 03) end2 = Date.new(2020, 01, 15) expect{Hotel::Block.new(start2, end2, @rooms, @rate)}.must_raise ArgumentError diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index c7fbee847..2a80f83d1 100755 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -11,15 +11,15 @@ rooms = @front_desk.rooms expect(rooms).must_be_kind_of Array end - end + describe "reserve_room" do - it "takes two Date objects and returns a Reservation, adds reservation to room" do + it "takes two Date objects and adds reservation to room" do start_date = @date end_date = start_date + 3 reservation = @front_desk.reserve_room(start_date, end_date) expect(reservation).must_be_kind_of Hotel::Reservation - room = @front_desk.rooms.find {|room| room.reservations.length > 0} + room = @front_desk.rooms.find {|r| r.reservations.length > 0} expect(room.reservations.include? reservation).must_equal true end @@ -108,7 +108,10 @@ expect(reservation_list.include?(@res2)).must_equal false expect(reservation_list.include?(@res3)).must_equal true end - + #TO DO: write this test + it "excludes blocks, but includes reservations made from block" do + + end end end diff --git a/test/room_test.rb b/test/room_test.rb index 0a9f7ad9c..4c3914bd8 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -74,8 +74,8 @@ @room15.add(reservation5) @room15.add(reservation6) resvs_within = @room15.get_reservations(Date.new(2020, 01,01), Date.new(2020,01,31)) - expect(resvs_within.include? @reservation5).must_equal false - expect(resvs_within.include? @reservation6).must_equal false + expect(resvs_within.include? reservation5).must_equal false + expect(resvs_within.include? reservation6).must_equal false end it "returns empty array if none found" do resvs_within = @room15.get_reservations(Date.new(2020, 03,01), Date.new(2020,03,31)) From e7c6b5776de706fea87c5074150ab163971d0170 Mon Sep 17 00:00:00 2001 From: Yaz Date: Mon, 9 Mar 2020 08:10:58 -0700 Subject: [PATCH 21/22] final formatting and added file refactor.txt --- .DS_Store | Bin 8196 -> 8196 bytes lib/date_range.rb | 1 - lib/front_desk.rb | 11 +---------- lib/room.rb | 12 ++---------- refactor.txt | 4 ++++ test/front_desk_test.rb | 3 +-- 6 files changed, 8 insertions(+), 23 deletions(-) create mode 100644 refactor.txt diff --git a/.DS_Store b/.DS_Store index b9b36c9eefb30c0aa5a98b77aeb413497dff96f6..9e73d9cb4114e13365f8546aa3e4d8775b90e5f4 100644 GIT binary patch delta 55 zcmZp1XmOa}I9U^hRb(q&5n;nH*7#SHhw+W}PY-X4E L#M*vLN1JqjGGq=r?5;ckloBK@r`A(l;~Tgi3L&s DSN#r- diff --git a/lib/date_range.rb b/lib/date_range.rb index 398b52a54..1df1f5fbb 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -29,7 +29,6 @@ def initialize(start_date, end_date) def overlap?(other) other.nights.each do |night| - # this uses #include? not ruby enumerable if self.include? night return true end diff --git a/lib/front_desk.rb b/lib/front_desk.rb index bfaa4e2be..082f1214f 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -1,21 +1,12 @@ module Hotel class FrontDesk - attr_reader :rooms, :reservations - + attr_reader :rooms def initialize @rooms = [] (1..20).each do |n| @rooms << Room.new(n) end end - # TO DO: refactor so that add takes start,end or range and more Resv.new to Room#add - # def reserve_room(start_date, end_date) - # date_range = Hotel::DateRange.new(start_date, end_date) - # room = find_room(date_range) - # reservation = Reservation.new(start_date, end_date, room.id) - # room.add(reservation) - # return reservation - # end def reserve_room(start_date, end_date) date_range = Hotel::DateRange.new(start_date, end_date) diff --git a/lib/room.rb b/lib/room.rb index c598bc23c..3cdfd8045 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -8,7 +8,7 @@ def initialize(id, room_rate=200) @room_rate = room_rate end - # This method checks if room is available for a specific reservation or a general date range + # is available for a specific reservation or a general date range def available?(date_range) if reservations.length == 0 return true @@ -19,15 +19,7 @@ def available?(date_range) return true end end - # TO DO refactor: from FrontDesk#reserve_room, take care of Reservation.new HERE, change method param to - # account for this. Additionally, take advantage of optional room_rate here. - # def add(reservation) - # if self.available?(reservation) - # @reservations << reservation - # else - # raise ArgumentError.new("Room #{self.id} isn't available for that reservation.") - # end - # end + def add(date_range) if date_range.class != Reservation && date_range.class != Block reservation = Reservation.new(date_range.start_date, date_range.end_date, self.id, room_rate) diff --git a/refactor.txt b/refactor.txt new file mode 100644 index 000000000..5d682ef8d --- /dev/null +++ b/refactor.txt @@ -0,0 +1,4 @@ +* Create consistent convention for when to use date_range or start_date, end_date as parameters +* Create RoomNotAvailableError Class +* Map out everywhere that Room#availble? is used - there is redundancy here. +* Figure out why block_test.rb is not included in coverage file diff --git a/test/front_desk_test.rb b/test/front_desk_test.rb index 2a80f83d1..b7a680ebe 100755 --- a/test/front_desk_test.rb +++ b/test/front_desk_test.rb @@ -85,9 +85,8 @@ end it "takes a Date and returns a list of Reservations" do - reservation_list = @front_desk.get_reservations(@date) + reservation_list = @fd.get_reservations(@date) expect(reservation_list).must_be_kind_of Array - reservation_list.each do |res| expect(res).must_be_kind_of Hotel::Reservation end From d2a9a6e3d6eadd82312798a147a7dd2123eb0a20 Mon Sep 17 00:00:00 2001 From: Yaz O'Shaughnessy <54053695+saintmedusa@users.noreply.github.com> Date: Sat, 14 Mar 2020 19:07:10 -0700 Subject: [PATCH 22/22] using range to create rooms is this possible? --- lib/front_desk.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/front_desk.rb b/lib/front_desk.rb index 082f1214f..58a31ddf5 100644 --- a/lib/front_desk.rb +++ b/lib/front_desk.rb @@ -3,6 +3,8 @@ class FrontDesk attr_reader :rooms def initialize @rooms = [] + # Refactor: custom range - rooms. Rooms include Comparable, and implement succ and <=> + # See range doc (1..20).each do |n| @rooms << Room.new(n) end @@ -51,4 +53,4 @@ def find_room(date_range) end end -end \ No newline at end of file +end