From 3e6c1ab743efe22d702b8e58c1d00c3371bc9f5e Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Mon, 5 Mar 2018 13:41:53 -0800 Subject: [PATCH 01/18] Skeleton BookingSystem --- lib/administrator.rb | 0 lib/reservation.rb | 0 lib/room.rb | 0 specs/administrator_spec.rb | 1 + specs/reservation_spec.rb | 1 + specs/room_spec.rb | 1 + specs/spec_helper.rb | 15 +++++++++++++++ 7 files changed, 18 insertions(+) create mode 100644 lib/administrator.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 specs/administrator_spec.rb create mode 100644 specs/reservation_spec.rb create mode 100644 specs/room_spec.rb create mode 100644 specs/spec_helper.rb diff --git a/lib/administrator.rb b/lib/administrator.rb new file mode 100644 index 000000000..e69de29bb 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/specs/administrator_spec.rb b/specs/administrator_spec.rb new file mode 100644 index 000000000..ae9c220ea --- /dev/null +++ b/specs/administrator_spec.rb @@ -0,0 +1 @@ +require_relative 'spec_helper' diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb new file mode 100644 index 000000000..ae9c220ea --- /dev/null +++ b/specs/reservation_spec.rb @@ -0,0 +1 @@ +require_relative 'spec_helper' diff --git a/specs/room_spec.rb b/specs/room_spec.rb new file mode 100644 index 000000000..ae9c220ea --- /dev/null +++ b/specs/room_spec.rb @@ -0,0 +1 @@ +require_relative 'spec_helper' diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb new file mode 100644 index 000000000..24c6b7c5e --- /dev/null +++ b/specs/spec_helper.rb @@ -0,0 +1,15 @@ +require 'date' +require "simplecov" +SimpleCov.start + +require 'minitest' +require 'minitest/autorun' +require 'minitest/reporters' +# Add simplecov + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + +# Require_relative your lib files here! +require_relative '../lib/administrator' +require_relative '../lib/reservation' +require_relative '../lib/room' From c1b83e87411b0bcb830ead59d06cf7eb0bccef24 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Mon, 5 Mar 2018 14:31:49 -0800 Subject: [PATCH 02/18] Test and code for Room class, all tests passing. --- lib/room.rb | 10 ++++++++++ specs/room_spec.rb | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lib/room.rb b/lib/room.rb index e69de29bb..b66d30fc2 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -0,0 +1,10 @@ +module BookingSystem + class Room + attr_reader :number, :cost + + def initialize number, cost + @number = number + @cost = cost + end + end +end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index ae9c220ea..10aa5c375 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -1 +1,20 @@ require_relative 'spec_helper' + +describe "Room class" do + number = 1 + cost = 200 + let(:room) {BookingSystem::Room.new(number, cost)} + + describe "#initialize" do + it "is an instance of Room" do + room.must_be_kind_of BookingSystem::Room + end + it "is set up for specific attributes and data types" do + [:number, :cost].each{|prop| room.must_respond_to prop} + + room.number.must_be_kind_of Integer + room.cost.must_be_kind_of Integer + end + +end +end From 409cf50cfd51e1fa23aaac9fded2a7466f55c596 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Mon, 5 Mar 2018 16:50:31 -0800 Subject: [PATCH 03/18] Test and code for Reservation class, all tests passing. --- lib/invalid_duration_error.rb | 2 ++ lib/reservation.rb | 26 ++++++++++++++++++++ specs/reservation_spec.rb | 46 +++++++++++++++++++++++++++++++++++ specs/spec_helper.rb | 1 + 4 files changed, 75 insertions(+) create mode 100644 lib/invalid_duration_error.rb diff --git a/lib/invalid_duration_error.rb b/lib/invalid_duration_error.rb new file mode 100644 index 000000000..d0da3c8e5 --- /dev/null +++ b/lib/invalid_duration_error.rb @@ -0,0 +1,2 @@ +class InvalidDurationError < StandardError +end diff --git a/lib/reservation.rb b/lib/reservation.rb index e69de29bb..3ed4d2323 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -0,0 +1,26 @@ +require 'date' +require_relative 'invalid_duration_error' + +module BookingSystem + class Reservation + attr_reader :id, :check_in, :check_out, :room + + def initialize(input) + @id = input[:id] + @check_in = input[:check_in] + @check_out = input[:check_out] + @room = input[:room] + raise InvalidDurationError.new("Check out time can not be before check in time") if booking_duration < 0 + end +# @check_out != nil && + def booking_duration + # return nil if @check_out == nil + return (@check_out - @check_in).to_i + end + + def total_cost + return booking_duration * @room.cost + end + + end +end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index ae9c220ea..db1745509 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -1 +1,47 @@ require_relative 'spec_helper' + +describe "Reservation class" do + reservation_data = { + id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-27"), room: BookingSystem::Room.new(1, 200)} + + let(:reservation) {BookingSystem::Reservation.new(reservation_data)} + + describe "#initialize" do + it "raises an InvalidDurationError if Check out time is before check in time" do + proc { BookingSystem::Reservation.new({id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-15"), room: BookingSystem::Room.new(1, 200)}) + }.must_raise InvalidDurationError + end + + it "is an instance of Reservation" do + reservation.must_be_kind_of BookingSystem::Reservation + end + + it "stores an instance of room" do + reservation.room.must_be_kind_of BookingSystem::Room + end + + it "is set up for specific attributes and data types" do + [:id, :check_in, :check_out, :room].each{|prop| reservation.must_respond_to prop} + + reservation.id.must_be_kind_of Integer + reservation.check_in.must_be_kind_of Date + reservation.check_out.must_be_kind_of Date + end + end + + describe "#booking_duration" do + it "returns the duration of the booking in days" do + reservation.booking_duration.must_equal 7 + reservation.booking_duration.must_be_instance_of Integer + end + end + + describe "#total_cost" do + it "returns total cost for a given reservation" do + reservation.total_cost.must_equal 1400 + reservation.total_cost.must_be_instance_of Integer + end + end + + +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index 24c6b7c5e..be8da9575 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -13,3 +13,4 @@ require_relative '../lib/administrator' require_relative '../lib/reservation' require_relative '../lib/room' +require_relative '../lib/invalid_duration_error' From 78dbdd09c301b423c36771b305554146405e7588 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Mon, 5 Mar 2018 20:29:47 -0800 Subject: [PATCH 04/18] Added Rakefile --- Rakefile | 9 +++++++++ lib/reservation.rb | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 Rakefile diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..deb52f2cd --- /dev/null +++ b/Rakefile @@ -0,0 +1,9 @@ +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.libs = ["lib"] + t.warning = true + t.test_files = FileList['specs/*_spec.rb'] +end + +task default: :test diff --git a/lib/reservation.rb b/lib/reservation.rb index 3ed4d2323..88dfdc433 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,4 +1,5 @@ require 'date' +require_relative 'room' require_relative 'invalid_duration_error' module BookingSystem @@ -12,9 +13,8 @@ def initialize(input) @room = input[:room] raise InvalidDurationError.new("Check out time can not be before check in time") if booking_duration < 0 end -# @check_out != nil && + def booking_duration - # return nil if @check_out == nil return (@check_out - @check_in).to_i end From d003a0c439f5f010eaacff5cefb59401d2b898e8 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Tue, 6 Mar 2018 17:02:35 -0800 Subject: [PATCH 05/18] Wrote Code and test for Administrator class --- lib/administrator.rb | 57 +++++++++++++++++++++ lib/reservation.rb | 2 +- lib/room_not_available_error.rb | 2 + specs/administrator_spec.rb | 87 +++++++++++++++++++++++++++++++++ specs/spec_helper.rb | 1 + 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 lib/room_not_available_error.rb diff --git a/lib/administrator.rb b/lib/administrator.rb index e69de29bb..4670d1eea 100644 --- a/lib/administrator.rb +++ b/lib/administrator.rb @@ -0,0 +1,57 @@ +require 'date' +require_relative 'room' +require_relative 'reservation' +require_relative 'room_not_available_error' + +module BookingSystem + class Administrator + attr_reader :rooms, :reservations, :range + + def initialize + @rooms = {} + (1..20).each{ |num| @rooms[num] = BookingSystem::Room.new(num, 200) } + @reservations = {} + @range = (1..500).to_a + end + + def list_rooms + return @rooms.values + end + + def reserve_room(room_num, check_in, check_out) + raise ArgumentError.new("Incorrect room number")if room_num < 1 ||room_num > 20 + + room = @rooms[room_num] + reservation_details = {id: @range.shift, check_in: check_in, check_out: check_out, room: room} + + raise RoomNotAvailableError.new("That room is not available")if !list_available_rooms.include?(room) + + new_reservation = reservation.new(reservation_details) + @reservations[new_reservation.id] = new_reservation + return new_reservation + end + + def find_reservation(date) + date_object = Date.parse(date) + return @reservations.select{|id, reservation|reservation.check_in <= date_object && reservation.check_out > date_object}.values + end + + def total_cost(reservation_id) + return @reservations[reservation_id].total_cost + end + + def list_reserved_rooms(start_date, end_date) + reserved_rooms = [] + (start_date..end_date).each{ |date| + reserved_rooms += find_reservation(date).map{ |reservation| reservation.room }} + return reserved_rooms + end + + def list_available_rooms(start_date, end_date) + return @rooms.values - list_reserved_rooms(start_date, end_date) + end + + end +end +# a = BookingSystem::Administrator.new +# puts a.list_available_rooms(Date.parse('2018-03-27'),Date.parse('2018-03-30')) diff --git a/lib/reservation.rb b/lib/reservation.rb index 88dfdc433..431e4ea3e 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -13,7 +13,7 @@ def initialize(input) @room = input[:room] raise InvalidDurationError.new("Check out time can not be before check in time") if booking_duration < 0 end - + def booking_duration return (@check_out - @check_in).to_i end diff --git a/lib/room_not_available_error.rb b/lib/room_not_available_error.rb new file mode 100644 index 000000000..e95e55b9c --- /dev/null +++ b/lib/room_not_available_error.rb @@ -0,0 +1,2 @@ +class RoomNotAvailableError < StandardError +end diff --git a/specs/administrator_spec.rb b/specs/administrator_spec.rb index ae9c220ea..1a415ee93 100644 --- a/specs/administrator_spec.rb +++ b/specs/administrator_spec.rb @@ -1 +1,88 @@ require_relative 'spec_helper' +describe "Administrator class" do + let(:admin){BookingSystem::Administrator.new} + + describe "#Initializer" do + it "is an instance of Administrator" do + admin.must_be_kind_of BookingSystem::Administrator + end + + it "establishes the base data structures when instantiated" do + [:rooms, :reservations, :range].each do |prop| + admin.must_respond_to prop + end + + admin.rooms.must_be_kind_of Hash + admin.reservations.must_be_kind_of Hash + admin.range.must_be_kind_of Array + end + end + + describe "#list_rooms" do + it "can access the list of all of the rooms in the hotel" do + admin.list_rooms.must_be_instance_of Array + end + end + + describe "#reserve_room" do + reservation_data = { + id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-27"), room: BookingSystem::Room.new(1, 200)} + + let(:reservation) {BookingSystem::Reservation.new(reservation_data)} + it "raises an error for Incorrect room number" do + proc { admin.reserve_room(21, Date.parse('2018-03-27'), Date.parse('2018-03-30')) + }.must_raise ArgumentError + + proc { admin.reserve_room(0, Date.parse('2018-03-27'), Date.parse('2018-03-30')) + }.must_raise ArgumentError + + proc { admin.reserve_room("7", Date.parse('2018-03-27'), Date.parse('2018-03-30')) + }.must_raise ArgumentError + end + # it "raises an error if room is not available" do + # admin.reserve_room(5, Date.parse('2018-03-27'), Date.parse('2018-03-30')) + # proc { !list_available_rooms(Date.parse('2018-03-27'), Date.parse('2018-03-30')).include?(@rooms[5]) + # }.must_raise RoomNotAvailableError + # end + # it "can reserve a room for a given date range" do + # admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-27")).must_be_instance_of Reservation + # end + end + + describe "#find_reservation" do + reservation_data = { + id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-27"), room: BookingSystem::Room.new(1, 200)} + + let(:reservation) {BookingSystem::Reservation.new(reservation_data)} + + it "can access the list of reservations for a specific date" do + admin.find_reservation('2018-03-27').must_be_instance_of Array + # admin.find_reservation('2018-03-27')[0].must_be_kind_of BookingSystem::Reservation + end + end + + describe "#total_cost" do + reservation_data = { + id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-27"), room: BookingSystem::Room.new(1, 200)} + + let(:reservation) {BookingSystem::Reservation.new(reservation_data)} + + it "can get the total cost for a given reservation" do + skip + # admin.total_cost(1).must_equal 1400 + end + end + + describe "list_reserved_rooms" do + it "can view a list of rooms that are reserved for a given date range" do + admin.list_reserved_rooms.must_be_instance_of Array + end + end + + describe "list_available_rooms" do + it "can view a list of rooms that are not reserved for a given date range" do + admin.list_available_rooms.must_be_instance_of Array + end + end + + end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index be8da9575..b5c87a4b2 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -14,3 +14,4 @@ require_relative '../lib/reservation' require_relative '../lib/room' require_relative '../lib/invalid_duration_error' +require_relative '../lib/room_not_available_error' From 1c879997518d5055c4d9b36ea9cb9f2e2a418b8f Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Wed, 7 Mar 2018 13:21:23 -0800 Subject: [PATCH 06/18] All tests passing for administrator class, Wave 2 --- lib/administrator.rb | 22 ++++++----- specs/administrator_spec.rb | 79 ++++++++++++++++++++++++++++--------- specs/reservation_spec.rb | 15 ++++--- specs/spec_helper.rb | 1 + 4 files changed, 84 insertions(+), 33 deletions(-) diff --git a/lib/administrator.rb b/lib/administrator.rb index 4670d1eea..f1f76d4c5 100644 --- a/lib/administrator.rb +++ b/lib/administrator.rb @@ -9,11 +9,16 @@ class Administrator def initialize @rooms = {} - (1..20).each{ |num| @rooms[num] = BookingSystem::Room.new(num, 200) } + (1..20).each{ |num| @rooms[num] = BookingSystem::Room.new(num, 200.00) } @reservations = {} @range = (1..500).to_a end + # def load_rooms + # rooms = {} + # end + + def list_rooms return @rooms.values end @@ -24,16 +29,15 @@ def reserve_room(room_num, check_in, check_out) room = @rooms[room_num] reservation_details = {id: @range.shift, check_in: check_in, check_out: check_out, room: room} - raise RoomNotAvailableError.new("That room is not available")if !list_available_rooms.include?(room) + raise RoomNotAvailableError.new("That room is not available")if !list_available_rooms(check_in, check_out).include?(room) - new_reservation = reservation.new(reservation_details) + new_reservation = BookingSystem::Reservation.new(reservation_details) @reservations[new_reservation.id] = new_reservation return new_reservation end def find_reservation(date) - date_object = Date.parse(date) - return @reservations.select{|id, reservation|reservation.check_in <= date_object && reservation.check_out > date_object}.values + return @reservations.select{|id, reservation|reservation.check_in <= date && reservation.check_out > date}.values end def total_cost(reservation_id) @@ -44,14 +48,14 @@ def list_reserved_rooms(start_date, end_date) reserved_rooms = [] (start_date..end_date).each{ |date| reserved_rooms += find_reservation(date).map{ |reservation| reservation.room }} - return reserved_rooms + return reserved_rooms.uniq end def list_available_rooms(start_date, end_date) - return @rooms.values - list_reserved_rooms(start_date, end_date) + return @rooms.values - list_reserved_rooms(start_date, end_date-1) end end end -# a = BookingSystem::Administrator.new -# puts a.list_available_rooms(Date.parse('2018-03-27'),Date.parse('2018-03-30')) +a = BookingSystem::Administrator.new +puts a.list_available_rooms(Date.parse('2018-03-27'),Date.parse('2018-03-30')) diff --git a/specs/administrator_spec.rb b/specs/administrator_spec.rb index 1a415ee93..e5feb9181 100644 --- a/specs/administrator_spec.rb +++ b/specs/administrator_spec.rb @@ -21,6 +21,7 @@ describe "#list_rooms" do it "can access the list of all of the rooms in the hotel" do admin.list_rooms.must_be_instance_of Array + admin.list_rooms.each{|room| room.must_be_instance_of BookingSystem::Room} end end @@ -39,14 +40,32 @@ proc { admin.reserve_room("7", Date.parse('2018-03-27'), Date.parse('2018-03-30')) }.must_raise ArgumentError end - # it "raises an error if room is not available" do - # admin.reserve_room(5, Date.parse('2018-03-27'), Date.parse('2018-03-30')) - # proc { !list_available_rooms(Date.parse('2018-03-27'), Date.parse('2018-03-30')).include?(@rooms[5]) - # }.must_raise RoomNotAvailableError - # end - # it "can reserve a room for a given date range" do - # admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-27")).must_be_instance_of Reservation - # end + it "raises an error if room is not available" do + admin.reserve_room(5, Date.parse('2018-03-27'), Date.parse('2018-03-30')) + proc { admin.reserve_room(5, Date.parse('2018-03-29'), Date.parse('2018-03-30'))}.must_raise RoomNotAvailableError + end + + it "allows start on the same day that another reservation for the same room ends" do + admin.reserve_room(5, Date.parse('2018-03-27'), Date.parse('2018-03-30')) + admin.reserve_room(5, Date.parse('2018-03-23'), Date.parse('2018-03-27')).must_be_instance_of BookingSystem::Reservation + admin.reserve_room(5, Date.parse('2018-03-30'), Date.parse('2018-04-01')).must_be_instance_of BookingSystem::Reservation + end + + it "can reserve a room for a given date range" do + admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-27")).must_be_instance_of BookingSystem::Reservation + end + + it "adds to the reservations" do + before = admin.reservations.count + admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-27")) + admin.reservations.count.must_equal before + 1 + end + + it "raises an error if all rooms are booked" do + (1..20).each{ |num| admin.reserve_room(num, Date.parse('2018-03-27'), Date.parse('2018-03-30')) } + proc { admin.reserve_room(5, Date.parse('2018-03-29'), Date.parse('2018-03-30'))}.must_raise RoomNotAvailableError + end + end describe "#find_reservation" do @@ -56,33 +75,55 @@ let(:reservation) {BookingSystem::Reservation.new(reservation_data)} it "can access the list of reservations for a specific date" do - admin.find_reservation('2018-03-27').must_be_instance_of Array - # admin.find_reservation('2018-03-27')[0].must_be_kind_of BookingSystem::Reservation + admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-27")) + admin.find_reservation(Date.parse("2018-03-20")).must_be_instance_of Array + admin.find_reservation(Date.parse("2018-03-20"))[0].must_be_kind_of BookingSystem::Reservation + end + + it "returns an empty array when there are no reservations" do + admin.find_reservation(Date.parse("2018-03-20")).must_be_instance_of Array + admin.find_reservation(Date.parse("2018-03-20")).must_be_empty end end describe "#total_cost" do - reservation_data = { - id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-27"), room: BookingSystem::Room.new(1, 200)} - - let(:reservation) {BookingSystem::Reservation.new(reservation_data)} it "can get the total cost for a given reservation" do - skip - # admin.total_cost(1).must_equal 1400 + new_reservation = admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-27")) + admin.total_cost(new_reservation.id).must_equal 1400.00 end end describe "list_reserved_rooms" do it "can view a list of rooms that are reserved for a given date range" do - admin.list_reserved_rooms.must_be_instance_of Array + admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-25")) + admin.list_reserved_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).must_be_instance_of Array + admin.list_reserved_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).count.must_equal 1 + end + it "can view multiple rooms that are reserved for a given date range" do + admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-25")) + admin.reserve_room(2, Date.parse("2018-03-20"), Date.parse("2018-03-25")) + admin.reserve_room(3, Date.parse("2018-03-20"), Date.parse("2018-03-25")) + admin.list_reserved_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).must_be_instance_of Array + admin.list_reserved_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).count.must_equal 3 end end describe "list_available_rooms" do it "can view a list of rooms that are not reserved for a given date range" do - admin.list_available_rooms.must_be_instance_of Array + admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-25")) + admin.list_available_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).must_be_instance_of Array + admin.list_available_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).count.must_equal 19 end - end + it "returns all rooms when none is reserved" do + rooms = admin.list_available_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")) + rooms.count.must_equal 20 + rooms.map{|room| room.number}.sort.must_equal (1..20).to_a + end + it "returns empty when all are reserved" do + 20.times{ |index| admin.reserve_room(index+1, Date.parse('2018-03-27'), Date.parse('2018-03-30')) } + admin.list_available_rooms(Date.parse("2018-03-27"), Date.parse("2018-03-30")).must_be_empty + end + end end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index db1745509..3631f9b36 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -29,19 +29,24 @@ end end - describe "#booking_duration" do - it "returns the duration of the booking in days" do + describe "#booking_duration" do + it "returns the duration of the booking in days" do reservation.booking_duration.must_equal 7 reservation.booking_duration.must_be_instance_of Integer end - end + end - describe "#total_cost" do - it "returns total cost for a given reservation" do + describe "#total_cost" do + it "returns total cost for a given reservation" do reservation.total_cost.must_equal 1400 reservation.total_cost.must_be_instance_of Integer end + it "does not charge for the checkout day" do + reservation_for_2_days = BookingSystem::Reservation.new({ + id: 1, check_in: Date.parse("2018-03-01"), check_out: Date.parse("2018-03-02"), room: BookingSystem::Room.new(1, 200)}) + reservation_for_2_days.total_cost.must_equal 200 end + end end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index b5c87a4b2..b14631879 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -5,6 +5,7 @@ require 'minitest' require 'minitest/autorun' require 'minitest/reporters' +require 'minitest/skip_dsl' # Add simplecov Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new From 1bd8e45499e78b6c22a15bb68485f46c4bb16140 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Wed, 7 Mar 2018 13:22:50 -0800 Subject: [PATCH 07/18] Removed puts statement --- lib/administrator.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/administrator.rb b/lib/administrator.rb index f1f76d4c5..4906ca5fa 100644 --- a/lib/administrator.rb +++ b/lib/administrator.rb @@ -57,5 +57,3 @@ def list_available_rooms(start_date, end_date) end end -a = BookingSystem::Administrator.new -puts a.list_available_rooms(Date.parse('2018-03-27'),Date.parse('2018-03-30')) From b174fdaec89f72480ed71376d882bc69b6f9e716 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Wed, 7 Mar 2018 13:23:57 -0800 Subject: [PATCH 08/18] Added rooms.csv in supportfolder --- support/rooms.csv | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 support/rooms.csv diff --git a/support/rooms.csv b/support/rooms.csv new file mode 100644 index 000000000..8152ed717 --- /dev/null +++ b/support/rooms.csv @@ -0,0 +1,21 @@ +room_num cost +1 200.00 +2 200.00 +3 200.00 +4 200.00 +5 200.00 +6 200.00 +7 200.00 +8 200.00 +9 200.00 +10 200.00 +11 200.00 +12 200.00 +13 200.00 +14 200.00 +15 200.00 +16 200.00 +17 200.00 +18 200.00 +19 200.00 +20 200.00 From 4a450178f4b97d145dc59b2b77d7d61180ef87a1 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Wed, 7 Mar 2018 16:47:51 -0800 Subject: [PATCH 09/18] Add #load_rooms in Administrator class --- lib/administrator.rb | 24 +++++++++++++++++------- support/rooms.csv | 42 +++++++++++++++++++++--------------------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/lib/administrator.rb b/lib/administrator.rb index 4906ca5fa..9f3c26bf8 100644 --- a/lib/administrator.rb +++ b/lib/administrator.rb @@ -1,3 +1,4 @@ +require 'csv' require 'date' require_relative 'room' require_relative 'reservation' @@ -8,15 +9,24 @@ class Administrator attr_reader :rooms, :reservations, :range def initialize - @rooms = {} - (1..20).each{ |num| @rooms[num] = BookingSystem::Room.new(num, 200.00) } + @rooms = load_rooms + #{} + # (1..20).each{ |num| @rooms[num] = BookingSystem::Room.new(num, 200.00) } @reservations = {} @range = (1..500).to_a end - # def load_rooms - # rooms = {} - # end + def load_rooms + number = nil + cost = nil + rooms = {} + CSV.read("support/rooms.csv", :headers => true, :header_converters => :symbol, :converters => :all).each { |line| + number = line[0].to_i + cost = line[1].to_f + rooms[number] = BookingSystem::Room.new(number, cost) + } + return rooms + end def list_rooms @@ -47,8 +57,8 @@ def total_cost(reservation_id) def list_reserved_rooms(start_date, end_date) reserved_rooms = [] (start_date..end_date).each{ |date| - reserved_rooms += find_reservation(date).map{ |reservation| reservation.room }} - return reserved_rooms.uniq + reserved_rooms += find_reservation(date).map{ |reservation| reservation.room }} + return reserved_rooms.uniq end def list_available_rooms(start_date, end_date) diff --git a/support/rooms.csv b/support/rooms.csv index 8152ed717..b100c43d9 100644 --- a/support/rooms.csv +++ b/support/rooms.csv @@ -1,21 +1,21 @@ -room_num cost -1 200.00 -2 200.00 -3 200.00 -4 200.00 -5 200.00 -6 200.00 -7 200.00 -8 200.00 -9 200.00 -10 200.00 -11 200.00 -12 200.00 -13 200.00 -14 200.00 -15 200.00 -16 200.00 -17 200.00 -18 200.00 -19 200.00 -20 200.00 +number, cost +1, 200.00 +2, 200.00 +3, 200.00 +4, 200.00 +5, 200.00 +6, 200.00 +7, 200.00 +8, 200.00 +9, 200.00 +10, 200.00 +11, 200.00 +12, 200.00 +13, 200.00 +14, 200.00 +15, 200.00 +16, 200.00 +17, 200.00 +18, 200.00 +19, 200.00 +20, 200.00 From 5e4433a43fbb58d2a0dc2be35a8effc49b55b69c Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sun, 11 Mar 2018 12:16:31 -0700 Subject: [PATCH 10/18] Add Booking class --- lib/booking.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 lib/booking.rb diff --git a/lib/booking.rb b/lib/booking.rb new file mode 100644 index 000000000..af05df0a0 --- /dev/null +++ b/lib/booking.rb @@ -0,0 +1,20 @@ +require 'date' +require_relative 'invalid_duration_error' + +module BookingSystem + class Booking + attr_reader :id, :check_in, :check_out + + def initialize(input) + @id = input[:id] + @check_in = input[:check_in] + @check_out = input[:check_out] + raise InvalidDurationError.new("Check out time can not be before check in time") if booking_duration < 0 + end + + def booking_duration + return (@check_out - @check_in).to_i + end + + end +end From b39b38333542c7b1791e8dda6918338cf3c8b730 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sun, 11 Mar 2018 12:33:22 -0700 Subject: [PATCH 11/18] Add test for Block class --- specs/block_spec.rb | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 specs/block_spec.rb diff --git a/specs/block_spec.rb b/specs/block_spec.rb new file mode 100644 index 000000000..2699ea9be --- /dev/null +++ b/specs/block_spec.rb @@ -0,0 +1,39 @@ +require_relative 'spec_helper' + +describe "Block class" do + block_data = { + id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-27"), rooms: [BookingSystem::Room.new(1, 200.00)], rate: 180.00 } + + let(:block) {BookingSystem::Block.new(block_data)} + + describe "#initialize" do + it "raises an InvalidDurationError if Check out time is before check in time" do + proc { BookingSystem::Block.new({id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-15"), rooms: [BookingSystem::Room.new(1, 200.00)], rate: 180.00 }) + }.must_raise InvalidDurationError + end + + it "is an instance of Block" do + block.must_be_kind_of BookingSystem::Block + end + + it "stores an array of rooms" do + block.rooms.must_be_instance_of Array + block.rooms.each { |room| room.must_be_kind_of BookingSystem::Room } + end + + it "is set up for specific attributes and data types" do + [:id, :check_in, :check_out, :rooms].each{|prop| block.must_respond_to prop} + block.id.must_be_kind_of Integer + block.check_in.must_be_kind_of Date + block.check_out.must_be_kind_of Date + block.rate.must_be_kind_of Numeric + end + end + + describe "#booking_duration" do + it "returns the duration of the block in days" do + block.booking_duration.must_equal 7 + block.booking_duration.must_be_instance_of Integer + end + end +end From 01eac8f541c918476c248f642679ecc1d4635a0c Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sun, 11 Mar 2018 13:10:36 -0700 Subject: [PATCH 12/18] Add Block class --- lib/block.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 lib/block.rb diff --git a/lib/block.rb b/lib/block.rb new file mode 100644 index 000000000..894658f32 --- /dev/null +++ b/lib/block.rb @@ -0,0 +1,16 @@ +require 'date' +require_relative 'booking' +require_relative 'invalid_duration_error' + +module BookingSystem + class Block < Booking + attr_reader :rooms, :rate + + def initialize(input) + super(input) + @rooms = input[:rooms] + @rate = input[:rate] + end + + end +end From 463d1a60f2cd84b2c38701705f7358715cdb95d2 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sun, 11 Mar 2018 13:17:57 -0700 Subject: [PATCH 13/18] Modify spec_helper --- specs/spec_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index b14631879..5fbe95f08 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -14,5 +14,6 @@ require_relative '../lib/administrator' require_relative '../lib/reservation' require_relative '../lib/room' +require_relative '../lib/block' require_relative '../lib/invalid_duration_error' require_relative '../lib/room_not_available_error' From 3cf4a12690930f5ac29f745e5595f7b7f0d8b1a3 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sun, 11 Mar 2018 13:26:53 -0700 Subject: [PATCH 14/18] Refactored reservation to inherit from booking --- lib/reservation.rb | 17 ++++++----------- specs/room_spec.rb | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 431e4ea3e..e0a7f652b 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,25 +1,20 @@ require 'date' +require_relative 'booking' require_relative 'room' require_relative 'invalid_duration_error' module BookingSystem - class Reservation - attr_reader :id, :check_in, :check_out, :room + class Reservation < Booking + attr_reader :room, :cost def initialize(input) - @id = input[:id] - @check_in = input[:check_in] - @check_out = input[:check_out] + super(input) @room = input[:room] - raise InvalidDurationError.new("Check out time can not be before check in time") if booking_duration < 0 - end - - def booking_duration - return (@check_out - @check_in).to_i + @cost = input.has_key?(:rate) ? input[:rate] : @room.cost end def total_cost - return booking_duration * @room.cost + return booking_duration * @cost end end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index 10aa5c375..e00f06ad3 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -16,5 +16,5 @@ room.cost.must_be_kind_of Integer end -end + end end From 43b7f54238fb9bc86d071030200942ce897ccd93 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sun, 11 Mar 2018 13:27:56 -0700 Subject: [PATCH 15/18] Wrote additional tests --- specs/administrator_spec.rb | 114 +++++++++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 3 deletions(-) diff --git a/specs/administrator_spec.rb b/specs/administrator_spec.rb index e5feb9181..0847ecd35 100644 --- a/specs/administrator_spec.rb +++ b/specs/administrator_spec.rb @@ -43,6 +43,9 @@ it "raises an error if room is not available" do admin.reserve_room(5, Date.parse('2018-03-27'), Date.parse('2018-03-30')) proc { admin.reserve_room(5, Date.parse('2018-03-29'), Date.parse('2018-03-30'))}.must_raise RoomNotAvailableError + + admin.create_block([7,8],Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) + proc { admin.reserve_room(7, Date.parse('2018-03-27'), Date.parse('2018-03-30'))}.must_raise RoomNotAvailableError end it "allows start on the same day that another reservation for the same room ends" do @@ -94,7 +97,7 @@ end end - describe "list_reserved_rooms" do + describe "#list_reserved_rooms" do it "can view a list of rooms that are reserved for a given date range" do admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-25")) admin.list_reserved_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).must_be_instance_of Array @@ -109,8 +112,8 @@ end end - describe "list_available_rooms" do - it "can view a list of rooms that are not reserved for a given date range" do + describe "#list_available_rooms" do + it "can view a list of rooms that are available for a given date range" do admin.reserve_room(1, Date.parse("2018-03-20"), Date.parse("2018-03-25")) admin.list_available_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).must_be_instance_of Array admin.list_available_rooms(Date.parse("2018-03-20"), Date.parse("2018-03-25")).count.must_equal 19 @@ -126,4 +129,109 @@ admin.list_available_rooms(Date.parse("2018-03-27"), Date.parse("2018-03-30")).must_be_empty end end + + describe "#create_block" do + it "raises error if room numbers is not an instance of an array" do + proc { admin.create_block( + 1, Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) }.must_raise ArgumentError + end + + it "raises error if room count is <1 or >5 in block" do + proc { admin.create_block( + [], Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) }.must_raise ArgumentError + + proc { admin.create_block( + [1,2,3,4,5,6], Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) }.must_raise ArgumentError + end + + it "raises error if room number is invalid" do + proc { admin.create_block([-1], Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) }.must_raise ArgumentError + + proc { admin.create_block(["1"], Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) }.must_raise ArgumentError + + proc { admin.create_block(["one"], Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) }.must_raise ArgumentError + end + + it "raises an error if room is not available" do + admin.reserve_room(4, Date.parse('2018-03-27'), Date.parse('2018-03-30')) + proc { admin.create_block([1,4,5], Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) }.must_raise RoomNotAvailableError + + admin.create_block([9], Date.parse('2018-03-29'), Date.parse('2018-03-30'), 180.00) + proc { admin.create_block([8,9,10], Date.parse('2018-03-29'), Date.parse('2018-03-30'), 180.00) }.must_raise RoomNotAvailableError + end + + it "allows creation of blocks on the same day when another block for the same room ends" do + admin.create_block([5], Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) + admin.create_block([5], Date.parse('2018-03-23'), Date.parse('2018-03-27'), 180.00).must_be_instance_of BookingSystem::Block + admin.create_block([5], Date.parse('2018-03-30'), Date.parse('2018-04-01'), 180.00).must_be_instance_of BookingSystem::Block + end + + it "allows reservation before block start and on block end date" do + admin.create_block([5], Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) + admin.reserve_room(5, Date.parse('2018-03-23'), Date.parse('2018-03-27')).must_be_instance_of BookingSystem::Reservation + admin.reserve_room(5, Date.parse('2018-03-30'), Date.parse('2018-04-01')).must_be_instance_of BookingSystem::Reservation + end + + it "can block a room for a given date range" do + admin.create_block([1,2], Date.parse("2018-03-20"), Date.parse("2018-03-27"), 180.00).must_be_instance_of BookingSystem::Block + end + + it "raises an error if all rooms are reserved" do + (1..20).each{ |num| admin.reserve_room(num, Date.parse('2018-03-27'), Date.parse('2018-03-30')) } + proc { admin.create_block([5], Date.parse('2018-03-29'), Date.parse('2018-03-30'), 180.00)}.must_raise RoomNotAvailableError + end + + it "raises an error if all rooms are blocked" do + admin.create_block((1..5).to_a, Date.parse('2018-03-27'), Date.parse('2018-03-30'), 180.00) + proc { admin.create_block([5], Date.parse('2018-03-29'), Date.parse('2018-03-30'), 180.00)}.must_raise RoomNotAvailableError + end + end + + describe "#list_available_rooms_in_block" do + it "can view a list of rooms that are available" do + block = admin.create_block([1,2,3], Date.parse("2018-03-20"), Date.parse("2018-03-25"), 180.00) + admin.list_available_rooms_in_block(block.id).must_be_instance_of Array + admin.list_available_rooms_in_block(block.id).count.must_equal 3 + end + + it "returns all rooms in block when none is reserved" do + block = admin.create_block([1,2,3], Date.parse("2018-03-20"), Date.parse("2018-03-25"), 180.00) + rooms = admin.list_available_rooms_in_block(block.id) + rooms.count.must_equal 3 + rooms.map{|room| room.number}.sort.must_equal (1..3).to_a + end + + it "returns empty when all are reserved" do + block = admin.create_block([1,2,3], Date.parse("2018-03-20"), Date.parse("2018-03-25"), 180.00) + 3.times{ |index| admin.reserve_in_block(block.id, index+1) } + admin.list_available_rooms_in_block(block.id).must_be_empty + end + end + + describe "#reserve_in_block" do + it "can reserve a room in the block" do + block = admin.create_block([1,2,3], Date.parse("2018-03-20"), Date.parse("2018-03-25"), 180.00) + admin.reserve_in_block(block.id, 1).must_be_instance_of BookingSystem::Reservation + end + + it "reservation dates will always match the date range of the block" do + block = admin.create_block([1,2,3], Date.parse("2018-03-20"), Date.parse("2018-03-25"), 180.00) + reservation = admin.reserve_in_block(block.id, 1) + reservation.check_in.must_equal Date.parse("2018-03-20") + reservation.check_out.must_equal Date.parse("2018-03-25") + end + + it "raises an error if room is not in block" do + block = admin.create_block([1,2,3], Date.parse("2018-03-20"), Date.parse("2018-03-25"), 180.00) + proc { admin.reserve_in_block(block.id, 4) }.must_raise ArgumentError + end + + it "raises an error if room is already reserved" do + block = admin.create_block([1,2,3], Date.parse("2018-03-20"), Date.parse("2018-03-25"), 180.00) + admin.reserve_in_block(block.id, 3) + proc { admin.reserve_in_block(block.id, 3) }.must_raise RoomNotAvailableError + end + + end + end From 26fd96d355ca45276844c3b132ce5f1f5fe64859 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sun, 11 Mar 2018 13:29:15 -0700 Subject: [PATCH 16/18] Wrote additional tests --- specs/reservation_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 3631f9b36..d4972381d 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -41,11 +41,17 @@ reservation.total_cost.must_equal 1400 reservation.total_cost.must_be_instance_of Integer end + it "does not charge for the checkout day" do reservation_for_2_days = BookingSystem::Reservation.new({ id: 1, check_in: Date.parse("2018-03-01"), check_out: Date.parse("2018-03-02"), room: BookingSystem::Room.new(1, 200)}) reservation_for_2_days.total_cost.must_equal 200 end + + it "uses the rate if provided" do + discounted_reservation = BookingSystem::Reservation.new({id: 1, check_in: Date.parse("2018-03-20"), check_out: Date.parse("2018-03-27"), room: BookingSystem::Room.new(1, 200), rate: 100.00}) + discounted_reservation.total_cost.must_equal 700.00 + end end From 431a0c12124e53df5f8ec05be14fd852e5b3a1be Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sun, 11 Mar 2018 13:32:46 -0700 Subject: [PATCH 17/18] Add #create_block, #reserve_in_block, #list_available_rooms_in_block --- lib/administrator.rb | 59 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/lib/administrator.rb b/lib/administrator.rb index 9f3c26bf8..5d90b74a2 100644 --- a/lib/administrator.rb +++ b/lib/administrator.rb @@ -2,11 +2,12 @@ require 'date' require_relative 'room' require_relative 'reservation' +require_relative 'block' require_relative 'room_not_available_error' module BookingSystem class Administrator - attr_reader :rooms, :reservations, :range + attr_reader :rooms, :reservations, :range, :blocks def initialize @rooms = load_rooms @@ -14,6 +15,7 @@ def initialize # (1..20).each{ |num| @rooms[num] = BookingSystem::Room.new(num, 200.00) } @reservations = {} @range = (1..500).to_a + @blocks = {} end def load_rooms @@ -34,13 +36,12 @@ def list_rooms end def reserve_room(room_num, check_in, check_out) - raise ArgumentError.new("Incorrect room number")if room_num < 1 ||room_num > 20 + raise ArgumentError.new("Incorrect room number") if !rooms.keys.include?(room_num) room = @rooms[room_num] - reservation_details = {id: @range.shift, check_in: check_in, check_out: check_out, room: room} - raise RoomNotAvailableError.new("That room is not available")if !list_available_rooms(check_in, check_out).include?(room) + reservation_details = {id: @range.shift, check_in: check_in, check_out: check_out, room: room} new_reservation = BookingSystem::Reservation.new(reservation_details) @reservations[new_reservation.id] = new_reservation return new_reservation @@ -57,12 +58,56 @@ def total_cost(reservation_id) def list_reserved_rooms(start_date, end_date) reserved_rooms = [] (start_date..end_date).each{ |date| - reserved_rooms += find_reservation(date).map{ |reservation| reservation.room }} - return reserved_rooms.uniq + reserved_rooms += find_reservation(date).map{ |reservation| reservation.room } + } + return reserved_rooms.flatten.uniq + end + + def list_blocked_rooms(start_date, end_date) + blocked_rooms = [] + (start_date..end_date).each{ |date| + selected_blocks = @blocks.select{|id, block|block.check_in <= date && block.check_out > date}.values + blocked_rooms += selected_blocks.map{ |block| block.rooms } + } + return blocked_rooms.flatten.uniq end def list_available_rooms(start_date, end_date) - return @rooms.values - list_reserved_rooms(start_date, end_date-1) + return @rooms.values - list_reserved_rooms(start_date, end_date-1) - list_blocked_rooms(start_date, end_date-1) + end + + def create_block(room_numbers, check_in, check_out, discounted_rate) + raise ArgumentError.new("Room numbers should be an Array") if room_numbers.class != Array + raise ArgumentError.new("Room count should be between 1 & 5") if room_numbers.count < 1 || room_numbers.count > 5 + + block_rooms = [] + room_numbers.each { |room_num| + raise ArgumentError.new("Incorrect room number #{room_num}") if !@rooms.keys.include?(room_num) + raise RoomNotAvailableError.new("Room #{room_num} is not available") if !(list_available_rooms(check_in, check_out).map{|room|room.number}).include?(room_num) + block_rooms << @rooms[room_num] + } + + block_details = {id: @range.shift, check_in: check_in, check_out: check_out, rooms: block_rooms, rate: discounted_rate} + new_block = BookingSystem::Block.new(block_details) + @blocks[new_block.id] = new_block + return new_block + end + + def list_available_rooms_in_block(block_id) + block = @blocks[block_id] + return block.rooms - list_reserved_rooms(block.check_in, block.check_out - 1) + end + + def reserve_in_block(block_id, room_number) + block = @blocks[block_id] + raise ArgumentError.new("Room #{room_number} not in block") if !block.rooms.map{ |room| room.number }.include?(room_number) + room = @rooms[room_number] + raise RoomNotAvailableError.new("That room is not available") if list_reserved_rooms(block.check_in, block.check_out - 1).include?(room) + + reservation_details = {id: @range.shift, check_in: block.check_in, check_out: block.check_out, room: room} + new_reservation = BookingSystem::Reservation.new(reservation_details) + @reservations[new_reservation.id] = new_reservation + return new_reservation end end From d2892aa11d8f0fd38fb18a6ea15b9d6774a95f37 Mon Sep 17 00:00:00 2001 From: Monalisa Chatterjee Date: Sat, 31 Mar 2018 19:05:29 -0700 Subject: [PATCH 18/18] Add design-activity --- .DS_Store | Bin 0 -> 8196 bytes design-activity.md | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 .DS_Store create mode 100644 design-activity.md diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4d7a8d65ae1fe9a78f86b8060ad99f441f7e42c6 GIT binary patch literal 8196 zcmeI1%Wl&^6o$_vDRop;WPxax-XO7vP=W-igpk~jF1kQM1i=DOYsYSD)wLtrX#{C1 zZ+Hg!3Oosqz=QAr@Xv*ii?d*ZXgNok`Ny7feEA&D_)LgMbcTMLXq$*E6se63R3#?+ zWm&R{*|P~1h$l+PrDF>Aqolv&%{!O?6JP>NfC(^xe}MqzY-!etd0+Q(%>pQa$7rEd4IQXd3IMHPw=%Sm2dEg^sAIIyszPy0ojnK>DolzYbU6BL=?-;_7Fu;U z2^~(toLQI*MX0kQ&Q|Uu9Iae40Vc3aK<4fi^(moq3TE?nFG@W0$=B%#%Kab8&?@ow zM%lplfAt1YnB}e3H&Ln9)^4p^^}1ExwBGkll2I>r^I_I;)3<6X^aIbdUnNO2ZM)v< zFc=*)?mSE4+zsO(opFEnCXD@L)JcZ1pQ+=#aPt$ysuLYF?vBSht)~6>;iPG!)o$85 z?MIV|Wo_MSKixk(`|xpmF}eJ#ZiIvxP3X4Xp4L}ow|U-6<0y%b(I?|J=m^LH^2x)p zN1smV0iBUA7e8j;eSzmJyedT$k~i-qw#vP3CRl@D0jEVTf$hRyAUFywq)_rU8b8l=68{YACq+ zH5A|_P_r