From 9dddf8201a81d64285aa93316120f7e286da782d Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Tue, 3 Sep 2019 14:32:18 -0700 Subject: [PATCH 01/25] created files for classes --- lib/calendar.rb | 7 +++++++ lib/hotel_block.rb | 5 +++++ lib/hotel_booker.rb | 5 +++++ lib/reservation.rb | 4 ++++ lib/room.rb | 4 ++++ test/calendar_test.rb | 0 test/hotel_block_test.rb | 0 test/hotel_booker_test.rb | 0 test/reservation_test.rb | 0 test/room_test.rb | 0 10 files changed, 25 insertions(+) create mode 100644 lib/calendar.rb create mode 100644 lib/hotel_block.rb create mode 100644 lib/hotel_booker.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 test/calendar_test.rb create mode 100644 test/hotel_block_test.rb create mode 100644 test/hotel_booker_test.rb create mode 100644 test/reservation_test.rb create mode 100644 test/room_test.rb diff --git a/lib/calendar.rb b/lib/calendar.rb new file mode 100644 index 000000000..4f634ff7e --- /dev/null +++ b/lib/calendar.rb @@ -0,0 +1,7 @@ +class Calendar + + + + + +end diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb new file mode 100644 index 000000000..b893bba34 --- /dev/null +++ b/lib/hotel_block.rb @@ -0,0 +1,5 @@ +class HotelBlock + + + +end \ No newline at end of file diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb new file mode 100644 index 000000000..5118970aa --- /dev/null +++ b/lib/hotel_booker.rb @@ -0,0 +1,5 @@ +class HotelBooker + + + +end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..39688a87c --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,4 @@ +class Reservation + + +end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..db3542851 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,4 @@ +class Room + + +end \ No newline at end of file diff --git a/test/calendar_test.rb b/test/calendar_test.rb new file mode 100644 index 000000000..e69de29bb diff --git a/test/hotel_block_test.rb b/test/hotel_block_test.rb new file mode 100644 index 000000000..e69de29bb diff --git a/test/hotel_booker_test.rb b/test/hotel_booker_test.rb new file mode 100644 index 000000000..e69de29bb 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 50b6dbfe11528026d6180effccc5b39c62866faa Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Thu, 5 Sep 2019 09:28:19 -0700 Subject: [PATCH 02/25] deleted hotel block/ room and added initialize to hotel booker and reservation --- lib/calendar.rb | 2 ++ lib/hotel_block.rb | 5 ----- lib/hotel_booker.rb | 44 +++++++++++++++++++++++++++++++++++++++++++- lib/reservation.rb | 20 ++++++++++++++++++++ lib/room.rb | 4 ---- 5 files changed, 65 insertions(+), 10 deletions(-) delete mode 100644 lib/hotel_block.rb delete mode 100644 lib/room.rb diff --git a/lib/calendar.rb b/lib/calendar.rb index 4f634ff7e..18867a39c 100644 --- a/lib/calendar.rb +++ b/lib/calendar.rb @@ -1,5 +1,7 @@ class Calendar +def initialize +end diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb deleted file mode 100644 index b893bba34..000000000 --- a/lib/hotel_block.rb +++ /dev/null @@ -1,5 +0,0 @@ -class HotelBlock - - - -end \ No newline at end of file diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 5118970aa..b25b56cd9 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -1,5 +1,47 @@ + +require_relative 'reservation' + class HotelBooker + attr_reader :rooms, :reservations + + + def initialize + @rooms = [] + @reservations = [] + end + + def find_available_room(start_date, end_date) + Calendar.new(start_date, end_date) + + + end + def create_reservation(start_date, end_date) + find_available_room(start_date, end_date) + + Reservation.new() + + + end + + + def find_reservation_by_date (date) + + + + end + + + + + + + +end + + + + + -end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb index 39688a87c..229b205a2 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,4 +1,24 @@ class Reservation + attr_reader :id, :start_date, :end_date,:room + + def initialize (id:, start_date:, end_date:, room:) + @id = id + @start_date = start_date + @end_date = end_date + @room = room + + if end_date < start_date + raise ArgumentError.new "Invalid Date Range (end date is before start date)" + + end + + end + + # guest does not have to pay for last day + def total_cost + + end + end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb deleted file mode 100644 index db3542851..000000000 --- a/lib/room.rb +++ /dev/null @@ -1,4 +0,0 @@ -class Room - - -end \ No newline at end of file From f1bea5a2310bb9968c1c36a82256d7316cbc541e Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Thu, 5 Sep 2019 09:30:23 -0700 Subject: [PATCH 03/25] deleted tests for hotel block/ room and added to test_helper --- test/hotel_block_test.rb | 0 test/room_test.rb | 0 test/test_helper.rb | 9 +++++++++ 3 files changed, 9 insertions(+) delete mode 100644 test/hotel_block_test.rb delete mode 100644 test/room_test.rb diff --git a/test/hotel_block_test.rb b/test/hotel_block_test.rb deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/room_test.rb b/test/room_test.rb deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..533f280aa 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,8 +1,17 @@ # Add simplecov +require 'simplecov' +SimpleCov.start do + add_filter 'test/' +end require "minitest" require "minitest/autorun" require "minitest/reporters" + + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # require_relative your lib files here! +require_relative '../lib/calendar' +require_relative '../lib/hotel_booker' +require_relative '../lib/reservation' From 69a23e0aa8895f0cb0b6d4f92b5864b626b81d5b Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Fri, 6 Sep 2019 23:35:46 -0700 Subject: [PATCH 04/25] added tests for total_cost method --- test/reservation_test.rb | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index e69de29bb..f3c89584c 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -0,0 +1,32 @@ +require_relative 'test_helper' + +describe "Wave 1 Reservation Tests" do + describe "Initialize" do + + + end + + describe "total_cost method" do + before do + + @start_time = Date.new(2019,9,6) + @end_time = Date.new(2019,9,9) + @reservation = Reservation.new(id: 1, start_date: @start_time, end_date: @end_time, room: 5 ) + + end + it "checks that it returns an instance of an integer" do + expect(@reservation.total_cost).must_be_instance_of Integer + + end + + it "checks that it returns accurate calculation" do + expect(@reservation.total_cost).must_equal 600 + + end + + + + end + + +end \ No newline at end of file From a252425dcfa7986605e15b7c33e04e1698fb1d0f Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Fri, 6 Sep 2019 23:39:35 -0700 Subject: [PATCH 05/25] added total cost method and removed date range validation --- lib/reservation.rb | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 229b205a2..244d9c5ad 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,24 +1,15 @@ class Reservation attr_reader :id, :start_date, :end_date,:room - + def initialize (id:, start_date:, end_date:, room:) @id = id @start_date = start_date @end_date = end_date - @room = room - - if end_date < start_date - raise ArgumentError.new "Invalid Date Range (end date is before start date)" - - end - + @room = room end - - # guest does not have to pay for last day + def total_cost - + 200 * (end_date - start_date).to_i end - - - + end \ No newline at end of file From 84c975200c31a76dc5c52c27ec1c742df4b9de4e Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sat, 7 Sep 2019 16:38:15 -0700 Subject: [PATCH 06/25] added code for find_available_room, added code for create_reservation, changed @reservations and @rooms --- lib/hotel_booker.rb | 77 +++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index b25b56cd9..4ab08c951 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -1,47 +1,50 @@ -require_relative 'reservation' +require_relative "reservation" -class HotelBooker - attr_reader :rooms, :reservations - - - def initialize - @rooms = [] - @reservations = [] - end - - def find_available_room(start_date, end_date) - Calendar.new(start_date, end_date) +class HotelBooker + attr_reader :rooms, :reservations - - end - def create_reservation(start_date, end_date) - find_available_room(start_date, end_date) - - Reservation.new() + def initialize + @rooms = (1..20).map { |i| i } + @reservations = {} + @rooms.each do |room| + @reservations[room] = [] + end + end + + def find_available_room(start_date, end_date) + available_rooms = [] + @reservations.each do |room, reservations| + if reservations.empty? + available_rooms = @rooms + else + reservations.each do |reservation| + date_range = Calendar.new(start_date, end_date) + + if !date_range.overlap(reservation) + available_rooms << room + end + end + end end - - - def find_reservation_by_date (date) - - - - end - - + return available_rooms + end + def create_reservation(id, start_date, end_date) + found_rooms = find_available_room(start_date, end_date) + if found_rooms.empty? + raise ArgumentError " no available rooms " + else + new_reservation = Reservation.new(id: id, start_date: start_date, end_date: end_date, room: found_rooms.first) + @reservations[found_rooms.first] = @reservations[found_rooms.first] << new_reservation - - -end - - - - - - - + return new_reservation + end + end + # def find_reservation_by_date(date) + # end +end From d54afa730d311e5ee0be27fcae3450cabb1a387a Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sat, 7 Sep 2019 16:40:29 -0700 Subject: [PATCH 07/25] added some tests for initialize, create_reservation, and find_available_room --- test/hotel_booker_test.rb | 44 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/test/hotel_booker_test.rb b/test/hotel_booker_test.rb index e69de29bb..9ae5ce30d 100644 --- a/test/hotel_booker_test.rb +++ b/test/hotel_booker_test.rb @@ -0,0 +1,44 @@ +require_relative "test_helper" + +describe "Wave 1 " do + describe "initialize" do + before do + @hotel = HotelBooker.new + end + it "creates 20 rooms " do + expect(@hotel.rooms.length).must_equal 20 + end + it "checks that rooms are integers" do + expect(@hotel.rooms).must_be_instance_of Array + @hotel.rooms.each do |room| + expect(room).must_be_instance_of Integer + end + end + end + + describe " create_reservation" do + it "returns a reservation" do + hotel = HotelBooker.new + reservation = hotel.create_reservation(1, Date.new(2019, 2, 3), Date.new(2019, 2, 6)) + expect(reservation).must_be_instance_of Reservation + end + + it "checks if it adds the reservation " do + hotel = HotelBooker.new + + end + + describe "find_reservation_by_date" do + it "" do + end + end +end +describe "Wave 2" do + describe "find_available_room" do + it "returns an array of available rooms" do + hotel = HotelBooker.new + available_rooms = hotel.find_available_room(Date.new(2019, 2, 5), Date.new(2019, 2, 9)) + expect(available_rooms).must_be_instance_of Array + end + end +end From ac5ec55c04f9c9b2e67a1e0dfa8ed132dd663e15 Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 11:46:52 -0700 Subject: [PATCH 08/25] addded tests for overlap and invalid date range --- test/calendar_test.rb | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/calendar_test.rb b/test/calendar_test.rb index e69de29bb..580870dd7 100644 --- a/test/calendar_test.rb +++ b/test/calendar_test.rb @@ -0,0 +1,33 @@ +require_relative "test_helper" + +describe "wave 2" do + describe "initialize " do + it "raises an argument error for invalid date range" do + expect { Calendar.new(start_date: Date.new(2019, 2, 9), end_date: Date.new(2019, 2, 3)) }.must_raise ArgumentError + end + end + describe "overlap?" do + before do + @reservation = Reservation.new(id: 1, start_date: Date.new(2019, 2, 5), end_date: Date.new(2019, 2, 9), room: 5) + end + + it "new reservation endate overlaps " do + date_range = Calendar.new(start_date: Date.new(2019, 2, 3), end_date: Date.new(2019, 2, 6)) + expect(date_range.overlap?(@reservation)).must_equal true + end + + it " new reserveration start overlaps" do + date_range = Calendar.new(start_date: Date.new(2019, 2, 6), end_date: Date.new(2019, 2, 11)) + expect(date_range.overlap?(@reservation)).must_equal true + end + + it " new reservation start_date and end_date both overlap" do + date_range = Calendar.new(start_date: Date.new(2019, 2, 6), end_date: Date.new(2019, 2, 8)) + expect(date_range.overlap?(@reservation)).must_equal true + end + it "new reservation includes start_date and endate of current reservation" do + date_range = Calendar.new(start_date: Date.new(2019, 2, 3), end_date: Date.new(2019, 2, 14)) + expect(date_range.overlap?(@reservation)).must_equal true + end + end +end From b918e26820f8bd560ac2f3d3f774812e74a7e592 Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 11:47:54 -0700 Subject: [PATCH 09/25] made overlap boolean zen --- lib/calendar.rb | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/calendar.rb b/lib/calendar.rb index 18867a39c..2fe18e3a3 100644 --- a/lib/calendar.rb +++ b/lib/calendar.rb @@ -1,9 +1,16 @@ -class Calendar -def initialize +class Calendar + attr_reader :start_date, :end_date -end + def initialize(start_date:, end_date:) + @start_date = start_date + @end_date = end_date + if end_date < start_date + raise ArgumentError.new "Invalid Date Range (end date is before start date)" + end + end - - -end + def overlap?(current_reservation) + return !(current_reservation.start_date >= @end_date || current_reservation.end_date < @start_date) + end +end From 30893c2e76531d77c136269d0e0549c86477142b Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 15:26:50 -0700 Subject: [PATCH 10/25] fixed available rooms method --- lib/hotel_booker.rb | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 4ab08c951..3f0a7b341 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -18,14 +18,11 @@ def find_available_room(start_date, end_date) available_rooms = [] @reservations.each do |room, reservations| if reservations.empty? - available_rooms = @rooms + available_rooms << room else - reservations.each do |reservation| - date_range = Calendar.new(start_date, end_date) - - if !date_range.overlap(reservation) - available_rooms << room - end + date_range = Calendar.new(start_date: start_date, end_date: end_date) + if reservations.all? { |reservation| !date_range.overlap?(reservation) } + available_rooms << room end end end @@ -35,16 +32,17 @@ def find_available_room(start_date, end_date) def create_reservation(id, start_date, end_date) found_rooms = find_available_room(start_date, end_date) + if found_rooms.empty? raise ArgumentError " no available rooms " else new_reservation = Reservation.new(id: id, start_date: start_date, end_date: end_date, room: found_rooms.first) @reservations[found_rooms.first] = @reservations[found_rooms.first] << new_reservation - + return new_reservation end end - # def find_reservation_by_date(date) - # end + def find_reservation_by_date(date) + end end From 44b100d05c702191260d5610fbb8175cbd1a9f5b Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 17:44:29 -0700 Subject: [PATCH 11/25] added find_reservation_by_date method --- lib/hotel_booker.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index 3f0a7b341..a577bb414 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -1,5 +1,6 @@ -require_relative "reservation" +require_relative 'reservation' +require_relative 'calendar' class HotelBooker attr_reader :rooms, :reservations @@ -44,5 +45,22 @@ def create_reservation(id, start_date, end_date) end def find_reservation_by_date(date) + reservations_for_date = [] + @reservations.each do |room, reservations| + reservations.each do |reservation| + days = (reservation.end_date - reservation.start_date + 1).to_i + current_date = reservation.end_date + + days.times do + if date == current_date + reservations_for_date << reservation + break + end + current_date -= 1 + end + end + end + + return reservations_for_date end end From 590e501f91b5ab98d7809472aa55579cdcf9ad42 Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 18:08:28 -0700 Subject: [PATCH 12/25] added tests for available rooms method and find reservation by date --- test/hotel_booker_test.rb | 64 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/test/hotel_booker_test.rb b/test/hotel_booker_test.rb index 9ae5ce30d..b4954dbe9 100644 --- a/test/hotel_booker_test.rb +++ b/test/hotel_booker_test.rb @@ -23,13 +23,50 @@ expect(reservation).must_be_instance_of Reservation end - it "checks if it adds the reservation " do + it "checks if new reservation is added to reservations" do hotel = HotelBooker.new - + new_res = hotel.create_reservation(1, Date.new(2019, 2, 5), Date.new(2019, 2, 9)) + expect(hotel.reservations[1].length).must_equal 1 + end + it "doesnt make conflicting reservations for the same room" do + hotel = HotelBooker.new + hotel.create_reservation(1, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) + hotel.create_reservation(4, Date.new(2019, 2, 7), Date.new(2019, 2, 10)) + + puts hotel.reservations + expect(hotel.reservations[1].length).must_equal 1 + expect(hotel.reservations[2].length).must_equal 1 + end + it "checks that new reservations start on checkout days" do + hotel = HotelBooker.new + hotel.create_reservation(1, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) + hotel.create_reservation(2, Date.new(2019, 2, 1), Date.new(2019, 2, 6)) + expect(hotel.reservations[1].length).must_equal 2 + end end describe "find_reservation_by_date" do - it "" do + before do + @hotel = HotelBooker.new + @hotel.create_reservation(1, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) + @hotel.create_reservation(2, Date.new(2019, 2, 1), Date.new(2019, 2, 6)) + @hotel.create_reservation(3, Date.new(2019, 2, 3), Date.new(2019, 2, 12)) + @hotel.create_reservation(4, Date.new(2019, 2, 7), Date.new(2019, 2, 10)) + @hotel.create_reservation(5, Date.new(2019, 2, 8), Date.new(2019, 2, 13)) + end + it "returns an array of reservations" do + found_reservations = @hotel.find_reservation_by_date(Date.new(2019, 2, 10)) + expect(found_reservations).must_be_instance_of Array + found_reservations.each do |reservation| + expect(reservation).must_be_instance_of Reservation + end + end + it "all returned reservations inlcude the date" do + found_reservations = @hotel.find_reservation_by_date(Date.new(2019, 2, 6)) + expect(found_reservations[0].id).must_equal 1 + expect(found_reservations[1].id).must_equal 2 + expect(found_reservations[2].id).must_equal 3 + expect(found_reservations[3]).must_be_nil end end end @@ -40,5 +77,26 @@ available_rooms = hotel.find_available_room(Date.new(2019, 2, 5), Date.new(2019, 2, 9)) expect(available_rooms).must_be_instance_of Array end + + it "returns all the rooms when the array is empty" do + hotel = HotelBooker.new + available_rooms = hotel.find_available_room(Date.new(2019, 2, 5), Date.new(2019, 2, 9)) + expect(available_rooms.length).must_equal 20 + end + + it "returns only empty rooms " do + hotel = HotelBooker.new + + hotel.create_reservation(1, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) + + hotel.create_reservation(2, Date.new(2019, 2, 1), Date.new(2019, 2, 8)) + + hotel.create_reservation(3, Date.new(2019, 2, 8), Date.new(2019, 2, 12)) + hotel.create_reservation(4, Date.new(2019, 2, 11), Date.new(2019, 2, 14)) + hotel.create_reservation(5, Date.new(2019, 2, 11), Date.new(2019, 2, 14)) + available_rooms = hotel.find_available_room(Date.new(2019, 2, 5), Date.new(2019, 2, 9)) + expect(available_rooms[0]).must_equal 3 + expect(available_rooms.length).must_equal 18 + end end end From 373f48a448343b08a8fdd49f90d642dd1fc2f58b Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 18:13:58 -0700 Subject: [PATCH 13/25] removed empty initialize tests --- test/reservation_test.rb | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index f3c89584c..d720e8530 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,11 +1,5 @@ require_relative 'test_helper' -describe "Wave 1 Reservation Tests" do - describe "Initialize" do - - - end - describe "total_cost method" do before do @@ -27,6 +21,4 @@ end - - -end \ No newline at end of file + \ No newline at end of file From dc6c21c7f15980ce8df30fe61c6efad405d8fa0b Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 18:15:16 -0700 Subject: [PATCH 14/25] added require date --- test/test_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index 533f280aa..ae4290beb 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -6,6 +6,7 @@ require "minitest" require "minitest/autorun" require "minitest/reporters" +require 'date' From e9ba6801a86d957596e411eb7210f240fe902177 Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 18:17:08 -0700 Subject: [PATCH 15/25] fixed an error in overlap --- lib/calendar.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/calendar.rb b/lib/calendar.rb index 2fe18e3a3..267292033 100644 --- a/lib/calendar.rb +++ b/lib/calendar.rb @@ -11,6 +11,6 @@ def initialize(start_date:, end_date:) end def overlap?(current_reservation) - return !(current_reservation.start_date >= @end_date || current_reservation.end_date < @start_date) + return !(current_reservation.start_date >= @end_date || current_reservation.end_date <= @start_date) end end From 1fde6f91e7e23e383d2dd8fb41281fae29774670 Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 18:19:42 -0700 Subject: [PATCH 16/25] changed total cost to use instance variables --- lib/reservation.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 244d9c5ad..bd0cf1eed 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -5,11 +5,12 @@ def initialize (id:, start_date:, end_date:, room:) @id = id @start_date = start_date @end_date = end_date - @room = room + @room = room + end def total_cost - 200 * (end_date - start_date).to_i + 200 * (@end_date - @start_date).to_i end end \ No newline at end of file From 8f88541645463c787ca06c7208b1240413dc784e Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 18:40:43 -0700 Subject: [PATCH 17/25] fixed ruby syntax --- lib/reservation.rb | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index bd0cf1eed..b530e7a28 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,16 +1,14 @@ -class Reservation - attr_reader :id, :start_date, :end_date,:room - - def initialize (id:, start_date:, end_date:, room:) - @id = id - @start_date = start_date - @end_date = end_date - @room = room - - end - - def total_cost - 200 * (@end_date - @start_date).to_i - end - -end \ No newline at end of file +class Reservation + attr_reader :id, :start_date, :end_date, :room + + def initialize(id:, start_date:, end_date:, room:) + @id = id + @start_date = start_date + @end_date = end_date + @room = room + end + + def total_cost + 200 * (@end_date - @start_date).to_i + end +end From e717f79ab130b06d6929ea24c00cea0c84eb9934 Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 19:07:45 -0700 Subject: [PATCH 18/25] added more tests for overlap --- test/calendar_test.rb | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/test/calendar_test.rb b/test/calendar_test.rb index 580870dd7..844580641 100644 --- a/test/calendar_test.rb +++ b/test/calendar_test.rb @@ -11,23 +11,46 @@ @reservation = Reservation.new(id: 1, start_date: Date.new(2019, 2, 5), end_date: Date.new(2019, 2, 9), room: 5) end - it "new reservation endate overlaps " do + it "returns true if new reservation endate overlaps " do date_range = Calendar.new(start_date: Date.new(2019, 2, 3), end_date: Date.new(2019, 2, 6)) expect(date_range.overlap?(@reservation)).must_equal true end - it " new reserveration start overlaps" do + it " returns true if new reserveration start date overlaps" do date_range = Calendar.new(start_date: Date.new(2019, 2, 6), end_date: Date.new(2019, 2, 11)) expect(date_range.overlap?(@reservation)).must_equal true end - it " new reservation start_date and end_date both overlap" do + it " returns true if new reservation start_date and end_date both overlap" do date_range = Calendar.new(start_date: Date.new(2019, 2, 6), end_date: Date.new(2019, 2, 8)) expect(date_range.overlap?(@reservation)).must_equal true end - it "new reservation includes start_date and endate of current reservation" do + it "returns true if new reservation includes both start_date and endate" do date_range = Calendar.new(start_date: Date.new(2019, 2, 3), end_date: Date.new(2019, 2, 14)) expect(date_range.overlap?(@reservation)).must_equal true end + it "returns true if new reservation is exactly the same" do + date_range = Calendar.new(start_date: Date.new(2019, 2, 5), end_date: Date.new(2019, 2, 9)) + expect(date_range.overlap?(@reservation)).must_equal true + end + + it "returns false if new reservation is completely before" do + date_range = Calendar.new(start_date: Date.new(2019, 2, 1), end_date: Date.new(2019, 2, 3)) + expect(date_range.overlap?(@reservation)).must_equal false + end + it "returns false if new reservation is completely after" do + date_range = Calendar.new(start_date: Date.new(2019, 2, 11), end_date: Date.new(2019, 2, 15)) + expect(date_range.overlap?(@reservation)).must_equal false + end + + it "returns false if new reservation starts on end date " do + date_range = Calendar.new(start_date: Date.new(2019, 2, 9), end_date: Date.new(2019, 2, 16)) + expect(date_range.overlap?(@reservation)).must_equal false + end + + it "returns false if new reservation ends on start date" do + date_range = Calendar.new(start_date: Date.new(2019, 2, 1), end_date: Date.new(2019, 2, 5)) + expect(date_range.overlap?(@reservation)).must_equal false + end end end From d2dbe95e097f89fc6b700c105fbc282b833d6b73 Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 8 Sep 2019 19:10:58 -0700 Subject: [PATCH 19/25] removed unnecessary variable --- test/hotel_booker_test.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/hotel_booker_test.rb b/test/hotel_booker_test.rb index b4954dbe9..74fc8cca2 100644 --- a/test/hotel_booker_test.rb +++ b/test/hotel_booker_test.rb @@ -25,7 +25,7 @@ it "checks if new reservation is added to reservations" do hotel = HotelBooker.new - new_res = hotel.create_reservation(1, Date.new(2019, 2, 5), Date.new(2019, 2, 9)) + hotel.create_reservation(1, Date.new(2019, 2, 5), Date.new(2019, 2, 9)) expect(hotel.reservations[1].length).must_equal 1 end it "doesnt make conflicting reservations for the same room" do @@ -33,11 +33,10 @@ hotel.create_reservation(1, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) hotel.create_reservation(4, Date.new(2019, 2, 7), Date.new(2019, 2, 10)) - puts hotel.reservations expect(hotel.reservations[1].length).must_equal 1 expect(hotel.reservations[2].length).must_equal 1 end - it "checks that new reservations start on checkout days" do + it "checks that new reservations can start on checkout days" do hotel = HotelBooker.new hotel.create_reservation(1, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) hotel.create_reservation(2, Date.new(2019, 2, 1), Date.new(2019, 2, 6)) From 26fdfff2d8fa75f5e43117245f9b3b60106d328b Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Mon, 9 Sep 2019 05:43:04 -0700 Subject: [PATCH 20/25] added a list of future changes --- refactors.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 refactors.txt diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..e75761135 --- /dev/null +++ b/refactors.txt @@ -0,0 +1,10 @@ +Refactor list +- improve find_reservation_by_date by creating another method that checks if the date is included in the range +-make the classes less coupled +-refactor all methods to be shorter/more efficient +-add a module +-reword test desciptions +-make method that calculates nights +-check all names and make sure they make sense + + From ff8f1b9e2804e9bc89f635981b4c3348482b6fc4 Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 29 Sep 2019 10:24:35 -0700 Subject: [PATCH 21/25] refactored find_reservation_by_date method --- lib/hotel_booker.rb | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/lib/hotel_booker.rb b/lib/hotel_booker.rb index a577bb414..37308a452 100644 --- a/lib/hotel_booker.rb +++ b/lib/hotel_booker.rb @@ -2,6 +2,8 @@ require_relative 'reservation' require_relative 'calendar' +class NoAvailableRoomsError < StandardError +end class HotelBooker attr_reader :rooms, :reservations @@ -17,7 +19,7 @@ def initialize def find_available_room(start_date, end_date) available_rooms = [] - @reservations.each do |room, reservations| + reservations.each do |room, reservations| if reservations.empty? available_rooms << room else @@ -35,32 +37,19 @@ def create_reservation(id, start_date, end_date) found_rooms = find_available_room(start_date, end_date) if found_rooms.empty? - raise ArgumentError " no available rooms " + raise NoAvailableRoomsError else new_reservation = Reservation.new(id: id, start_date: start_date, end_date: end_date, room: found_rooms.first) - @reservations[found_rooms.first] = @reservations[found_rooms.first] << new_reservation + reservations[found_rooms.first] = reservations[found_rooms.first] << new_reservation return new_reservation end end def find_reservation_by_date(date) - reservations_for_date = [] - @reservations.each do |room, reservations| - reservations.each do |reservation| - days = (reservation.end_date - reservation.start_date + 1).to_i - current_date = reservation.end_date - - days.times do - if date == current_date - reservations_for_date << reservation - break - end - current_date -= 1 - end - end - end - - return reservations_for_date + reservations_for_date = reservations.map do |room, reservation| + reservation.find_all { |reservation| reservation.calculate_days.include?(date)} + end + return reservations_for_date.flatten end end From 0cee5c494fff6c20fae188dc31b1861bc76e2c5d Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 29 Sep 2019 10:25:32 -0700 Subject: [PATCH 22/25] added calculate days method --- lib/reservation.rb | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index b530e7a28..024e5f404 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,5 +1,5 @@ class Reservation - attr_reader :id, :start_date, :end_date, :room + attr_reader :id, :start_date, :end_date, :room, :date_range,:reservation_days def initialize(id:, start_date:, end_date:, room:) @id = id @@ -9,6 +9,19 @@ def initialize(id:, start_date:, end_date:, room:) end def total_cost - 200 * (@end_date - @start_date).to_i + 200 * (end_date - start_date).to_i end + + def calculate_days + days = [] + current_date = end_date + while current_date >= start_date + days << current_date + current_date -= 1 + end + return days + end + + + end From 48b727e5509c35873d4cdbd6285e75b3d9e5ab4c Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 29 Sep 2019 10:26:36 -0700 Subject: [PATCH 23/25] fixed syntax and hid instance variables --- lib/calendar.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/calendar.rb b/lib/calendar.rb index 267292033..b6b34ae07 100644 --- a/lib/calendar.rb +++ b/lib/calendar.rb @@ -6,11 +6,11 @@ def initialize(start_date:, end_date:) @end_date = end_date if end_date < start_date - raise ArgumentError.new "Invalid Date Range (end date is before start date)" + raise ArgumentError.new("Invalid Date Range (end date is before start date)") end end def overlap?(current_reservation) - return !(current_reservation.start_date >= @end_date || current_reservation.end_date <= @start_date) + return !(current_reservation.start_date >= end_date || current_reservation.end_date <= start_date) end end From ae3b084af5e34324c7fe3ffb3096063c7a80913a Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 29 Sep 2019 10:27:06 -0700 Subject: [PATCH 24/25] added missing test and tests for new method --- test/hotel_booker_test.rb | 15 ++++++++--- test/reservation_test.rb | 53 +++++++++++++++++++++++---------------- 2 files changed, 43 insertions(+), 25 deletions(-) diff --git a/test/hotel_booker_test.rb b/test/hotel_booker_test.rb index 74fc8cca2..d68af2bf1 100644 --- a/test/hotel_booker_test.rb +++ b/test/hotel_booker_test.rb @@ -5,10 +5,10 @@ before do @hotel = HotelBooker.new end - it "creates 20 rooms " do + it "creates 20 rooms " do expect(@hotel.rooms.length).must_equal 20 end - it "checks that rooms are integers" do + it " returns rooms that are integers" do expect(@hotel.rooms).must_be_instance_of Array @hotel.rooms.each do |room| expect(room).must_be_instance_of Integer @@ -23,7 +23,7 @@ expect(reservation).must_be_instance_of Reservation end - it "checks if new reservation is added to reservations" do + it "new reservation is added to reservations" do hotel = HotelBooker.new hotel.create_reservation(1, Date.new(2019, 2, 5), Date.new(2019, 2, 9)) expect(hotel.reservations[1].length).must_equal 1 @@ -36,12 +36,19 @@ expect(hotel.reservations[1].length).must_equal 1 expect(hotel.reservations[2].length).must_equal 1 end - it "checks that new reservations can start on checkout days" do + it "new reservations can start on checkout days" do hotel = HotelBooker.new hotel.create_reservation(1, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) hotel.create_reservation(2, Date.new(2019, 2, 1), Date.new(2019, 2, 6)) expect(hotel.reservations[1].length).must_equal 2 end + it "produces an error if all the rooms are booked" do + hotel = HotelBooker.new + 20.times do |i| + hotel.create_reservation(i, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) + end + expect { hotel.create_reservation(21, Date.new(2019, 2, 6), Date.new(2019, 2, 11)) }.must_raise NoAvailableRoomsError + end end describe "find_reservation_by_date" do diff --git a/test/reservation_test.rb b/test/reservation_test.rb index d720e8530..7acf15536 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,24 +1,35 @@ -require_relative 'test_helper' +require_relative "test_helper" - describe "total_cost method" do - before do - - @start_time = Date.new(2019,9,6) - @end_time = Date.new(2019,9,9) - @reservation = Reservation.new(id: 1, start_date: @start_time, end_date: @end_time, room: 5 ) - - end - it "checks that it returns an instance of an integer" do - expect(@reservation.total_cost).must_be_instance_of Integer +describe "total_cost method" do + before do + @start_time = Date.new(2019, 9, 6) + @end_time = Date.new(2019, 9, 9) + @reservation = Reservation.new(id: 1, start_date: @start_time, end_date: @end_time, room: 5) + end + it "returns an instance of an integer" do + expect(@reservation.total_cost).must_be_instance_of Integer + end - end - - it "checks that it returns accurate calculation" do - expect(@reservation.total_cost).must_equal 600 + it "returns accurate calculation of total cost" do + expect(@reservation.total_cost).must_equal 600 + end +end - end - - - - end - \ No newline at end of file +describe "calculate days method" do + before do + @start_time = Date.new(2019, 2, 1) + @end_time = Date.new(2019, 2, 5) + @reservation = Reservation.new(id: 1, start_date: @start_time, end_date: @end_time, room: 5) + end + + it " returns an array" do + expect(@reservation.calculate_days).must_be_instance_of Array + end + it "returns accurate information for days included in reservation" do + days = @reservation.calculate_days + expect(days.length).must_equal 5 + [Date.new(2019, 2, 1), Date.new(2019, 2, 2), Date.new(2019, 2, 3), Date.new(2019, 2, 4), Date.new(2019, 2, 5)].each do |date| + expect(days.include?(date)).must_equal true + end + end +end From 2f1c88c1979dc86c2bcb03b49dc7e6a3e95a5aaa Mon Sep 17 00:00:00 2001 From: Amal Hassan-Ali Date: Sun, 29 Sep 2019 10:33:09 -0700 Subject: [PATCH 25/25] answered design activity questions --- design-activity.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..e008a39f3 --- /dev/null +++ b/design-activity.md @@ -0,0 +1,42 @@ +What classes does each implementation include? Are the lists the same? +ShoppingCart, Order, and CartEntry are classes in both implementations. + +Write down a sentence to describe each class. +CartEntry- calculates the price of an item added to a cart based on unit price and quantity. +ShoppingCart- calculates the price of total items in a cart +Order- calculates the total price of a cart including sales tax + +How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. +ShoppingCart holds many CartEntry objects and calculates the price of all of them. Order takes one shopping cart object and calculates final price with tax. + +What data does each class store? How (if at all) does this differ between the two implementations? Cart entry stores the data for the unit price and quantity. Shopping cart stores the data for all the entries. Order stores the data for the shopping cart. In the first implementation only order can get data about the price. In Implementaiton B they all have information about the price. + + +What methods does each class have? How (if at all) does this differ between the two implementations?In implmentation A the shopping cart and cart entry have no methods. However, in implementation B they both have pricing methods. In both implementaitons Order has total price method. + +Consider the Order#total_price method. In each implementation: +Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? +Does total_price directly manipulate the instance variables of other classes? + +In implementation A logic is not delegated to lower classes. However, in implementaiton b logic is delegated to lower classes. Total price does not directlymanipulate the instance variables of the other classes. + +If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + +You would have to add an if statement to add a discount if the quantity is higher than the bulk amount. It is easier to modify implementation B. + +Which implementation better adheres to the single responsibility principle?Implementation B better adheres to the single responsibility principle. + + +Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? +Implementation B is more loosely coupled than implementation A. In implementation A the order is connected to both shoppingcart and cart entry then shopping cart is also connected to cart entry. In Implementation B order is connected to only shopping cart and shopping cart is connected to cart entry. + + +what changes you would need to make to improve this design, and how the resulting design would be an improvement. + +my find_reservation_by_date is doing a lot. It is finding the days that are included in between the start date/end date. Then checking if the date is included into that. I decided to add a method in reservation that creates an array with all the dates. That way in find_reservation_by_date it only needs to check if the date is included in that array. + + + + + +