From d507ad31080199831b7e573de25de50e2311a1ef Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Mon, 2 Mar 2020 15:39:32 -0800 Subject: [PATCH 1/9] initial scaffolding + tests passing --- .gitignore | 8 ++++++++ lib/date_range.rb | 19 +++++++++++++++++++ lib/reservation.rb | 21 +++++++++++++++++++++ lib/reservation_manager.rb | 29 +++++++++++++++++++++++++++++ lib/room.rb | 0 test/date_range_test.rb | 28 ++++++++++++++++++++++++++++ test/reservation_manager_test.rb | 28 ++++++++++++++++++++++++++++ test/reservation_test.rb | 16 ++++++++++++++++ test/room_test.rb | 0 test/test_helper.rb | 11 ++++++++++- 10 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 lib/date_range.rb create mode 100644 lib/reservation.rb create mode 100644 lib/reservation_manager.rb create mode 100644 lib/room.rb create mode 100644 test/date_range_test.rb create mode 100644 test/reservation_manager_test.rb create mode 100644 test/reservation_test.rb create mode 100644 test/room_test.rb diff --git a/.gitignore b/.gitignore index 5e1422c9c..dfe0e1613 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,11 @@ build-iPhoneSimulator/ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: .rvmrc + +#simplecov + +coverage + +#system + +.DS_store diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..6bd410136 --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,19 @@ +require 'date' + +module Hotel + class DateRange + attr_reader :check_in, :check_out, :nights_spent + + def initialize(check_in, check_out) + @check_in = check_in + @check_out = check_out + @nights_spent = (@check_out - @check_in) + end + + def to_id + return (@check_in.year.to_s + @check_in.mon.to_s + @check_in.mday.to_s) + end + + + end +end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..e975759b1 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,21 @@ +require 'date' + +require_relative 'date_range' +require_relative 'room' + +module Hotel + class Reservation + attr_reader :reservation_id, :dates, :occupancy + + def initialize(type, dates, occupancy) + @reservation_id = type[0] + dates.to_id + occupancy[:room_id] + @dates = dates + @occupancy = occupancy + end + + def total_price + return @dates.duration * @occupancy[room.price] + end + + end +end diff --git a/lib/reservation_manager.rb b/lib/reservation_manager.rb new file mode 100644 index 000000000..27f30c755 --- /dev/null +++ b/lib/reservation_manager.rb @@ -0,0 +1,29 @@ +require 'time' + +require_relative 'room' +require_relative 'reservation' + +module Hotel + class ReservationManager + attr_reader :rooms, :reservations + + def initialize(room_count) + @rooms = generate_rooms(room_count) + @reservations = nil + end + + def new_reservation(dates) + end + + + private + + def generate_rooms(room_count) + rooms = [] + room_count.times do |num| + rooms << {:room_id => (num+1).to_s} + end + return rooms + end + end +end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..e69de29bb diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100644 index 000000000..0b7de35a6 --- /dev/null +++ b/test/date_range_test.rb @@ -0,0 +1,28 @@ +require_relative 'test_helper' + +describe "DateRange class" do + describe "initialize" do + + before do + check_in = Date.parse('2020-08-01') + check_out = Date.parse('2020-08-04') + + @dates = Hotel::DateRange.new(check_in, check_out) + end + + it "creates an instance of DateRange" do + expect(@dates).must_be_kind_of Hotel::DateRange + end + + it "returns accurate count of nights spent" do + expect(@dates.nights_spent).must_equal 3 + end + + it "returns accurate start Date" do + expect(@dates.check_in).must_be_kind_of Date + + end + + end + +end \ No newline at end of file diff --git a/test/reservation_manager_test.rb b/test/reservation_manager_test.rb new file mode 100644 index 000000000..5ff725594 --- /dev/null +++ b/test/reservation_manager_test.rb @@ -0,0 +1,28 @@ +require_relative 'test_helper' + +describe "ReservationManager class" do + + describe "Initializer" do + + before do + @reservation_manager = Hotel::ReservationManager.new(20) + end + + it "is an instance of ReservationManager" do + expect(@reservation_manager).must_be_kind_of Hotel::ReservationManager + end + + it "initializes correct number of rooms" do + expect(@reservation_manager.rooms.length).must_equal 20 + end + + it "assigns an id to each room" do + expect(@reservation_manager.rooms[1][:room_id]).must_be_kind_of String + end + + it "initializes with zero reservations" do + assert_nil(@reservation_manager.reservations) + end + + end +end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..0bac53a13 --- /dev/null +++ b/test/reservation_test.rb @@ -0,0 +1,16 @@ +require_relative 'test_helper' + +describe "Reservation class" do + describe "initializer" do + before do + @date = Hotel::DateRange.new(Date.new, Date.new + 2) + @occupancy = {room_id: "1", guest: "Picchu"} + @reservation = Hotel::Reservation.new("single", @date, @occupancy) + end + + it "is an instance of Reservation object" do + expect(@reservation).must_be_kind_of Hotel::Reservation + end + end + +end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb new file mode 100644 index 000000000..e69de29bb diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..1010d7f14 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,4 +1,8 @@ -# Add simplecov +require 'simplecov' +SimpleCov.start do + add_filter 'test/' # Tests should not be checked for coverage. +end + require "minitest" require "minitest/autorun" require "minitest/reporters" @@ -6,3 +10,8 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # require_relative your lib files here! +require_relative "../lib/reservation_manager.rb" +require_relative "../lib/room.rb" +require_relative "../lib/reservation.rb" +require_relative "../lib/date_range.rb" + From cd99558fb339c3f6cb830d2a4ea6c64ec42c848d Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Tue, 3 Mar 2020 13:58:52 -0800 Subject: [PATCH 2/9] basic class structure complete, all tests passing --- lib/reservation.rb | 4 ++-- lib/reservation_manager.rb | 9 +++++---- lib/room.rb | 18 ++++++++++++++++++ test/reservation_manager_test.rb | 25 ++++++++++++++++++++++--- test/reservation_test.rb | 19 ++++++++++--------- test/room_test.rb | 15 +++++++++++++++ 6 files changed, 72 insertions(+), 18 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index e975759b1..04ce6e40b 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -8,13 +8,13 @@ class Reservation attr_reader :reservation_id, :dates, :occupancy def initialize(type, dates, occupancy) - @reservation_id = type[0] + dates.to_id + occupancy[:room_id] + @reservation_id = type[0] + dates.to_id + occupancy[:room].id @dates = dates @occupancy = occupancy end def total_price - return @dates.duration * @occupancy[room.price] + return @dates.nights_spent * @occupancy[:room].price end end diff --git a/lib/reservation_manager.rb b/lib/reservation_manager.rb index 27f30c755..fc7931836 100644 --- a/lib/reservation_manager.rb +++ b/lib/reservation_manager.rb @@ -9,19 +9,20 @@ class ReservationManager def initialize(room_count) @rooms = generate_rooms(room_count) - @reservations = nil + @reservations = [] end - def new_reservation(dates) + def create_reservation(type, range, guest) + range = DateRange.new(Date.new, Date.new+2) + @reservations << Reservation.new("single", range, [{:room => @rooms.sample, :guest => guest}]) end - private def generate_rooms(room_count) rooms = [] room_count.times do |num| - rooms << {:room_id => (num+1).to_s} + rooms << Room.new(num+1) end return rooms end diff --git a/lib/room.rb b/lib/room.rb index e69de29bb..e80fef55d 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -0,0 +1,18 @@ +require_relative 'reservation' + +module Hotel + class Room + attr_reader :id, :reservations, :price, :type + + def initialize(id) + @id = id.to_s + @reservations = [] + @price = 200 + @type = "standard" + end + + # TO-DO: add inspect to display all reservations + + end + +end \ No newline at end of file diff --git a/test/reservation_manager_test.rb b/test/reservation_manager_test.rb index 5ff725594..e4b87e7de 100644 --- a/test/reservation_manager_test.rb +++ b/test/reservation_manager_test.rb @@ -16,13 +16,32 @@ expect(@reservation_manager.rooms.length).must_equal 20 end - it "assigns an id to each room" do - expect(@reservation_manager.rooms[1][:room_id]).must_be_kind_of String + it "populates valid room objects" do + expect(@reservation_manager.rooms[1]).must_be_kind_of Hotel::Room end it "initializes with zero reservations" do - assert_nil(@reservation_manager.reservations) + expect(@reservation_manager.reservations.length).must_equal 0 + end + + it "manages a hotel with 0 rooms" do + reservation_manager = Hotel::ReservationManager.new(0) + expect(reservation_manager.rooms.length).must_equal 0 + end end + + describe "create reservation" do + before do + @date = Hotel::DateRange.new(Date.new, Date.new + 2) + @occupancy = {:room => Hotel::Room.new(12), :guest => "Picchu"} + @reservation = Hotel::Reservation.new("single", @date, @occupancy) + end + + it "creates an instance of Reservation object" do + expect(@reservation).must_be_kind_of Hotel::Reservation + end + + end end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 0bac53a13..998ece83b 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,16 +1,17 @@ require_relative 'test_helper' describe "Reservation class" do + before do + @date = Hotel::DateRange.new(Date.new, Date.new + 2) + @occupancy = {:room => Hotel::Room.new(12), :guest => "Picchu"} + @reservation = Hotel::Reservation.new("single", @date, @occupancy) + end describe "initializer" do - before do - @date = Hotel::DateRange.new(Date.new, Date.new + 2) - @occupancy = {room_id: "1", guest: "Picchu"} - @reservation = Hotel::Reservation.new("single", @date, @occupancy) - end - - it "is an instance of Reservation object" do - expect(@reservation).must_be_kind_of Hotel::Reservation - end + end + + it "calculates total price" do + expect(@reservation.total_price).must_equal (400) + end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index e69de29bb..058cfb38a 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -0,0 +1,15 @@ +require_relative 'test_helper' + +describe "Room class" do + before do + @room = Hotel::Room.new(1) + end + + describe "initialize" do + it "creates a valid room object" do + expect(@room).must_be_kind_of Hotel::Room + end + + end + +end \ No newline at end of file From 22af1d2e64c523ab084d68cc04f64f5297cf731f Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 4 Mar 2020 17:24:55 -0800 Subject: [PATCH 3/9] Added .collide? method to test for date overlaps --- lib/date_range.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/date_range.rb b/lib/date_range.rb index 6bd410136..1550a7883 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -14,6 +14,9 @@ def to_id return (@check_in.year.to_s + @check_in.mon.to_s + @check_in.mday.to_s) end + def collide? (other_check_in, other_check_out) + return ((@check_in..@check_out).cover? (other_check_in)) || ((@check_in-1...@check_out).cover? (other_check_out)) + end end end \ No newline at end of file From b70128d770c80daf1255422308b5f1ce126d725c Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 4 Mar 2020 17:26:24 -0800 Subject: [PATCH 4/9] rooms no longer track reservations --- lib/room.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/room.rb b/lib/room.rb index e80fef55d..b508fd008 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -2,17 +2,13 @@ module Hotel class Room - attr_reader :id, :reservations, :price, :type + attr_reader :id, :price, :type def initialize(id) @id = id.to_s - @reservations = [] @price = 200 @type = "standard" end - - # TO-DO: add inspect to display all reservations - end end \ No newline at end of file From af700ad1aa54807022bba75ca95bcc948317054a Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 4 Mar 2020 17:27:58 -0800 Subject: [PATCH 5/9] reservation objects now accept multiple rooms (blocks). includes testing. --- lib/reservation.rb | 9 ++++++--- test/reservation_test.rb | 27 ++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 04ce6e40b..a48b65087 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -5,16 +5,19 @@ module Hotel class Reservation - attr_reader :reservation_id, :dates, :occupancy + attr_reader :id, :dates, :occupancy def initialize(type, dates, occupancy) - @reservation_id = type[0] + dates.to_id + occupancy[:room].id + @id = type[0] + dates.to_id @dates = dates @occupancy = occupancy end def total_price - return @dates.nights_spent * @occupancy[:room].price + # if @occupancy.length > 1 #block + return @occupancy.sum { |occupancy| occupancy[:room].price * @dates.nights_spent } + # end + # return @dates.nights_spent * @occupancy[0][:room].price end end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 998ece83b..73d2664d8 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -3,15 +3,32 @@ describe "Reservation class" do before do @date = Hotel::DateRange.new(Date.new, Date.new + 2) - @occupancy = {:room => Hotel::Room.new(12), :guest => "Picchu"} - @reservation = Hotel::Reservation.new("single", @date, @occupancy) + @occupancy = [{:room => Hotel::Room.new(12), :guest => "Picchu"}] + @reservation = Hotel::Reservation.new(:SINGLE, @date, @occupancy) end + describe "initializer" do + + it "creates a valid Reservation" do + expect(@reservation.id).must_be_kind_of String + expect(@reservation.dates).must_be_kind_of Hotel::DateRange + end end - it "calculates total price" do - expect(@reservation.total_price).must_equal (400) - end + describe "total_price" do + + it "calculates total price on single room" do + expect(@reservation.total_price).must_equal (400) + end + + it "calculates total price of a block" do + occupancy = [{:room => Hotel::Room.new(12), :guest => "Picchu"},{:room => Hotel::Room.new(14), :guest => "Elvy"}] + reservation = Hotel::Reservation.new(:BLOCK, @date, occupancy) + + expect(reservation.total_price).must_equal (800) + end + + end end \ No newline at end of file From 1b95126076b87ea3c0eed069dfe396242f471a6a Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Wed, 4 Mar 2020 17:28:45 -0800 Subject: [PATCH 6/9] reservation_manager now finds reservations by date. includes tests. --- lib/reservation_manager.rb | 14 +++++++++++-- test/reservation_manager_test.rb | 34 ++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/lib/reservation_manager.rb b/lib/reservation_manager.rb index fc7931836..b023b2a3f 100644 --- a/lib/reservation_manager.rb +++ b/lib/reservation_manager.rb @@ -13,8 +13,18 @@ def initialize(room_count) end def create_reservation(type, range, guest) - range = DateRange.new(Date.new, Date.new+2) - @reservations << Reservation.new("single", range, [{:room => @rooms.sample, :guest => guest}]) + raise ArgumentError.new("Invalid reservation type (given #{type}, must be :SINGLE or :BLOCK)") unless + type == :SINGLE || type == :BLOCK + + occupancy = [{:room => @rooms.sample, :guest => guest}] + + new_reservation = Reservation.new(type, range, occupancy) + @reservations << new_reservation + return new_reservation + end + + def find_reservations_by_date(date) + by_date = @reservations.select { |reservation| reservation.dates.collide?(date,date)} end private diff --git a/test/reservation_manager_test.rb b/test/reservation_manager_test.rb index e4b87e7de..7d542e010 100644 --- a/test/reservation_manager_test.rb +++ b/test/reservation_manager_test.rb @@ -1,13 +1,11 @@ require_relative 'test_helper' describe "ReservationManager class" do + before do + @reservation_manager = Hotel::ReservationManager.new(20) + end describe "Initializer" do - - before do - @reservation_manager = Hotel::ReservationManager.new(20) - end - it "is an instance of ReservationManager" do expect(@reservation_manager).must_be_kind_of Hotel::ReservationManager end @@ -29,19 +27,39 @@ expect(reservation_manager.rooms.length).must_equal 0 end - end describe "create reservation" do before do + @room = Hotel::Room.new(100) + @occupancy = [{:room => @room, :guest => "Picchu"}] @date = Hotel::DateRange.new(Date.new, Date.new + 2) - @occupancy = {:room => Hotel::Room.new(12), :guest => "Picchu"} - @reservation = Hotel::Reservation.new("single", @date, @occupancy) + @reservation = @reservation_manager.create_reservation(:SINGLE, @date, @occupancy) end it "creates an instance of Reservation object" do expect(@reservation).must_be_kind_of Hotel::Reservation end + it "creates valid objects inside of a Reservation" do + expect(@reservation.occupancy).must_be_kind_of Array + end + + end + + describe "find_reservations_by_date" do + before do + room = Hotel::Room.new(200) + occupancy = [{:room => @room, :guest => "Elvy"}] + date = Hotel::DateRange.new(Date.new, Date.new + 2) + @reservation_manager.create_reservation(:SINGLE, date, occupancy) + end + + it "finds all reservations for a date" do + results = @reservation_manager.find_reservations_by_date(Date.new) + expect(results).must_be_kind_of Array + expect(results[0]).must_be_kind_of Hotel::Reservation + expect(results[0].occupancy[0][:room].id).must_be_kind_of String + end end end \ No newline at end of file From 7ec02e2024b4341e08439403449e103ecf94133e Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Sun, 8 Mar 2020 17:26:42 -0700 Subject: [PATCH 7/9] spacing cleanup and additional commenting --- lib/reservation.rb | 3 --- lib/reservation_manager.rb | 19 +++++++++++++++++-- lib/room.rb | 2 -- test/reservation_manager_test.rb | 15 +++++++++++++-- test/room_test.rb | 9 +++++++++ 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index a48b65087..39341e03f 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -14,10 +14,7 @@ def initialize(type, dates, occupancy) end def total_price - # if @occupancy.length > 1 #block return @occupancy.sum { |occupancy| occupancy[:room].price * @dates.nights_spent } - # end - # return @dates.nights_spent * @occupancy[0][:room].price end end diff --git a/lib/reservation_manager.rb b/lib/reservation_manager.rb index b023b2a3f..d55b1d560 100644 --- a/lib/reservation_manager.rb +++ b/lib/reservation_manager.rb @@ -12,21 +12,36 @@ def initialize(room_count) @reservations = [] end - def create_reservation(type, range, guest) + # Parameters: + # -type: symbol (:SINGLE, :BLOCK) that indicates type of reservation + # -range: DateRange object + # -occupancy: Hash or String + # Returns: Reservation object and also adds it to the grand list of reservations + def create_reservation(type, range, occupancy) raise ArgumentError.new("Invalid reservation type (given #{type}, must be :SINGLE or :BLOCK)") unless type == :SINGLE || type == :BLOCK - occupancy = [{:room => @rooms.sample, :guest => guest}] + occupancy = [{:room => @rooms.sample, :guest => occupancy}] if occupancy.class == String new_reservation = Reservation.new(type, range, occupancy) @reservations << new_reservation return new_reservation end + # Parameters: Date object + # Returns: an Array of all Reservation instances that contain that date def find_reservations_by_date(date) by_date = @reservations.select { |reservation| reservation.dates.collide?(date,date)} end + def find_reservations_by_room(room) + #TO DO + end + + def find_all_available + # TO-DO return all available rooms for a given date range + end + private def generate_rooms(room_count) diff --git a/lib/room.rb b/lib/room.rb index b508fd008..4f3771ae1 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,5 +1,3 @@ -require_relative 'reservation' - module Hotel class Room attr_reader :id, :price, :type diff --git a/test/reservation_manager_test.rb b/test/reservation_manager_test.rb index 7d542e010..04c5c3df5 100644 --- a/test/reservation_manager_test.rb +++ b/test/reservation_manager_test.rb @@ -50,16 +50,27 @@ describe "find_reservations_by_date" do before do room = Hotel::Room.new(200) - occupancy = [{:room => @room, :guest => "Elvy"}] + occupancy = [{:room => room, :guest => "Elvy"}] date = Hotel::DateRange.new(Date.new, Date.new + 2) @reservation_manager.create_reservation(:SINGLE, date, occupancy) + @reservation_manager.create_reservation(:SINGLE,date, [{:room => Hotel::Room.new(100), :guest => "Picchu"}] ) + end + + it "has accurate number of reservations" do + expect(@reservation_manager.reservations.length).must_equal 2 end it "finds all reservations for a date" do results = @reservation_manager.find_reservations_by_date(Date.new) expect(results).must_be_kind_of Array + expect(results.length).must_equal 2 expect(results[0]).must_be_kind_of Hotel::Reservation - expect(results[0].occupancy[0][:room].id).must_be_kind_of String + expect(results[0].occupancy).must_be_kind_of Array + expect(results[0].occupancy[0]).must_be_kind_of Hash + expect(results[0].occupancy[0][:room]).must_be_kind_of Hotel::Room + expect(results[0].occupancy[0][:room].id).must_equal "200" + expect(results[0].occupancy[0][:guest]).must_equal "Elvy" + end end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 058cfb38a..ced612872 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -9,7 +9,16 @@ it "creates a valid room object" do expect(@room).must_be_kind_of Hotel::Room end + end + + describe "Room methods" do + it "sets price to 200" do + expect(@room.price).must_equal 200 + end + it "gives room a default type" do + expect(@room.type).must_equal "standard" + end end end \ No newline at end of file From 1f4b4fcea931cc91be3cf884a427643ac73f4ba8 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Mon, 9 Mar 2020 00:07:02 -0700 Subject: [PATCH 8/9] added date range validation --- lib/date_range.rb | 3 ++- test/date_range_test.rb | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 1550a7883..0c8d292e0 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -5,6 +5,7 @@ class DateRange attr_reader :check_in, :check_out, :nights_spent def initialize(check_in, check_out) + raise ArgumentError, 'Invalid date range given.' unless check_out > check_in @check_in = check_in @check_out = check_out @nights_spent = (@check_out - @check_in) @@ -14,7 +15,7 @@ def to_id return (@check_in.year.to_s + @check_in.mon.to_s + @check_in.mday.to_s) end - def collide? (other_check_in, other_check_out) + def overlap? (other_check_in, other_check_out) return ((@check_in..@check_out).cover? (other_check_in)) || ((@check_in-1...@check_out).cover? (other_check_out)) end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 0b7de35a6..50c650704 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -4,23 +4,23 @@ describe "initialize" do before do - check_in = Date.parse('2020-08-01') - check_out = Date.parse('2020-08-04') - - @dates = Hotel::DateRange.new(check_in, check_out) + @dates = Hotel::DateRange.new(Date.new, Date.new + 2) end it "creates an instance of DateRange" do expect(@dates).must_be_kind_of Hotel::DateRange end + it "raises an error for invalid dates" do + expect{(Hotel::DateRange.new(Date.new+2, Date.new))}.must_raise ArgumentError + end + it "returns accurate count of nights spent" do - expect(@dates.nights_spent).must_equal 3 + expect(@dates.nights_spent).must_equal 2 end it "returns accurate start Date" do expect(@dates.check_in).must_be_kind_of Date - end end From 4b12b6061f2a076c401ff49aeedb0f71fb206001 Mon Sep 17 00:00:00 2001 From: Angela Nguyen Date: Mon, 9 Mar 2020 00:07:35 -0700 Subject: [PATCH 9/9] added ability to find available rooms given a date range --- lib/reservation_manager.rb | 24 +++++++++---- test/reservation_manager_test.rb | 60 ++++++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/lib/reservation_manager.rb b/lib/reservation_manager.rb index d55b1d560..8b38b929c 100644 --- a/lib/reservation_manager.rb +++ b/lib/reservation_manager.rb @@ -16,7 +16,7 @@ def initialize(room_count) # -type: symbol (:SINGLE, :BLOCK) that indicates type of reservation # -range: DateRange object # -occupancy: Hash or String - # Returns: Reservation object and also adds it to the grand list of reservations + # Returns: newly created Reservation object def create_reservation(type, range, occupancy) raise ArgumentError.new("Invalid reservation type (given #{type}, must be :SINGLE or :BLOCK)") unless type == :SINGLE || type == :BLOCK @@ -30,16 +30,27 @@ def create_reservation(type, range, occupancy) # Parameters: Date object # Returns: an Array of all Reservation instances that contain that date - def find_reservations_by_date(date) - by_date = @reservations.select { |reservation| reservation.dates.collide?(date,date)} + def find_reservations_by_date(check_in, check_out) + by_date = @reservations.select { |reservation| reservation.dates.overlap?(check_in, check_out)} end def find_reservations_by_room(room) - #TO DO + by_room = @reservations.select { |reservation| reservation.occupancy.detect { |occupancy| occupancy[:room] == room }} end - def find_all_available - # TO-DO return all available rooms for a given date range + def list_all_available(check_in, check_out) + reserved = find_reservations_by_date(check_in, check_out) + + if reserved.length > 0 + occupancies = reserved.map { |reservation| reservation.occupancy } + occupied_rooms = occupancies.flatten + occupied_rooms_ids = occupied_rooms.map { |occupancy| occupancy[:room].id } + end + + rooms = @rooms.map { |room| room.id } + + return (rooms - occupied_rooms_ids) + end private @@ -51,5 +62,6 @@ def generate_rooms(room_count) end return rooms end + end end \ No newline at end of file diff --git a/test/reservation_manager_test.rb b/test/reservation_manager_test.rb index 04c5c3df5..298fc95cc 100644 --- a/test/reservation_manager_test.rb +++ b/test/reservation_manager_test.rb @@ -49,11 +49,9 @@ describe "find_reservations_by_date" do before do - room = Hotel::Room.new(200) - occupancy = [{:room => room, :guest => "Elvy"}] date = Hotel::DateRange.new(Date.new, Date.new + 2) - @reservation_manager.create_reservation(:SINGLE, date, occupancy) - @reservation_manager.create_reservation(:SINGLE,date, [{:room => Hotel::Room.new(100), :guest => "Picchu"}] ) + @reservation_manager.create_reservation(:SINGLE, date, [{:room => Hotel::Room.new(100), :guest => "Elvy"}]) + @reservation_manager.create_reservation(:SINGLE, date, [{:room => Hotel::Room.new(200), :guest => "Picchu"}] ) end it "has accurate number of reservations" do @@ -61,16 +59,64 @@ end it "finds all reservations for a date" do - results = @reservation_manager.find_reservations_by_date(Date.new) + results = @reservation_manager.find_reservations_by_date(Date.new, Date.new + 3) expect(results).must_be_kind_of Array expect(results.length).must_equal 2 expect(results[0]).must_be_kind_of Hotel::Reservation expect(results[0].occupancy).must_be_kind_of Array expect(results[0].occupancy[0]).must_be_kind_of Hash expect(results[0].occupancy[0][:room]).must_be_kind_of Hotel::Room - expect(results[0].occupancy[0][:room].id).must_equal "200" + expect(results[0].occupancy[0][:room].id).must_equal "100" expect(results[0].occupancy[0][:guest]).must_equal "Elvy" end end -end \ No newline at end of file + + describe "find_by_room" do + before do + @room = Hotel::Room.new(100) + @reservation_manager.create_reservation( + :SINGLE, + Hotel::DateRange.new(Date.new + 5, Date.new + 10), + [{:room => @room, :guest => "Picchu"}] + ) + @reservation_manager.create_reservation( + :SINGLE, + Hotel::DateRange.new(Date.new + 11, Date.new + 15), + [{:room => @room, :guest => "Elvy"}] + ) + @reservation_manager.create_reservation( + :SINGLE, + Hotel::DateRange.new(Date.new + 16, Date.new + 18), + [{:room => @room, :guest => "Tater Tot"}] + ) + @reservation_manager.create_reservation( + :BLOCK, + Hotel::DateRange.new(Date.new + 19, Date.new + 23), + [{:room => Hotel::Room.new(300), :guest => "Peaches"},{:room => @room, :guest => "Tater Tot"},{:room => Hotel::Room.new(200), :guest => "Finn"}] + ) + end + + it "finds all reservations for a given room" do + results = @reservation_manager.find_reservations_by_room(@room) + expect(results).must_be_kind_of Array + expect(results.length).must_equal 4 + expect(results.all? {|result| result.class == Hotel::Reservation}).must_equal true + end + end + + describe "list_all_available" do + before do + date = Hotel::DateRange.new(Date.new, Date.new + 2) + @reservation_manager.create_reservation(:SINGLE, date, [{:room => @reservation_manager.rooms[0], :guest => "Elvy"}]) + @reservation_manager.create_reservation(:SINGLE, date, [{:room => @reservation_manager.rooms[1], :guest => "Picchu"}] ) + @reservation_manager.create_reservation(:SINGLE, date, [{:room => @reservation_manager.rooms[2], :guest => "Brom"}] ) + end + + it "returns list of available rooms for a given date range" do + results = @reservation_manager.list_all_available(Date.new, Date.new + 2) + expect(results.length).must_equal 17 + end + + end +end