From 701f1d0532906e4a7495c89842f1ddd373641023 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Tue, 3 Mar 2020 20:40:55 -0800 Subject: [PATCH 01/16] added three classe and their initialize with tests --- .DS_Store | Bin 0 -> 6148 bytes lib/date_range.rb | 25 +++++++++++++++++++++++++ lib/hotel_controller.rb | 33 +++++++++++++++++++++++++++++++++ lib/reservation.rb | 23 +++++++++++++++++++++++ test/date_range_test.rb | 14 ++++++++++++++ test/hotel_controller_test.rb | 26 ++++++++++++++++++++++++++ test/reservation_test.rb | 22 ++++++++++++++++++++++ test/test_helper.rb | 10 ++++++++++ 8 files changed, 153 insertions(+) create mode 100644 .DS_Store create mode 100644 lib/date_range.rb create mode 100644 lib/hotel_controller.rb create mode 100644 lib/reservation.rb create mode 100644 test/date_range_test.rb create mode 100644 test/hotel_controller_test.rb create mode 100644 test/reservation_test.rb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e8238f3854166a493abe5ffa1b66543d55b693c6 GIT binary patch literal 6148 zcmeHKO>Wab6n@hf7^gyHfz&R&L1Gc16ewL(NG45%x4O#!)fISonBDJ9fczfmS4^vR836MplXGDJkn zv=44VF-2JKLpq{cbWE{a^^L4g=dxUSNF(qIRncgRUWw4cV87**9ie|@U?-sM7 zad~3K`W&5PX<7ApU)WO1xpeso=WX7;+I|%rig8ed)u`-;#S2+`99D;siJuCQ{fxut zS(=P@JJ+{FUWI9%6e>B56Hs10PxDxe`(l*Gr5Y#D9h|$|-R-PSCb!quyB>;Z*PCo? z^t#^NJNKqjm#^GdyT7w{eD-?sX8QI$UIoUmc`CbR@CSTAU_>|#iaZnf0a_%R(-TN} zgh^N| 20 || @room_num <= 0 + end + + def cost + # how many night times 200 per nightß + return (@date_range.duration)* 200 + end + end +end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100644 index 000000000..84df28cee --- /dev/null +++ b/test/date_range_test.rb @@ -0,0 +1,14 @@ +require_relative 'test_helper' + +describe "Date Range class" do + before do + @data_range = Hotel::DateRange.new( + start_date = Time.new(2010,03,02), + end_date = Time.new(2010,03,05) + ) + end + + it "is an instance of Date Range" do + expect(@data_range).must_be_kind_of Hotel::DateRange + end +end diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb new file mode 100644 index 000000000..71060f5fc --- /dev/null +++ b/test/hotel_controller_test.rb @@ -0,0 +1,26 @@ +require_relative 'test_helper' + +describe "Hotel Controller" do + def build_hotel_controller + return Hotel::HotelController.new + #reservation_list = {1 => {start_date: Date.parse("2020-01-01"), end_date: Date.parse("2020-01-05")} } + end + + describe "Initalizer" do + it "is an instance of Hotel Controller" do + front_desk = build_hotel_controller + expect(front_desk).must_be_kind_of Hotel::HotelController + end + end + + describe "reserve_room" do + before do + @front_desk = build_hotel_controller + end + + it "will create a new Reservation class and push into Reservation List" do + @front_desk.reserve_room( Date.new(2010,02,05), Date.new(2010,02,07), 3 ) + expect(@front_desk.reservation_list.length).must_equal 1 + end + end +end diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..d57b12412 --- /dev/null +++ b/test/reservation_test.rb @@ -0,0 +1,22 @@ +require_relative 'test_helper' + +describe "Reservation class" do + before do + @new_hotel = Hotel::HotelController.new + @new_hotel.reserve_room(Date.new(2010,02,10),Date.new(2010,02,13),3) + @new_reservation = @new_hotel.reservation_list[1] + end + + describe "Initializer" do + it "is an instance of Reservation" do + expect(@new_hotel.reservation_list[1]).must_be_kind_of Hotel::Reservation + end + end + + describe "cost" do + it "will calculate the total cost of the reservation" do + expect(@new_reservation.cost).must_equal 600 + end + end + +end diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..61fed229c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,8 +1,18 @@ # Add simplecov +require 'simplecov' +SimpleCov.start + require "minitest" require "minitest/autorun" require "minitest/reporters" +require "date" + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # require_relative your lib files here! + +require_relative '../lib/reservation' +require_relative '../lib/hotel_controller' +require_relative '../lib/date_range' + From 783f7ff19762d38c1c0bb710f0c9a5a5c0a65646 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Wed, 4 Mar 2020 15:44:44 -0800 Subject: [PATCH 02/16] added date_range methods overlap? include? --- lib/date_range.rb | 18 ++++++++++++++---- lib/hotel_controller.rb | 11 ++++++++--- lib/reservation.rb | 4 ++-- test/hotel_controller_test.rb | 1 - 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 1eadfbfc1..6e9e71044 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -11,13 +11,23 @@ def initialize(start_date, end_date) end def overlap?(other) - return false + # check to see if the date range itself is overlapping with "other"? + if self.start_date.between?(other.start_date, other.end_date - 1) || other.start_date.between?(self.start_date, self.end_date - 1) + return true + else + return false + end end def include?(date) - return false - end - + # see if the date provided is in between the date range + if date.between?(self.start_date, self.end_date - 1) + return true + else + return false + end + end + def duration return @end_date - @start_date end diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 11edec89b..38435554d 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -5,7 +5,7 @@ module Hotel class HotelController - attr_reader :reservation_list, :room_list + attr_reader :reservation_list, :room_list, :specific_date_reservation # Wave 1 def initialize @reservation_list = Hash.new @@ -20,8 +20,13 @@ def reserve_room(start_date, end_date, room_num) reservation_list[reservation_list.length + 1] = new_reservation end - def reservations(date) - return [] + def reservations(date) + #@reservation_list.each_value do |reservation| + #if date.between?(reservation.date_range.start_date, reservation.date_range.end_date) + # @specific_date_reservation << reservation + #end + #end + return @specific_date_reservation end # Wave 2 diff --git a/lib/reservation.rb b/lib/reservation.rb index 72c2517fa..700be969f 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -10,13 +10,13 @@ class Reservation def initialize(date_range, room_num) @date_range = date_range @room_num = room_num - @status = :active + @status = :comfirmed raise ArgumentError.new("Please enter a valid room number. There are only 20 rooms in this hotel") if @room_num > 20 || @room_num <= 0 end def cost - # how many night times 200 per nightß + # how many night times 200 per night return (@date_range.duration)* 200 end end diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 71060f5fc..160d8cecd 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -3,7 +3,6 @@ describe "Hotel Controller" do def build_hotel_controller return Hotel::HotelController.new - #reservation_list = {1 => {start_date: Date.parse("2020-01-01"), end_date: Date.parse("2020-01-05")} } end describe "Initalizer" do From 01d918605074b5a918497c140165f65b17ffb4aa Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Wed, 4 Mar 2020 16:05:18 -0800 Subject: [PATCH 03/16] added date_range tests --- test/date_range_test.rb | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 84df28cee..387a99585 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -3,12 +3,31 @@ describe "Date Range class" do before do @data_range = Hotel::DateRange.new( - start_date = Time.new(2010,03,02), - end_date = Time.new(2010,03,05) + start_date = Date.new(2010,03,02), + end_date = Date.new(2010,03,05) + ) + @date_range_two = Hotel::DateRange.new( + start_date = Date.new(2010,03,8), + end_date = Date.new(2010,03,10) + ) + @date_range_three = Hotel::DateRange.new( + start_date = Date.new(2010,03,8), + end_date = Date.new(2010,03,10) ) end it "is an instance of Date Range" do expect(@data_range).must_be_kind_of Hotel::DateRange end + + describe "overlap?" do + it "will return false if the time is not overlapping" do + expect(@date_range_two.overlap?(@data_range)).must_equal false + end + + it "will return true if the time is overlapping" do + expect(@date_range_two.overlap?(@date_range_three)).must_equal true + end + end end + \ No newline at end of file From a8ec2fcf1f9b882e3185d04eaa2a0f7ca0b3ab74 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Wed, 4 Mar 2020 22:18:21 -0800 Subject: [PATCH 04/16] added reservation and available_rooms methods --- lib/date_range.rb | 5 ++-- lib/hotel_controller.rb | 55 ++++++++++++++++++++++++++--------- lib/reservation.rb | 14 +++++---- test/hotel_controller_test.rb | 30 ++++++++++++------- test/reservation_test.rb | 7 +++-- 5 files changed, 77 insertions(+), 34 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 6e9e71044..f5794a7a5 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -7,11 +7,12 @@ class DateRange def initialize(start_date, end_date) @start_date = start_date @end_date = end_date - + raise ArgumentError.new("This is not a valid date range!") if @end_date < @start_date end def overlap?(other) # check to see if the date range itself is overlapping with "other"? + # A reservation is allowed start on the same day that another reservation for the same room ends if self.start_date.between?(other.start_date, other.end_date - 1) || other.start_date.between?(self.start_date, self.end_date - 1) return true else @@ -29,7 +30,7 @@ def include?(date) end def duration - return @end_date - @start_date + return @end_date - @start_date end end end \ No newline at end of file diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 38435554d..f8a430649 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -5,34 +5,63 @@ module Hotel class HotelController - attr_reader :reservation_list, :room_list, :specific_date_reservation + attr_reader :reservation_list + attr_accessor :room_list, :specific_date_reservation + # Wave 1 - def initialize + def initialize(number_of_room) @reservation_list = Hash.new - @room_list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] + @room_list = Array.new + + + n = 1 + number_of_room.times do + @room_list << "Room #{n}" + n += 1 + end + end - def reserve_room(start_date, end_date, room_num) + def reserve_room(start_date, end_date, customer_name) # start_date and end_date should be instances of class Date raise ArgumentError.new("They are not the valid Date class for start_date and end_date") if (start_date.class != Date || end_date.class != Date) resevation_duration = DateRange.new(start_date, end_date) - new_reservation = Reservation.new(resevation_duration,room_num) - reservation_list[reservation_list.length + 1] = new_reservation + new_reservation = Reservation.new(resevation_duration, customer_name) + new_reservation.cost + new_reservation.room_num = self.available_rooms(start_date, end_date)[0] + @reservation_list[reservation_list.length + 1] = new_reservation end def reservations(date) - #@reservation_list.each_value do |reservation| - #if date.between?(reservation.date_range.start_date, reservation.date_range.end_date) - # @specific_date_reservation << reservation - #end - #end - return @specific_date_reservation + specific_date_reservation = Array.new + @reservation_list.each_value do |reservation| + if reservation.date_range.include?(date) + specific_date_reservation << reservation + end + end + if specific_date_reservation.empty? + return "There is no reservation for today!" + else + return specific_date_reservation + end end # Wave 2 def available_rooms(start_date, end_date) # start_date and end_date should be instances of class Date - return [] + available_rooms_list = Array.new + occupied_rooms_list = Array.new + perferred_date_range = Hotel::DateRange.new(start_date, end_date) + @reservation_list.each_value do |reservation| + if reservation.date_range.overlap?(perferred_date_range) + occupied_rooms_list << reservation.room_num + end + end + if occupied_rooms_list.empty? + return @room_list + else + return @room_list - occupied_rooms_list + end end end end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb index 700be969f..81e7bd6db 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -5,19 +5,21 @@ module Hotel class Reservation - attr_reader :date_range, :room_num + attr_reader :date_range, :customer_name + attr_accessor :room_num - def initialize(date_range, room_num) + def initialize(date_range, customer_name) @date_range = date_range - @room_num = room_num + @room_num = nil + @customer_name = customer_name @status = :comfirmed - - raise ArgumentError.new("Please enter a valid room number. There are only 20 rooms in this hotel") if @room_num > 20 || @room_num <= 0 + @cost = nil end def cost # how many night times 200 per night - return (@date_range.duration)* 200 + @cost = ((@date_range.duration)* 200).to_f + return @cost end end end \ No newline at end of file diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 160d8cecd..9d3286a65 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -1,25 +1,35 @@ require_relative 'test_helper' describe "Hotel Controller" do - def build_hotel_controller - return Hotel::HotelController.new - end - + before do + @front_desk = Hotel::HotelController.new(20) + end + describe "Initalizer" do it "is an instance of Hotel Controller" do - front_desk = build_hotel_controller - expect(front_desk).must_be_kind_of Hotel::HotelController + expect(@front_desk).must_be_kind_of Hotel::HotelController end + + it "will create an array of rooms according to the number of room provided as an argument" + # it is creating the room array we want but not able to create test for it + # expect(@front_desk.room_list.length).must_equal 20 + end + end describe "reserve_room" do before do - @front_desk = build_hotel_controller - end + @front_desk = Hotel::HotelController.new(20) + @front_desk.reserve_room(Date.new(2020,01,05), Date.new(2020,01,10), "Alex") + end it "will create a new Reservation class and push into Reservation List" do - @front_desk.reserve_room( Date.new(2010,02,05), Date.new(2010,02,07), 3 ) expect(@front_desk.reservation_list.length).must_equal 1 + expect(@front_desk.reservation_list[1]).must_be_kind_of Hotel::Reservation end - end + + it "will create a new Date Range" do + expect(@front_desk.reservation_list[1].date_range).must_be_kind_of Hotel::DateRange + end + end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index d57b12412..fc981d7c6 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -2,14 +2,14 @@ describe "Reservation class" do before do - @new_hotel = Hotel::HotelController.new - @new_hotel.reserve_room(Date.new(2010,02,10),Date.new(2010,02,13),3) + @new_hotel = Hotel::HotelController.new(10) + @new_hotel.reserve_room(Date.new(2010,02,10),Date.new(2010,02,13), "Sharon") @new_reservation = @new_hotel.reservation_list[1] end describe "Initializer" do it "is an instance of Reservation" do - expect(@new_hotel.reservation_list[1]).must_be_kind_of Hotel::Reservation + expect(@new_reservation).must_be_kind_of Hotel::Reservation end end @@ -20,3 +20,4 @@ end end + \ No newline at end of file From db0d468ea5542835ecce34417b0dd2e50e985156 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Thu, 5 Mar 2020 20:24:37 -0800 Subject: [PATCH 05/16] added get room list --- lib/hotel_controller.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index f8a430649..e1af78e48 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -22,8 +22,14 @@ def initialize(number_of_room) end + def get_room_list + return @room_list + end + def reserve_room(start_date, end_date, customer_name) # start_date and end_date should be instances of class Date + # new data range and reservation created + # first available room assigned to the new reservation raise ArgumentError.new("They are not the valid Date class for start_date and end_date") if (start_date.class != Date || end_date.class != Date) resevation_duration = DateRange.new(start_date, end_date) new_reservation = Reservation.new(resevation_duration, customer_name) From efaabf443d23acdf481363c14782ec51d2a32849 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Thu, 5 Mar 2020 21:56:37 -0800 Subject: [PATCH 06/16] added get list of reservation method --- lib/hotel_controller.rb | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index e1af78e48..9a9a66519 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -12,8 +12,7 @@ class HotelController def initialize(number_of_room) @reservation_list = Hash.new @room_list = Array.new - - + n = 1 number_of_room.times do @room_list << "Room #{n}" @@ -34,8 +33,9 @@ def reserve_room(start_date, end_date, customer_name) resevation_duration = DateRange.new(start_date, end_date) new_reservation = Reservation.new(resevation_duration, customer_name) new_reservation.cost + reservation_id = @reservation_list.length + 1 new_reservation.room_num = self.available_rooms(start_date, end_date)[0] - @reservation_list[reservation_list.length + 1] = new_reservation + @reservation_list[reservation_id] = new_reservation end def reservations(date) @@ -52,6 +52,24 @@ def reservations(date) end end + + def get_list_of_reservations(specific_room, start_date, end_date) + date_range_reservation_list = Array.new + check_date_range = Hotel::DateRange.new(start_date, end_date) + @reservation_list.each_value do |reservation| + if (reservation.date_range.overlap?(check_date_range) )&& (reservation.room_num == specific_room) + date_range_reservation_list << reservation + end + end + return date_range_reservation_list + end + + + + def get_reservation_cost(reservation_id) + return self.reservation_list[reservation_id].cost + end + # Wave 2 def available_rooms(start_date, end_date) # start_date and end_date should be instances of class Date From 882bef267fc3dff56134f0d156a83a92e4d25c01 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Thu, 5 Mar 2020 22:34:08 -0800 Subject: [PATCH 07/16] added new errors to methods when no room left --- lib/hotel_controller.rb | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 9a9a66519..1b53febc5 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -34,7 +34,11 @@ def reserve_room(start_date, end_date, customer_name) new_reservation = Reservation.new(resevation_duration, customer_name) new_reservation.cost reservation_id = @reservation_list.length + 1 - new_reservation.room_num = self.available_rooms(start_date, end_date)[0] + if self.available_rooms(start_date, end_date)[0] == nil + raise ArgumentError.new("Opps! There is no room availiable for this date range!") + else + new_reservation.room_num = self.available_rooms(start_date, end_date)[0] + end @reservation_list[reservation_id] = new_reservation end @@ -46,7 +50,7 @@ def reservations(date) end end if specific_date_reservation.empty? - return "There is no reservation for today!" + raise ArgumentError.new("There is no reservation on this day!") else return specific_date_reservation end @@ -57,7 +61,7 @@ def get_list_of_reservations(specific_room, start_date, end_date) date_range_reservation_list = Array.new check_date_range = Hotel::DateRange.new(start_date, end_date) @reservation_list.each_value do |reservation| - if (reservation.date_range.overlap?(check_date_range) )&& (reservation.room_num == specific_room) + if (reservation.date_range.overlap?(check_date_range) ) && (reservation.room_num == specific_room) date_range_reservation_list << reservation end end @@ -84,7 +88,12 @@ def available_rooms(start_date, end_date) if occupied_rooms_list.empty? return @room_list else - return @room_list - occupied_rooms_list + available_rooms_list = @room_list - occupied_rooms_list + if available_rooms_list.empty? + raise ArgumentError.new("There is no more room for you!") + else + return available_rooms_list + end end end end From 972aee522f87b04e7d92e5b1ccbeaa18b79f4c23 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Fri, 6 Mar 2020 23:55:56 -0800 Subject: [PATCH 08/16] + create and reserve hotel block and availability --- lib/hotel_block.rb | 17 +++++++++++++ lib/hotel_controller.rb | 55 +++++++++++++++++++++++++++++++++++++++-- lib/reservation.rb | 11 ++++++--- 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 lib/hotel_block.rb diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb new file mode 100644 index 000000000..c0adb9a15 --- /dev/null +++ b/lib/hotel_block.rb @@ -0,0 +1,17 @@ +require 'date' +require 'time' +require './lib/date_range.rb' +require './lib/hotel_controller.rb' + +module Hotel + class BlockReservation + attr_reader :date_range, :status + attr_accessor :room_num , :no_of_rooms, :block_reservations + + def initialize(date_range, no_of_rooms) + @date_range = date_range + @no_of_rooms = no_of_rooms + @block_reservations = Array.new + end + end + end \ No newline at end of file diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 1b53febc5..3ab4efc33 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -2,17 +2,19 @@ require_relative 'reservation' require_relative 'date_range' +require_relative 'hotel_block' module Hotel class HotelController attr_reader :reservation_list - attr_accessor :room_list, :specific_date_reservation + attr_accessor :room_list, :specific_date_reservation, :hotel_block_list # Wave 1 def initialize(number_of_room) @reservation_list = Hash.new @room_list = Array.new - + @hotel_block_list = Hash.new + n = 1 number_of_room.times do @room_list << "Room #{n}" @@ -96,5 +98,54 @@ def available_rooms(start_date, end_date) end end end + + #Wave 3 Hotel Block + def create_hotel_block(start_date, end_date, number_of_rooms) + raise ArgumentError.new("They are not the valid Date class for start_date and end_date") if (start_date.class != Date || end_date.class != Date) + raise ArgumentError.new("There is not enough room!") if number_of_rooms > 5 || number_of_rooms > self.available_rooms(start_date, end_date).length + block_duration = DateRange.new(start_date, end_date) + new_hotel_block = BlockReservation.new(block_duration, number_of_rooms) + number_of_rooms.times do + block_room = self.reserve_room(block_duration.start_date, block_duration.end_date, "Hotel Block Reserve") + block_room.status = :open_hotel_block + new_hotel_block.block_reservations << block_room + end + hotel_block_id = hotel_block_list.length + 1 + hotel_block_list[hotel_block_id] = new_hotel_block + return new_hotel_block + end + + # check if a given block has any rooms available + # if there is available room - will return the rooms that are open + # else will raise argument + + def check_hotel_block_list_availability(hotel_block_id) + raise ArgumentError.new("Not a valid Hotel Block ID!") if !(hotel_block_list.keys.include? hotel_block_id) + available_rooms_in_block = Array.new + hotel_block_list[hotel_block_id].block_reservations.each do |reservation| + if reservation.status == :open_hotel_block + available_rooms_in_block << reservation.room_num + end + end + + if available_rooms_in_block == [] + raise ArgumentError.new("No room available in this hotel block anymore!") + else + return available_rooms_in_block + end + end + + def reserve_room_hotel_block(hotel_block_id, customer_name, specific_room) + raise ArgumentError.new("Not a valid Hotel Block ID!") if !(hotel_block_list.keys.include? hotel_block_id) + hotel_block_list[hotel_block_id].block_reservations.each do |reservation| + if (reservation.room_num == specific_room) && (reservation.status != :reserved_hotel_block) + booking_room = reservation + booking_room.customer_name = customer_name + booking_room.status = :reserved_hotel_block + end + + # ???????? raise ArgumentError.new("This is not a reserved room for the hotel block guest!") + end + end end end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb index 81e7bd6db..707646140 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -5,8 +5,8 @@ module Hotel class Reservation - attr_reader :date_range, :customer_name - attr_accessor :room_num + attr_reader :date_range + attr_accessor :room_num, :status, :customer_name def initialize(date_range, customer_name) @date_range = date_range @@ -17,8 +17,13 @@ def initialize(date_range, customer_name) end def cost - # how many night times 200 per night + # offering discount to hotel block customers + if @customer_name == "Hotel Block Reserve" + @cost = ((@date_range.duration)* 150).to_f + elsif + # how many night times 200 per night @cost = ((@date_range.duration)* 200).to_f + end return @cost end end From aa6b83d324dfeaebf6c7991039b5e49d913c76cc Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Sat, 7 Mar 2020 20:15:35 -0800 Subject: [PATCH 09/16] added more tests --- lib/hotel_block.rb | 17 ++++++-- lib/hotel_controller.rb | 13 +++--- lib/reservation.rb | 14 ++++++- refactors.txt | 0 test/hotel_controller_test.rb | 76 +++++++++++++++++++++++++++++------ 5 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 refactors.txt diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb index c0adb9a15..f0ebf506b 100644 --- a/lib/hotel_block.rb +++ b/lib/hotel_block.rb @@ -1,7 +1,8 @@ require 'date' require 'time' -require './lib/date_range.rb' -require './lib/hotel_controller.rb' +require_relative 'reservation' +require_relative 'date_range' + module Hotel class BlockReservation @@ -13,5 +14,15 @@ def initialize(date_range, no_of_rooms) @no_of_rooms = no_of_rooms @block_reservations = Array.new end + + # trial! + def check_valid_room(requested_room) + @block_reservations.each do |reservation| + if requested_room == reservation.room_num + return true + end + end + return false + end end - end \ No newline at end of file +end \ No newline at end of file diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 3ab4efc33..949594d38 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -10,7 +10,8 @@ class HotelController attr_accessor :room_list, :specific_date_reservation, :hotel_block_list # Wave 1 - def initialize(number_of_room) + # default number of room in the hotel is 20 + def initialize(number_of_room = 20) @reservation_list = Hash.new @room_list = Array.new @hotel_block_list = Hash.new @@ -51,6 +52,7 @@ def reservations(date) specific_date_reservation << reservation end end + if specific_date_reservation.empty? raise ArgumentError.new("There is no reservation on this day!") else @@ -123,7 +125,7 @@ def check_hotel_block_list_availability(hotel_block_id) raise ArgumentError.new("Not a valid Hotel Block ID!") if !(hotel_block_list.keys.include? hotel_block_id) available_rooms_in_block = Array.new hotel_block_list[hotel_block_id].block_reservations.each do |reservation| - if reservation.status == :open_hotel_block + if reservation.check_status available_rooms_in_block << reservation.room_num end end @@ -138,14 +140,15 @@ def check_hotel_block_list_availability(hotel_block_id) def reserve_room_hotel_block(hotel_block_id, customer_name, specific_room) raise ArgumentError.new("Not a valid Hotel Block ID!") if !(hotel_block_list.keys.include? hotel_block_id) hotel_block_list[hotel_block_id].block_reservations.each do |reservation| - if (reservation.room_num == specific_room) && (reservation.status != :reserved_hotel_block) + # check if the specific room requested in within the hotel block and not booked by another guests + if hotel_block_list[hotel_block_id].check_valid_room(specific_room) && reservation.check_status + #if (reservation.room_num == specific_room) && (reservation.status != :reserved_hotel_block) booking_room = reservation booking_room.customer_name = customer_name booking_room.status = :reserved_hotel_block end - - # ???????? raise ArgumentError.new("This is not a reserved room for the hotel block guest!") end + # raise ArgumentError.new("This is not a reserved room for the hotel block guest!") end end end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb index 707646140..c4cd694db 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,7 +1,8 @@ require 'date' require 'time' -require './lib/date_range.rb' -require './lib/hotel_controller.rb' +require_relative 'reservation' +require_relative 'date_range' +require_relative 'hotel_block' module Hotel class Reservation @@ -26,5 +27,14 @@ def cost end return @cost end + + # trial + def check_status + if self.status == :open_hotel_block + return true + else + return false + end + end end end \ No newline at end of file diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..e69de29bb diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 9d3286a65..b34f6148a 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -1,35 +1,85 @@ require_relative 'test_helper' describe "Hotel Controller" do - before do + before do @front_desk = Hotel::HotelController.new(20) - end + @front_desk.reserve_room(Date.new(2020,01,05), Date.new(2020,01,10), "Alex") + @front_desk.reserve_room(Date.new(2020,03,05), Date.new(2020,03,10), "Macy") + @front_desk.reserve_room(Date.new(2020,03,12), Date.new(2020,03,15), "Leo") + + end describe "Initalizer" do it "is an instance of Hotel Controller" do expect(@front_desk).must_be_kind_of Hotel::HotelController end - it "will create an array of rooms according to the number of room provided as an argument" + #it "will create an array of rooms according to the number of room provided as an argument" do # it is creating the room array we want but not able to create test for it # expect(@front_desk.room_list.length).must_equal 20 - end - + #end end describe "reserve_room" do - before do - @front_desk = Hotel::HotelController.new(20) - @front_desk.reserve_room(Date.new(2020,01,05), Date.new(2020,01,10), "Alex") - end - it "will create a new Reservation class and push into Reservation List" do - expect(@front_desk.reservation_list.length).must_equal 1 + expect(@front_desk.reservation_list.length).must_equal 3 expect(@front_desk.reservation_list[1]).must_be_kind_of Hotel::Reservation + expect(@front_desk.reservation_list[1].date_range).must_be_kind_of Hotel::DateRange + end + end + + describe "reservations" do + it "will return a list of reservation on that specific date" do + check_date = @front_desk.reservations(Date.new(2020,01,05)) + + expect(check_date).must_be_kind_of Array + expect(check_date.length).must_equal 1 + expect{@front_desk.reservations(Date.new(2020,10,05))}.must_raise ArgumentError end + end - it "will create a new Date Range" do - expect(@front_desk.reservation_list[1].date_range).must_be_kind_of Hotel::DateRange + describe "get_list_of_reservation" do + @front_desk = Hotel::HotelController.new(20) + it "will return a list of reservations for a specific room in that date range" do + room_reservation_list = @front_desk.get_list_of_reservations("Room 1", Date.new(2020,03,01), Date.new(2020,03,31,)) + expect(room_reservation_list.length).must_equal 2 end + end + describe "available_rooms" do + it "will return a list of avaliable_rooms" do + available_list = @front_desk.available_rooms(Date.new(2020,03,01), Date.new(2020,03,31,)) + available_list_two = @front_desk.available_rooms(Date.new(2020,10,01), Date.new(2020,10,31,)) + expect(available_list.length).must_equal 19 + expect(available_list_two.length).must_equal 20 + end + end + + describe "create_hotel_block" do + it "will create a hotel_block, create the correct amount of reservation according to the block" do + hotel_block = @front_desk.create_hotel_block(Date.new(2020,06,20), Date.new(2020,06,25), 5) + + expect(hotel_block).must_be_kind_of Hotel::BlockReservation + expect(@front_desk.reservations(Date.new(2020,06,20)).length).must_equal 5 + end + end + + describe "check_hotel_block_list_availability" do + it "will retrun the rooms from hotel block that is available" do + hotel_block = @front_desk.create_hotel_block(Date.new(2020,06,20), Date.new(2020,06,25), 5) + rooms_from_block = @front_desk.check_hotel_block_list_availability(1) + + expect(rooms_from_block.length).must_equal 5 + expect{@front_desk.check_hotel_block_list_availability(10)}.must_raise ArgumentError + end + end + + describe "reserve_room_hotel_block(hotel_block_id, customer_name, specific_room)" do + it "will reserve room within the hotel block" do + + + #expect{@front_desk.reserve_room_hotel_block(1, "Hello Kitty", 1)}.must_raise ArgumentError + end + end end + From 4e2ae849b054995d5d86c014f624d76739f26216 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Sun, 8 Mar 2020 21:59:39 -0700 Subject: [PATCH 10/16] fixed a bug from hotel block.rb --- lib/hotel_block.rb | 10 ---------- lib/hotel_controller.rb | 12 +++++++++--- lib/reservation.rb | 11 +++++------ 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb index f0ebf506b..73beb33c3 100644 --- a/lib/hotel_block.rb +++ b/lib/hotel_block.rb @@ -14,15 +14,5 @@ def initialize(date_range, no_of_rooms) @no_of_rooms = no_of_rooms @block_reservations = Array.new end - - # trial! - def check_valid_room(requested_room) - @block_reservations.each do |reservation| - if requested_room == reservation.room_num - return true - end - end - return false - end end end \ No newline at end of file diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 949594d38..9fedcaa59 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -139,16 +139,22 @@ def check_hotel_block_list_availability(hotel_block_id) def reserve_room_hotel_block(hotel_block_id, customer_name, specific_room) raise ArgumentError.new("Not a valid Hotel Block ID!") if !(hotel_block_list.keys.include? hotel_block_id) + + error_status = true + hotel_block_list[hotel_block_id].block_reservations.each do |reservation| # check if the specific room requested in within the hotel block and not booked by another guests - if hotel_block_list[hotel_block_id].check_valid_room(specific_room) && reservation.check_status - #if (reservation.room_num == specific_room) && (reservation.status != :reserved_hotel_block) + #if hotel_block_list[hotel_block_id].check_valid_room(specific_room) && reservation.check_status + if (reservation.check_valid_room(specific_room)) && (reservation.check_status) booking_room = reservation booking_room.customer_name = customer_name booking_room.status = :reserved_hotel_block + error_status = false end end - # raise ArgumentError.new("This is not a reserved room for the hotel block guest!") + if error_status + raise ArgumentError.new("This is not a reserved room for the hotel block guest! Or it is already reserved by another guest!") + end end end end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb index c4cd694db..e4a508848 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -28,13 +28,12 @@ def cost return @cost end - # trial + def check_valid_room(request_room) + return self.room_num == request_room + end + def check_status - if self.status == :open_hotel_block - return true - else - return false - end + return self.status == :open_hotel_block end end end \ No newline at end of file From 0422f727aa5faf875c49886a755f4f9fccac1021 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Sun, 8 Mar 2020 23:54:56 -0700 Subject: [PATCH 11/16] added more tests --- test/hotel_controller_test.rb | 23 +++++++++++++++-------- test/reservation_test.rb | 14 +++++++++++++- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index b34f6148a..024b37cbc 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -14,10 +14,9 @@ expect(@front_desk).must_be_kind_of Hotel::HotelController end - #it "will create an array of rooms according to the number of room provided as an argument" do - # it is creating the room array we want but not able to create test for it - # expect(@front_desk.room_list.length).must_equal 20 - #end + it "will create an array of rooms according to the number of room provided as an argument" do + expect(@front_desk.room_list.length).must_equal 20 + end end describe "reserve_room" do @@ -59,8 +58,10 @@ it "will create a hotel_block, create the correct amount of reservation according to the block" do hotel_block = @front_desk.create_hotel_block(Date.new(2020,06,20), Date.new(2020,06,25), 5) + expect(hotel_block).must_be_kind_of Hotel::BlockReservation expect(@front_desk.reservations(Date.new(2020,06,20)).length).must_equal 5 + expect{@front_desk.create_hotel_block(Date.new(2020,06,20), Date.new(2020,06,25), 10)}.must_raise ArgumentError end end @@ -76,10 +77,16 @@ describe "reserve_room_hotel_block(hotel_block_id, customer_name, specific_room)" do it "will reserve room within the hotel block" do - - - #expect{@front_desk.reserve_room_hotel_block(1, "Hello Kitty", 1)}.must_raise ArgumentError - end + @front_desk.create_hotel_block(Date.new(2020,06,20), Date.new(2020,06,25), 5) + @front_desk.create_hotel_block(Date.new(2020,06,20), Date.new(2020,06,25), 4) + + @front_desk.reserve_room_hotel_block(1, "Lily", "Room 1") + + expect(@front_desk.get_list_of_reservations("Room 1",Date.new(2020,06,20), Date.new(2020,06,25))[0].status).must_equal :reserved_hotel_block + expect(@front_desk.get_list_of_reservations("Room 1",Date.new(2020,06,20), Date.new(2020,06,25))[0].customer_name).must_equal "Lily" + expect{@front_desk.reserve_room_hotel_block(1, "Peter", "Room 1")}.must_raise ArgumentError + expect{@front_desk.reserve_room_hotel_block(5, "Hello Kitty", 1)}.must_raise ArgumentError + end end end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index fc981d7c6..ae6c14218 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -18,6 +18,18 @@ expect(@new_reservation.cost).must_equal 600 end end - + + describe "check_valid_room(request_room)" do + it "will return true if the request room matches with the room the reservation itself" do + expect(@new_reservation.check_valid_room("Room 1")).must_equal true + expect(@new_reservation.check_valid_room("Room 10")).must_equal false + end + end + + describe "check_status" do + it "will return false is the status of the reservation is not equal to :open_hotel_block" do + expect(@new_reservation.check_status).must_equal false + end + end end \ No newline at end of file From b37498130ece8388c34d6670e2b4e089e9306c46 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Mon, 9 Mar 2020 00:04:13 -0700 Subject: [PATCH 12/16] adding more on refactors.text --- refactors.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/refactors.txt b/refactors.txt index e69de29bb..35da3a384 100644 --- a/refactors.txt +++ b/refactors.txt @@ -0,0 +1,5 @@ +To refactor: +- I think some of my methods are too complicated and too much dependency within methods. + I would love to spend some time to clean that up +- try to follow the single responsibility +- Dry it up! \ No newline at end of file From 8273f9a3302425dd3a29a2a4aa36503c6784e859 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Mon, 9 Mar 2020 00:12:08 -0700 Subject: [PATCH 13/16] more on refactors.txt --- refactors.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/refactors.txt b/refactors.txt index 35da3a384..a6e5a9172 100644 --- a/refactors.txt +++ b/refactors.txt @@ -2,4 +2,6 @@ To refactor: - I think some of my methods are too complicated and too much dependency within methods. I would love to spend some time to clean that up - try to follow the single responsibility -- Dry it up! \ No newline at end of file +- Dry it up! +- would like to add more stuff in each class so it would be small methods +- maybe I should have a room class? \ No newline at end of file From 8221746fa3201ab578e5dcc2bfc8bbe2ae5c8f18 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Mon, 9 Mar 2020 00:13:49 -0700 Subject: [PATCH 14/16] added comments --- lib/hotel_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 9fedcaa59..6229b6799 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -1,5 +1,5 @@ require 'date' - + require_relative 'reservation' require_relative 'date_range' require_relative 'hotel_block' @@ -16,6 +16,7 @@ def initialize(number_of_room = 20) @room_list = Array.new @hotel_block_list = Hash.new + # added flexibilty to the number of room to have in the future n = 1 number_of_room.times do @room_list << "Room #{n}" @@ -24,6 +25,7 @@ def initialize(number_of_room = 20) end + # to get the list of rooms in the hotel def get_room_list return @room_list end From 8d109571fc2bc1c649f9fae9ca4e0ada3ff3b62d Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Mon, 9 Mar 2020 00:16:26 -0700 Subject: [PATCH 15/16] more comments added --- lib/hotel_controller.rb | 2 +- lib/reservation.rb | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 6229b6799..2b14994a3 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -120,7 +120,7 @@ def create_hotel_block(start_date, end_date, number_of_rooms) end # check if a given block has any rooms available - # if there is available room - will return the rooms that are open + # if there is available room - will return the list of rooms that are open # else will raise argument def check_hotel_block_list_availability(hotel_block_id) diff --git a/lib/reservation.rb b/lib/reservation.rb index e4a508848..3c4560f94 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -28,10 +28,12 @@ def cost return @cost end + # for hotel blocks - to check if request room is within the block def check_valid_room(request_room) return self.room_num == request_room end + # for hotel blocks - to make sure it is still open for hotel block guests def check_status return self.status == :open_hotel_block end From 2890ecafdbb434b0d5dc32e962b3988069fc1c17 Mon Sep 17 00:00:00 2001 From: Sharon Cheung Date: Mon, 9 Mar 2020 00:18:28 -0700 Subject: [PATCH 16/16] cleaning up codes --- test/hotel_controller_test.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 024b37cbc..59cc20540 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -77,11 +77,14 @@ describe "reserve_room_hotel_block(hotel_block_id, customer_name, specific_room)" do it "will reserve room within the hotel block" do + + # Arrange & Act @front_desk.create_hotel_block(Date.new(2020,06,20), Date.new(2020,06,25), 5) @front_desk.create_hotel_block(Date.new(2020,06,20), Date.new(2020,06,25), 4) @front_desk.reserve_room_hotel_block(1, "Lily", "Room 1") + # Assert expect(@front_desk.get_list_of_reservations("Room 1",Date.new(2020,06,20), Date.new(2020,06,25))[0].status).must_equal :reserved_hotel_block expect(@front_desk.get_list_of_reservations("Room 1",Date.new(2020,06,20), Date.new(2020,06,25))[0].customer_name).must_equal "Lily" expect{@front_desk.reserve_room_hotel_block(1, "Peter", "Room 1")}.must_raise ArgumentError