From a79e8c46eadb4cd7d698a4a6bd560f427f45450b Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Tue, 4 Sep 2018 17:00:02 -0700 Subject: [PATCH 01/30] create spec and lib files for hotel booker, calendar, reservation, and room --- Guardfile | 2 +- lib/calendar.rb | 0 lib/hotel_booker.rb | 18 ++++++++++++++++++ lib/reservation.rb | 0 lib/room.rb | 0 spec/calendar_spec.rb | 0 spec/hotel_booker_spec.rb | 10 ++++++++++ spec/reservation_spec | 0 spec/room_spec.rb | 0 spec/spec_helper.rb | 5 ++++- 10 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 lib/calendar.rb create mode 100644 lib/hotel_booker.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 spec/calendar_spec.rb create mode 100644 spec/hotel_booker_spec.rb create mode 100644 spec/reservation_spec create mode 100644 spec/room_spec.rb diff --git a/Guardfile b/Guardfile index 6760f9177..fa59fc3ef 100644 --- a/Guardfile +++ b/Guardfile @@ -1,4 +1,4 @@ -guard :minitest, bundler: false, rubygems: false do +guard :minitest, bundler: false, autorun: false, rubygems: false do # with Minitest::Spec watch(%r{^spec/(.*)_spec\.rb$}) watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } diff --git a/lib/calendar.rb b/lib/calendar.rb new file mode 100644 index 000000000..e69de29bb diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb new file mode 100644 index 000000000..639c3ab3a --- /dev/null +++ b/lib/hotel_booker.rb @@ -0,0 +1,18 @@ +require 'pry' +require 'awesome_print' + +require_relative 'room' +require_relative 'reservation' +require_relative 'calendar' + +module Hotel + class HotelBooker + attr_reader :id + attr_accessor + + def initialize + + end + + end +end diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..e69de29bb diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..e69de29bb diff --git a/spec/calendar_spec.rb b/spec/calendar_spec.rb new file mode 100644 index 000000000..e69de29bb diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb new file mode 100644 index 000000000..4fec50e72 --- /dev/null +++ b/spec/hotel_booker_spec.rb @@ -0,0 +1,10 @@ +require 'pry' +require_relative 'spec_helper' + +describe "hotel initation" do + + it "fails this test" do + expect(Hotel::HotelBooker.new).must_be_instance_of Hotel::HotelBooker + end + +end diff --git a/spec/reservation_spec b/spec/reservation_spec new file mode 100644 index 000000000..e69de29bb diff --git a/spec/room_spec.rb b/spec/room_spec.rb new file mode 100644 index 000000000..e69de29bb diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4d1e3fdc8..d96f6aa58 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,8 +1,11 @@ +require 'simplecov' +SimpleCov.start require 'minitest' require 'minitest/autorun' require 'minitest/reporters' -# Add simplecov +require 'minitest/pride' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # Require_relative your lib files here! +require_relative '../lib/hotel_booker' From 73609dc68f9d1f7e41a6dc08aa3ee74047d8d913 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Wed, 5 Sep 2018 16:32:14 -0700 Subject: [PATCH 02/30] HotelBooker initates 20 rooms, can list all rooms, can reserve a room, and can get total_cost of reservation --- lib/{calendar.rb => booked_dates.rb} | 0 lib/hotel_booker.rb | 31 +++++++++++++++-- lib/reservation.rb | 49 +++++++++++++++++++++++++++ lib/room.rb | 28 ++++++++++++++++ spec/booked_dates_spec.rb | 9 +++++ spec/calendar_spec.rb | 0 spec/hotel_booker_spec.rb | 50 +++++++++++++++++++++++++--- spec/reservation_spec | 0 spec/reservation_spec.rb | 42 +++++++++++++++++++++++ spec/room_spec.rb | 20 +++++++++++ spec/spec_helper.rb | 3 ++ 11 files changed, 225 insertions(+), 7 deletions(-) rename lib/{calendar.rb => booked_dates.rb} (100%) create mode 100644 spec/booked_dates_spec.rb delete mode 100644 spec/calendar_spec.rb delete mode 100644 spec/reservation_spec create mode 100644 spec/reservation_spec.rb diff --git a/lib/calendar.rb b/lib/booked_dates.rb similarity index 100% rename from lib/calendar.rb rename to lib/booked_dates.rb diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 639c3ab3a..a34d6daee 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -1,17 +1,42 @@ require 'pry' require 'awesome_print' +require 'date' require_relative 'room' require_relative 'reservation' -require_relative 'calendar' +require_relative 'booked_dates' module Hotel class HotelBooker - attr_reader :id + attr_reader :rooms, :reservations, :booked_dates attr_accessor - def initialize + def initialize() + @reservations = [] + @booked_dates = [] + @rooms = [] + number_of_rooms = 20 + number_of_rooms.times do |i| + @rooms << Hotel::Room.new(i+1) + end + end + + def make_reservation(id, check_in, check_out) + reservation = Hotel::Reservation.new(id, check_in, check_out) + reservation.assign_room(@rooms) + room = reservation.room + room.reservations << reservation + @reservations << reservation + end + + def all_rooms() + end + + def all_reservations() + end + + def all_booked_dates() end end diff --git a/lib/reservation.rb b/lib/reservation.rb index e69de29bb..ff17a6fb5 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -0,0 +1,49 @@ +require 'pry' +require 'awesome_print' + +require 'date' +require 'time_difference' + +module Hotel + class Reservation + attr_reader :id, :check_in, :check_out, :room + attr_accessor :cost + + def initialize(id, check_in, check_out) + @id = id + @check_in = Date.parse(check_in) + @check_out = Date.parse(check_out) + @cost = calculate_total_cost + + #calculate cost + + # how many days? + + # add to booked dates ?? + end + + + def is_booked?(date) + # iterates through reservations, returns true if reservation date includes date argument + # return true + end + + def assign_room(rooms) + @room = rooms[0] + return rooms[0] + end + + def calculate_total_cost + total_days = TimeDifference.between(@check_in, @check_out).in_days.to_int + total_cost = 200 * total_days + end + + + def add_reservation(reserv) + + # add the reservation to the array @reservations + end + + + end +end diff --git a/lib/room.rb b/lib/room.rb index e69de29bb..8f1a31dfb 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -0,0 +1,28 @@ +require 'pry' +require 'awesome_print' +require 'date' + +module Hotel + class Room + attr_reader :id + attr_accessor :reservations, :cost + + def initialize(id) + @id = id + @cost = 200 + @reservations = [] + end + + + def is_booked?(date) + # iterates through reservations, returns true if reservation date includes date argument + # return true + end + + def add_reservation(reserv) + # add the reservation to the array @reservations + end + + + end +end diff --git a/spec/booked_dates_spec.rb b/spec/booked_dates_spec.rb new file mode 100644 index 000000000..6bce574a8 --- /dev/null +++ b/spec/booked_dates_spec.rb @@ -0,0 +1,9 @@ +require_relative 'spec_helper' + +describe "booked dates initation" do + # + # it "fails this test" do + # expect(Hotel::HotelBooker.new).must_be_instance_of Hotel::HotelBooker + # end + +end diff --git a/spec/calendar_spec.rb b/spec/calendar_spec.rb deleted file mode 100644 index e69de29bb..000000000 diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 4fec50e72..31af2bfbb 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -1,10 +1,52 @@ -require 'pry' require_relative 'spec_helper' -describe "hotel initation" do - it "fails this test" do - expect(Hotel::HotelBooker.new).must_be_instance_of Hotel::HotelBooker +describe "HotelBooker class" do + + + describe "HotelBooker initation" do + let(:booker) {Hotel::HotelBooker.new} + + it "Returns an instance of HotelBooker" do + expect(booker).must_be_kind_of Hotel::HotelBooker + end + + it "Establishes the base data structures when instantiated" do + [:rooms, :reservations, :booked_dates].each do |prop| + expect(booker).must_respond_to prop + end + + expect(booker.rooms).must_be_kind_of Array + expect(booker.reservations).must_be_kind_of Array + expect(booker.booked_dates).must_be_kind_of Array + end + + it "Loads 20 Rooms" do + expect(booker.rooms.length).must_equal 20 + 20.times do |i| + expect(booker.rooms[i]).must_be_kind_of Hotel::Room + end + end + end + + describe "Make a reservation method" do + + before do + @booker = Hotel::HotelBooker.new + @booker.make_reservation(1, '2018-09-05', '2018-09-09') + end + + it "Adds a Reservation to the list of reservations" do + + expect(@booker.reservations.length).must_equal 1 + expect(@booker.reservations[0]).must_be_kind_of Hotel::Reservation + end + + it "Adds a Reservation which contains an instance of Room" do + + expect(@booker.reservations[0].room).must_be_kind_of Hotel::Room + end + end end diff --git a/spec/reservation_spec b/spec/reservation_spec deleted file mode 100644 index e69de29bb..000000000 diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb new file mode 100644 index 000000000..fdd616b87 --- /dev/null +++ b/spec/reservation_spec.rb @@ -0,0 +1,42 @@ +require_relative 'spec_helper' + +describe "Reservation Class" do + + describe "Reservation initiation" do + let (:reservation) { Hotel::Reservation.new(1, '2018-09-05', '2018-09-07') } + + it "is an instance of Reservation" do + expect(reservation).must_be_kind_of Hotel::Reservation + end + + it "has two Dates as arguments " do + expect(reservation.check_in).must_be_kind_of Date + expect(reservation.check_out).must_be_kind_of Date + end + end + + describe "calculate_total_cost helper method" do + it "calculates the cost of the reservation " do + reservation_1 = Hotel::Reservation.new(1, '2018-09-05', '2018-09-07') + reservation_2 = Hotel::Reservation.new(2, '2018-09-06', '2018-12-06') + expect(reservation_1.cost).must_equal 400 + expect(reservation_2.cost ).must_equal 18200 + end + end + + describe "assign_room method" do + it "assigns Room to reservation from array of Rooms" do + reservation = Hotel::Reservation.new(1, '2018-09-05', '2018-09-07') + rooms = [Hotel::Room.new(1), Hotel::Room.new(2), Hotel::Room.new(3)] + + reservation.assign_room(rooms) + expect(reservation.room).must_be_kind_of Hotel::Room + end + + # it "assigns " do + # reservation.assign_room(rooms) + # expect(reservation.room).must_be_kind_of Hotel::Room + # end + end + +end diff --git a/spec/room_spec.rb b/spec/room_spec.rb index e69de29bb..b09d43afe 100644 --- a/spec/room_spec.rb +++ b/spec/room_spec.rb @@ -0,0 +1,20 @@ +require_relative 'spec_helper' + +describe "Room Class" do + describe "Room initiation" do + before do + @room = Hotel::Room.new(1) + end + + it "is an instance of Room" do + expect(@room).must_be_kind_of Hotel::Room + end + + # it "stores an array of reservations" do + # expect(@room.resrvations).must_be_kind_of Array + # end + + + + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d96f6aa58..4f6a8ed95 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -4,8 +4,11 @@ require 'minitest/autorun' require 'minitest/reporters' require 'minitest/pride' +require 'date' +require 'pry' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # Require_relative your lib files here! require_relative '../lib/hotel_booker' +require_relative '../lib/room' From 44059e3f72461e1f5833764c95f30651ead485f1 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 7 Sep 2018 16:01:49 -0700 Subject: [PATCH 03/30] renamed booked_dates to date_range, started spec and method calls --- lib/booked_dates.rb | 0 lib/date_range.rb | 25 +++++++++++++++++++++++++ lib/hotel_booker.rb | 8 ++++---- lib/room.rb | 4 ++-- spec/booked_dates_spec.rb | 9 --------- spec/date_range.rb | 16 ++++++++++++++++ 6 files changed, 47 insertions(+), 15 deletions(-) delete mode 100644 lib/booked_dates.rb create mode 100644 lib/date_range.rb delete mode 100644 spec/booked_dates_spec.rb create mode 100644 spec/date_range.rb diff --git a/lib/booked_dates.rb b/lib/booked_dates.rb deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..97fe2319a --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,25 @@ +require 'pry' +require 'awesome_print' +require 'date' + +module Hotel + class DateRange + attr_reader :check_in, :check_out + + def initialize(check_in, check_out) + @check_in = check_in + @check_out = check_out + end + + + def overlaps?(range) + # does my range overlap with a different range? + end + + def includes?(range) + # does my range include a different range? + end + + + end +end diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index a34d6daee..f138afb3e 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -4,7 +4,7 @@ require 'date' require_relative 'room' require_relative 'reservation' -require_relative 'booked_dates' +require_relative 'date_range' module Hotel class HotelBooker @@ -25,9 +25,9 @@ def initialize() def make_reservation(id, check_in, check_out) reservation = Hotel::Reservation.new(id, check_in, check_out) reservation.assign_room(@rooms) - room = reservation.room - room.reservations << reservation - @reservations << reservation + # room = reservation.room + # room.reservations << reservation + @reservations << reservation end def all_rooms() diff --git a/lib/room.rb b/lib/room.rb index 8f1a31dfb..8b7555364 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -5,12 +5,12 @@ module Hotel class Room attr_reader :id - attr_accessor :reservations, :cost + attr_accessor :cost def initialize(id) @id = id @cost = 200 - @reservations = [] + # @reservations = [] end diff --git a/spec/booked_dates_spec.rb b/spec/booked_dates_spec.rb deleted file mode 100644 index 6bce574a8..000000000 --- a/spec/booked_dates_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require_relative 'spec_helper' - -describe "booked dates initation" do - # - # it "fails this test" do - # expect(Hotel::HotelBooker.new).must_be_instance_of Hotel::HotelBooker - # end - -end diff --git a/spec/date_range.rb b/spec/date_range.rb new file mode 100644 index 000000000..6fa4ccbd3 --- /dev/null +++ b/spec/date_range.rb @@ -0,0 +1,16 @@ +require_relative 'spec_helper' + +describe "DateRange class" do + + describe "Date Range initation " do + before do + @date_range = Hotel::DateRange.new('2018-09-05', '2018-09-09') + end + + it "is an instance of Date Range" do + expect(@date_range).must_be_kind_of Hotel::DateRange + end + + + end +end From d0ba0bf2e27e7683eeb69106e3423daeb45d8282 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Fri, 7 Sep 2018 18:34:19 -0700 Subject: [PATCH 04/30] overlap? method in date_range returns boolean if two date ranges overlap --- lib/date_range.rb | 11 ++++------- lib/hotel_booker.rb | 2 ++ spec/date_range.rb | 16 ---------------- spec/date_range_spec.rb | 34 ++++++++++++++++++++++++++++++++++ spec/spec_helper.rb | 2 ++ 5 files changed, 42 insertions(+), 23 deletions(-) delete mode 100644 spec/date_range.rb create mode 100644 spec/date_range_spec.rb diff --git a/lib/date_range.rb b/lib/date_range.rb index 97fe2319a..6983ffc96 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -4,22 +4,19 @@ module Hotel class DateRange - attr_reader :check_in, :check_out + attr_reader :check_in, :check_out, :dates_booked + # dates booked is an array excluding check_out date def initialize(check_in, check_out) @check_in = check_in @check_out = check_out + @dates_booked = (check_in...check_out).to_a end def overlaps?(range) - # does my range overlap with a different range? + @dates_booked & range.dates_booked == [] ? false : true end - def includes?(range) - # does my range include a different range? - end - - end end diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index f138afb3e..80212f343 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -23,6 +23,8 @@ def initialize() end def make_reservation(id, check_in, check_out) + + # TODO make check_in and check_out into dates here instad of reservation reservation = Hotel::Reservation.new(id, check_in, check_out) reservation.assign_room(@rooms) # room = reservation.room diff --git a/spec/date_range.rb b/spec/date_range.rb deleted file mode 100644 index 6fa4ccbd3..000000000 --- a/spec/date_range.rb +++ /dev/null @@ -1,16 +0,0 @@ -require_relative 'spec_helper' - -describe "DateRange class" do - - describe "Date Range initation " do - before do - @date_range = Hotel::DateRange.new('2018-09-05', '2018-09-09') - end - - it "is an instance of Date Range" do - expect(@date_range).must_be_kind_of Hotel::DateRange - end - - - end -end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb new file mode 100644 index 000000000..be9a0a1fd --- /dev/null +++ b/spec/date_range_spec.rb @@ -0,0 +1,34 @@ +require_relative 'spec_helper' + +describe "DateRange class" do + + describe "Date Range initation " do + before do + @date1 = Date.parse('2018-09-05') + @date2 = Date.parse('2018-09-09') + @date3 = Date.parse('2018-09-10') + @date4 = Date.parse('2018-09-11') + + @date_range1 = Hotel::DateRange.new(@date1, @date2) + @date_range2 = Hotel::DateRange.new(@date1, @date3) + @date_range3 = Hotel::DateRange.new(@date2, @date3) + @date_range4 = Hotel::DateRange.new(@date3, @date4) + end + + it "is an instance of Date Range" do + expect(@date_range1).must_be_kind_of Hotel::DateRange + end + + it "it passes Dates as arguments" do + expect(@date_range1.check_in).must_be_kind_of Date + expect(@date_range2.check_out).must_be_kind_of Date + end + + it "it creates an array of Dates between check_in and check_out & excluding check_out" do + expect(@date_range3.dates_booked).must_be_kind_of Array + expect(@date_range3.dates_booked.length).must_equal 1 + expect(@date_range3.dates_booked[0]).must_equal @date2 + end + + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4f6a8ed95..ad8ac1985 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -12,3 +12,5 @@ # Require_relative your lib files here! require_relative '../lib/hotel_booker' require_relative '../lib/room' +require_relative '../lib/reservation' +require_relative '../lib/date_range' From d4e5b6d0141f7250824596da0614f6743b430a8b Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 8 Sep 2018 11:37:31 -0700 Subject: [PATCH 05/30] overlaps? method in date_range returns boolean --- lib/date_range.rb | 1 + spec/date_range_spec.rb | 38 +++++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 6983ffc96..4dd7e1e99 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -18,5 +18,6 @@ def overlaps?(range) @dates_booked & range.dates_booked == [] ? false : true end + end end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index be9a0a1fd..4338e0e8b 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -1,20 +1,19 @@ require_relative 'spec_helper' -describe "DateRange class" do +describe "DateRange Class" do + before do + @date1 = Date.parse('2018-09-05') + @date2 = Date.parse('2018-09-09') + @date3 = Date.parse('2018-09-10') + @date4 = Date.parse('2018-09-11') - describe "Date Range initation " do - before do - @date1 = Date.parse('2018-09-05') - @date2 = Date.parse('2018-09-09') - @date3 = Date.parse('2018-09-10') - @date4 = Date.parse('2018-09-11') - - @date_range1 = Hotel::DateRange.new(@date1, @date2) - @date_range2 = Hotel::DateRange.new(@date1, @date3) - @date_range3 = Hotel::DateRange.new(@date2, @date3) - @date_range4 = Hotel::DateRange.new(@date3, @date4) - end + @date_range1 = Hotel::DateRange.new(@date1, @date2) + @date_range2 = Hotel::DateRange.new(@date1, @date3) + @date_range3 = Hotel::DateRange.new(@date2, @date3) + @date_range4 = Hotel::DateRange.new(@date3, @date4) + end + describe "Date Range initation " do it "is an instance of Date Range" do expect(@date_range1).must_be_kind_of Hotel::DateRange end @@ -28,7 +27,20 @@ expect(@date_range3.dates_booked).must_be_kind_of Array expect(@date_range3.dates_booked.length).must_equal 1 expect(@date_range3.dates_booked[0]).must_equal @date2 + + expect(@date_range2.dates_booked.length).must_equal 5 + expect(@date_range2.dates_booked[0]).must_equal @date1 end + end + describe "overlaps? method to check if ranges overlap" do + it "returns true if date range passed as argument overlaps with own date range" do + expect(@date_range1.overlaps?(@date_range2)).must_equal true + expect(@date_range1.overlaps?(@date_range3)).must_equal false + expect(@date_range1.overlaps?(@date_range4)).must_equal false + expect(@date_range2.overlaps?(@date_range3)).must_equal true + expect(@date_range2.overlaps?(@date_range4)).must_equal false + end end + end From 62b0679de99ca7c624cdfe3c4305e2bef60df3ae Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 8 Sep 2018 11:53:38 -0700 Subject: [PATCH 06/30] test for raising standard error for invalid date ranges is red --- lib/date_range.rb | 6 ++++++ spec/date_range_spec.rb | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 4dd7e1e99..bb62aea26 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -10,6 +10,12 @@ class DateRange def initialize(check_in, check_out) @check_in = check_in @check_out = check_out + + # if @check_in >= @check_out + # raise StandardError, "Your check in and check out date cannot be the same date!" + # elsif @check_in < + # end + @dates_booked = (check_in...check_out).to_a end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index 4338e0e8b..8cd5eb118 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -18,12 +18,19 @@ expect(@date_range1).must_be_kind_of Hotel::DateRange end - it "it passes Dates as arguments" do + it "passes Dates as arguments" do expect(@date_range1.check_in).must_be_kind_of Date expect(@date_range2.check_out).must_be_kind_of Date end - it "it creates an array of Dates between check_in and check_out & excluding check_out" do + it "raises a StandardError if invalid date range is provided" do + expect{ Hotel::DateRange.new(@date1, @date1) }.must_raise StandardError + + expect{ Hotel::DateRange.new(@date3, @date1) }.must_raise StandardError + binding.pry + end + + it "creates an array of Dates between check_in and check_out & excluding check_out" do expect(@date_range3.dates_booked).must_be_kind_of Array expect(@date_range3.dates_booked.length).must_equal 1 expect(@date_range3.dates_booked[0]).must_equal @date2 From b0548179f47bfa8e42d6c42d05a31623d0703565 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 8 Sep 2018 11:58:13 -0700 Subject: [PATCH 07/30] raises standard error for invalid date ranges: green --- lib/date_range.rb | 7 +++---- spec/date_range_spec.rb | 2 -- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index bb62aea26..4fee7a447 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -11,10 +11,9 @@ def initialize(check_in, check_out) @check_in = check_in @check_out = check_out - # if @check_in >= @check_out - # raise StandardError, "Your check in and check out date cannot be the same date!" - # elsif @check_in < - # end + if @check_in >= @check_out + raise StandardError, "Your check in and check out date is not valid!" + end @dates_booked = (check_in...check_out).to_a end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index 8cd5eb118..0675fef62 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -25,9 +25,7 @@ it "raises a StandardError if invalid date range is provided" do expect{ Hotel::DateRange.new(@date1, @date1) }.must_raise StandardError - expect{ Hotel::DateRange.new(@date3, @date1) }.must_raise StandardError - binding.pry end it "creates an array of Dates between check_in and check_out & excluding check_out" do From aaedaaf6b369d2279962d4b65fa1c22e6fc3b1cd Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 8 Sep 2018 12:18:59 -0700 Subject: [PATCH 08/30] raises ArgumentError if dates argument are not Dates --- lib/date_range.rb | 14 +++++--------- spec/date_range_spec.rb | 6 +++++- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 4fee7a447..955b6732f 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -6,23 +6,19 @@ module Hotel class DateRange attr_reader :check_in, :check_out, :dates_booked - # dates booked is an array excluding check_out date def initialize(check_in, check_out) - @check_in = check_in - @check_out = check_out - - if @check_in >= @check_out + if check_in >= check_out raise StandardError, "Your check in and check out date is not valid!" + elsif !check_in.is_a?(Date) || !check_out.is_a?(Date) + raise ArgumentError, "You must input Dates in the date range!" end - + @check_in = check_in + @check_out = check_out @dates_booked = (check_in...check_out).to_a end - def overlaps?(range) @dates_booked & range.dates_booked == [] ? false : true end - - end end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index 0675fef62..e79b0596b 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -27,6 +27,11 @@ expect{ Hotel::DateRange.new(@date1, @date1) }.must_raise StandardError expect{ Hotel::DateRange.new(@date3, @date1) }.must_raise StandardError end + it "raises an ArgumentError if do not put in a Date" do + expect{ Hotel::DateRange.new(@date1, '12/08/23') }.must_raise ArgumentError + expect{ Hotel::DateRange.new('12/06/30', @date1) }.must_raise ArgumentError + expect{ Hotel::DateRange.new('12/06/30', '12/08/23') }.must_raise ArgumentError + end it "creates an array of Dates between check_in and check_out & excluding check_out" do expect(@date_range3.dates_booked).must_be_kind_of Array @@ -47,5 +52,4 @@ expect(@date_range2.overlaps?(@date_range4)).must_equal false end end - end From fe5d223d7c59bc87263bc934d8c58e68da21a289 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 8 Sep 2018 13:55:13 -0700 Subject: [PATCH 09/30] change arguments in reservation to date_range, not check_in, check_out; test for find_reservations(date) in hotel_booker is red --- lib/hotel_booker.rb | 31 ++++++++++++++++++++----------- lib/reservation.rb | 24 +++++++----------------- spec/date_range_spec.rb | 3 +-- spec/hotel_booker_spec.rb | 23 +++++++++++++++-------- spec/reservation_spec.rb | 22 +++++++++++++++------- 5 files changed, 58 insertions(+), 45 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 80212f343..99488c7be 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -11,31 +11,40 @@ class HotelBooker attr_reader :rooms, :reservations, :booked_dates attr_accessor + NUM_ROOMS = 20 + def initialize() @reservations = [] @booked_dates = [] @rooms = [] - - number_of_rooms = 20 - number_of_rooms.times do |i| + NUM_ROOMS.times do |i| @rooms << Hotel::Room.new(i+1) end end def make_reservation(id, check_in, check_out) - - # TODO make check_in and check_out into dates here instad of reservation - reservation = Hotel::Reservation.new(id, check_in, check_out) + check_in = Date.parse(check_in) + check_out = Date.parse(check_out) + date_range = Hotel::DateRange.new(check_in, check_out) + + # + # # TODO make sure check_in and check_out into dates here instad of reservation + # @booked_dates.each do |range| + # if range.overlaps?(date_range) + # + # end + # end + # + + reservation = Hotel::Reservation.new(id, date_range) reservation.assign_room(@rooms) - # room = reservation.room - # room.reservations << reservation + @reservations << reservation + @booked_dates << date_range.dates_booked end - def all_rooms() - end + def find_reservations(date) - def all_reservations() end def all_booked_dates() diff --git a/lib/reservation.rb b/lib/reservation.rb index ff17a6fb5..3c442ef23 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,25 +1,16 @@ require 'pry' require 'awesome_print' - require 'date' -require 'time_difference' module Hotel class Reservation - attr_reader :id, :check_in, :check_out, :room + attr_reader :id, :date_range, :room attr_accessor :cost - def initialize(id, check_in, check_out) + def initialize(id, date_range) @id = id - @check_in = Date.parse(check_in) - @check_out = Date.parse(check_out) + @date_range = date_range @cost = calculate_total_cost - - #calculate cost - - # how many days? - - # add to booked dates ?? end @@ -34,15 +25,14 @@ def assign_room(rooms) end def calculate_total_cost - total_days = TimeDifference.between(@check_in, @check_out).in_days.to_int + total_days = @date_range.dates_booked.length total_cost = 200 * total_days end - def add_reservation(reserv) - - # add the reservation to the array @reservations - end + # def add_reservation(reserv) + # # add the reservation to the array @reservations + # end end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index e79b0596b..cfcffe401 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -27,7 +27,7 @@ expect{ Hotel::DateRange.new(@date1, @date1) }.must_raise StandardError expect{ Hotel::DateRange.new(@date3, @date1) }.must_raise StandardError end - it "raises an ArgumentError if do not put in a Date" do + it "raises an ArgumentError if user do not put in a Date" do expect{ Hotel::DateRange.new(@date1, '12/08/23') }.must_raise ArgumentError expect{ Hotel::DateRange.new('12/06/30', @date1) }.must_raise ArgumentError expect{ Hotel::DateRange.new('12/06/30', '12/08/23') }.must_raise ArgumentError @@ -37,7 +37,6 @@ expect(@date_range3.dates_booked).must_be_kind_of Array expect(@date_range3.dates_booked.length).must_equal 1 expect(@date_range3.dates_booked[0]).must_equal @date2 - expect(@date_range2.dates_booked.length).must_equal 5 expect(@date_range2.dates_booked[0]).must_equal @date1 end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 31af2bfbb..19c879525 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -1,9 +1,6 @@ require_relative 'spec_helper' - describe "HotelBooker class" do - - describe "HotelBooker initation" do let(:booker) {Hotel::HotelBooker.new} @@ -15,7 +12,6 @@ [:rooms, :reservations, :booked_dates].each do |prop| expect(booker).must_respond_to prop end - expect(booker.rooms).must_be_kind_of Array expect(booker.reservations).must_be_kind_of Array expect(booker.booked_dates).must_be_kind_of Array @@ -30,23 +26,34 @@ end describe "Make a reservation method" do - before do @booker = Hotel::HotelBooker.new - @booker.make_reservation(1, '2018-09-05', '2018-09-09') + @booker.make_reservation(1, '2018-09-05', '2018-09-07') end it "Adds a Reservation to the list of reservations" do - expect(@booker.reservations.length).must_equal 1 expect(@booker.reservations[0]).must_be_kind_of Hotel::Reservation end it "Adds a Reservation which contains an instance of Room" do - expect(@booker.reservations[0].room).must_be_kind_of Hotel::Room end + end + + describe "Find a reservation by date method" do + before do + @booker = Hotel::HotelBooker.new + @booker.make_reservation(1, '2018-09-05', '2018-09-08') + @booker.make_reservation(2, '2018-09-06', '2018-09-08') + @booker.make_reservation(2, '2018-09-07', '2018-09-09') + end + it "Returns an array of reservations" do + expect(@booker.find_reservations('2018-09-05')).must_be_kind_of Array + expect(@booker.find_reservations('2018-09-06')[0]).must_be_kind_of Hotel::Reservation + expect(@booker.find_reservations('2018-09-06').length).must_equal 2 + end end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index fdd616b87..6eb3c3bac 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -1,24 +1,32 @@ require_relative 'spec_helper' describe "Reservation Class" do + let (:date1) { Date.parse('2018-09-05') } + let (:date2) { Date.parse('2018-09-07') } + let (:date_range) { Hotel::DateRange.new(date1, date2) } + let (:reservation) { Hotel::Reservation.new(1, date_range) } describe "Reservation initiation" do - let (:reservation) { Hotel::Reservation.new(1, '2018-09-05', '2018-09-07') } it "is an instance of Reservation" do expect(reservation).must_be_kind_of Hotel::Reservation end - it "has two Dates as arguments " do - expect(reservation.check_in).must_be_kind_of Date - expect(reservation.check_out).must_be_kind_of Date + it "has a DateRange as an argument" do + expect(reservation.date_range).must_be_kind_of Hotel::DateRange + expect(reservation.date_range.check_in).must_be_kind_of Date + expect(reservation.date_range.check_out).must_be_kind_of Date + end end describe "calculate_total_cost helper method" do it "calculates the cost of the reservation " do - reservation_1 = Hotel::Reservation.new(1, '2018-09-05', '2018-09-07') - reservation_2 = Hotel::Reservation.new(2, '2018-09-06', '2018-12-06') + date3 = Date.parse('2018-09-06') + date4 = Date.parse('2018-12-06') + date_range2 = Hotel::DateRange.new(date3, date4) + reservation_1 = Hotel::Reservation.new(1, date_range) + reservation_2 = Hotel::Reservation.new(2, date_range2) expect(reservation_1.cost).must_equal 400 expect(reservation_2.cost ).must_equal 18200 end @@ -26,7 +34,7 @@ describe "assign_room method" do it "assigns Room to reservation from array of Rooms" do - reservation = Hotel::Reservation.new(1, '2018-09-05', '2018-09-07') + reservation = Hotel::Reservation.new(1, date_range) rooms = [Hotel::Room.new(1), Hotel::Room.new(2), Hotel::Room.new(3)] reservation.assign_room(rooms) From bfbb588dd6618f5a716e9e1d65f863cfa632d097 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sat, 8 Sep 2018 15:19:31 -0700 Subject: [PATCH 10/30] find_reservation in hotel_booker passes tests --- lib/hotel_booker.rb | 15 ++++++++++++++- lib/reservation.rb | 4 ++-- spec/hotel_booker_spec.rb | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 99488c7be..85b682d7a 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -27,7 +27,7 @@ def make_reservation(id, check_in, check_out) check_out = Date.parse(check_out) date_range = Hotel::DateRange.new(check_in, check_out) - # + # # # TODO make sure check_in and check_out into dates here instad of reservation # @booked_dates.each do |range| # if range.overlaps?(date_range) @@ -44,7 +44,20 @@ def make_reservation(id, check_in, check_out) end def find_reservations(date) + matching_reservations = [] + date = Date.parse(date) + + if @reservations.length == [] + return nil + end + @reservations.each do |reservation| + reservation_dates = reservation.date_range.dates_booked + if reservation_dates.include?(date) + matching_reservations << reservation + end + end + return matching_reservations end def all_booked_dates() diff --git a/lib/reservation.rb b/lib/reservation.rb index 3c442ef23..f1dbfbf3d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,8 +4,8 @@ module Hotel class Reservation - attr_reader :id, :date_range, :room - attr_accessor :cost + attr_reader :id, :date_range + attr_accessor :cost, :room def initialize(id, date_range) @id = id diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 19c879525..0ca067ab6 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -52,7 +52,7 @@ it "Returns an array of reservations" do expect(@booker.find_reservations('2018-09-05')).must_be_kind_of Array expect(@booker.find_reservations('2018-09-06')[0]).must_be_kind_of Hotel::Reservation - expect(@booker.find_reservations('2018-09-06').length).must_equal 2 + expect(@booker.find_reservations('2018-09-07').length).must_equal 3 end end From fe6c4f26736e736833ad601bd47ca361227572ca Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 12:04:49 -0700 Subject: [PATCH 11/30] split up tests for overlaps? in date_range --- lib/hotel_booker.rb | 4 ---- spec/date_range_spec.rb | 26 +++++++++++++++++++++++--- spec/hotel_booker_spec.rb | 4 ++-- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 85b682d7a..98d765154 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -47,10 +47,6 @@ def find_reservations(date) matching_reservations = [] date = Date.parse(date) - if @reservations.length == [] - return nil - end - @reservations.each do |reservation| reservation_dates = reservation.date_range.dates_booked if reservation_dates.include?(date) diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb index cfcffe401..040d71055 100644 --- a/spec/date_range_spec.rb +++ b/spec/date_range_spec.rb @@ -43,11 +43,31 @@ end describe "overlaps? method to check if ranges overlap" do - it "returns true if date range passed as argument overlaps with own date range" do + it "returns true if date ranges are the same" do + expect(@date_range1.overlaps?(@date_range1)).must_equal true + end + + it "returns true if date ranges overlaps in the front" do expect(@date_range1.overlaps?(@date_range2)).must_equal true - expect(@date_range1.overlaps?(@date_range3)).must_equal false - expect(@date_range1.overlaps?(@date_range4)).must_equal false + end + + it "returns true if date ranges overlaps in the back" do + expect(@date_range2.overlaps?(@date_range1)).must_equal true + end + + it "returns true if one range is completely contained in another range" do expect(@date_range2.overlaps?(@date_range3)).must_equal true + end + + it "returns false if one range is completely after" do + expect(@date_range1.overlaps?(@date_range4)).must_equal false + end + + it "returns false if one range is completely before" do + expect(@date_range4.overlaps?(@date_range1)).must_equal false + end + it "returns false if a range starts on another's check in date" do + expect(@date_range1.overlaps?(@date_range3)).must_equal false expect(@date_range2.overlaps?(@date_range4)).must_equal false end end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 0ca067ab6..cb5d93ad7 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -46,14 +46,14 @@ @booker = Hotel::HotelBooker.new @booker.make_reservation(1, '2018-09-05', '2018-09-08') @booker.make_reservation(2, '2018-09-06', '2018-09-08') - @booker.make_reservation(2, '2018-09-07', '2018-09-09') + @booker.make_reservation(3, '2018-09-07', '2018-09-09') end it "Returns an array of reservations" do expect(@booker.find_reservations('2018-09-05')).must_be_kind_of Array expect(@booker.find_reservations('2018-09-06')[0]).must_be_kind_of Hotel::Reservation expect(@booker.find_reservations('2018-09-07').length).must_equal 3 + end end - end From caaf57b750b299c67b6f33b3e53c6c0e12a90d1d Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 13:19:08 -0700 Subject: [PATCH 12/30] unreserved_rooms method in hotel_booker failes test --- lib/hotel_booker.rb | 8 ++++++++ spec/hotel_booker_spec.rb | 24 +++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 98d765154..25a08e5dc 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -43,6 +43,12 @@ def make_reservation(id, check_in, check_out) @booked_dates << date_range.dates_booked end + def unreserved_rooms(check_in, check_out) + check_in = Date.parse(check_in) + check_out = Date.parse(check_out) + + end + def find_reservations(date) matching_reservations = [] date = Date.parse(date) @@ -56,6 +62,8 @@ def find_reservations(date) return matching_reservations end + + def all_booked_dates() end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index cb5d93ad7..d24885224 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -49,11 +49,33 @@ @booker.make_reservation(3, '2018-09-07', '2018-09-09') end - it "Returns an array of reservations" do + it "returns an array of reservations if there are reservations" do expect(@booker.find_reservations('2018-09-05')).must_be_kind_of Array expect(@booker.find_reservations('2018-09-06')[0]).must_be_kind_of Hotel::Reservation expect(@booker.find_reservations('2018-09-07').length).must_equal 3 + end + it "returns an empty array if there are no reservations for that date" do + expect(@booker.find_reservations('2019-10-13')).must_equal [] end end + + describe "unreserved_rooms method" do + before do + @booker = Hotel::HotelBooker.new + @booker.make_reservation(1, '2018-09-05', '2018-09-08') + @booker.make_reservation(2, '2018-09-06', '2018-09-08') + @booker.make_reservation(3, '2018-09-07', '2018-09-09') + end + + it "returns an array of unreserved rooms for date range given unreserved rooms exist" do + expect(@booker.unreserved_rooms('2018-09-05', '2018-09-08')).must_be_kind_of Array + expect(@booker.unreserved_rooms('2018-09-05', '2018-09-08')[0]).must_be_kind_of Hotel::Rooms + end + + # it "returns an empty array if there are no unavailable rooms for that date" do + # expect(@booker.unreserved_rooms('2018-09-05', '2018-09-08')).must_equal [] + # end + end + end From c0cee89e7b281177af54326bcfa2be4c1874e490 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 14:23:29 -0700 Subject: [PATCH 13/30] initial pass for unreserved_rooms method in hotel_booker --- lib/hotel_booker.rb | 36 ++++++++++++++++++++++++------------ lib/reservation.rb | 11 ----------- spec/hotel_booker_spec.rb | 17 +++++++++++++++-- spec/reservation_spec.rb | 28 ++++++++++++++-------------- 4 files changed, 53 insertions(+), 39 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 25a08e5dc..866776e5a 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -22,30 +22,42 @@ def initialize() end end + # arguments for dates are strings def make_reservation(id, check_in, check_out) check_in = Date.parse(check_in) check_out = Date.parse(check_out) date_range = Hotel::DateRange.new(check_in, check_out) + reservation = Hotel::Reservation.new(id, date_range) - # - # # TODO make sure check_in and check_out into dates here instad of reservation - # @booked_dates.each do |range| - # if range.overlaps?(date_range) - # - # end - # end - # + available = unreserved_rooms(check_in, check_out) + if available == [] + raise StandardError, "There are no more available rooms for this date range!" + else + reservation.room = available[0] + end - reservation = Hotel::Reservation.new(id, date_range) - reservation.assign_room(@rooms) @reservations << reservation @booked_dates << date_range.dates_booked end + # arguments must be Dates, not strings def unreserved_rooms(check_in, check_out) - check_in = Date.parse(check_in) - check_out = Date.parse(check_out) + reserved_rooms = [] + new_range = Hotel::DateRange.new(check_in, check_out) + + @reservations.each do |reservation| + reservation_range = + if reservation.date_range.overlaps?(new_range) + reserved_rooms << reservation.room + end + end + + unreserved = @rooms - reserved_rooms + + + + return unreserved end diff --git a/lib/reservation.rb b/lib/reservation.rb index f1dbfbf3d..e9c025c37 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -19,21 +19,10 @@ def is_booked?(date) # return true end - def assign_room(rooms) - @room = rooms[0] - return rooms[0] - end - def calculate_total_cost total_days = @date_range.dates_booked.length total_cost = 200 * total_days end - - # def add_reservation(reserv) - # # add the reservation to the array @reservations - # end - - end end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index d24885224..4a3c76264 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -62,15 +62,28 @@ describe "unreserved_rooms method" do before do + + @date1 = Date.parse('2018-09-05') + @date2 = Date.parse('2018-09-09') + @date3 = Date.parse('2018-09-10') + @date4 = Date.parse('2018-09-11') + + @date_range1 = Hotel::DateRange.new(@date1, @date2) + @date_range2 = Hotel::DateRange.new(@date1, @date3) + @date_range3 = Hotel::DateRange.new(@date2, @date3) + @date_range4 = Hotel::DateRange.new(@date3, @date4) + + @booker = Hotel::HotelBooker.new @booker.make_reservation(1, '2018-09-05', '2018-09-08') @booker.make_reservation(2, '2018-09-06', '2018-09-08') @booker.make_reservation(3, '2018-09-07', '2018-09-09') + @date end it "returns an array of unreserved rooms for date range given unreserved rooms exist" do - expect(@booker.unreserved_rooms('2018-09-05', '2018-09-08')).must_be_kind_of Array - expect(@booker.unreserved_rooms('2018-09-05', '2018-09-08')[0]).must_be_kind_of Hotel::Rooms + expect(@booker.unreserved_rooms(@date1, @date2)).must_be_kind_of Array + expect(@booker.unreserved_rooms(@date1, @date2)[0]).must_be_kind_of Hotel::Room end # it "returns an empty array if there are no unavailable rooms for that date" do diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 6eb3c3bac..02bdb3a3a 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -32,19 +32,19 @@ end end - describe "assign_room method" do - it "assigns Room to reservation from array of Rooms" do - reservation = Hotel::Reservation.new(1, date_range) - rooms = [Hotel::Room.new(1), Hotel::Room.new(2), Hotel::Room.new(3)] - - reservation.assign_room(rooms) - expect(reservation.room).must_be_kind_of Hotel::Room - end - - # it "assigns " do - # reservation.assign_room(rooms) - # expect(reservation.room).must_be_kind_of Hotel::Room - # end - end + # describe "assign_room method" do + # it "assigns Room to reservation from array of Rooms" do + # reservation = Hotel::Reservation.new(1, date_range) + # rooms = [Hotel::Room.new(1), Hotel::Room.new(2), Hotel::Room.new(3)] + # + # reservation.assign_room(rooms) + # expect(reservation.room).must_be_kind_of Hotel::Room + # end + # + # # it "assigns " do + # # reservation.assign_room(rooms) + # # expect(reservation.room).must_be_kind_of Hotel::Room + # # end + # end end From b0fc1366be3d21ccadbae68e3114713185b4c009 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 19:24:14 -0700 Subject: [PATCH 14/30] clean up Room and room_spec files --- lib/room.rb | 12 ------------ spec/room_spec.rb | 6 ------ 2 files changed, 18 deletions(-) diff --git a/lib/room.rb b/lib/room.rb index 8b7555364..29edd5053 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -10,19 +10,7 @@ class Room def initialize(id) @id = id @cost = 200 - # @reservations = [] end - - def is_booked?(date) - # iterates through reservations, returns true if reservation date includes date argument - # return true - end - - def add_reservation(reserv) - # add the reservation to the array @reservations - end - - end end diff --git a/spec/room_spec.rb b/spec/room_spec.rb index b09d43afe..7ffe73742 100644 --- a/spec/room_spec.rb +++ b/spec/room_spec.rb @@ -10,11 +10,5 @@ expect(@room).must_be_kind_of Hotel::Room end - # it "stores an array of reservations" do - # expect(@room.resrvations).must_be_kind_of Array - # end - - - end end From a4314090caaf61f8243bdf5a31d2ab60e83074a4 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 19:44:18 -0700 Subject: [PATCH 15/30] cleaned up Reservation and Reservation_spec files --- lib/reservation.rb | 10 +++------- spec/reservation_spec.rb | 21 +++------------------ 2 files changed, 6 insertions(+), 25 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index e9c025c37..852c477dd 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -6,6 +6,7 @@ module Hotel class Reservation attr_reader :id, :date_range attr_accessor :cost, :room + COST = 200 def initialize(id, date_range) @id = id @@ -13,15 +14,10 @@ def initialize(id, date_range) @cost = calculate_total_cost end - - def is_booked?(date) - # iterates through reservations, returns true if reservation date includes date argument - # return true - end - def calculate_total_cost total_days = @date_range.dates_booked.length - total_cost = 200 * total_days + total_cost = COST * total_days + return total_cost end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 02bdb3a3a..c57a2f1cc 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -7,7 +7,6 @@ let (:reservation) { Hotel::Reservation.new(1, date_range) } describe "Reservation initiation" do - it "is an instance of Reservation" do expect(reservation).must_be_kind_of Hotel::Reservation end @@ -16,7 +15,6 @@ expect(reservation.date_range).must_be_kind_of Hotel::DateRange expect(reservation.date_range.check_in).must_be_kind_of Date expect(reservation.date_range.check_out).must_be_kind_of Date - end end @@ -27,24 +25,11 @@ date_range2 = Hotel::DateRange.new(date3, date4) reservation_1 = Hotel::Reservation.new(1, date_range) reservation_2 = Hotel::Reservation.new(2, date_range2) + + expect(reservation_1.cost).must_equal 400 - expect(reservation_2.cost ).must_equal 18200 + expect(reservation_2.cost).must_equal 18200 end end - # describe "assign_room method" do - # it "assigns Room to reservation from array of Rooms" do - # reservation = Hotel::Reservation.new(1, date_range) - # rooms = [Hotel::Room.new(1), Hotel::Room.new(2), Hotel::Room.new(3)] - # - # reservation.assign_room(rooms) - # expect(reservation.room).must_be_kind_of Hotel::Room - # end - # - # # it "assigns " do - # # reservation.assign_room(rooms) - # # expect(reservation.room).must_be_kind_of Hotel::Room - # # end - # end - end From 4859efe0e6cd42f0db97eda24ec774349ed3e8cb Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 20:15:43 -0700 Subject: [PATCH 16/30] updated unreserved_rooms method testing in hotel_booker_spec --- lib/hotel_booker.rb | 23 ++++------------------- spec/hotel_booker_spec.rb | 38 +++++++++++++++++++++----------------- spec/reservation_spec.rb | 1 - 3 files changed, 25 insertions(+), 37 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 866776e5a..420403f0d 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -8,21 +8,18 @@ module Hotel class HotelBooker - attr_reader :rooms, :reservations, :booked_dates - attr_accessor - + attr_accessor :rooms, :reservations NUM_ROOMS = 20 def initialize() @reservations = [] - @booked_dates = [] @rooms = [] NUM_ROOMS.times do |i| @rooms << Hotel::Room.new(i+1) end end - # arguments for dates are strings + # arguments for check_in and check_out are Strings def make_reservation(id, check_in, check_out) check_in = Date.parse(check_in) check_out = Date.parse(check_out) @@ -34,31 +31,23 @@ def make_reservation(id, check_in, check_out) raise StandardError, "There are no more available rooms for this date range!" else reservation.room = available[0] + @reservations << reservation end - - - @reservations << reservation - @booked_dates << date_range.dates_booked end - # arguments must be Dates, not strings + # arguments for check_in and check_out are Dates def unreserved_rooms(check_in, check_out) reserved_rooms = [] new_range = Hotel::DateRange.new(check_in, check_out) @reservations.each do |reservation| - reservation_range = if reservation.date_range.overlaps?(new_range) reserved_rooms << reservation.room end end unreserved = @rooms - reserved_rooms - - - return unreserved - end def find_reservations(date) @@ -75,9 +64,5 @@ def find_reservations(date) end - - def all_booked_dates() - end - end end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 4a3c76264..9ff2aac81 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -9,12 +9,11 @@ end it "Establishes the base data structures when instantiated" do - [:rooms, :reservations, :booked_dates].each do |prop| + [:rooms, :reservations].each do |prop| expect(booker).must_respond_to prop end expect(booker.rooms).must_be_kind_of Array expect(booker.reservations).must_be_kind_of Array - expect(booker.booked_dates).must_be_kind_of Array end it "Loads 20 Rooms" do @@ -28,17 +27,26 @@ describe "Make a reservation method" do before do @booker = Hotel::HotelBooker.new - @booker.make_reservation(1, '2018-09-05', '2018-09-07') end - it "Adds a Reservation to the list of reservations" do + it "adds a Reservation to the list of reservations" do + @booker.make_reservation(1, '2018-09-05', '2018-09-07') expect(@booker.reservations.length).must_equal 1 expect(@booker.reservations[0]).must_be_kind_of Hotel::Reservation end - it "Adds a Reservation which contains an instance of Room" do + it "adds a Reservation which contains an instance of Room" do + @booker.make_reservation(1, '2018-09-05', '2018-09-07') expect(@booker.reservations[0].room).must_be_kind_of Hotel::Room end + + it "raises a StandardError if there are no available rooms for the date range" do + 20.times do |i| + @booker.make_reservation(i+1, '2018-09-05', '2018-09-07') + end + + expect{ @booker.make_reservation(21, '2018-09-05', '2018-09-07') }.must_raise StandardError + end end describe "Find a reservation by date method" do @@ -62,33 +70,29 @@ describe "unreserved_rooms method" do before do - @date1 = Date.parse('2018-09-05') @date2 = Date.parse('2018-09-09') @date3 = Date.parse('2018-09-10') @date4 = Date.parse('2018-09-11') - @date_range1 = Hotel::DateRange.new(@date1, @date2) - @date_range2 = Hotel::DateRange.new(@date1, @date3) - @date_range3 = Hotel::DateRange.new(@date2, @date3) - @date_range4 = Hotel::DateRange.new(@date3, @date4) - - @booker = Hotel::HotelBooker.new @booker.make_reservation(1, '2018-09-05', '2018-09-08') @booker.make_reservation(2, '2018-09-06', '2018-09-08') @booker.make_reservation(3, '2018-09-07', '2018-09-09') - @date end it "returns an array of unreserved rooms for date range given unreserved rooms exist" do expect(@booker.unreserved_rooms(@date1, @date2)).must_be_kind_of Array + expect(@booker.unreserved_rooms(@date1, @date2).length).must_equal 17 expect(@booker.unreserved_rooms(@date1, @date2)[0]).must_be_kind_of Hotel::Room + expect(@booker.unreserved_rooms(@date1, @date2)[0].id).must_equal 4 + end + + it "returns array of 20 rooms given if there no reservations for the date" do + expect(@booker.unreserved_rooms(@date3, @date4)).must_be_kind_of Array + expect(@booker.unreserved_rooms(@date3, @date4).length).must_equal 20 end - # it "returns an empty array if there are no unavailable rooms for that date" do - # expect(@booker.unreserved_rooms('2018-09-05', '2018-09-08')).must_equal [] - # end - end + end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index c57a2f1cc..582817ce6 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -26,7 +26,6 @@ reservation_1 = Hotel::Reservation.new(1, date_range) reservation_2 = Hotel::Reservation.new(2, date_range2) - expect(reservation_1.cost).must_equal 400 expect(reservation_2.cost).must_equal 18200 end From e8de7fe48d718f531e6b59d765c2d91b643e3ebc Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 20:48:54 -0700 Subject: [PATCH 17/30] start tests for create_block method in hotel_booker --- lib/hotel_booker.rb | 27 +++++++++++++++++++++++++++ lib/reservation.rb | 14 ++++++++++---- lib/room.rb | 4 ---- spec/hotel_booker_spec.rb | 17 +++++++++++++++++ 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 420403f0d..6b2aafbf3 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -10,6 +10,7 @@ module Hotel class HotelBooker attr_accessor :rooms, :reservations NUM_ROOMS = 20 + BLOCK_MAX = 5 def initialize() @reservations = [] @@ -35,6 +36,32 @@ def make_reservation(id, check_in, check_out) end end + def make_block_reservation(id) + end + + + def make_block(info) + num_rooms = info[:rooms] + if num_rooms > BLOCK_MAX + raise StandardError, "Five is the maximum number of rooms in a block." + end + discount = info[:discount] + check_in = Date.parse(info[:check_in]) + check_out = Date.parse(info[:check_out]) + date_range = Hotel::DateRange.new(check_in, check_out) + + + + available = unreserved_rooms(check_in, check_out) + if available == [] + raise StandardError, "There are no more available rooms for this date range!" + else + reservation.room = available[0] + @reservations << reservation + end + end + + # arguments for check_in and check_out are Dates def unreserved_rooms(check_in, check_out) reserved_rooms = [] diff --git a/lib/reservation.rb b/lib/reservation.rb index 852c477dd..31a4e361d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,24 +1,30 @@ require 'pry' require 'awesome_print' require 'date' +require_relative 'room' module Hotel class Reservation attr_reader :id, :date_range - attr_accessor :cost, :room - COST = 200 + attr_accessor :room def initialize(id, date_range) @id = id @date_range = date_range - @cost = calculate_total_cost + # placeholder room initation + @room = Hotel::Room.new(0) end + def cost + @cost = calculate_total_cost + end + def calculate_total_cost total_days = @date_range.dates_booked.length - total_cost = COST * total_days + total_cost = @room.cost * total_days return total_cost end + end end diff --git a/lib/room.rb b/lib/room.rb index 29edd5053..5cf99ab89 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,7 +1,3 @@ -require 'pry' -require 'awesome_print' -require 'date' - module Hotel class Room attr_reader :id diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 9ff2aac81..a69dc1982 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -92,7 +92,24 @@ expect(@booker.unreserved_rooms(@date3, @date4)).must_be_kind_of Array expect(@booker.unreserved_rooms(@date3, @date4).length).must_equal 20 end + end + + + describe "Make block of rooms " do + before do + @booker = Hotel::HotelBooker.new + end + + it "takes in a hash containing number of rooms, discount rate, check_in, and check_out" do + end + + it "creates an array of available rooms with discounted rates" do + end + it "returns a StandardError if there are not enough rooms to make a block" do + end end + + end From 4f89d836194a343ef88324f18f9c6edff6c9509a Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 22:09:14 -0700 Subject: [PATCH 18/30] hotel_booker can create a block of rooms --- lib/hotel_booker.rb | 68 ++++++++++++++++++++++++++------------- spec/hotel_booker_spec.rb | 36 +++++++++++++++++++-- 2 files changed, 78 insertions(+), 26 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 6b2aafbf3..c04e87c44 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -8,64 +8,71 @@ module Hotel class HotelBooker - attr_accessor :rooms, :reservations + attr_accessor :rooms, :reservations, :unreserved_block, :reserved_block NUM_ROOMS = 20 BLOCK_MAX = 5 def initialize() + @unreserved_block = [] + @reserved_block = [] @reservations = [] @rooms = [] + NUM_ROOMS.times do |i| @rooms << Hotel::Room.new(i+1) end end + # arguments for check_in and check_out are Strings def make_reservation(id, check_in, check_out) check_in = Date.parse(check_in) check_out = Date.parse(check_out) - date_range = Hotel::DateRange.new(check_in, check_out) + date_range = range(check_in, check_out) reservation = Hotel::Reservation.new(id, date_range) available = unreserved_rooms(check_in, check_out) if available == [] raise StandardError, "There are no more available rooms for this date range!" - else - reservation.room = available[0] - @reservations << reservation end - end - def make_block_reservation(id) + reservation.room = available[0] + @reservations << reservation end - def make_block(info) - num_rooms = info[:rooms] - if num_rooms > BLOCK_MAX + def make_block(rooms: nil, discount: nil, check_in: nil, check_out: nil) + check_in = Date.parse(check_in) + check_out = Date.parse(check_out) + date_range = range(check_in, check_out) + available = unreserved_rooms(check_in, check_out) + if rooms > BLOCK_MAX raise StandardError, "Five is the maximum number of rooms in a block." + elsif available.length < rooms + raise StandardError, "There are not enough available rooms to create a block." end - discount = info[:discount] - check_in = Date.parse(info[:check_in]) - check_out = Date.parse(info[:check_out]) - date_range = Hotel::DateRange.new(check_in, check_out) + rooms.times do |i| + reservation = Hotel::Reservation.new("BLOCK ROOM #{i+1}", date_range) + available[i].cost = discount + reservation.room = available[i] + @unreserved_block << reservation + end + return @unreserved_block + end - available = unreserved_rooms(check_in, check_out) - if available == [] - raise StandardError, "There are no more available rooms for this date range!" - else - reservation.room = available[0] - @reservations << reservation - end + + def make_block_reservation(id) end # arguments for check_in and check_out are Dates def unreserved_rooms(check_in, check_out) reserved_rooms = [] - new_range = Hotel::DateRange.new(check_in, check_out) + unreserved_block_rooms = [] + reserved_block_rooms = [] + new_range = range(check_in, check_out) @reservations.each do |reservation| if reservation.date_range.overlaps?(new_range) @@ -73,7 +80,19 @@ def unreserved_rooms(check_in, check_out) end end - unreserved = @rooms - reserved_rooms + @unreserved_block.each do |reservation| + if reservation.date_range.overlaps?(new_range) + unreserved_block_rooms << reservation.room + end + end + + @reserved_block.each do |reservation| + if reservation.date_range.overlaps?(new_range) + reserved_block_rooms << reservation.room + end + end + + unreserved = @rooms - reserved_rooms - unreserved_block_rooms - reserved_block_rooms return unreserved end @@ -90,6 +109,9 @@ def find_reservations(date) return matching_reservations end + def range(check_in, check_out) + Hotel::DateRange.new(check_in, check_out) + end end end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index a69dc1982..d35559094 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -99,13 +99,43 @@ before do @booker = Hotel::HotelBooker.new end - - it "takes in a hash containing number of rooms, discount rate, check_in, and check_out" do + + it "raises StandardError if user tries to create a block with more than 5 rooms" do + expect{ @booker.make_block(rooms: 6, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') }.must_raise StandardError end - it "creates an array of available rooms with discounted rates" do + it "raises StandardError if there are not enough available rooms for a block" do + 20.times do |i| + @booker.make_reservation(i+1, '2018-09-05', '2018-09-10') + end + + expect{ @booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') }.must_raise StandardError end + it "creates an array of available block reservations" do + expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')).must_be_kind_of Array + end + + it "creates an array the size of Reservations described by rooms" do + expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10').length).must_equal 5 + end + + it "creates an array carrying instances of Reservation " do + expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[0]).must_be_kind_of Hotel::Reservation + expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[4]).must_be_kind_of Hotel::Reservation + end + + it "assigns rooms starting from available rooms" do + 10.times do |i| + @booker.make_reservation(i+1, '2018-09-05', '2018-09-10') + end + + expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[0].room.id).must_equal 11 + end + + + + it "returns a StandardError if there are not enough rooms to make a block" do end From abeee86f51c3842e36cf4faae1bd636d7502cb69 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 22:31:45 -0700 Subject: [PATCH 19/30] reservation dates match the date range of the block test passes --- lib/hotel_booker.rb | 9 ++++++++- spec/hotel_booker_spec.rb | 17 +++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index c04e87c44..2536b7432 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -58,7 +58,6 @@ def make_block(rooms: nil, discount: nil, check_in: nil, check_out: nil) reservation.room = available[i] @unreserved_block << reservation end - return @unreserved_block end @@ -106,6 +105,14 @@ def find_reservations(date) matching_reservations << reservation end end + + @reserved_block.each do |reservation| + reservation_dates = reservation.date_range.dates_booked + if reservation_dates.include?(date) + matching_reservations << reservation + end + end + return matching_reservations end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index d35559094..339e1a9c5 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -94,8 +94,7 @@ end end - - describe "Make block of rooms " do + describe "Make block of rooms" do before do @booker = Hotel::HotelBooker.new end @@ -120,8 +119,7 @@ expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10').length).must_equal 5 end - it "creates an array carrying instances of Reservation " do - expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[0]).must_be_kind_of Hotel::Reservation + it "creates an array carrying instances of Reservation" do expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[4]).must_be_kind_of Hotel::Reservation end @@ -133,13 +131,16 @@ expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[0].room.id).must_equal 11 end + it "reservation dates match the date range of the block" do + @booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') + dates = @booker.unreserved_block[0].date_range + same_range = @booker.range(Date.parse('2018-09-05'), Date.parse('2018-09-10')) - - - it "returns a StandardError if there are not enough rooms to make a block" do + expect(dates.check_in).must_equal same_range.check_in + expect(dates.check_out).must_equal same_range.check_out end - end + end end From 5a90808a4614d4c44698857ea6fdea93de5ec140 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 22:39:04 -0700 Subject: [PATCH 20/30] start make_block_reservation method --- lib/hotel_booker.rb | 5 +++++ spec/hotel_booker_spec.rb | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 2536b7432..c915627a8 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -58,11 +58,16 @@ def make_block(rooms: nil, discount: nil, check_in: nil, check_out: nil) reservation.room = available[i] @unreserved_block << reservation end + return @unreserved_block end def make_block_reservation(id) + if @unreserved_block.length = 0 + raise StandardError, "There are no available Block reservations." + end + end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 339e1a9c5..087252002 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -127,7 +127,6 @@ 10.times do |i| @booker.make_reservation(i+1, '2018-09-05', '2018-09-10') end - expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[0].room.id).must_equal 11 end @@ -135,12 +134,20 @@ @booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') dates = @booker.unreserved_block[0].date_range same_range = @booker.range(Date.parse('2018-09-05'), Date.parse('2018-09-10')) - expect(dates.check_in).must_equal same_range.check_in expect(dates.check_out).must_equal same_range.check_out end + end + describe "make_block_reservation method" do + before do + @booker = Hotel::HotelBooker.new + end + it "raises an error if there are no avaiable block reservations" do + expect{ @booker.make_block_reservation(1) }.must_raise StandardError + end end + end From c4d7e68e672b863b00fd65a97455885bea8dd48f Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 23:02:25 -0700 Subject: [PATCH 21/30] can book a block reservation --- lib/hotel_booker.rb | 14 +++++++++++++- spec/hotel_booker_spec.rb | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index c915627a8..df3025871 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -64,10 +64,12 @@ def make_block(rooms: nil, discount: nil, check_in: nil, check_out: nil) def make_block_reservation(id) - if @unreserved_block.length = 0 + if @unreserved_block.length == 0 raise StandardError, "There are no available Block reservations." end + @reserved_block << @unreserved_block[0] + @unreserved_block.delete_at(0) end @@ -100,6 +102,16 @@ def unreserved_rooms(check_in, check_out) return unreserved end + def unreserved_block_rooms + unreserved_block_rooms = [] + @unreserved_block.each do |reservation| + unreserved_block_rooms << reservation.room + end + + return unreserved_block_rooms + end + + def find_reservations(date) matching_reservations = [] date = Date.parse(date) diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 087252002..eadb14e66 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -123,6 +123,10 @@ expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[4]).must_be_kind_of Hotel::Reservation end + it "carries instances of Reservation with adjusted cost" do + expect(@booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[0].cost).must_equal 750 + end + it "assigns rooms starting from available rooms" do 10.times do |i| @booker.make_reservation(i+1, '2018-09-05', '2018-09-10') @@ -148,6 +152,18 @@ expect{ @booker.make_block_reservation(1) }.must_raise StandardError end + it "moves a reservation from @unreserved_block to @reserve_block" do + @booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') + @booker.make_block_reservation(1) + + expect(@booker.unreserved_block.length).must_equal 0 + expect(@booker.reserved_block.length).must_equal 1 + expect(@booker.reserved_block[0]).must_be_kind_of Hotel::Reservation + + end + + + end end From a9639030383085395393d61a157fb3d9e57f3755 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 23:13:20 -0700 Subject: [PATCH 22/30] create unreserved_block_rooms method and passing test --- lib/date_range.rb | 2 -- lib/hotel_booker.rb | 6 ++---- lib/reservation.rb | 5 +---- spec/hotel_booker_spec.rb | 14 +++++++++++--- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 955b6732f..06a4e9469 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,5 +1,3 @@ -require 'pry' -require 'awesome_print' require 'date' module Hotel diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index df3025871..d63eb2242 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -1,6 +1,3 @@ -require 'pry' -require 'awesome_print' - require 'date' require_relative 'room' require_relative 'reservation' @@ -99,13 +96,14 @@ def unreserved_rooms(check_in, check_out) end unreserved = @rooms - reserved_rooms - unreserved_block_rooms - reserved_block_rooms + return unreserved end def unreserved_block_rooms unreserved_block_rooms = [] @unreserved_block.each do |reservation| - unreserved_block_rooms << reservation.room + unreserved_block_rooms << reservation.room end return unreserved_block_rooms diff --git a/lib/reservation.rb b/lib/reservation.rb index 31a4e361d..387bfaa44 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,6 +1,3 @@ -require 'pry' -require 'awesome_print' -require 'date' require_relative 'room' module Hotel @@ -18,7 +15,7 @@ def initialize(id, date_range) def cost @cost = calculate_total_cost end - + def calculate_total_cost total_days = @date_range.dates_booked.length total_cost = @room.cost * total_days diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index eadb14e66..a860b8db5 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -159,11 +159,19 @@ expect(@booker.unreserved_block.length).must_equal 0 expect(@booker.reserved_block.length).must_equal 1 expect(@booker.reserved_block[0]).must_be_kind_of Hotel::Reservation - end + end + describe "unreserved_block_rooms method" do + before do + @booker = Hotel::HotelBooker.new + @booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') + end - + it "returns an array of available rooms marked for block reservations" do + expect(@booker.unreserved_block_rooms).must_be_kind_of Array + expect(@booker.unreserved_block_rooms[0]).must_be_kind_of Hotel::Room + expect(@booker.unreserved_block_rooms.length).must_equal 5 + end end - end From e781d16ca55e9a4ad0c95efbb39df9ecfdd1e5f2 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 9 Sep 2018 23:23:34 -0700 Subject: [PATCH 23/30] add a refactors file --- lib/reservation.rb | 2 -- lib/room.rb | 1 - refactors.txt | 7 +++++++ spec/hotel_booker_spec.rb | 2 +- 4 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 refactors.txt diff --git a/lib/reservation.rb b/lib/reservation.rb index 387bfaa44..2e5fe0fa7 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -21,7 +21,5 @@ def calculate_total_cost total_cost = @room.cost * total_days return total_cost end - - end end diff --git a/lib/room.rb b/lib/room.rb index 5cf99ab89..0c60344bf 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -7,6 +7,5 @@ def initialize(id) @id = id @cost = 200 end - end end diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..d9fd94eec --- /dev/null +++ b/refactors.txt @@ -0,0 +1,7 @@ +1. I...lowkey cheated and made a collection of Reservations instead of a collection of Rooms. I would rewrite this part by making a subclass under Room called BookedRoom? + +2. HotelBooker has a lot of WET code because I have to loop through several data structures (@unreserved_block, @reserved_block, @reservations)!! If I had focused the Wave 3 blocks of rooms on the ROOMS instead of reservations, probably wouldn't have created this mess ¯\_(ツ)_/¯ + +3. there are certain check_in and check_out arguments that are strings (as in Hotel::HotelBooker.new.make_reservation) and some that are an instance of Date (as in Hotel::HotelBooker.new.unreserved_rooms). Other arguments pass in a Hotel::DateRange (such as Hotel::Reservations). note to future goeun: make this less terrible + +4. How many ways can you say "range"? ;__; diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index a860b8db5..98d410c99 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -1,6 +1,6 @@ require_relative 'spec_helper' -describe "HotelBooker class" do +describe "HotelBooker Class" do describe "HotelBooker initation" do let(:booker) {Hotel::HotelBooker.new} From eca8b388a9be5aa23457ced8e33795b4a65722da Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 30 Sep 2018 15:32:00 -0700 Subject: [PATCH 24/30] remove unnecessary namespacing --- lib/hotel_booker.rb | 8 ++++---- lib/reservation.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index d63eb2242..dffc7fe02 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -16,7 +16,7 @@ def initialize() @rooms = [] NUM_ROOMS.times do |i| - @rooms << Hotel::Room.new(i+1) + @rooms << Room.new(i+1) end end @@ -26,7 +26,7 @@ def make_reservation(id, check_in, check_out) check_in = Date.parse(check_in) check_out = Date.parse(check_out) date_range = range(check_in, check_out) - reservation = Hotel::Reservation.new(id, date_range) + reservation = Reservation.new(id, date_range) available = unreserved_rooms(check_in, check_out) if available == [] @@ -50,7 +50,7 @@ def make_block(rooms: nil, discount: nil, check_in: nil, check_out: nil) end rooms.times do |i| - reservation = Hotel::Reservation.new("BLOCK ROOM #{i+1}", date_range) + reservation = Reservation.new("BLOCK ROOM #{i+1}", date_range) available[i].cost = discount reservation.room = available[i] @unreserved_block << reservation @@ -132,7 +132,7 @@ def find_reservations(date) end def range(check_in, check_out) - Hotel::DateRange.new(check_in, check_out) + DateRange.new(check_in, check_out) end end diff --git a/lib/reservation.rb b/lib/reservation.rb index 2e5fe0fa7..253445e80 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -9,7 +9,7 @@ def initialize(id, date_range) @id = id @date_range = date_range # placeholder room initation - @room = Hotel::Room.new(0) + @room = Room.new(0) end def cost From 1be5ba32f7d05340a72e7a1eb9ca096e35f3a21f Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 30 Sep 2018 15:39:41 -0700 Subject: [PATCH 25/30] refactor checking available rooms into its own method --- lib/hotel_booker.rb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index dffc7fe02..1b894ac02 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -20,18 +20,21 @@ def initialize() end end + def available?(available_rooms) + if available_rooms.empty? + raise StandardError, "There are no more available rooms for this date range!" + end + end + # arguments for check_in and check_out are Strings def make_reservation(id, check_in, check_out) check_in = Date.parse(check_in) check_out = Date.parse(check_out) - date_range = range(check_in, check_out) - reservation = Reservation.new(id, date_range) + reservation = Reservation.new(id, range(check_in, check_out)) available = unreserved_rooms(check_in, check_out) - if available == [] - raise StandardError, "There are no more available rooms for this date range!" - end + available?(available) reservation.room = available[0] @reservations << reservation @@ -61,10 +64,7 @@ def make_block(rooms: nil, discount: nil, check_in: nil, check_out: nil) def make_block_reservation(id) - if @unreserved_block.length == 0 - raise StandardError, "There are no available Block reservations." - end - + available?(@unreserved_block) @reserved_block << @unreserved_block[0] @unreserved_block.delete_at(0) end From 8278260ba493c4ad276ecac43dce781e043e8980 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 30 Sep 2018 16:02:44 -0700 Subject: [PATCH 26/30] start design-activity responses --- design-activity.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..39602aea0 --- /dev/null +++ b/design-activity.md @@ -0,0 +1,34 @@ +What classes does each implementation include? Are the lists the same? + +Each implementation includes the classes CartEntry, ShoppingCart, and Order. In Implementation A, CartEntry and ShoppingCart both have initialize as only methods and class Order has initialize and total_price. In Implementation B, CartEntry and ShoppingCart has price method in addition. + +Write down a sentence to describe each class. + +CartEntry initializes with the unity price and quantity of the entry. ShoppingCart initializes with an empty array of entries. Order initializes by creating a new instance of ShoppingCart and has a method to calculate the total price. In Implementation B, each class can calculate their own price on their own (whether it's price for entry, price for shopping cart, or total price in order including tax). + +How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. + + +CartEntry is added to an array in ShoppingCart. Order can calculate the total price from the shopping cart's entries. + + +What data does each class store? How (if at all) does this differ between the two implementations? + + +What methods does each class have? How (if at all) does this differ between the two implementations? + + +Consider the Order#total_price method. In each implementation: +Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? + + +Does total_price directly manipulate the instance variables of other classes? + + +If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + + +Which implementation better adheres to the single responsibility principle? + + +Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? From 108afe7b4f0966ce1c0330d62920efa80b3fbf59 Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 30 Sep 2018 16:04:59 -0700 Subject: [PATCH 27/30] add bolded questions --- design-activity.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/design-activity.md b/design-activity.md index 39602aea0..b157986d3 100644 --- a/design-activity.md +++ b/design-activity.md @@ -1,34 +1,34 @@ -What classes does each implementation include? Are the lists the same? +### What classes does each implementation include? Are the lists the same? Each implementation includes the classes CartEntry, ShoppingCart, and Order. In Implementation A, CartEntry and ShoppingCart both have initialize as only methods and class Order has initialize and total_price. In Implementation B, CartEntry and ShoppingCart has price method in addition. -Write down a sentence to describe each class. +### Write down a sentence to describe each class. CartEntry initializes with the unity price and quantity of the entry. ShoppingCart initializes with an empty array of entries. Order initializes by creating a new instance of ShoppingCart and has a method to calculate the total price. In Implementation B, each class can calculate their own price on their own (whether it's price for entry, price for shopping cart, or total price in order including tax). -How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. +### How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. CartEntry is added to an array in ShoppingCart. Order can calculate the total price from the shopping cart's entries. -What data does each class store? How (if at all) does this differ between the two implementations? +### What data does each class store? How (if at all) does this differ between the two implementations? -What methods does each class have? How (if at all) does this differ between the two implementations? +### What methods does each class have? How (if at all) does this differ between the two implementations? -Consider the Order#total_price method. In each implementation: -Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? +###Consider the Order#total_price method. In each implementation: +###Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? -Does total_price directly manipulate the instance variables of other classes? +###Does total_price directly manipulate the instance variables of other classes? -If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? +###If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? -Which implementation better adheres to the single responsibility principle? +###Which implementation better adheres to the single responsibility principle? -Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? +###Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? From df6bd13e193643b6b46a50f5ac76798461bcaaec Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 30 Sep 2018 16:25:42 -0700 Subject: [PATCH 28/30] finish design-activity questions --- design-activity.md | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/design-activity.md b/design-activity.md index b157986d3..cb2c8b1ab 100644 --- a/design-activity.md +++ b/design-activity.md @@ -8,27 +8,34 @@ CartEntry initializes with the unity price and quantity of the entry. ShoppingCa ### How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. - -CartEntry is added to an array in ShoppingCart. Order can calculate the total price from the shopping cart's entries. - +CartEntry is added to an array in ShoppingCart. Order can calculate the total price from the shopping cart's entries. In implementation B, the price is calculated in every class so that Order doesn't need to do the calculating logic using CartEntry and ShoppingCart's instance variable and can instead get the subtotal by using @cart.price. ### What data does each class store? How (if at all) does this differ between the two implementations? +CartEntry stores the unit_price and quantity, ShoppingCart stores an array of CartEntry objects. Order stores one instance of ShoppingCart. There are additional methods in implementation B (the price method) but those calculate and return the sum, not store the data. ### What methods does each class have? How (if at all) does this differ between the two implementations? +Other than initialize, CartEntry and ShoppingCart have a price method that can return the price of each entry or cart in implementation B. In implementation A, only Order had a total_price method which did not adhere to single responsibility and used variables from ShoppingCart and CartEntry. + + +### Consider the Order#total_price method. In each implementation: +### Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? -###Consider the Order#total_price method. In each implementation: -###Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? +In implementation A, it's retained in Order. In implementation B, it's delegated to CartEntry and ShoppingCart. +### Does total_price directly manipulate the instance variables of other classes? -###Does total_price directly manipulate the instance variables of other classes? +In A, yes. in B, no. +### If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? -###If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? +Implementation B makes the change easier to modify the code in CartEntry (such as a conditional loop) instead of trying to make that logic work in Order. +### Which implementation better adheres to the single responsibility principle? -###Which implementation better adheres to the single responsibility principle? +Implementation B. +### Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? -###Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? +Implementation B. The total_price in Order doesn't require knowing the unit price and quantity of each CartEntry. From 821a8dba98a051ac7a7ff1b501cdc6f054334b4b Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 30 Sep 2018 16:34:42 -0700 Subject: [PATCH 29/30] refactor unreserved_block_rooms method --- lib/hotel_booker.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 1b894ac02..dd00aea9c 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -26,6 +26,9 @@ def available?(available_rooms) end end + def range(check_in, check_out) + DateRange.new(check_in, check_out) + end # arguments for check_in and check_out are Strings def make_reservation(id, check_in, check_out) @@ -101,11 +104,8 @@ def unreserved_rooms(check_in, check_out) end def unreserved_block_rooms - unreserved_block_rooms = [] - @unreserved_block.each do |reservation| - unreserved_block_rooms << reservation.room - end - + unreserved_block_rooms = + @unreserved_block.map { |reservation| reservation.room } return unreserved_block_rooms end @@ -131,9 +131,5 @@ def find_reservations(date) return matching_reservations end - def range(check_in, check_out) - DateRange.new(check_in, check_out) - end - end end From 96f44ed58c38f725af15391e00f6732877585b6e Mon Sep 17 00:00:00 2001 From: Goeun Park Date: Sun, 30 Sep 2018 17:25:55 -0700 Subject: [PATCH 30/30] refactor / design in changing cost of room when creating blocks --- design-activity.md | 8 ++++++++ lib/hotel_booker.rb | 4 ++-- lib/room.rb | 5 +++++ spec/hotel_booker_spec.rb | 20 ++++++++++---------- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/design-activity.md b/design-activity.md index cb2c8b1ab..a2a33e960 100644 --- a/design-activity.md +++ b/design-activity.md @@ -39,3 +39,11 @@ Implementation B. ### Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? Implementation B. The total_price in Order doesn't require knowing the unit price and quantity of each CartEntry. + +### Changes made in Hotel + +In my original HotelBooker class, I had a method for make_block and directly changed the cost of the Room as such: + +` available[i].cost = discount ` + +To make this code less coupled, I created a wrapping method in Room `set_discount` so HotelBooker wouldn't directly handle the instance variable from Room. diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index dd00aea9c..aa0af1811 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -44,7 +44,7 @@ def make_reservation(id, check_in, check_out) end - def make_block(rooms: nil, discount: nil, check_in: nil, check_out: nil) + def make_block(rooms, discount, check_in, check_out) check_in = Date.parse(check_in) check_out = Date.parse(check_out) date_range = range(check_in, check_out) @@ -57,7 +57,7 @@ def make_block(rooms: nil, discount: nil, check_in: nil, check_out: nil) rooms.times do |i| reservation = Reservation.new("BLOCK ROOM #{i+1}", date_range) - available[i].cost = discount + available[i].set_discount(discount) reservation.room = available[i] @unreserved_block << reservation end diff --git a/lib/room.rb b/lib/room.rb index 0c60344bf..08557ce1f 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -7,5 +7,10 @@ def initialize(id) @id = id @cost = 200 end + + def set_discount(new_cost) + @cost = new_cost + end + end end diff --git a/spec/hotel_booker_spec.rb b/spec/hotel_booker_spec.rb index 98d410c99..f54137cca 100644 --- a/spec/hotel_booker_spec.rb +++ b/spec/hotel_booker_spec.rb @@ -100,7 +100,7 @@ end it "raises StandardError if user tries to create a block with more than 5 rooms" do - expect{ @booker.make_block(rooms: 6, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') }.must_raise StandardError + expect{ @booker.make_block(6, 150, '2018-09-05', '2018-09-10') }.must_raise StandardError end it "raises StandardError if there are not enough available rooms for a block" do @@ -108,34 +108,34 @@ @booker.make_reservation(i+1, '2018-09-05', '2018-09-10') end - expect{ @booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') }.must_raise StandardError + expect{ @booker.make_block(1, 150, '2018-09-05', '2018-09-10') }.must_raise StandardError end it "creates an array of available block reservations" do - expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')).must_be_kind_of Array + expect(@booker.make_block(5, 150, '2018-09-05', '2018-09-10')).must_be_kind_of Array end it "creates an array the size of Reservations described by rooms" do - expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10').length).must_equal 5 + expect(@booker.make_block(5, 150, '2018-09-05', '2018-09-10').length).must_equal 5 end it "creates an array carrying instances of Reservation" do - expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[4]).must_be_kind_of Hotel::Reservation + expect(@booker.make_block(5, 150, '2018-09-05', '2018-09-10')[4]).must_be_kind_of Hotel::Reservation end it "carries instances of Reservation with adjusted cost" do - expect(@booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[0].cost).must_equal 750 + expect(@booker.make_block(1, 150, '2018-09-05', '2018-09-10')[0].cost).must_equal 750 end it "assigns rooms starting from available rooms" do 10.times do |i| @booker.make_reservation(i+1, '2018-09-05', '2018-09-10') end - expect(@booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10')[0].room.id).must_equal 11 + expect(@booker.make_block(5, 150, '2018-09-05', '2018-09-10')[0].room.id).must_equal 11 end it "reservation dates match the date range of the block" do - @booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') + @booker.make_block(1, 150, '2018-09-05', '2018-09-10') dates = @booker.unreserved_block[0].date_range same_range = @booker.range(Date.parse('2018-09-05'), Date.parse('2018-09-10')) expect(dates.check_in).must_equal same_range.check_in @@ -153,7 +153,7 @@ end it "moves a reservation from @unreserved_block to @reserve_block" do - @booker.make_block(rooms: 1, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') + @booker.make_block(1, 150, '2018-09-05', '2018-09-10') @booker.make_block_reservation(1) expect(@booker.unreserved_block.length).must_equal 0 @@ -165,7 +165,7 @@ describe "unreserved_block_rooms method" do before do @booker = Hotel::HotelBooker.new - @booker.make_block(rooms: 5, discount: 150, check_in: '2018-09-05', check_out: '2018-09-10') + @booker.make_block(5, 150, '2018-09-05', '2018-09-10') end it "returns an array of available rooms marked for block reservations" do