From f5e767e166db531ba0770096842818449470d165 Mon Sep 17 00:00:00 2001 From: quinqu Date: Mon, 2 Mar 2020 16:39:20 -0800 Subject: [PATCH 01/11] day one og --- .DS_Store | Bin 0 -> 6148 bytes lib/date_range.rb | 26 +++++++++++++ lib/hotel.rb | 46 ++++++++++++++++++++++ lib/reservation.rb | 31 +++++++++++++++ lib/room.rb | 21 ++++++++++ test/date_range_test.rb | 0 test/hotel_test.rb | 81 +++++++++++++++++++++++++++++++++++++++ test/reservation_test.rb | 0 test/room_test.rb | 0 9 files changed, 205 insertions(+) create mode 100644 .DS_Store create mode 100644 lib/date_range.rb create mode 100644 lib/hotel.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 test/date_range_test.rb create mode 100644 test/hotel_test.rb create mode 100644 test/reservation_test.rb create mode 100644 test/room_test.rb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..93c1b3c63dbfee06db9cb5885e1ca73c8e647483 GIT binary patch literal 6148 zcmeHK(QeZ)6un*pxSbGvK-wPjg2Y3GT9}w7gcM3AvMlWy#c}R8Wfg z!ao3iz^Cv9d5yXlB09T%qn$KA2-7@725%4d;5UCN zLqyc1M>N8EAA)yC38fU*7+-6Q267S#t65@gc~&?sPR-lDg{Ns!l-=%kvC?oZUA`h^ zOSZ1IUinA)*e`=}RP=-43x0YMlt-b7pXPZwkAv`85|8)V*B|Ct86;UeROBRzk@E6+ zl12HrpO3PrQ2qG2LCU6V?zPt^lit=w$GzR%ns(gD=4Q9!Zrr&$oi^p#jo$s8{gb!v zChw;oKC>>^3$Yn0yJqk=d_iDDc;gSVG|yh6hO;H@Lds)I!cr;4N90t+-=%GOKm&RV z+B#6ED*(_zwKBx~vA`VHpl5KV5iKyGsX$E?=87RS9rdos^9;^3YB~vX z`4HyK!rV}VdOP}eRXPbzqb;ohR)MMl4gJ{W^MCu#_x~!%K3N5<0_REr;SBsiA44){ z>%!pptaai0a5m1HX;c&x<~UXXAI0l%WoUCb0D1;z8c_qY9|B4STUZ7DsRF+Mgsj{c literal 0 HcmV?d00001 diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..ecad70450 --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,26 @@ +module HotelSystem + class DateRange + attr_accessor :start_date, :end_date + + def initialize(start_date, end_date) + @start_date = start_date + @end_date = end_date + end + + def overlap?(other) + return false + end + + def include?(date) + return false + end + + def nights + return 3 + end + + end + + + +end \ No newline at end of file diff --git a/lib/hotel.rb b/lib/hotel.rb new file mode 100644 index 000000000..a5cf50ec4 --- /dev/null +++ b/lib/hotel.rb @@ -0,0 +1,46 @@ +require_relative 'room' +require_relative 'reservation' + +module HotelSystem + class Hotel + attr_accessor :rooms + + def initialize + @rooms = [] + 20.times do |i| + @rooms << Room.new(i+1, 200) + end + end + + + def find_reservations_with_date(room_number, start_date, end_date) + #TODO find a parse method dates + room = find(room_number) + reservs = [] + room.reservations.each do |reservation| + if start_date - reservation.end_date < 0 + reservs << reservation + elsif end_date - reservation.end_date < 0 + reservs << reservation + else + ########### + end + end + return reservs + end + + + def find(room_number) + @rooms.each do |room| + if room_number == room.room_number + return room + end + end + end + + + + + end +end + diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..291329520 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,31 @@ +require_relative 'date_range' + +require 'date' + +module HotelSystem + class Reservation + attr_reader :start_date, :end_date, :total_cost + attr_accessor :reservation_number + + def initialize(reservation_number, start_date, end_date) + @reservation_number = reservation_number + check_dates(start_date, end_date) + @start_date = start_date + @end_date = end_date + @total_cost = ((@end_date - @start_date)-1) * 200 + end + + def get_total_cost + return @total_cost + end + + def check_dates(start_date, end_date) + # if Date.today - start_date > 0 + # raise ArgumentError.new("Invalid date, you can't start a reservation in the past") + # elsif Date.today - end_date > 0 + # raise ArgumentError.new("Invalid date, you can't end a reservation in the past") + # end + 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..817c6be38 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,21 @@ +require_relative 'reservation' + +module HotelSystem + class Room + attr_reader :room_number, :cost_per_night + attr_accessor :reservations + + def initialize(room_number, cost_per_night) + @room_number = room_number + @cost_per_night = cost_per_night + @reservations = [] #[[s ,e ]], [s, e], [s,e]] + end + + def add_reservation(reservation) + @reservations << reservation + 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..e69de29bb diff --git a/test/hotel_test.rb b/test/hotel_test.rb new file mode 100644 index 000000000..ef07b9fd8 --- /dev/null +++ b/test/hotel_test.rb @@ -0,0 +1,81 @@ + +require 'date' +require 'minitest/autorun' +require 'minitest/reporters' +require 'minitest/skip_dsl' + +require_relative '../lib/hotel' +require_relative '../lib/room' +require_relative '../lib/reservation' + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + +describe "initialize" do + it "I can access the list of all of the rooms in the hotel" do + hotel = HotelSystem::Hotel.new + hotel.must_be_instance_of HotelSystem::Hotel + + end + + it "an element in Hotel object must be a room" do + hotel = HotelSystem::Hotel.new + room = hotel.rooms[1] + room.must_be_instance_of HotelSystem::Room + + end + +end +# def find_reservations_with_date(room_number, start_date, end_date) + +describe "other instance methods" do + + it "finds a room " do + + hotel = HotelSystem::Hotel.new + + room = hotel.find(1) + + room.must_be_instance_of HotelSystem::Room + + end + + it "finds an array of reservations" do + + hotel = HotelSystem::Hotel.new + + room = hotel.find(1) + + res1 = HotelSystem::Reservation.new(1, Date.new(2020, 02, 18), Date.new(2020,02,29)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 02, 29), Date.new(2020, 03,02)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020,03,18)) + room.add_reservation(res1) + room.add_reservation(res2) + reservation = room.reservations[1] + + reservation.must_be_instance_of HotelSystem::Reservation + + end + + + it "I access the list of reservations for a specified room and a given date range" do + + res1 = HotelSystem::Reservation.new(1, Date.new(2020, 02, 18), Date.new(2020,02,29)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 02, 29), Date.new(2020, 03,02)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020,03,18)) + + + hotel = HotelSystem::Hotel.new + + hotel.rooms[1].add_reservation(res1) + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res3) + + + array = hotel.find_reservations_with_date( 1 , Date.new(2020, 02, 17), Date.new(2020, 02, 13)) + + array.must_be_instance_of Array + + 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..e69de29bb diff --git a/test/room_test.rb b/test/room_test.rb new file mode 100644 index 000000000..e69de29bb From cffee2223aa2267841fc6a52e0a065b797b3d6db Mon Sep 17 00:00:00 2001 From: quinqu Date: Tue, 3 Mar 2020 12:08:44 -0800 Subject: [PATCH 02/11] working code for the moment : - ) --- lib/hotel.rb | 17 ++++++++--------- lib/reservation.rb | 13 ++++++------- lib/room.rb | 34 ++++++++++++++++++++++++++++------ test/hotel_test.rb | 19 +++++++++---------- test/reservation_test.rb | 29 +++++++++++++++++++++++++++++ test/room_test.rb | 38 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 118 insertions(+), 32 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index a5cf50ec4..49ce2db80 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -8,14 +8,15 @@ class Hotel def initialize @rooms = [] 20.times do |i| - @rooms << Room.new(i+1, 200) - end + @rooms << Room.new(i+1, 200, []) + end + end def find_reservations_with_date(room_number, start_date, end_date) #TODO find a parse method dates - room = find(room_number) + room = find_room(room_number) reservs = [] room.reservations.each do |reservation| if start_date - reservation.end_date < 0 @@ -30,17 +31,15 @@ def find_reservations_with_date(room_number, start_date, end_date) end - def find(room_number) + def find_room(room_number) @rooms.each do |room| if room_number == room.room_number return room end end - end - - - - + end + end end + diff --git a/lib/reservation.rb b/lib/reservation.rb index 291329520..4ff538dbb 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,5 +1,6 @@ require_relative 'date_range' - +require_relative 'hotel' +require_relative 'room' require 'date' module HotelSystem @@ -12,7 +13,7 @@ def initialize(reservation_number, start_date, end_date) check_dates(start_date, end_date) @start_date = start_date @end_date = end_date - @total_cost = ((@end_date - @start_date)-1) * 200 + @total_cost = ((@end_date - @start_date)) * 200 end def get_total_cost @@ -20,11 +21,9 @@ def get_total_cost end def check_dates(start_date, end_date) - # if Date.today - start_date > 0 - # raise ArgumentError.new("Invalid date, you can't start a reservation in the past") - # elsif Date.today - end_date > 0 - # raise ArgumentError.new("Invalid date, you can't end a reservation in the past") - # end + if Date.today > start_date || Date.today > end_date + raise ArgumentError.new("Invalid date, you can't start or end a reservation in the past") + end end end diff --git a/lib/room.rb b/lib/room.rb index 817c6be38..d8e89a309 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,21 +1,43 @@ require_relative 'reservation' +require_relative 'hotel' module HotelSystem - class Room + class Room attr_reader :room_number, :cost_per_night attr_accessor :reservations - def initialize(room_number, cost_per_night) + def initialize(room_number, cost_per_night, reservations=[]) @room_number = room_number @cost_per_night = cost_per_night - @reservations = [] #[[s ,e ]], [s, e], [s,e]] + @reservations = [] end def add_reservation(reservation) @reservations << reservation - end - + end + end -end \ No newline at end of file +end + +def main + #res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) + #res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) + #res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) + + + #hotel = HotelSystem::Hotel.new + + #hotel.add_reservation(1, HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29))) + # hotel.rooms[1].add_reservation(res2) + # hotel.rooms[1].add_reservation(res3) + #hotel.to_s + + #array = hotel.find_reservations_with_date(2, Date.new(2020, 03, 18), Date.new(2020, 04, 02)) + + #puts array.to_s + +end + +main \ No newline at end of file diff --git a/test/hotel_test.rb b/test/hotel_test.rb index ef07b9fd8..26bea6f87 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -33,7 +33,7 @@ hotel = HotelSystem::Hotel.new - room = hotel.find(1) + room = hotel.find_room(1) room.must_be_instance_of HotelSystem::Room @@ -43,11 +43,11 @@ hotel = HotelSystem::Hotel.new - room = hotel.find(1) + room = hotel.find_room(1) - res1 = HotelSystem::Reservation.new(1, Date.new(2020, 02, 18), Date.new(2020,02,29)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 02, 29), Date.new(2020, 03,02)) - res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020,03,18)) + res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) + room.add_reservation(res1) room.add_reservation(res2) reservation = room.reservations[1] @@ -58,10 +58,9 @@ it "I access the list of reservations for a specified room and a given date range" do - - res1 = HotelSystem::Reservation.new(1, Date.new(2020, 02, 18), Date.new(2020,02,29)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 02, 29), Date.new(2020, 03,02)) - res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020,03,18)) + res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) hotel = HotelSystem::Hotel.new @@ -71,7 +70,7 @@ hotel.rooms[1].add_reservation(res3) - array = hotel.find_reservations_with_date( 1 , Date.new(2020, 02, 17), Date.new(2020, 02, 13)) + array = hotel.find_reservations_with_date(1 , Date.new(2020, 03, 07), Date.new(2020, 03, 13)) array.must_be_instance_of Array diff --git a/test/reservation_test.rb b/test/reservation_test.rb index e69de29bb..d6963694b 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -0,0 +1,29 @@ +require 'date' +require 'minitest/autorun' +require 'minitest/reporters' +require 'minitest/skip_dsl' + +require_relative '../lib/reservation' + + +describe "reservation" do + it "initializes a reservation correctly" do + reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 04), Date.new(2020, 03, 06)) + + reservation.must_be_instance_of HotelSystem::Reservation + + end + + it "total cost must be correct " do + reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 04), Date.new(2020, 03, 06)) + cost = reservation.get_total_cost + cost.must_equal 400 + + end + + it "must raise arguemnt error for invalid date " do + expect{HotelSystem::Reservation.new(500, Date.new(2020, 03, 01), Date.new(2020, 03, 06))}.must_raise ArgumentError + end + + +end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index e69de29bb..301fe09f4 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -0,0 +1,38 @@ +require 'date' +require 'minitest/autorun' +require 'minitest/reporters' +require 'minitest/skip_dsl' + +require_relative '../lib/hotel' +require_relative '../lib/room' +require_relative '../lib/reservation' + +describe "room" do + + it "creates an instance of room" do + + + + + end + it "I access the list of reservations for a specified room" do + res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) + + room = HotelSystem::Room.new(5, 200) + room.add_reservation(res1) + room.add_reservation(res2) + room.add_reservation(res3) + + res = room.reservations + + res.must_be_instance_of Array + + end + + + + + +end \ No newline at end of file From 32646370775d3db6e4c4ff75c56520c09cc9b0d9 Mon Sep 17 00:00:00 2001 From: quinqu Date: Tue, 3 Mar 2020 13:46:33 -0800 Subject: [PATCH 03/11] fixed uninitialized constant error --- lib/hotel.rb | 34 ++++++++++++++++++++++++++++------ lib/reservation.rb | 3 --- lib/room.rb | 31 ++++--------------------------- test/room_test.rb | 6 +----- 4 files changed, 33 insertions(+), 41 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 49ce2db80..b85fe652c 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -1,16 +1,12 @@ require_relative 'room' -require_relative 'reservation' +#require_relative 'reservation' module HotelSystem class Hotel attr_accessor :rooms def initialize - @rooms = [] - 20.times do |i| - @rooms << Room.new(i+1, 200, []) - end - + @rooms = create_rooms end @@ -30,6 +26,11 @@ def find_reservations_with_date(room_number, start_date, end_date) return reservs end + def get_all_rooms + @rooms.each do |room| + puts room + end + end def find_room(room_number) @rooms.each do |room| @@ -38,8 +39,29 @@ def find_room(room_number) end end end + + private + + def create_rooms + rooms = [] + 20.times do |i| + rooms << HotelSystem::Room.new(i+1, 200) + end + return rooms + end + end end +def main + hotel = HotelSystem::Hotel.new + hotel.get_all_rooms + + + +end + +main + diff --git a/lib/reservation.rb b/lib/reservation.rb index 4ff538dbb..2a80416c7 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,6 +1,3 @@ -require_relative 'date_range' -require_relative 'hotel' -require_relative 'room' require 'date' module HotelSystem diff --git a/lib/room.rb b/lib/room.rb index d8e89a309..166759a1d 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,15 +1,13 @@ -require_relative 'reservation' -require_relative 'hotel' module HotelSystem - class Room - attr_reader :room_number, :cost_per_night - attr_accessor :reservations + class Room + + attr_accessor :reservations,:room_number, :cost_per_night def initialize(room_number, cost_per_night, reservations=[]) @room_number = room_number @cost_per_night = cost_per_night - @reservations = [] + @reservations = reservations end def add_reservation(reservation) @@ -20,24 +18,3 @@ def add_reservation(reservation) end end - -def main - #res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) - #res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) - #res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) - - - #hotel = HotelSystem::Hotel.new - - #hotel.add_reservation(1, HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29))) - # hotel.rooms[1].add_reservation(res2) - # hotel.rooms[1].add_reservation(res3) - #hotel.to_s - - #array = hotel.find_reservations_with_date(2, Date.new(2020, 03, 18), Date.new(2020, 04, 02)) - - #puts array.to_s - -end - -main \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 301fe09f4..33c758404 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -10,7 +10,7 @@ describe "room" do it "creates an instance of room" do - + @@ -31,8 +31,4 @@ end - - - - end \ No newline at end of file From e09031b9be7f3cd04488c53c3aded62cebc39280 Mon Sep 17 00:00:00 2001 From: quinqu Date: Tue, 3 Mar 2020 15:50:21 -0800 Subject: [PATCH 04/11] working code --- lib/hotel.rb | 60 +++++++++++++++++++++++++++------------------ lib/room.rb | 5 ++++ test/hotel_test.rb | 61 +++++++++++++++++++++++++++++++++++++++++++++- test/room_test.rb | 9 ++++--- 4 files changed, 106 insertions(+), 29 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index b85fe652c..1e84921af 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -1,5 +1,5 @@ require_relative 'room' -#require_relative 'reservation' +require_relative 'reservation' module HotelSystem class Hotel @@ -10,26 +10,28 @@ def initialize end - def find_reservations_with_date(room_number, start_date, end_date) - #TODO find a parse method dates + def find_reservations_with_room_number(room_number, start_date, end_date) + room = find_room(room_number) - reservs = [] - room.reservations.each do |reservation| - if start_date - reservation.end_date < 0 - reservs << reservation - elsif end_date - reservation.end_date < 0 - reservs << reservation - else - ########### + list_reservations = [] + room.reservations.each do |reservation| + if is_between_two_dates([start_date, end_date], reservation.start_date) || is_between_two_dates([start_date, end_date], reservation.end_date) + list_reservations << reservation + end end - end - return reservs + return list_reservations end - def get_all_rooms + def list_reservations_dates(start_date, end_date) + list_reservations = [] @rooms.each do |room| - puts room + room.reservations.each do |reservation| + if is_between_two_dates([start_date, end_date], reservation.start_date) || is_between_two_dates([start_date, end_date], reservation.end_date) + list_reservations << reservation + end + end end + return list_reservations end def find_room(room_number) @@ -40,6 +42,21 @@ def find_room(room_number) end end + def find_reservation(reservation_number) + @rooms.each do |room| + room.reservations.each do |reservation| + if reservation.reservation_number == reservation_number + return reservation + end + end + end + end + + def total_cost(reservation_number) + res = find_reservation(reservation_number) + return res.total_cost + end + private def create_rooms @@ -49,19 +66,14 @@ def create_rooms end return rooms end - + + def is_between_two_dates(range_wanted, date) + return date >= range_wanted[0] && date <= range_wanted[1]; + end end end -def main - hotel = HotelSystem::Hotel.new - hotel.get_all_rooms - - - -end -main diff --git a/lib/room.rb b/lib/room.rb index 166759a1d..346751146 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,4 +1,5 @@ +require 'awesome_print' module HotelSystem class Room @@ -14,7 +15,11 @@ def add_reservation(reservation) @reservations << reservation end + def list_reservations + ap @reservations + end end end + diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 26bea6f87..0c34a3d56 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -70,11 +70,70 @@ hotel.rooms[1].add_reservation(res3) - array = hotel.find_reservations_with_date(1 , Date.new(2020, 03, 07), Date.new(2020, 03, 13)) + array = hotel.find_reservations_with_room_number(2 , Date.new(2020, 03, 07), Date.new(2020, 03, 13)) array.must_be_instance_of Array end + it "outputs the correct reservations" do + + + res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) + + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res3) + hotel.rooms[2].add_reservation(res1) + + array = hotel.list_reservations_dates(Date.new(2020, 03, 07), Date.new(2020, 03, 31)) + + array.must_equal [res2, res3] + end + + + it "finds the correct reservations given a room number" do + + res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) + + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res1) + hotel.rooms[10].add_reservation(res3) + + + array = hotel.find_reservations_with_room_number(11, Date.new(2020, 03, 07), Date.new(2020, 03, 31)) + + array.must_equal [res3] + + end + + + it "finds the correct reservations given a room number - test 2" do + + res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) + + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res1) + hotel.rooms[10].add_reservation(res3) + + + array = hotel.find_reservations_with_room_number(2, Date.new(2020, 03, 07), Date.new(2020, 03, 31)) + + array.must_equal [res2] + + end + + end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 33c758404..827398a59 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -10,11 +10,10 @@ describe "room" do it "creates an instance of room" do - - - - + room = HotelSystem::Room.new(7, 100) + room.must_be_instance_of HotelSystem::Room end + it "I access the list of reservations for a specified room" do res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) @@ -31,4 +30,6 @@ end + + end \ No newline at end of file From c91d50cf7c32cea6029edea5b124b93e7c5a4975 Mon Sep 17 00:00:00 2001 From: quinqu Date: Tue, 3 Mar 2020 17:17:13 -0800 Subject: [PATCH 05/11] added methods and some TODOs --- lib/hotel.rb | 14 ++++++++++++-- lib/reservation.rb | 8 ++++++++ lib/room.rb | 12 ++++++++++++ test/room_test.rb | 25 ++++++++++++++++++++++++- 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 1e84921af..3afc12923 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -9,9 +9,7 @@ def initialize @rooms = create_rooms end - def find_reservations_with_room_number(room_number, start_date, end_date) - room = find_room(room_number) list_reservations = [] room.reservations.each do |reservation| @@ -57,6 +55,18 @@ def total_cost(reservation_number) return res.total_cost end + def available_rooms(start_date, end_date) + #TODO create method + #try to use enumerables + end + + + def make_reservation(room_number) + #TODO create method + #try to + + end + private def create_rooms diff --git a/lib/reservation.rb b/lib/reservation.rb index 2a80416c7..6d6623cd5 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -23,5 +23,13 @@ def check_dates(start_date, end_date) end end + def reservation_in_progress + #TODO + + end + + + + end end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb index 346751146..75480a01c 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,5 +1,6 @@ require 'awesome_print' + module HotelSystem class Room @@ -18,6 +19,17 @@ def add_reservation(reservation) def list_reservations ap @reservations end + #this method only looks at the very last reservation + def is_room_available?(start_date, end_date) + return is_between_two_dates([start_date, end_date], @reservations.last.end_date) #&& is_between_two_dates([start_date, end_date], @reservations.last.start_date) + + end + + private + + def is_between_two_dates(range_wanted, date) + return date >= range_wanted[0] && date <= range_wanted[1]; + end end diff --git a/test/room_test.rb b/test/room_test.rb index 827398a59..9371912fd 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -13,7 +13,7 @@ room = HotelSystem::Room.new(7, 100) room.must_be_instance_of HotelSystem::Room end - + it "I access the list of reservations for a specified room" do res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) @@ -32,4 +32,27 @@ +end + +describe "class methods" do + it "returns a boolean for is_room_available?" do + res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) + + room = HotelSystem::Room.new(5, 200) + room.add_reservation(res1) + room.add_reservation(res2) + room.add_reservation(res3) + + #def is_room_available?(start_date, end_date) + + answer = room.is_room_available?(Date.new(2020, 03, 07), Date.new(2020, 03, 31)) # shoudl return false + + answer.must_equal false + + + end + + end \ No newline at end of file From 2c5efbf9eb7aad3e57a0f370b7bd566974540fdd Mon Sep 17 00:00:00 2001 From: quinqu Date: Wed, 4 Mar 2020 15:45:46 -0800 Subject: [PATCH 06/11] day 3 --- lib/hotel.rb | 44 ++++++++++++++++++++++++++++++++++++-------- lib/reservation.rb | 2 +- lib/room.rb | 3 ++- test/hotel_test.rb | 32 +++++++++++++++++++++++++++++--- test/room_test.rb | 18 +++++++++++++++--- 5 files changed, 83 insertions(+), 16 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 3afc12923..105ef64ba 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -1,5 +1,6 @@ require_relative 'room' require_relative 'reservation' +require 'awesome_print' module HotelSystem class Hotel @@ -15,7 +16,7 @@ def find_reservations_with_room_number(room_number, start_date, end_date) room.reservations.each do |reservation| if is_between_two_dates([start_date, end_date], reservation.start_date) || is_between_two_dates([start_date, end_date], reservation.end_date) list_reservations << reservation - end + end end return list_reservations end @@ -28,7 +29,7 @@ def list_reservations_dates(start_date, end_date) list_reservations << reservation end end - end + end return list_reservations end @@ -56,8 +57,15 @@ def total_cost(reservation_number) end def available_rooms(start_date, end_date) - #TODO create method - #try to use enumerables + list_rooms = [] + @rooms.each do |room| + if room.reservations.length == 0 || room.reservations == nil + list_rooms << room + elsif no_shared_days?(start_date, end_date, room.reservations.last) === true + list_rooms << room + end + end + return list_rooms end @@ -66,6 +74,26 @@ def make_reservation(room_number) #try to end + + def no_shared_days?(start_date, end_date, reservation) + count = 0 + reservation_start = reservation.start_date + reservation_end = reservation.end_date + i = 1 + + while start_date < end_date + while reservation_start < reservation_end + if start_date == reservation_start + count += 1 + end + reservation_start += 1 + end + reservation_start = reservation.start_date + i + start_date += 1 + i +=1 + end + return count < 2 + end private @@ -79,11 +107,11 @@ def create_rooms def is_between_two_dates(range_wanted, date) return date >= range_wanted[0] && date <= range_wanted[1]; - end - - end -end + end + + end +end diff --git a/lib/reservation.rb b/lib/reservation.rb index 6d6623cd5..73bffb159 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -23,7 +23,7 @@ def check_dates(start_date, end_date) end end - def reservation_in_progress + def reservation_in_progress? #TODO end diff --git a/lib/room.rb b/lib/room.rb index 75480a01c..2862171e6 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -17,7 +17,8 @@ def add_reservation(reservation) end def list_reservations - ap @reservations + res = ap @reservations + return res end #this method only looks at the very last reservation def is_room_available?(start_date, end_date) diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 0c34a3d56..53255b096 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -14,9 +14,7 @@ it "I can access the list of all of the rooms in the hotel" do hotel = HotelSystem::Hotel.new hotel.must_be_instance_of HotelSystem::Hotel - end - it "an element in Hotel object must be a room" do hotel = HotelSystem::Hotel.new room = hotel.rooms[1] @@ -25,7 +23,7 @@ end end -# def find_reservations_with_date(room_number, start_date, end_date) + describe "other instance methods" do @@ -133,7 +131,35 @@ array.must_equal [res2] + end + + it "finds the available rooms" do + res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) + + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res1) + hotel.rooms[10].add_reservation(res3) + + avail_rooms = hotel.available_rooms(Date.new(2020, 03, 06), Date.new(2020, 03, 18)) + + avail_rooms.must_be_instance_of Array + + end + it "evaluates overlapping correcty " do + hotel = HotelSystem::Hotel.new + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020, 03,29)) + answer = hotel.no_shared_days?(Date.new(2020, 03, 18), Date.new(2020, 04, 18), res3) + + + answer.must_equal false + + end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 9371912fd..8e6a3bffd 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -50,9 +50,21 @@ answer = room.is_room_available?(Date.new(2020, 03, 07), Date.new(2020, 03, 31)) # shoudl return false answer.must_equal false - - end - + # it "lists reservations" do + + # res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) + # res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) + # res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) + + # room = HotelSystem::Room.new(5, 200) + # room.add_reservation(res1) + # room.add_reservation(res2) + # room.add_reservation(res3) + + # printed = room.list_reservations() + + # printed.m + # end end \ No newline at end of file From a4b10c44992b3ab8c71de7830340fbe23c02e8e1 Mon Sep 17 00:00:00 2001 From: quinqu Date: Wed, 4 Mar 2020 17:15:29 -0800 Subject: [PATCH 07/11] got test helper working --- .DS_Store | Bin 6148 -> 6148 bytes lib/hotel.rb | 42 +++++++++++++++++++++++----- lib/room.rb | 14 +--------- test/hotel_test.rb | 59 +++++++++++++++++++++++++++++++-------- test/reservation_test.rb | 7 ++--- test/room_test.rb | 51 +++++++++++---------------------- test/test_helper.rb | 14 ++++++++-- 7 files changed, 115 insertions(+), 72 deletions(-) diff --git a/.DS_Store b/.DS_Store index 93c1b3c63dbfee06db9cb5885e1ca73c8e647483..2eca1a1d7def1519a9517a8c5ddafd1871ace879 100644 GIT binary patch delta 125 zcmZoMXfc@JFUrHfz`)4BAi%&-#E{64&XDSvlb^gAV`XXA( end_date_object.end_date + end_date_object = res + end + end - def make_reservation(room_number) - #TODO create method - #try to - - end + if room.reservations == [] + room.reservations << HotelSystem::Reservation.new(next_reservation_number, start_date, end_date) + elsif no_shared_days?(start_date, end_date, end_date_object) === true + room.reservations << HotelSystem::Reservation.new(next_reservation_number, start_date, end_date) + else + raise ArgumentError.new("you can't overlap reservations") + end + + end + + def no_shared_days?(start_date, end_date, reservation) count = 0 reservation_start = reservation.start_date reservation_end = reservation.end_date i = 1 - while start_date < end_date while reservation_start < reservation_end if start_date == reservation_start @@ -94,7 +108,9 @@ def no_shared_days?(start_date, end_date, reservation) end return count < 2 end + + #PRIVATE METHODS private def create_rooms @@ -105,11 +121,23 @@ def create_rooms return rooms end + #used for fine_reservations_for_room and list_reservations_with_date def is_between_two_dates(range_wanted, date) return date >= range_wanted[0] && date <= range_wanted[1]; end - + def next_reservation_number + max = 0 + @rooms.each do |room| + room.reservations.each do |reservation| + if max < reservation.reservation_number + max = reservation.reservation_number + end + + end + end + return max + 1 + end end end diff --git a/lib/room.rb b/lib/room.rb index 2862171e6..5a836cdf9 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -17,21 +17,9 @@ def add_reservation(reservation) end def list_reservations - res = ap @reservations - return res - end - #this method only looks at the very last reservation - def is_room_available?(start_date, end_date) - return is_between_two_dates([start_date, end_date], @reservations.last.end_date) #&& is_between_two_dates([start_date, end_date], @reservations.last.start_date) + return @reservations end - - private - - def is_between_two_dates(range_wanted, date) - return date >= range_wanted[0] && date <= range_wanted[1]; - end - end end diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 53255b096..0da7b366a 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -1,12 +1,9 @@ -require 'date' -require 'minitest/autorun' -require 'minitest/reporters' -require 'minitest/skip_dsl' -require_relative '../lib/hotel' -require_relative '../lib/room' -require_relative '../lib/reservation' + +require_relative 'test_helper' + + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new @@ -28,11 +25,8 @@ describe "other instance methods" do it "finds a room " do - hotel = HotelSystem::Hotel.new - room = hotel.find_room(1) - room.must_be_instance_of HotelSystem::Room end @@ -81,7 +75,7 @@ res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) - res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) hotel = HotelSystem::Hotel.new hotel.rooms[1].add_reservation(res2) @@ -162,4 +156,47 @@ end + it "must raise argument error if there is an invalid reservation" do + + hotel = HotelSystem::Hotel.new + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020, 03,29)) + hotel.rooms[1].add_reservation(res3) + #make_reservation(room_number, start_date, end_date) + + expect{hotel.make_reservation(2, Date.new(2020, 03, 07), Date.new(2020, 04, 1))}.must_raise ArgumentError + end + + it "must make a reservation inside of specified room" do + hotel = HotelSystem::Hotel.new + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020, 03, 18)) + hotel.rooms[1].add_reservation(res3) + + + hotel.make_reservation(2, Date.new(2020, 03, 18), Date.new(2020, 04, 01)) + + hotel.rooms[1].reservations.length.must_equal 2 + end + + it "finds the total cost of a reservation" do + + res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) + + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res1) + hotel.rooms[10].add_reservation(res3) + + + cost = hotel.total_cost(1) + + + cost.must_equal 600 + + end + end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index d6963694b..f33a41937 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,9 +1,6 @@ -require 'date' -require 'minitest/autorun' -require 'minitest/reporters' -require 'minitest/skip_dsl' -require_relative '../lib/reservation' +require_relative 'test_helper' + describe "reservation" do diff --git a/test/room_test.rb b/test/room_test.rb index 8e6a3bffd..789274bc7 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -1,17 +1,15 @@ -require 'date' -require 'minitest/autorun' -require 'minitest/reporters' -require 'minitest/skip_dsl' -require_relative '../lib/hotel' -require_relative '../lib/room' -require_relative '../lib/reservation' + +require_relative 'test_helper' + + describe "room" do it "creates an instance of room" do room = HotelSystem::Room.new(7, 100) room.must_be_instance_of HotelSystem::Room + room.room_number.must_be_instance_of Integer end it "I access the list of reservations for a specified room" do @@ -25,7 +23,6 @@ room.add_reservation(res3) res = room.reservations - res.must_be_instance_of Array end @@ -35,36 +32,22 @@ end describe "class methods" do - it "returns a boolean for is_room_available?" do - res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) - res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) - - room = HotelSystem::Room.new(5, 200) - room.add_reservation(res1) - room.add_reservation(res2) - room.add_reservation(res3) - - #def is_room_available?(start_date, end_date) - - answer = room.is_room_available?(Date.new(2020, 03, 07), Date.new(2020, 03, 31)) # shoudl return false - answer.must_equal false - end + - # it "lists reservations" do + it "lists reservations" do - # res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) - # res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) - # res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) + res1 = HotelSystem::Reservation.new(1, Date.today, Date.new(2020,03,29)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 29), Date.new(2020, 04,02)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 04, 06), Date.new(2020,04,18)) - # room = HotelSystem::Room.new(5, 200) - # room.add_reservation(res1) - # room.add_reservation(res2) - # room.add_reservation(res3) + room = HotelSystem::Room.new(5, 200) + room.add_reservation(res1) + room.add_reservation(res2) + room.add_reservation(res3) - # printed = room.list_reservations() + room.list_reservations.must_be_instance_of Array - # printed.m - # end + + end end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..f8840cea3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,8 +1,18 @@ -# Add simplecov +require "simplecov" +SimpleCov.start do + add_filter 'test/' +end +require 'date' require "minitest" require "minitest/autorun" require "minitest/reporters" Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -# require_relative your lib files here! + require_relative '../lib/hotel' + require_relative '../lib/room' + require_relative '../lib/reservation' + + + + From 43e146daf833e44d6d2e2669a48d36cf4a55cb9b Mon Sep 17 00:00:00 2001 From: quinqu Date: Wed, 4 Mar 2020 20:18:53 -0800 Subject: [PATCH 08/11] added tests --- .DS_Store | Bin 6148 -> 8196 bytes lib/hotel.rb | 14 +++++--------- test/hotel_test.rb | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/.DS_Store b/.DS_Store index 2eca1a1d7def1519a9517a8c5ddafd1871ace879..2cec8161516e3dc438609a2cdc7fcc51eddf9cf9 100644 GIT binary patch delta 123 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aMA$h$FMH}hr%jz7$c**Q2SHn1@A zPUc~8nOw@&&u(UDprc@9Jeix_X|p|xI`d|Kp8d>R65K%jt{@{e3vzsCp3E=eIoY3w PgM$%bI>Y98o;l0_= range_wanted[0] && date <= range_wanted[1]; diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 0da7b366a..574fcda7f 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -199,4 +199,21 @@ end + it " can make a reservation the same day one ends" do + #make_reservation(room_number, start_date, end_date) + res1 = HotelSystem::Reservation.new(1, Date.new(2020,03,05), Date.new(2020,03,06)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 11), Date.new(2020,04,02)) + + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res1) + hotel.make_reservation(2, Date.new(2020, 03, 11), Date.new(2020, 04, 02)) + + hotel.rooms[1].reservations.length.must_equal 3 + + + end + end \ No newline at end of file From 556c8617fe6a62a27113b703edca51eed6a2491a Mon Sep 17 00:00:00 2001 From: quinqu Date: Thu, 5 Mar 2020 08:40:40 -0800 Subject: [PATCH 09/11] added test for edge case and fixed some bugs --- lib/hotel.rb | 36 +++++++++++++++++++----------------- lib/reservation.rb | 9 --------- lib/room.rb | 1 - test/hotel_test.rb | 13 +++++++++++++ test/reservation_test.rb | 4 ++-- 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 1fdf6e52e..b9a33fa2b 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -1,6 +1,5 @@ require_relative 'room' require_relative 'reservation' -require 'awesome_print' module HotelSystem class Hotel @@ -11,7 +10,6 @@ def initialize 20.times do |i| @rooms << HotelSystem::Room.new(i+1, 200) end - end def find_reservations_with_room_number(room_number, start_date, end_date) @@ -75,16 +73,17 @@ def available_rooms(start_date, end_date) def make_reservation(room_number, start_date, end_date) room = find_room(room_number) - end_date_object = room.reservations[0] - room.reservations.each do |res| - if res.end_date > end_date_object.end_date - end_date_object = res - end - end - + true_for_all = [] if room.reservations == [] room.reservations << HotelSystem::Reservation.new(next_reservation_number, start_date, end_date) - elsif no_shared_days?(start_date, end_date, end_date_object) === true + else + room.reservations.each do |res| + if no_shared_days?(start_date, end_date, res) === true + true_for_all << true + end + end + end + if true_for_all.length == room.reservations.length room.reservations << HotelSystem::Reservation.new(next_reservation_number, start_date, end_date) else raise ArgumentError.new("you can't overlap reservations") @@ -92,16 +91,18 @@ def make_reservation(room_number, start_date, end_date) end - - + def no_shared_days?(start_date, end_date, reservation) count = 0 reservation_start = reservation.start_date reservation_end = reservation.end_date i = 1 while start_date < end_date + while reservation_start < reservation_end - if start_date == reservation_start + if start_date == reservation_start + puts "#{start_date} && #{reservation_start}" + puts " " count += 1 end reservation_start += 1 @@ -110,13 +111,15 @@ def no_shared_days?(start_date, end_date, reservation) start_date += 1 i +=1 end - return count < 2 + if (reservation.end_date - reservation.start_date == 1) && reservation_start == start_date + return false + else + return count < 2 + end end - #PRIVATE METHODS private - #used for fine_reservations_for_room and list_reservations_with_date def is_between_two_dates(range_wanted, date) return date >= range_wanted[0] && date <= range_wanted[1]; @@ -134,7 +137,6 @@ def next_reservation_number end return max + 1 end - end end diff --git a/lib/reservation.rb b/lib/reservation.rb index 73bffb159..f0742d142 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -22,14 +22,5 @@ def check_dates(start_date, end_date) raise ArgumentError.new("Invalid date, you can't start or end a reservation in the past") end end - - def reservation_in_progress? - #TODO - - end - - - - end end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb index 5a836cdf9..cf0b94820 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -18,7 +18,6 @@ def add_reservation(reservation) def list_reservations return @reservations - end end diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 574fcda7f..f12270b50 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -216,4 +216,17 @@ end + it " can make a reservation the same day one ends" do + #make_reservation(room_number, start_date, end_date) + res1 = HotelSystem::Reservation.new(1, Date.new(2020,03,05), Date.new(2020,03,06)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + + #should raise argument error + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res1) + expect{hotel.make_reservation(2, Date.new(2020, 03, 05), Date.new(2020, 04, 02))}.must_raise ArgumentError + + end + end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index f33a41937..aaab512d9 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -5,14 +5,14 @@ describe "reservation" do it "initializes a reservation correctly" do - reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 04), Date.new(2020, 03, 06)) + reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 05), Date.new(2020, 03, 06)) reservation.must_be_instance_of HotelSystem::Reservation end it "total cost must be correct " do - reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 04), Date.new(2020, 03, 06)) + reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 10), Date.new(2020, 03, 12)) cost = reservation.get_total_cost cost.must_equal 400 From b7072ef5045308679b44bfebf0d5472bc6844172 Mon Sep 17 00:00:00 2001 From: quinqu Date: Fri, 6 Mar 2020 10:15:48 -0800 Subject: [PATCH 10/11] fixed no_shared_days? --- .DS_Store | Bin 8196 -> 8196 bytes lib/hotel.rb | 68 ++++++++++++++++++++++++++++----------- lib/room.rb | 2 +- lib/roomblock.rb | 17 ++++++++++ test/hotel_test.rb | 49 ++++++++++++++++++++++------ test/reservation_test.rb | 6 ++-- 6 files changed, 110 insertions(+), 32 deletions(-) create mode 100644 lib/roomblock.rb diff --git a/.DS_Store b/.DS_Store index 2cec8161516e3dc438609a2cdc7fcc51eddf9cf9..ec1f5adfbd54fbcfa0267d820f871a849b605352 100644 GIT binary patch delta 58 zcmZp1XmQw(E5OFd!O6kPF}YDVNe;y1j2Doot~N3;*HJJsHmcQ8s5Un@&`~fkGnmXM LV!ByF@D3jUeY6cd delta 28 jcmZp1XmQw(D=@iQxQN}%&_GAQ$awM>VW-U+f_L};iQx%K diff --git a/lib/hotel.rb b/lib/hotel.rb index b9a33fa2b..3ce9c212c 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -4,7 +4,7 @@ module HotelSystem class Hotel attr_accessor :rooms - + def initialize @rooms = [] #create_rooms 20.times do |i| @@ -73,52 +73,58 @@ def available_rooms(start_date, end_date) def make_reservation(room_number, start_date, end_date) room = find_room(room_number) + true_for_all = [] - if room.reservations == [] - room.reservations << HotelSystem::Reservation.new(next_reservation_number, start_date, end_date) + if room.reservations == [] + room.reservations << HotelSystem::Reservation.new(next_reservation_number, start_date, end_date) else - room.reservations.each do |res| - if no_shared_days?(start_date, end_date, res) === true - true_for_all << true - end - end + room.reservations.each do |res| + if no_shared_days?(start_date, end_date, res) === true + true_for_all << true + end + end end + if true_for_all.length == room.reservations.length room.reservations << HotelSystem::Reservation.new(next_reservation_number, start_date, end_date) else raise ArgumentError.new("you can't overlap reservations") end - end + + + + # def make_reservation_block(block, start_date, end_date) + # block.each do |room| + # make_reservation(room.room_number, start_date, end_date) + # end + # end def no_shared_days?(start_date, end_date, reservation) count = 0 reservation_start = reservation.start_date reservation_end = reservation.end_date - i = 1 while start_date < end_date while reservation_start < reservation_end if start_date == reservation_start - puts "#{start_date} && #{reservation_start}" - puts " " count += 1 end - reservation_start += 1 + reservation_start = reservation_start + 1 end - reservation_start = reservation.start_date + i + reservation_start = reservation.start_date start_date += 1 - i +=1 end + if (reservation.end_date - reservation.start_date == 1) && reservation_start == start_date return false else return count < 2 end + end - - #PRIVATE METHODS + private #used for fine_reservations_for_room and list_reservations_with_date def is_between_two_dates(range_wanted, date) @@ -136,8 +142,34 @@ def next_reservation_number end end return max + 1 - end + end + end end +def main + # hotel = HotelSystem::Hotel.new + # #puts hotel.rooms.to_s + + # hotel.make_reservation_block([hotel.rooms[0], hotel.rooms[1], hotel.rooms[2], hotel.rooms[3]], Date.new(2020, 03, 10), Date.new(2020, 03, 18)) + + # puts hotel.rooms.to_s + #res1 = HotelSystem::Reservation.new(1, Date.new(2020,03,9), Date.new(2020,03,12)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 14), Date.new(2020, 03,17)) + + #should raise argument error + hotel = HotelSystem::Hotel.new + #hotel.rooms[1].add_reservation(res2) + #hotel.rooms[1].add_reservation(res1) + ans = hotel.no_shared_days?(Date.new(2020, 03, 10), Date.new(2020, 03, 14), res2) + + puts ans + + + + +end + + +main diff --git a/lib/room.rb b/lib/room.rb index cf0b94820..1cc755c46 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -9,7 +9,7 @@ class Room def initialize(room_number, cost_per_night, reservations=[]) @room_number = room_number @cost_per_night = cost_per_night - @reservations = reservations + @reservations = [] end def add_reservation(reservation) diff --git a/lib/roomblock.rb b/lib/roomblock.rb new file mode 100644 index 000000000..f3f18f383 --- /dev/null +++ b/lib/roomblock.rb @@ -0,0 +1,17 @@ +module HotelSystem + class RoomBlock + + attr_accessor :block + + def initialize(block, discount_rate) + if @block.length > 5 + raise ArgumentError.new("you can't reserve more than 5 rooms in a block") + end + @block = block #array or rooms + @cost_per_night = (@block.length * 200) - ((@block.length) * 200) * ((@discount_rate/100) ) + end + end + + + +end \ No newline at end of file diff --git a/test/hotel_test.rb b/test/hotel_test.rb index f12270b50..8558caa32 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -201,32 +201,61 @@ it " can make a reservation the same day one ends" do #make_reservation(room_number, start_date, end_date) - res1 = HotelSystem::Reservation.new(1, Date.new(2020,03,05), Date.new(2020,03,06)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + res1 = HotelSystem::Reservation.new(1, Date.new(2020,03, 10), Date.new(2020,03,12)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 18), Date.new(2020, 03,20)) - res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 11), Date.new(2020,04,02)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 20), Date.new(2020,04,02)) hotel = HotelSystem::Hotel.new hotel.rooms[1].add_reservation(res2) hotel.rooms[1].add_reservation(res1) - hotel.make_reservation(2, Date.new(2020, 03, 11), Date.new(2020, 04, 02)) + hotel.make_reservation(2, Date.new(2020, 03, 12), Date.new(2020, 03, 15)) hotel.rooms[1].reservations.length.must_equal 3 end - it " can make a reservation the same day one ends" do - #make_reservation(room_number, start_date, end_date) - res1 = HotelSystem::Reservation.new(1, Date.new(2020,03,05), Date.new(2020,03,06)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + it " can raise argument error if days are overlapped" do + + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 18), Date.new(2020, 03,20)) + + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 20), Date.new(2020,04,02)) + #should raise argument error hotel = HotelSystem::Hotel.new hotel.rooms[1].add_reservation(res2) - hotel.rooms[1].add_reservation(res1) - expect{hotel.make_reservation(2, Date.new(2020, 03, 05), Date.new(2020, 04, 02))}.must_raise ArgumentError + hotel.rooms[1].add_reservation(res3) + expect{hotel.make_reservation(2, Date.new(2020, 03, 10), Date.new(2020, 04, 01))}.must_raise ArgumentError end + it "can return the right answer for no_shared_days?" do + res1 = HotelSystem::Reservation.new(1, Date.new(2020,03,10), Date.new(2020,03,12)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 14), Date.new(2020, 03,17)) + + #should raise argument error + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + #hotel.rooms[1].add_reservation(res1) + ans = hotel.no_shared_days?(Date.new(2020, 03, 25), Date.new(2020, 03, 30), res2) + ans.must_equal true + + + end + + it "can return the right answer for no_shared_days?" do + res1 = HotelSystem::Reservation.new(1, Date.new(2020,03,9), Date.new(2020,03,12)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 14), Date.new(2020, 03,17)) + + #should raise argument error + hotel = HotelSystem::Hotel.new + hotel.rooms[1].add_reservation(res2) + hotel.rooms[1].add_reservation(res1) + ans = hotel.no_shared_days?(Date.new(2020, 03, 10), Date.new(2020, 03, 30), res2) + ans.must_equal false + + + end end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb index aaab512d9..370cd53fa 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -5,16 +5,16 @@ describe "reservation" do it "initializes a reservation correctly" do - reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 05), Date.new(2020, 03, 06)) + reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 18), Date.new(2020, 03, 20)) reservation.must_be_instance_of HotelSystem::Reservation end it "total cost must be correct " do - reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 10), Date.new(2020, 03, 12)) + reservation = HotelSystem::Reservation.new(500, Date.new(2020, 03, 18), Date.new(2020, 03, 21)) cost = reservation.get_total_cost - cost.must_equal 400 + cost.must_equal 600 end From 205b95a59c18f33055454658f7da97388cf8e907 Mon Sep 17 00:00:00 2001 From: quinqu Date: Mon, 9 Mar 2020 08:38:10 -0700 Subject: [PATCH 11/11] final additions --- lib/hotel.rb | 64 +++++++++++++++++++--------------------------- lib/room.rb | 1 + test/hotel_test.rb | 37 +++++++++++++++++++++------ test/room_test.rb | 2 ++ 4 files changed, 58 insertions(+), 46 deletions(-) diff --git a/lib/hotel.rb b/lib/hotel.rb index 3ce9c212c..778e5b5c2 100644 --- a/lib/hotel.rb +++ b/lib/hotel.rb @@ -6,11 +6,26 @@ class Hotel attr_accessor :rooms def initialize - @rooms = [] #create_rooms + @rooms = [] 20.times do |i| @rooms << HotelSystem::Room.new(i+1, 200) end end + #the block can only be the last 5 rooms 15-20 + # def make_reservation_block(start_date, end_date, rooms_numbers, rate) + # rooms = [] + # rooms_numbers.each do |num| + # if num > 20 || num < 15 + # raise ArgumentError.new("you can only reserve rooms 15-20 for a block reservation") + # end + # rooms << find_room(num) + # end + + # rooms.each do |room| + # room.cost_per_night = cost_with_discount(rate, room) + # make_reservation(room.room_number, start_date, end_date) + # end + # end def find_reservations_with_room_number(room_number, start_date, end_date) room = find_room(room_number) @@ -50,12 +65,11 @@ def find_reservation(reservation_number) return reservation end end - end + end end def total_cost(reservation_number) - res = find_reservation(reservation_number) - return res.total_cost + return find_reservation(reservation_number).total_cost end def available_rooms(start_date, end_date) @@ -75,7 +89,8 @@ def make_reservation(room_number, start_date, end_date) room = find_room(room_number) true_for_all = [] - if room.reservations == [] + + if room.reservations.length == 0 room.reservations << HotelSystem::Reservation.new(next_reservation_number, start_date, end_date) else room.reservations.each do |res| @@ -92,21 +107,13 @@ def make_reservation(room_number, start_date, end_date) end end - - - # def make_reservation_block(block, start_date, end_date) - # block.each do |room| - # make_reservation(room.room_number, start_date, end_date) - # end - # end - + #there may be some cases where a reservation starts when one ends, but trust me it still works the method name isn't very accurate def no_shared_days?(start_date, end_date, reservation) count = 0 reservation_start = reservation.start_date reservation_end = reservation.end_date while start_date < end_date - while reservation_start < reservation_end if start_date == reservation_start count += 1 @@ -116,16 +123,15 @@ def no_shared_days?(start_date, end_date, reservation) reservation_start = reservation.start_date start_date += 1 end - if (reservation.end_date - reservation.start_date == 1) && reservation_start == start_date return false else return count < 2 end - end private + #used for fine_reservations_for_room and list_reservations_with_date def is_between_two_dates(range_wanted, date) return date >= range_wanted[0] && date <= range_wanted[1]; @@ -144,32 +150,14 @@ def next_reservation_number return max + 1 end + def cost_with_discount(rate, room) + return room.cost_per_night - (room.cost_per_night*(rate/100)) + end end end def main - # hotel = HotelSystem::Hotel.new - # #puts hotel.rooms.to_s - - # hotel.make_reservation_block([hotel.rooms[0], hotel.rooms[1], hotel.rooms[2], hotel.rooms[3]], Date.new(2020, 03, 10), Date.new(2020, 03, 18)) - - # puts hotel.rooms.to_s - #res1 = HotelSystem::Reservation.new(1, Date.new(2020,03,9), Date.new(2020,03,12)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 14), Date.new(2020, 03,17)) - - #should raise argument error - hotel = HotelSystem::Hotel.new - #hotel.rooms[1].add_reservation(res2) - #hotel.rooms[1].add_reservation(res1) - ans = hotel.no_shared_days?(Date.new(2020, 03, 10), Date.new(2020, 03, 14), res2) - - puts ans - - - - -end - +end main diff --git a/lib/room.rb b/lib/room.rb index 1cc755c46..9ca2be0a4 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -19,6 +19,7 @@ def add_reservation(reservation) def list_reservations return @reservations end + end end diff --git a/test/hotel_test.rb b/test/hotel_test.rb index 8558caa32..8a6307a4e 100644 --- a/test/hotel_test.rb +++ b/test/hotel_test.rb @@ -73,7 +73,7 @@ res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 10), Date.new(2020, 03,11)) res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) @@ -91,7 +91,7 @@ it "finds the correct reservations given a room number" do res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 10), Date.new(2020, 03,11)) res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) @@ -111,7 +111,7 @@ it "finds the correct reservations given a room number - test 2" do res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 10), Date.new(2020, 03,12)) res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) @@ -129,7 +129,7 @@ it "finds the available rooms" do res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 10), Date.new(2020, 03,18)) res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) @@ -148,7 +148,7 @@ it "evaluates overlapping correcty " do hotel = HotelSystem::Hotel.new - res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020, 03,29)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 10), Date.new(2020, 03,29)) answer = hotel.no_shared_days?(Date.new(2020, 03, 18), Date.new(2020, 04, 18), res3) @@ -160,7 +160,7 @@ hotel = HotelSystem::Hotel.new - res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020, 03,29)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 10), Date.new(2020, 03,29)) hotel.rooms[1].add_reservation(res3) #make_reservation(room_number, start_date, end_date) @@ -170,7 +170,7 @@ it "must make a reservation inside of specified room" do hotel = HotelSystem::Hotel.new - res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 06), Date.new(2020, 03, 18)) + res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 10), Date.new(2020, 03, 18)) hotel.rooms[1].add_reservation(res3) @@ -182,7 +182,7 @@ it "finds the total cost of a reservation" do res1 = HotelSystem::Reservation.new(1, Date.new(2020,04,03), Date.new(2020,04,06)) - res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 06), Date.new(2020, 03,11)) + res2 = HotelSystem::Reservation.new(2, Date.new(2020, 03, 10), Date.new(2020, 03,11)) res3 = HotelSystem::Reservation.new(3, Date.new(2020, 03, 31), Date.new(2020,04,02)) @@ -258,4 +258,25 @@ end + + # it "raises argument error when given invalid rooms" do + # hotel = HotelSystem::Hotel.new + # expect{hotel.make_reservation_block(Date.new(2020, 03, 14), Date.new(2020, 03, 18), [1, 2, 3], 15)}.must_raise ArgumentError + # end + + # it "makes a reservation block" do + # hotel = HotelSystem::Hotel.new + + # hotel.make_reservation_block(Date.new(2020, 05, 28), Date.new(2020, 05, 30), [19, 18], 15) + # puts hotel.rooms[18].reservations.to_s + # hotel.rooms[18].reservations.length.must_equal 1 + # end + + + + # it "will not make a reservation from reservation block if room is booked" do + # hotel = HotelSystem::Hotel.new + # expect{hotel.make_reservation_block(Date.new(2020, 03, 14), Date.new(2020, 03, 18), [19, 18, 20], 15)}.must_raise ArgumentError + + # end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 789274bc7..1178fc555 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -50,4 +50,6 @@ end + + end \ No newline at end of file