From bff8a2908e64ab6bcc1af81d18a0af4fe863d111 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 13:04:06 -0800 Subject: [PATCH 01/72] File structure setup --- Rakefile | 9 +++++++++ lib/admin.rb | 8 ++++++++ lib/reservation.rb | 5 +++++ lib/room.rb | 5 +++++ specs/admin_spec.rb | 5 +++++ specs/reservation_spec.rb | 5 +++++ specs/room_spec.rb | 5 +++++ specs/spec_helper.rb | 14 ++++++++++++++ 8 files changed, 56 insertions(+) create mode 100644 Rakefile create mode 100644 lib/admin.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 specs/admin_spec.rb create mode 100644 specs/reservation_spec.rb create mode 100644 specs/room_spec.rb create mode 100644 specs/spec_helper.rb diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..deb52f2cd --- /dev/null +++ b/Rakefile @@ -0,0 +1,9 @@ +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.libs = ["lib"] + t.warning = true + t.test_files = FileList['specs/*_spec.rb'] +end + +task default: :test diff --git a/lib/admin.rb b/lib/admin.rb new file mode 100644 index 000000000..13716c0b3 --- /dev/null +++ b/lib/admin.rb @@ -0,0 +1,8 @@ +require_relative 'reservation' +require_relative 'room' + +module Hotel + class Admin + + end +end diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..daa802e78 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,5 @@ +module Hotel + class Reservation + + end +end diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..9e44dbb8d --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,5 @@ +module Hotel + class Room + + end +end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb new file mode 100644 index 000000000..b3b32f804 --- /dev/null +++ b/specs/admin_spec.rb @@ -0,0 +1,5 @@ +require_relative 'spec_helper' + +describe "Admin class" do + +end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb new file mode 100644 index 000000000..7eab9ba4b --- /dev/null +++ b/specs/reservation_spec.rb @@ -0,0 +1,5 @@ +require_relative 'spec_helper' + +descibe "Reservation class" do + +end diff --git a/specs/room_spec.rb b/specs/room_spec.rb new file mode 100644 index 000000000..fcb140911 --- /dev/null +++ b/specs/room_spec.rb @@ -0,0 +1,5 @@ +require_relative 'spec_helper' + +describe "Room class" do + +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb new file mode 100644 index 000000000..5172ff6e2 --- /dev/null +++ b/specs/spec_helper.rb @@ -0,0 +1,14 @@ +# require 'time' + +require 'simplecov' +SimpleCov.start + +require 'minitest' +require 'minitest/autorun' +require 'minitest/reporters' + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + +require_relative '../lib/admin' +require_relative '../lib/reservation' +require_relative '../lib/room' From f6c8bd480396b44f2a43b118412cb21757dfd946 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 13:19:09 -0800 Subject: [PATCH 02/72] Adds #initialize and related tests --- lib/admin.rb | 7 +++++++ specs/admin_spec.rb | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/admin.rb b/lib/admin.rb index 13716c0b3..ba41fd04b 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -4,5 +4,12 @@ module Hotel class Admin + attr_reader :reservations, :rooms + + def initialize + @reservations = [] + @rooms = [] + end + end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index b3b32f804..31d034711 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -1,5 +1,20 @@ require_relative 'spec_helper' describe "Admin class" do - + + describe "Initializer" do + before do + @admin = Hotel::Admin.new + end + + it "is an instance of Admin" do + @admin.must_be_instance_of Hotel::Admin + end + + it "creates initial data structures" do + @admin.reservations.must_be_kind_of Array + @admin.rooms.must_be_kind_of Array + end + end + end From ac8bb709365d6aaae45e4e13ec8dc4986eaaa748 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 13:43:34 -0800 Subject: [PATCH 03/72] Adds #create_rooms and related tests --- lib/admin.rb | 13 +++++++++++-- specs/admin_spec.rb | 17 +++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index ba41fd04b..c85631969 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -4,11 +4,20 @@ module Hotel class Admin - attr_reader :reservations, :rooms + attr_reader :reservations, :num_rooms, :rooms def initialize @reservations = [] - @rooms = [] + @num_rooms = 20 + @rooms = create_rooms + end + + def create_rooms + rooms = [] + num_rooms.times do |i| + rooms << Hotel::Room.new + end + return rooms end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 31d034711..95fea42a7 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -2,19 +2,28 @@ describe "Admin class" do - describe "Initializer" do - before do - @admin = Hotel::Admin.new - end + before do + @admin = Hotel::Admin.new + end + describe "Initializer" do it "is an instance of Admin" do @admin.must_be_instance_of Hotel::Admin end it "creates initial data structures" do @admin.reservations.must_be_kind_of Array + @admin.num_rooms.must_be_kind_of Integer @admin.rooms.must_be_kind_of Array end end + describe "#create_rooms" do + it "returns an array of Room instances" do + initial_rooms = @admin.create_rooms + initial_rooms.must_be_kind_of Array + initial_rooms.all? {|room| room.must_be_instance_of Hotel::Room} + end + end + end From 0356e377736674983f2c879ebf058b1c27c0e998 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 13:44:12 -0800 Subject: [PATCH 04/72] Deletes .keep files --- lib/.keep | 0 specs/.keep | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/.keep delete mode 100644 specs/.keep diff --git a/lib/.keep b/lib/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/specs/.keep b/specs/.keep deleted file mode 100644 index e69de29bb..000000000 From 0b1d255722271457be63901514c5c15a8a2537aa Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 14:01:58 -0800 Subject: [PATCH 05/72] Adds #initialize and tests --- lib/room.rb | 7 +++++++ specs/room_spec.rb | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/room.rb b/lib/room.rb index 9e44dbb8d..bcbbacf9a 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,5 +1,12 @@ module Hotel class Room + attr_reader :is_reserved, :room_id + + def initialize(id) + @is_reserved = FALSE + @room_id = id + end + end end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index fcb140911..f29891011 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -1,5 +1,19 @@ require_relative 'spec_helper' describe "Room class" do - + before do + id = 1 + @room = Hotel::Room.new(id) + end + + describe "Initializer" do + it "is an instance of Room" do + @room.must_be_instance_of Hotel::Room + end + + it "creates initial data structures" do + @room.is_reserved.must_equal FALSE + @room.room_id.must_be_kind_of Integer + end + end end From b01730b4efa969b8e9bae592f3124d3e787c6e61 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 14:07:06 -0800 Subject: [PATCH 06/72] Refactors #create_rooms and tests in Admin class --- lib/admin.rb | 3 ++- specs/admin_spec.rb | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index c85631969..c7ec98c61 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -15,7 +15,8 @@ def initialize def create_rooms rooms = [] num_rooms.times do |i| - rooms << Hotel::Room.new + id = i + 1 + rooms << Hotel::Room.new(id) end return rooms end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 95fea42a7..cbd762235 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -19,11 +19,20 @@ end describe "#create_rooms" do + before do + @initial_rooms = @admin.create_rooms + end + it "returns an array of Room instances" do - initial_rooms = @admin.create_rooms - initial_rooms.must_be_kind_of Array - initial_rooms.all? {|room| room.must_be_instance_of Hotel::Room} + @initial_rooms.must_be_kind_of Array + @initial_rooms.all? {|room| room.must_be_instance_of Hotel::Room} end + + it "assigns correct ids to Room instances" do + @initial_rooms.first.room_id.must_equal 1 + @initial_rooms.last.room_id.must_equal 20 + end + end end From 4afaa05ec7607cd4c0d873b944d024eef93adec6 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 14:08:49 -0800 Subject: [PATCH 07/72] Changes 'FALSE' to 'false' in #initialize in Room class and tests --- lib/room.rb | 2 +- specs/room_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/room.rb b/lib/room.rb index bcbbacf9a..71531df7f 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -4,7 +4,7 @@ class Room attr_reader :is_reserved, :room_id def initialize(id) - @is_reserved = FALSE + @is_reserved = false @room_id = id end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index f29891011..575583ed7 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -12,7 +12,7 @@ end it "creates initial data structures" do - @room.is_reserved.must_equal FALSE + @room.is_reserved.must_equal false @room.room_id.must_be_kind_of Integer end end From c4d9aa4e18bf4ec6f7fc899193dae0881b70a7ef Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 14:14:11 -0800 Subject: [PATCH 08/72] Injects dependency -> #create_room_instance and tests --- lib/admin.rb | 6 +++++- specs/admin_spec.rb | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/admin.rb b/lib/admin.rb index c7ec98c61..907277362 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -16,10 +16,14 @@ def create_rooms rooms = [] num_rooms.times do |i| id = i + 1 - rooms << Hotel::Room.new(id) + rooms << create_room_instance(id) end return rooms end + def create_room_instance(id) + return Hotel::Room.new(id) + end + end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index cbd762235..f96d95ded 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -32,7 +32,13 @@ @initial_rooms.first.room_id.must_equal 1 @initial_rooms.last.room_id.must_equal 20 end + end + describe "#create_room_instance" do + it "returns a Room instance" do + id = 1 + @admin.create_room_instance(id).must_be_instance_of Hotel::Room + end end end From 6b1c2942233acef40b11a385383848da329edc54 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 14:39:43 -0800 Subject: [PATCH 09/72] Refactors #create_room_instance and tests to account for invalid input --- lib/admin.rb | 10 +++++++--- specs/admin_spec.rb | 18 +++++++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 907277362..8036b0125 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -9,10 +9,10 @@ class Admin def initialize @reservations = [] @num_rooms = 20 - @rooms = create_rooms + @rooms = create_rooms_array end - def create_rooms + def create_rooms_array rooms = [] num_rooms.times do |i| id = i + 1 @@ -22,7 +22,11 @@ def create_rooms end def create_room_instance(id) - return Hotel::Room.new(id) + if id.class == Integer + return Hotel::Room.new(id) + else + raise ArgumentError.new("Id must be an Integer") + end end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index f96d95ded..de287cac0 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -1,4 +1,5 @@ require_relative 'spec_helper' +require 'pry' describe "Admin class" do @@ -20,7 +21,7 @@ describe "#create_rooms" do before do - @initial_rooms = @admin.create_rooms + @initial_rooms = @admin.create_rooms_array end it "returns an array of Room instances" do @@ -35,9 +36,20 @@ end describe "#create_room_instance" do + before do + @id = 1 + @bad_id = 'id' + end + it "returns a Room instance" do - id = 1 - @admin.create_room_instance(id).must_be_instance_of Hotel::Room + room = @admin.create_room_instance(@id) + room.must_be_instance_of Hotel::Room + end + + it "throws an ArgumentError if id is not an Integer" do + proc { + @admin.create_room_instance(@bad_id) + }.must_raise ArgumentError end end From e253e4010d77650d251ed573a52080cf30426164 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 15:32:06 -0800 Subject: [PATCH 10/72] Adds #create_reservation & #check_reservation data to Admin class + related tests --- lib/admin.rb | 27 +++++++++++++++++++++++++- specs/admin_spec.rb | 47 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 8036b0125..990b35c34 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -1,6 +1,8 @@ require_relative 'reservation' require_relative 'room' +require 'date' + module Hotel class Admin @@ -25,7 +27,30 @@ def create_room_instance(id) if id.class == Integer return Hotel::Room.new(id) else - raise ArgumentError.new("Id must be an Integer") + raise ArgumentError.new("ID is invalid") + end + end + + def create_reservation(reservation_data) + #check input (reservaion_data) + if check_reservation_data(reservation_data) + #get available room + + #make reservation instance + #add reservation to reservations array + #update rooms array + else + raise StandardError.new("Date range is invalid") + end + end + + def check_reservation_data(reservation_data) + start_time = reservation_data[:start_date].to_time + end_time = reservation_data[:end_date].to_time + if end_time - start_time < 0 + return false + else + return true end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index de287cac0..2b43d2b01 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -1,4 +1,5 @@ require_relative 'spec_helper' +require 'date' require 'pry' describe "Admin class" do @@ -46,11 +47,55 @@ room.must_be_instance_of Hotel::Room end - it "throws an ArgumentError if id is not an Integer" do + it "raises an ArgumentError if id is not an Integer" do proc { @admin.create_room_instance(@bad_id) }.must_raise ArgumentError end end + describe "#create_reservation" do + before do + @reservation_data = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + + @bad_reservation_data = { + start_date: Date.new(2018, 05, 05), + end_date: Date.new(2018, 01, 01) + } + end + + it "raises a StandardError for invalid date range" do + proc { + @admin.create_reservation(@bad_reservation_data) + }.must_raise StandardError + end + end + + describe "#check_reservation_data" do + before do + @reservation_data = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + + @bad_reservation_data = { + start_date: Date.new(2018, 05, 05), + end_date: Date.new(2018, 01, 01) + } + end + + it "returns true for a valid date range" do + reservation = @admin.check_reservation_data(@reservation_data) + reservation.must_equal true + end + + it "returns false for an invalid date range" do + reservation = @admin.check_reservation_data(@bad_reservation_data) + reservation.must_equal false + end + end + end From efb6dc7082ed270f1e559f28a4a458fc1485352e Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 15:37:47 -0800 Subject: [PATCH 11/72] Changes from #check_reservation_data(reservation_data) to #check_date_range(date_range) in Admin class and tests --- lib/admin.rb | 10 +++++----- specs/admin_spec.rb | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 990b35c34..4a4162249 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -31,9 +31,9 @@ def create_room_instance(id) end end - def create_reservation(reservation_data) + def create_reservation(date_range) #check input (reservaion_data) - if check_reservation_data(reservation_data) + if check_date_range(date_range) #get available room #make reservation instance @@ -44,9 +44,9 @@ def create_reservation(reservation_data) end end - def check_reservation_data(reservation_data) - start_time = reservation_data[:start_date].to_time - end_time = reservation_data[:end_date].to_time + def check_date_range(date_range) + start_time = date_range[:start_date].to_time + end_time = date_range[:end_date].to_time if end_time - start_time < 0 return false else diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 2b43d2b01..83e7c5776 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -56,12 +56,12 @@ describe "#create_reservation" do before do - @reservation_data = { + @date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @bad_reservation_data = { + @bad_date_range = { start_date: Date.new(2018, 05, 05), end_date: Date.new(2018, 01, 01) } @@ -69,31 +69,31 @@ it "raises a StandardError for invalid date range" do proc { - @admin.create_reservation(@bad_reservation_data) + @admin.create_reservation(@bad_date_range) }.must_raise StandardError end end - describe "#check_reservation_data" do + describe "#check_date_range" do before do - @reservation_data = { + @date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @bad_reservation_data = { + @bad_date_range = { start_date: Date.new(2018, 05, 05), end_date: Date.new(2018, 01, 01) } end it "returns true for a valid date range" do - reservation = @admin.check_reservation_data(@reservation_data) + reservation = @admin.check_date_range(@date_range) reservation.must_equal true end it "returns false for an invalid date range" do - reservation = @admin.check_reservation_data(@bad_reservation_data) + reservation = @admin.check_date_range(@bad_date_range) reservation.must_equal false end end From d953dc48708b8f3266ff0b0ff9d68223b428ce64 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 15:49:02 -0800 Subject: [PATCH 12/72] Adds #initialize and related tests in Reservation class --- lib/reservation.rb | 10 ++++++++++ specs/reservation_spec.rb | 24 ++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index daa802e78..645b15b90 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,5 +1,15 @@ module Hotel class Reservation + attr_reader :start_date, :end_date, :cost, :room_id, :reservation_id + + def initialize(date_range) + @start_date = date_range[:start_date] + @end_date = date_range[:end_date] + @cost = 0.0 + @room_id = 0 + @reservation_id = 0 + end + end end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 7eab9ba4b..8e95c17d3 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -1,5 +1,25 @@ require_relative 'spec_helper' -descibe "Reservation class" do - +describe "Reservation class" do + before do + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + @reservation = Hotel::Reservation.new(date_range) + end + + describe "Initializer" do + it "is an instance of Reservation" do + @reservation.must_be_instance_of Hotel::Reservation + end + + it "correctly initializes instance variables" do + @reservation.start_date.must_be_kind_of Date + @reservation.end_date.must_be_kind_of Date + @reservation.cost.must_be_kind_of Float + @reservation.room_id.must_be_kind_of Integer + @reservation.reservation_id.must_be_kind_of Integer + end + end end From 3621433b1083fef750071a750d04f4d564649374 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 15:57:54 -0800 Subject: [PATCH 13/72] Adds new #create_reservation and tests & changes previously made method name to #add_reservation --- lib/admin.rb | 12 ++++++++---- specs/admin_spec.rb | 14 ++++++++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 4a4162249..bb68acee3 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -31,12 +31,12 @@ def create_room_instance(id) end end - def create_reservation(date_range) - #check input (reservaion_data) - if check_date_range(date_range) - #get available room + def add_reservation(date_range) + #is there an available room (WAVE #2) + if check_date_range(date_range) #make reservation instance + #add reservation to reservations array #update rooms array else @@ -54,5 +54,9 @@ def check_date_range(date_range) end end + def create_reservation(date_range) + return Hotel::Reservation.new(date_range) + end + end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 83e7c5776..1febbeafd 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -54,7 +54,7 @@ end end - describe "#create_reservation" do + describe "#add_reservation" do before do @date_range = { start_date: Date.new(2018, 03, 05), @@ -69,7 +69,7 @@ it "raises a StandardError for invalid date range" do proc { - @admin.create_reservation(@bad_date_range) + @admin.add_reservation(@bad_date_range) }.must_raise StandardError end end @@ -98,4 +98,14 @@ end end + describe "#create_reservation" do + it "returns a Reservation instance" do + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + @admin.create_reservation(date_range).must_be_instance_of Hotel::Reservation + end + end + end From 40f34bb3d70105076d9ee3ca4849249aee0a9d3a Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 16:04:31 -0800 Subject: [PATCH 14/72] Pushes new reservation instance into @reservations array --- lib/admin.rb | 4 +++- specs/admin_spec.rb | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/admin.rb b/lib/admin.rb index bb68acee3..4c2aee2a2 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -36,9 +36,11 @@ def add_reservation(date_range) if check_date_range(date_range) #make reservation instance - + reservation = create_reservation(date_range) #add reservation to reservations array + reservations << reservation #update rooms array + else raise StandardError.new("Date range is invalid") end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 1febbeafd..cf29e096b 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -72,6 +72,15 @@ @admin.add_reservation(@bad_date_range) }.must_raise StandardError end + + it "adds new reservation to reservations array" do + initial_length = @admin.reservations.length + @admin.add_reservation(@date_range) + new_length = @admin.reservations.length + + new_length.must_equal initial_length + 1 + end + end describe "#check_date_range" do From 502b2e0a33577ef8dc24e8a91eeb5640d9da18f4 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 16:35:19 -0800 Subject: [PATCH 15/72] Adds cost calculation to Admin class & modifies related test and Reservation class --- lib/admin.rb | 8 ++++++-- lib/reservation.rb | 8 ++++---- specs/admin_spec.rb | 1 - specs/reservation_spec.rb | 5 +++-- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 4c2aee2a2..16bd0bfc5 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -6,11 +6,13 @@ module Hotel class Admin - attr_reader :reservations, :num_rooms, :rooms + attr_reader :reservations, :num_rooms, :rooms, :cost_per_day, :reservation_id_tracker def initialize @reservations = [] @num_rooms = 20 + @cost_per_day = 200 + # @reservation_id_tracker = 0 @rooms = create_rooms_array end @@ -57,7 +59,9 @@ def check_date_range(date_range) end def create_reservation(date_range) - return Hotel::Reservation.new(date_range) + total_days = (date_range[:start_date] - date_range[:end_date]).to_i + cost = (total_days - 1) * cost_per_day + return Hotel::Reservation.new(date_range, cost) end end diff --git a/lib/reservation.rb b/lib/reservation.rb index 645b15b90..76dadab9d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -3,12 +3,12 @@ class Reservation attr_reader :start_date, :end_date, :cost, :room_id, :reservation_id - def initialize(date_range) + def initialize(date_range, cost) @start_date = date_range[:start_date] @end_date = date_range[:end_date] - @cost = 0.0 - @room_id = 0 - @reservation_id = 0 + @cost = cost + @room_id = 1 + @reservation_id = get_id end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index cf29e096b..660fffbf0 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -80,7 +80,6 @@ new_length.must_equal initial_length + 1 end - end describe "#check_date_range" do diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 8e95c17d3..a5ccd9413 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -2,11 +2,12 @@ describe "Reservation class" do before do + cost = 800 date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @reservation = Hotel::Reservation.new(date_range) + @reservation = Hotel::Reservation.new(date_range, cost) end describe "Initializer" do @@ -17,7 +18,7 @@ it "correctly initializes instance variables" do @reservation.start_date.must_be_kind_of Date @reservation.end_date.must_be_kind_of Date - @reservation.cost.must_be_kind_of Float + @reservation.cost.must_be_kind_of Integer @reservation.room_id.must_be_kind_of Integer @reservation.reservation_id.must_be_kind_of Integer end From e2819d694153afd370ba70b1c45991b81b73c889 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 17:06:13 -0800 Subject: [PATCH 16/72] Fixes total_days var --- lib/admin.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 16bd0bfc5..240d54dce 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -41,7 +41,8 @@ def add_reservation(date_range) reservation = create_reservation(date_range) #add reservation to reservations array reservations << reservation - #update rooms array + + #update rooms array(WAVE #2) else raise StandardError.new("Date range is invalid") @@ -59,7 +60,7 @@ def check_date_range(date_range) end def create_reservation(date_range) - total_days = (date_range[:start_date] - date_range[:end_date]).to_i + total_days = (date_range[:end_date] - date_range[:start_date]).to_i cost = (total_days - 1) * cost_per_day return Hotel::Reservation.new(date_range, cost) end From 959094f00dc510f07fc48f2763cab15882235c0f Mon Sep 17 00:00:00 2001 From: Phoebe Date: Mon, 5 Mar 2018 17:07:57 -0800 Subject: [PATCH 17/72] Comments out reservation id var and test --- lib/reservation.rb | 6 +++++- specs/reservation_spec.rb | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 76dadab9d..ab8373e62 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -8,8 +8,12 @@ def initialize(date_range, cost) @end_date = date_range[:end_date] @cost = cost @room_id = 1 - @reservation_id = get_id + # @reservation_id = get_id end + # def get_id + # + # end + end end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index a5ccd9413..12a517948 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -20,7 +20,13 @@ @reservation.end_date.must_be_kind_of Date @reservation.cost.must_be_kind_of Integer @reservation.room_id.must_be_kind_of Integer - @reservation.reservation_id.must_be_kind_of Integer + # @reservation.reservation_id.must_be_kind_of Integer end end + + # describe "#get_id" do + # it "returns an Integer" do + # @reservation.get_id.must_be_kind_of Integer + # end + # end end From 72b915ce3d7e4d9f2c31f9b5ecfde2c5ebc9172b Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 11:20:56 -0800 Subject: [PATCH 18/72] tests for and template of #get_reservation_list --- lib/admin.rb | 12 ++++++++++ specs/admin_spec.rb | 53 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/lib/admin.rb b/lib/admin.rb index 240d54dce..bc7677799 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -65,5 +65,17 @@ def create_reservation(date_range) return Hotel::Reservation.new(date_range, cost) end + def get_reservation_list(date) + reservation_list = [] + if reservations.length != 0 + #iterate through reservations + #check date against start and end dates of each reservation + #if date is within the range, add reservation to list of reservations + #return reservation_list + else + return reservation_list + end + end + end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 660fffbf0..21002a725 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -116,4 +116,57 @@ end end + describe "#get_reservation_list(date)" do + it "returns an array" do + date = Date.new(2018, 03, 05) + list = @admin.get_reservation_list(date) + list.must_be_kind_of Array + end + + it "returns an empty array if there are no reservations" do + date = Date.new(2018, 04, 05) + @admin.get_reservation_list(date).must_equal [] + end + + it "returns correct array if date is end_date of a reservation" do + skip + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + @admin.create_reservation(date_range) + list = @admin.get_reservation_list(Date.new(2018, 03, 10)) + + list.first.start_date.must_equal Date.new(2018, 03, 05) + list.last.end_date.must_equal Date.new(2018, 03, 10) + end + + it "returns correct array if date is start_date of a reservation" do + skip + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + @admin.create_reservation(date_range) + list = @admin.get_reservation_list(Date.new(2018, 03, 05)) + + list.first.start_date.must_equal Date.new(2018, 03, 05) + list.last.end_date.must_equal Date.new(2018, 03, 10) + end + + it "returns correct array if date is in between start_date and end_date" do + skip + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + @admin.create_reservation(date_range) + # date = Date.new(2018, 03, 08) + list = @admin.get_reservation_list(Date.new(2018, 03, 06)) + + list.first.start_date.must_equal Date.new(2018, 03, 05) + list.last.end_date.must_equal Date.new(2018, 03, 10) + end + end + end From cd52adc44d3c5ba558995df54ccc14599b62eefa Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 11:53:05 -0800 Subject: [PATCH 19/72] #compare dates and tests --- lib/admin.rb | 25 +++++++++++++++++++++---- specs/admin_spec.rb | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index bc7677799..0c19a7175 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -68,14 +68,31 @@ def create_reservation(date_range) def get_reservation_list(date) reservation_list = [] if reservations.length != 0 - #iterate through reservations - #check date against start and end dates of each reservation - #if date is within the range, add reservation to list of reservations - #return reservation_list + #iterate through reservations + # reservations.select {|reservation| } + #check date against start and end dates of each reservation + #if date is within the range, add reservation to list of reservations + #return reservation_list else return reservation_list end end + def compare_dates(reservation, date) + start_date = reservation.start_date + end_date = reservation.end_date + + #date is w/i the reservation date_range + if ((date <=> start_date) == 1) && ((end_date <=> date) == 1) + return true + #date is not w/i the reservation date_range + elsif ((date <=> start_date) == -1) || ((end_date <=> date) == -1) + return false + #date is either equal to the start_date or the end_date + else + return true + end + end + end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 21002a725..ed73bb30f 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -169,4 +169,39 @@ end end + describe "#compare_dates(reservation, date)" do + before do + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + @admin.add_reservation(date_range) + @reservation = @admin.reservations.first + end + + it "returns true if date is w/i date range of the reservation" do + date = Date.new(2018, 03, 07) + compare = @admin.compare_dates(@reservation, date) + compare.must_equal true + end + + it "returns true if date == start_date of a reservation" do + date = Date.new(2018, 03, 05) + compare = @admin.compare_dates(@reservation, date) + compare.must_equal true + end + + it "returns true if date == end_date of a reservation" do + date = Date.new(2018, 03, 10) + compare = @admin.compare_dates(@reservation, date) + compare.must_equal true + end + + it "returns false if date is NOT w/i date range of the reservation" do + date = Date.new(2018, 04, 01) + compare = @admin.compare_dates(@reservation, date) + compare.must_equal false + end + end + end From 4b7464ef69d513455a94436fd6a48257c3368561 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 12:11:00 -0800 Subject: [PATCH 20/72] Completes #get_reservation_list(date) and tests in Admin class --- lib/admin.rb | 13 +++++-------- specs/admin_spec.rb | 28 ++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 0c19a7175..0f1f77073 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -66,15 +66,12 @@ def create_reservation(date_range) end def get_reservation_list(date) - reservation_list = [] + # reservation_list = [] if reservations.length != 0 - #iterate through reservations - # reservations.select {|reservation| } - #check date against start and end dates of each reservation - #if date is within the range, add reservation to list of reservations - #return reservation_list - else + reservation_list = reservations.select {|reservation| compare_dates(reservation, date)} return reservation_list + else + return [] end end @@ -88,7 +85,7 @@ def compare_dates(reservation, date) #date is not w/i the reservation date_range elsif ((date <=> start_date) == -1) || ((end_date <=> date) == -1) return false - #date is either equal to the start_date or the end_date + #date is either equal to the start_date or to the end_date else return true end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index ed73bb30f..4e91560a4 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -129,12 +129,11 @@ end it "returns correct array if date is end_date of a reservation" do - skip date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @admin.create_reservation(date_range) + @admin.add_reservation(date_range) list = @admin.get_reservation_list(Date.new(2018, 03, 10)) list.first.start_date.must_equal Date.new(2018, 03, 05) @@ -142,12 +141,11 @@ end it "returns correct array if date is start_date of a reservation" do - skip date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @admin.create_reservation(date_range) + @admin.add_reservation(date_range) list = @admin.get_reservation_list(Date.new(2018, 03, 05)) list.first.start_date.must_equal Date.new(2018, 03, 05) @@ -155,18 +153,32 @@ end it "returns correct array if date is in between start_date and end_date" do - skip date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @admin.create_reservation(date_range) - # date = Date.new(2018, 03, 08) + @admin.add_reservation(date_range) list = @admin.get_reservation_list(Date.new(2018, 03, 06)) - + list.first.start_date.must_equal Date.new(2018, 03, 05) list.last.end_date.must_equal Date.new(2018, 03, 10) end + + it "returns empty array if date is not in any reservations" do + date_range1 = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + date_range2 = { + start_date: Date.new(2017, 07, 05), + end_date: Date.new(2017, 07, 23) + } + @admin.add_reservation(date_range1) + @admin.add_reservation(date_range2) + + list = @admin.get_reservation_list(Date.new(2018, 03, 11)) + list.must_equal [] + end end describe "#compare_dates(reservation, date)" do From 2d59cfa5ff762e133249da4f004ec1da435d3caa Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 13:56:25 -0800 Subject: [PATCH 21/72] removes #create_reservation in Admin & creates #calculate_cost in Reservation --- lib/admin.rb | 24 +++++++++--------------- lib/reservation.rb | 12 +++++++++--- specs/admin_spec.rb | 12 +----------- specs/reservation_spec.rb | 10 ++++++++-- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 0f1f77073..a3fdf2f14 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -16,6 +16,8 @@ def initialize @rooms = create_rooms_array end +#---------------------------------------------------------------------# + def create_rooms_array rooms = [] num_rooms.times do |i| @@ -33,17 +35,15 @@ def create_room_instance(id) end end +#---------------------------------------------------------------------# + def add_reservation(date_range) #is there an available room (WAVE #2) - if check_date_range(date_range) - #make reservation instance - reservation = create_reservation(date_range) - #add reservation to reservations array - reservations << reservation - + # reservation = create_reservation(date_range) + new_reservation = Hotel::Reservation.new(date_range) + reservations << new_reservation #update rooms array(WAVE #2) - else raise StandardError.new("Date range is invalid") end @@ -59,16 +59,11 @@ def check_date_range(date_range) end end - def create_reservation(date_range) - total_days = (date_range[:end_date] - date_range[:start_date]).to_i - cost = (total_days - 1) * cost_per_day - return Hotel::Reservation.new(date_range, cost) - end +#---------------------------------------------------------------------# def get_reservation_list(date) - # reservation_list = [] if reservations.length != 0 - reservation_list = reservations.select {|reservation| compare_dates(reservation, date)} + reservation_list = reservations.select { |reservation| compare_dates(reservation, date) } return reservation_list else return [] @@ -78,7 +73,6 @@ def get_reservation_list(date) def compare_dates(reservation, date) start_date = reservation.start_date end_date = reservation.end_date - #date is w/i the reservation date_range if ((date <=> start_date) == 1) && ((end_date <=> date) == 1) return true diff --git a/lib/reservation.rb b/lib/reservation.rb index ab8373e62..38c22c45b 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -3,12 +3,18 @@ class Reservation attr_reader :start_date, :end_date, :cost, :room_id, :reservation_id - def initialize(date_range, cost) + def initialize(date_range) @start_date = date_range[:start_date] @end_date = date_range[:end_date] - @cost = cost + @cost = calculate_cost @room_id = 1 - # @reservation_id = get_id + #TODO: @reservation_id = get_id + end + + def calculate_cost + total_days = (end_date - start_date).to_i + cost = (total_days - 1) * 200 + return cost end # def get_id diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 4e91560a4..f4c7d56e3 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -106,16 +106,6 @@ end end - describe "#create_reservation" do - it "returns a Reservation instance" do - date_range = { - start_date: Date.new(2018, 03, 05), - end_date: Date.new(2018, 03, 10) - } - @admin.create_reservation(date_range).must_be_instance_of Hotel::Reservation - end - end - describe "#get_reservation_list(date)" do it "returns an array" do date = Date.new(2018, 03, 05) @@ -159,7 +149,7 @@ } @admin.add_reservation(date_range) list = @admin.get_reservation_list(Date.new(2018, 03, 06)) - + list.first.start_date.must_equal Date.new(2018, 03, 05) list.last.end_date.must_equal Date.new(2018, 03, 10) end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 12a517948..25fc36714 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -2,12 +2,12 @@ describe "Reservation class" do before do - cost = 800 + # cost = 800 date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @reservation = Hotel::Reservation.new(date_range, cost) + @reservation = Hotel::Reservation.new(date_range) end describe "Initializer" do @@ -24,6 +24,12 @@ end end + describe "#calculate_cost" do + it "returns an Integer" do + @reservation.cost.must_be_kind_of Integer + end + end + # describe "#get_id" do # it "returns an Integer" do # @reservation.get_id.must_be_kind_of Integer From 54e648d7dd035c0a137fc49603f689486b85b53d Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 14:10:20 -0800 Subject: [PATCH 22/72] adds edge case for #calculate_cost --- lib/reservation.rb | 11 ++++++++--- specs/reservation_spec.rb | 13 +++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 38c22c45b..1e3c95e3c 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,11 +1,12 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :cost, :room_id, :reservation_id + attr_reader :start_date, :end_date, :cost, :room_id, :reservation_id, :cost_per_day def initialize(date_range) @start_date = date_range[:start_date] @end_date = date_range[:end_date] + @cost_per_day = 200 @cost = calculate_cost @room_id = 1 #TODO: @reservation_id = get_id @@ -13,8 +14,12 @@ def initialize(date_range) def calculate_cost total_days = (end_date - start_date).to_i - cost = (total_days - 1) * 200 - return cost + if total_days > 0 + cost = (total_days - 1) * cost_per_day + return cost + else + return cost_per_day + end end # def get_id diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 25fc36714..6b52ff0b8 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -25,8 +25,17 @@ end describe "#calculate_cost" do - it "returns an Integer" do - @reservation.cost.must_be_kind_of Integer + it "accurately calculates cost" do + @reservation.cost.must_equal 800 + end + + it "accurately calculates cost for one day" do + one_day = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 05) + } + reservation = Hotel::Reservation.new(one_day) + reservation.cost.must_equal 200 end end From 2770088113665c4ee46f56c3b6a3d90fc246ef84 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 16:37:43 -0800 Subject: [PATCH 23/72] Changes is_reserved instance variable from false to true --- lib/room.rb | 2 +- specs/room_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/room.rb b/lib/room.rb index 71531df7f..2a88304e6 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -4,7 +4,7 @@ class Room attr_reader :is_reserved, :room_id def initialize(id) - @is_reserved = false + @is_reserved = true @room_id = id end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index 575583ed7..51ff1fbd0 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -12,7 +12,7 @@ end it "creates initial data structures" do - @room.is_reserved.must_equal false + @room.is_reserved.must_equal true @room.room_id.must_be_kind_of Integer end end From 7a73903b9a997b0f7a353131df5765b68729b563 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 16:39:37 -0800 Subject: [PATCH 24/72] Adds template for #get_unreserved_rooms and tests --- lib/admin.rb | 18 ++++++++++++------ specs/admin_spec.rb | 25 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index a3fdf2f14..c224db41c 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -6,14 +6,13 @@ module Hotel class Admin - attr_reader :reservations, :num_rooms, :rooms, :cost_per_day, :reservation_id_tracker + attr_reader :reservations, :num_rooms, :rooms, :reservation_id_tracker def initialize @reservations = [] @num_rooms = 20 - @cost_per_day = 200 - # @reservation_id_tracker = 0 @rooms = create_rooms_array + # @reservation_id_tracker = 0 end #---------------------------------------------------------------------# @@ -61,6 +60,7 @@ def check_date_range(date_range) #---------------------------------------------------------------------# + #TODO: add error if date is not a date object def get_reservation_list(date) if reservations.length != 0 reservation_list = reservations.select { |reservation| compare_dates(reservation, date) } @@ -73,17 +73,23 @@ def get_reservation_list(date) def compare_dates(reservation, date) start_date = reservation.start_date end_date = reservation.end_date - #date is w/i the reservation date_range + # date is w/i the reservation date_range if ((date <=> start_date) == 1) && ((end_date <=> date) == 1) return true - #date is not w/i the reservation date_range + # date is not w/i the reservation date_range elsif ((date <=> start_date) == -1) || ((end_date <=> date) == -1) return false - #date is either equal to the start_date or to the end_date + # date is either equal to the start_date or to the end_date else return true end end +#---------------------------------------------------------------------# + + def get_unreserved_rooms(date_range) + + end + end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index f4c7d56e3..90f986aa0 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -206,4 +206,29 @@ end end + describe "#get_unreserved_rooms(date_range)" do + before do + @date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + end + + it "returns an Array of Integers (Room Ids)" do + @admin.get_unreserved_rooms(@date_range).must_be_kind_of Array + @admin.get_unreserved_rooms(@date_range).all? { + |room| room.must_be_kind_of Integer + } + end + + it "returns an empty Array if there are no available rooms" do + # available_rooms = @admin.get_unreserved_rooms(@date_range) + + end + + it "returns correct Array of Integers when there are multiple reservations" do + + end + end + end From 8ca6c0e5a5dfeccbfdaf92e38d55c451dc88e5a9 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 16:44:36 -0800 Subject: [PATCH 25/72] Adds room as parameter for #add_reservation --- lib/admin.rb | 4 ++-- lib/reservation.rb | 6 +++--- specs/admin_spec.rb | 25 ++++++++++++++++--------- specs/reservation_spec.rb | 6 ++++-- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index c224db41c..0d563a9cd 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -36,11 +36,11 @@ def create_room_instance(id) #---------------------------------------------------------------------# - def add_reservation(date_range) + def add_reservation(date_range, room) #is there an available room (WAVE #2) if check_date_range(date_range) # reservation = create_reservation(date_range) - new_reservation = Hotel::Reservation.new(date_range) + new_reservation = Hotel::Reservation.new(date_range, room) reservations << new_reservation #update rooms array(WAVE #2) else diff --git a/lib/reservation.rb b/lib/reservation.rb index 1e3c95e3c..d390ac222 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,14 +1,14 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :cost, :room_id, :reservation_id, :cost_per_day + attr_reader :start_date, :end_date, :cost_per_day, :cost, :room_id, :reservation_id - def initialize(date_range) + def initialize(date_range, room_id) @start_date = date_range[:start_date] @end_date = date_range[:end_date] @cost_per_day = 200 @cost = calculate_cost - @room_id = 1 + @room_id = room_id #TODO: @reservation_id = get_id end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 90f986aa0..267d69b3e 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -65,17 +65,19 @@ start_date: Date.new(2018, 05, 05), end_date: Date.new(2018, 01, 01) } + + @room = 1 end it "raises a StandardError for invalid date range" do proc { - @admin.add_reservation(@bad_date_range) + @admin.add_reservation(@bad_date_range, @room) }.must_raise StandardError end it "adds new reservation to reservations array" do initial_length = @admin.reservations.length - @admin.add_reservation(@date_range) + @admin.add_reservation(@date_range, @room) new_length = @admin.reservations.length new_length.must_equal initial_length + 1 @@ -123,7 +125,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @admin.add_reservation(date_range) + room = 1 + @admin.add_reservation(date_range, room) list = @admin.get_reservation_list(Date.new(2018, 03, 10)) list.first.start_date.must_equal Date.new(2018, 03, 05) @@ -135,7 +138,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @admin.add_reservation(date_range) + room = 1 + @admin.add_reservation(date_range, room) list = @admin.get_reservation_list(Date.new(2018, 03, 05)) list.first.start_date.must_equal Date.new(2018, 03, 05) @@ -147,7 +151,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @admin.add_reservation(date_range) + room = 1 + @admin.add_reservation(date_range, room) list = @admin.get_reservation_list(Date.new(2018, 03, 06)) list.first.start_date.must_equal Date.new(2018, 03, 05) @@ -163,8 +168,9 @@ start_date: Date.new(2017, 07, 05), end_date: Date.new(2017, 07, 23) } - @admin.add_reservation(date_range1) - @admin.add_reservation(date_range2) + room = 1 + @admin.add_reservation(date_range1, room) + @admin.add_reservation(date_range2, room) list = @admin.get_reservation_list(Date.new(2018, 03, 11)) list.must_equal [] @@ -177,7 +183,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @admin.add_reservation(date_range) + room = 1 + @admin.add_reservation(date_range, room) @reservation = @admin.reservations.first end @@ -227,7 +234,7 @@ end it "returns correct Array of Integers when there are multiple reservations" do - + end end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 6b52ff0b8..d8a4b07e1 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -7,7 +7,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - @reservation = Hotel::Reservation.new(date_range) + room = 1 + @reservation = Hotel::Reservation.new(date_range, room) end describe "Initializer" do @@ -34,7 +35,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 05) } - reservation = Hotel::Reservation.new(one_day) + room = 1 + reservation = Hotel::Reservation.new(one_day, room) reservation.cost.must_equal 200 end end From 88ce651e18146c4cd17212b55c6658376411b8b7 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Tue, 6 Mar 2018 17:08:24 -0800 Subject: [PATCH 26/72] Tests for #get_unreserved_rooms --- specs/admin_spec.rb | 59 +++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 267d69b3e..8a9aa0ce8 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -125,8 +125,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - room = 1 - @admin.add_reservation(date_range, room) + room_id = 1 + @admin.add_reservation(date_range, room_id) list = @admin.get_reservation_list(Date.new(2018, 03, 10)) list.first.start_date.must_equal Date.new(2018, 03, 05) @@ -138,8 +138,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - room = 1 - @admin.add_reservation(date_range, room) + room_id = 1 + @admin.add_reservation(date_range, room_id) list = @admin.get_reservation_list(Date.new(2018, 03, 05)) list.first.start_date.must_equal Date.new(2018, 03, 05) @@ -151,8 +151,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - room = 1 - @admin.add_reservation(date_range, room) + room_id = 1 + @admin.add_reservation(date_range, room_id) list = @admin.get_reservation_list(Date.new(2018, 03, 06)) list.first.start_date.must_equal Date.new(2018, 03, 05) @@ -168,9 +168,9 @@ start_date: Date.new(2017, 07, 05), end_date: Date.new(2017, 07, 23) } - room = 1 - @admin.add_reservation(date_range1, room) - @admin.add_reservation(date_range2, room) + room_id = 1 + @admin.add_reservation(date_range1, room_id) + @admin.add_reservation(date_range2, room_id) list = @admin.get_reservation_list(Date.new(2018, 03, 11)) list.must_equal [] @@ -183,8 +183,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - room = 1 - @admin.add_reservation(date_range, room) + room_id = 1 + @admin.add_reservation(date_range, room_id) @reservation = @admin.reservations.first end @@ -215,26 +215,53 @@ describe "#get_unreserved_rooms(date_range)" do before do - @date_range = { + @date_range1 = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } + + @date_range2 = { + start_date: Date.new(2018, 03, 01), + end_date: Date.new(2018, 05, 20) + } + + @date_range3 = { + start_date: Date.new(2018, 05, 19), + end_date: Date.new(2018, 05, 25) + } end it "returns an Array of Integers (Room Ids)" do - @admin.get_unreserved_rooms(@date_range).must_be_kind_of Array - @admin.get_unreserved_rooms(@date_range).all? { + @admin.get_unreserved_rooms(@date_range1).must_be_kind_of Array + @admin.get_unreserved_rooms(@date_range1).all? { |room| room.must_be_kind_of Integer } end it "returns an empty Array if there are no available rooms" do - # available_rooms = @admin.get_unreserved_rooms(@date_range) - + @admin.num_rooms.times do |num| + @admin.add_reservation(@date_range1, num + 1) + end + available_rooms = @admin.get_unreserved_rooms(@date_range1) + available_rooms.must_equal [] end it "returns correct Array of Integers when there are multiple reservations" do + room_id1 = 1 + room_id2 = 17 + room_id3 = 20 + reservation1 = @admin.add_reservation(@date_range1, room_id1) + reservation2 = @admin.add_reservation(@date_range2, room_id2) + reservation3 = @admin.add_reservation(@date_range3, room_id3) + + date_range = { + start_date: Date.new(2018, 04, 02), + end_date: Date.new(2018, 04, 06) + } + available_rooms = @admin.get_unreserved_rooms(date_range) + #all rooms EXCEPT #17 should be available + available_rooms.must_equal [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] end end From abc98fe56a5af87aba1771a492e1753c6607e45a Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 12:43:21 -0800 Subject: [PATCH 27/72] Modifies #compare_dates, #get_reservation_list, and related tests in order to make #get_unreserved_rooms work --- lib/admin.rb | 42 ++++++++++++++++++++++++++++++++---------- specs/admin_spec.rb | 37 ++++++++++++++++++++++++++----------- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 0d563a9cd..e8c42cec1 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -36,13 +36,14 @@ def create_room_instance(id) #---------------------------------------------------------------------# - def add_reservation(date_range, room) + def add_reservation(date_range, room_id) #is there an available room (WAVE #2) if check_date_range(date_range) # reservation = create_reservation(date_range) - new_reservation = Hotel::Reservation.new(date_range, room) + new_reservation = Hotel::Reservation.new(date_range, room_id) reservations << new_reservation #update rooms array(WAVE #2) + else raise StandardError.new("Date range is invalid") end @@ -63,7 +64,7 @@ def check_date_range(date_range) #TODO: add error if date is not a date object def get_reservation_list(date) if reservations.length != 0 - reservation_list = reservations.select { |reservation| compare_dates(reservation, date) } + reservation_list = reservations.select { |reservation| compare_dates(reservation, date) >= 0 } return reservation_list else return [] @@ -73,22 +74,43 @@ def get_reservation_list(date) def compare_dates(reservation, date) start_date = reservation.start_date end_date = reservation.end_date - # date is w/i the reservation date_range + # date is w/i the reservation date_range (TRUE) if ((date <=> start_date) == 1) && ((end_date <=> date) == 1) - return true - # date is not w/i the reservation date_range + return 1 + # date is not w/i the reservation date_range (FALSE) elsif ((date <=> start_date) == -1) || ((end_date <=> date) == -1) - return false - # date is either equal to the start_date or to the end_date - else - return true + return -1 + # date is either equal to the start_date or to the end_date (TRUE) + elsif ((date <=> start_date) == 0) || ((end_date <=> date) == 0) + return 0 end end #---------------------------------------------------------------------# def get_unreserved_rooms(date_range) + #TODO: FIGURE OUT HOW TO GET ROOM IDS THAT ARE NOT INCLUDED IN RESERVATIONS ARRAY + desired_start_date = date_range[:start_date] + desired_end_date = date_range[:end_date] + unreserved_rooms = [] + reservations.each do |reservation| + reservation_start = reservation.start_date + reservation_end = reservation.end_date + # if desired_end_date <= + + + #compare desired_end_date with reservation + # compare_dates(reservation, desired_end_date) AND + #compare desired_start_date with reservation + # compare_dates(reservation, desired_start_date) + # if false AND false, then push room id of the reservation (reservation.room_id) + + #push reservation.room_id into unreserved_rooms array + end + #iterate through rooms array and return array of rooms where is_available is true (call available_rooms) + #return unreserved_rooms + available rooms (get rid of duplicates and sort) + return unreserved_rooms end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 8a9aa0ce8..78b7b470b 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -66,18 +66,18 @@ end_date: Date.new(2018, 01, 01) } - @room = 1 + @room_id = 1 end it "raises a StandardError for invalid date range" do proc { - @admin.add_reservation(@bad_date_range, @room) + @admin.add_reservation(@bad_date_range, @room_id) }.must_raise StandardError end it "adds new reservation to reservations array" do initial_length = @admin.reservations.length - @admin.add_reservation(@date_range, @room) + @admin.add_reservation(@date_range, @room_id) new_length = @admin.reservations.length new_length.must_equal initial_length + 1 @@ -191,25 +191,25 @@ it "returns true if date is w/i date range of the reservation" do date = Date.new(2018, 03, 07) compare = @admin.compare_dates(@reservation, date) - compare.must_equal true + compare.must_be :>=, 0 end it "returns true if date == start_date of a reservation" do date = Date.new(2018, 03, 05) compare = @admin.compare_dates(@reservation, date) - compare.must_equal true + compare.must_be :>=, 0 end it "returns true if date == end_date of a reservation" do date = Date.new(2018, 03, 10) compare = @admin.compare_dates(@reservation, date) - compare.must_equal true + compare.must_be :>=, 0 end it "returns false if date is NOT w/i date range of the reservation" do date = Date.new(2018, 04, 01) compare = @admin.compare_dates(@reservation, date) - compare.must_equal false + compare.must_be :<, 0 end end @@ -229,6 +229,8 @@ start_date: Date.new(2018, 05, 19), end_date: Date.new(2018, 05, 25) } + + @all_rooms = (1..20).to_a end it "returns an Array of Integers (Room Ids)" do @@ -250,9 +252,9 @@ room_id1 = 1 room_id2 = 17 room_id3 = 20 - reservation1 = @admin.add_reservation(@date_range1, room_id1) - reservation2 = @admin.add_reservation(@date_range2, room_id2) - reservation3 = @admin.add_reservation(@date_range3, room_id3) + @admin.add_reservation(@date_range1, room_id1) + @admin.add_reservation(@date_range2, room_id2) + @admin.add_reservation(@date_range3, room_id3) date_range = { start_date: Date.new(2018, 04, 02), @@ -261,7 +263,20 @@ available_rooms = @admin.get_unreserved_rooms(date_range) #all rooms EXCEPT #17 should be available - available_rooms.must_equal [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] + available_rooms.must_equal [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] + end + + it "returns all rooms when start_date of new reservation == end date of one previous reservation" do + room_id = 1 + @admin.add_reservation(@date_range1, room_id) + + date_range = { + start_date: Date.new(2018, 03, 10), + end_date: Date.new(2018, 03, 12) + } + + available_rooms = @admin.get_unreserved_rooms(date_range) + available_rooms.must_equal @all_rooms end end From cbcd63a7d5a7029fe7e822f696ee6bd7f9d0a5a1 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 13:12:47 -0800 Subject: [PATCH 28/72] Changes reservation class to have a Room class instance instead of a room_id. --- lib/admin.rb | 48 +++++++------- lib/reservation.rb | 6 +- specs/admin_spec.rb | 132 +++++++++++++++++++------------------- specs/reservation_spec.rb | 6 +- 4 files changed, 94 insertions(+), 98 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index e8c42cec1..a6e9889d0 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -40,7 +40,8 @@ def add_reservation(date_range, room_id) #is there an available room (WAVE #2) if check_date_range(date_range) # reservation = create_reservation(date_range) - new_reservation = Hotel::Reservation.new(date_range, room_id) + room = create_room_instance(room_id) + new_reservation = Hotel::Reservation.new(date_range, room) reservations << new_reservation #update rooms array(WAVE #2) @@ -77,7 +78,7 @@ def compare_dates(reservation, date) # date is w/i the reservation date_range (TRUE) if ((date <=> start_date) == 1) && ((end_date <=> date) == 1) return 1 - # date is not w/i the reservation date_range (FALSE) + # date is NOT w/i the reservation date_range (FALSE) elsif ((date <=> start_date) == -1) || ((end_date <=> date) == -1) return -1 # date is either equal to the start_date or to the end_date (TRUE) @@ -88,30 +89,25 @@ def compare_dates(reservation, date) #---------------------------------------------------------------------# - def get_unreserved_rooms(date_range) - #TODO: FIGURE OUT HOW TO GET ROOM IDS THAT ARE NOT INCLUDED IN RESERVATIONS ARRAY - desired_start_date = date_range[:start_date] - desired_end_date = date_range[:end_date] - unreserved_rooms = [] - reservations.each do |reservation| - reservation_start = reservation.start_date - reservation_end = reservation.end_date - - # if desired_end_date <= - - - #compare desired_end_date with reservation - # compare_dates(reservation, desired_end_date) AND - #compare desired_start_date with reservation - # compare_dates(reservation, desired_start_date) - # if false AND false, then push room id of the reservation (reservation.room_id) - - #push reservation.room_id into unreserved_rooms array - end - #iterate through rooms array and return array of rooms where is_available is true (call available_rooms) - #return unreserved_rooms + available rooms (get rid of duplicates and sort) - return unreserved_rooms - end + # def get_unreserved_rooms(date_range) + # #TODO: FIGURE OUT HOW TO GET ROOM IDS THAT ARE NOT INCLUDED IN RESERVATIONS ARRAY + # desired_start_date = date_range[:start_date] + # desired_end_date = date_range[:end_date] + # unreserved_rooms = [] + # reservations.each do |reservation| + # reservation_start = reservation.start_date + # reservation_end = reservation.end_date + # + # if desired_end_date <= reservation_start || desired_start_date >= reservation_end + # unreserved_rooms << reservation.room_id + # end + # + # #push reservation.room_id into unreserved_rooms array + # end + # #iterate through rooms array and return array of rooms where is_available is true (call available_rooms) + # #return unreserved_rooms + available rooms (get rid of duplicates and sort) + # return unreserved_rooms + # end end end diff --git a/lib/reservation.rb b/lib/reservation.rb index d390ac222..80c28f9d7 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,14 +1,14 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :cost_per_day, :cost, :room_id, :reservation_id + attr_reader :start_date, :end_date, :cost_per_day, :cost, :room, :reservation_id - def initialize(date_range, room_id) + def initialize(date_range, room) @start_date = date_range[:start_date] @end_date = date_range[:end_date] @cost_per_day = 200 @cost = calculate_cost - @room_id = room_id + @room = room #TODO: @reservation_id = get_id end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 78b7b470b..9e7ccd55a 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -213,71 +213,71 @@ end end - describe "#get_unreserved_rooms(date_range)" do - before do - @date_range1 = { - start_date: Date.new(2018, 03, 05), - end_date: Date.new(2018, 03, 10) - } - - @date_range2 = { - start_date: Date.new(2018, 03, 01), - end_date: Date.new(2018, 05, 20) - } - - @date_range3 = { - start_date: Date.new(2018, 05, 19), - end_date: Date.new(2018, 05, 25) - } - - @all_rooms = (1..20).to_a - end - - it "returns an Array of Integers (Room Ids)" do - @admin.get_unreserved_rooms(@date_range1).must_be_kind_of Array - @admin.get_unreserved_rooms(@date_range1).all? { - |room| room.must_be_kind_of Integer - } - end - - it "returns an empty Array if there are no available rooms" do - @admin.num_rooms.times do |num| - @admin.add_reservation(@date_range1, num + 1) - end - available_rooms = @admin.get_unreserved_rooms(@date_range1) - available_rooms.must_equal [] - end - - it "returns correct Array of Integers when there are multiple reservations" do - room_id1 = 1 - room_id2 = 17 - room_id3 = 20 - @admin.add_reservation(@date_range1, room_id1) - @admin.add_reservation(@date_range2, room_id2) - @admin.add_reservation(@date_range3, room_id3) - - date_range = { - start_date: Date.new(2018, 04, 02), - end_date: Date.new(2018, 04, 06) - } - - available_rooms = @admin.get_unreserved_rooms(date_range) - #all rooms EXCEPT #17 should be available - available_rooms.must_equal [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] - end - - it "returns all rooms when start_date of new reservation == end date of one previous reservation" do - room_id = 1 - @admin.add_reservation(@date_range1, room_id) - - date_range = { - start_date: Date.new(2018, 03, 10), - end_date: Date.new(2018, 03, 12) - } - - available_rooms = @admin.get_unreserved_rooms(date_range) - available_rooms.must_equal @all_rooms - end - end + # describe "#get_unreserved_rooms(date_range)" do + # before do + # @date_range1 = { + # start_date: Date.new(2018, 03, 05), + # end_date: Date.new(2018, 03, 10) + # } + # + # @date_range2 = { + # start_date: Date.new(2018, 03, 01), + # end_date: Date.new(2018, 05, 20) + # } + # + # @date_range3 = { + # start_date: Date.new(2018, 05, 19), + # end_date: Date.new(2018, 05, 25) + # } + # + # @all_rooms = (1..20).to_a + # end + # + # it "returns an Array of Integers (Room Ids)" do + # @admin.get_unreserved_rooms(@date_range1).must_be_kind_of Array + # @admin.get_unreserved_rooms(@date_range1).all? { + # |room| room.must_be_kind_of Integer + # } + # end + # + # it "returns an empty Array if there are no available rooms" do + # @admin.num_rooms.times do |num| + # @admin.add_reservation(@date_range1, num + 1) + # end + # available_rooms = @admin.get_unreserved_rooms(@date_range1) + # available_rooms.must_equal [] + # end + # + # it "returns correct Array of Integers when there are multiple reservations" do + # room_id1 = 1 + # room_id2 = 17 + # room_id3 = 20 + # @admin.add_reservation(@date_range1, room_id1) + # @admin.add_reservation(@date_range2, room_id2) + # @admin.add_reservation(@date_range3, room_id3) + # + # date_range = { + # start_date: Date.new(2018, 04, 02), + # end_date: Date.new(2018, 04, 06) + # } + # + # available_rooms = @admin.get_unreserved_rooms(date_range) + # #all rooms EXCEPT #17 should be available + # available_rooms.must_equal [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] + # end + # + # it "returns all rooms when start_date of new reservation == end date of one previous reservation" do + # room_id = 1 + # @admin.add_reservation(@date_range1, room_id) + # + # date_range = { + # start_date: Date.new(2018, 03, 10), + # end_date: Date.new(2018, 03, 12) + # } + # + # available_rooms = @admin.get_unreserved_rooms(date_range) + # available_rooms.must_equal @all_rooms + # end + # end end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index d8a4b07e1..061c8e8fd 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -7,7 +7,7 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - room = 1 + room = Hotel::Room.new(1) @reservation = Hotel::Reservation.new(date_range, room) end @@ -20,7 +20,7 @@ @reservation.start_date.must_be_kind_of Date @reservation.end_date.must_be_kind_of Date @reservation.cost.must_be_kind_of Integer - @reservation.room_id.must_be_kind_of Integer + @reservation.room.must_be_instance_of Hotel::Room # @reservation.reservation_id.must_be_kind_of Integer end end @@ -35,7 +35,7 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 05) } - room = 1 + room = Hotel::Room.new(1) reservation = Hotel::Reservation.new(one_day, room) reservation.cost.must_equal 200 end From 007f1b9d2214b12f8e676a048b941b49ec0d7292 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 15:03:28 -0800 Subject: [PATCH 29/72] Adds new parameter is_available to room Class --- lib/admin.rb | 55 ++++++++------- lib/room.rb | 7 +- specs/admin_spec.rb | 138 +++++++++++++++++++------------------- specs/reservation_spec.rb | 5 +- specs/room_spec.rb | 4 +- 5 files changed, 109 insertions(+), 100 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index a6e9889d0..a8ab07353 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -19,16 +19,17 @@ def initialize def create_rooms_array rooms = [] + is_reserved = false num_rooms.times do |i| id = i + 1 - rooms << create_room_instance(id) + rooms << create_room_instance(id, is_reserved) end return rooms end - def create_room_instance(id) + def create_room_instance(id, is_reserved) if id.class == Integer - return Hotel::Room.new(id) + return Hotel::Room.new(id, is_reserved) else raise ArgumentError.new("ID is invalid") end @@ -40,11 +41,11 @@ def add_reservation(date_range, room_id) #is there an available room (WAVE #2) if check_date_range(date_range) # reservation = create_reservation(date_range) - room = create_room_instance(room_id) + room = create_room_instance(room_id, true) + # room.is_reserved = true new_reservation = Hotel::Reservation.new(date_range, room) + # new_reservation.room.is_reserved = true reservations << new_reservation - #update rooms array(WAVE #2) - else raise StandardError.new("Date range is invalid") end @@ -89,25 +90,29 @@ def compare_dates(reservation, date) #---------------------------------------------------------------------# - # def get_unreserved_rooms(date_range) - # #TODO: FIGURE OUT HOW TO GET ROOM IDS THAT ARE NOT INCLUDED IN RESERVATIONS ARRAY - # desired_start_date = date_range[:start_date] - # desired_end_date = date_range[:end_date] - # unreserved_rooms = [] - # reservations.each do |reservation| - # reservation_start = reservation.start_date - # reservation_end = reservation.end_date - # - # if desired_end_date <= reservation_start || desired_start_date >= reservation_end - # unreserved_rooms << reservation.room_id - # end - # - # #push reservation.room_id into unreserved_rooms array - # end - # #iterate through rooms array and return array of rooms where is_available is true (call available_rooms) - # #return unreserved_rooms + available rooms (get rid of duplicates and sort) - # return unreserved_rooms - # end + def get_unreserved_rooms(date_range) + #TODO: FIGURE OUT HOW TO GET ROOM IDS THAT ARE NOT INCLUDED IN RESERVATIONS ARRAY + desired_start_date = date_range[:start_date] + desired_end_date = date_range[:end_date] + unreserved_rooms = [] + reservations.each do |reservation| + reservation_start = reservation.start_date + reservation_end = reservation.end_date + + if desired_end_date <= reservation_start || desired_start_date >= reservation_end + unreserved_rooms << reservation.room.room_id + end + + end + #iterate through rooms array and return array of rooms where is_available is true (call available_rooms) + rooms.each do |room| + if room.is_reserved == false + unreserved_rooms << room.room_id + end + end + #return unreserved_rooms + available rooms (get rid of duplicates and sort) + return unreserved_rooms.sort.uniq + end end end diff --git a/lib/room.rb b/lib/room.rb index 2a88304e6..c1e5b4aa8 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,11 +1,12 @@ module Hotel class Room - attr_reader :is_reserved, :room_id + attr_reader :room_id + attr_accessor :is_reserved - def initialize(id) - @is_reserved = true + def initialize(id, is_reserved) @room_id = id + @is_reserved = is_reserved end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 9e7ccd55a..71826d51f 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -40,16 +40,17 @@ before do @id = 1 @bad_id = 'id' + @is_reserved = false end it "returns a Room instance" do - room = @admin.create_room_instance(@id) + room = @admin.create_room_instance(@id, @is_reserved) room.must_be_instance_of Hotel::Room end it "raises an ArgumentError if id is not an Integer" do proc { - @admin.create_room_instance(@bad_id) + @admin.create_room_instance(@bad_id, @is_reserved) }.must_raise ArgumentError end end @@ -213,71 +214,72 @@ end end - # describe "#get_unreserved_rooms(date_range)" do - # before do - # @date_range1 = { - # start_date: Date.new(2018, 03, 05), - # end_date: Date.new(2018, 03, 10) - # } - # - # @date_range2 = { - # start_date: Date.new(2018, 03, 01), - # end_date: Date.new(2018, 05, 20) - # } - # - # @date_range3 = { - # start_date: Date.new(2018, 05, 19), - # end_date: Date.new(2018, 05, 25) - # } - # - # @all_rooms = (1..20).to_a - # end - # - # it "returns an Array of Integers (Room Ids)" do - # @admin.get_unreserved_rooms(@date_range1).must_be_kind_of Array - # @admin.get_unreserved_rooms(@date_range1).all? { - # |room| room.must_be_kind_of Integer - # } - # end - # - # it "returns an empty Array if there are no available rooms" do - # @admin.num_rooms.times do |num| - # @admin.add_reservation(@date_range1, num + 1) - # end - # available_rooms = @admin.get_unreserved_rooms(@date_range1) - # available_rooms.must_equal [] - # end - # - # it "returns correct Array of Integers when there are multiple reservations" do - # room_id1 = 1 - # room_id2 = 17 - # room_id3 = 20 - # @admin.add_reservation(@date_range1, room_id1) - # @admin.add_reservation(@date_range2, room_id2) - # @admin.add_reservation(@date_range3, room_id3) - # - # date_range = { - # start_date: Date.new(2018, 04, 02), - # end_date: Date.new(2018, 04, 06) - # } - # - # available_rooms = @admin.get_unreserved_rooms(date_range) - # #all rooms EXCEPT #17 should be available - # available_rooms.must_equal [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] - # end - # - # it "returns all rooms when start_date of new reservation == end date of one previous reservation" do - # room_id = 1 - # @admin.add_reservation(@date_range1, room_id) - # - # date_range = { - # start_date: Date.new(2018, 03, 10), - # end_date: Date.new(2018, 03, 12) - # } - # - # available_rooms = @admin.get_unreserved_rooms(date_range) - # available_rooms.must_equal @all_rooms - # end - # end + describe "#get_unreserved_rooms(date_range)" do + before do + @date_range1 = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + + @date_range2 = { + start_date: Date.new(2018, 03, 01), + end_date: Date.new(2018, 05, 20) + } + + @date_range3 = { + start_date: Date.new(2018, 05, 19), + end_date: Date.new(2018, 05, 25) + } + + @all_rooms = (1..20).to_a + end + + it "returns an Array of Integers (Room Ids)" do + @admin.get_unreserved_rooms(@date_range1).must_be_kind_of Array + @admin.get_unreserved_rooms(@date_range1).all? { + |room| room.must_be_kind_of Integer + } + end + + it "returns an empty Array if there are no available rooms" do + @admin.num_rooms.times do |num| + @admin.add_reservation(@date_range1, num + 1) + end + available_rooms = @admin.get_unreserved_rooms(@date_range1) + available_rooms.must_equal [] + end + + it "returns correct Array of Integers when there are multiple reservations" do + room_id1 = 1 + room_id2 = 17 + room_id3 = 20 + @admin.add_reservation(@date_range1, room_id1) + @admin.add_reservation(@date_range2, room_id2) + @admin.add_reservation(@date_range3, room_id3) + # binding.pry + + date_range = { + start_date: Date.new(2018, 04, 02), + end_date: Date.new(2018, 04, 06) + } + + available_rooms = @admin.get_unreserved_rooms(date_range) + #all rooms EXCEPT #17 should be available + available_rooms.must_equal [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] + end + + it "returns all rooms when start_date of new reservation == end date of one previous reservation" do + room_id = 1 + @admin.add_reservation(@date_range1, room_id) + + date_range = { + start_date: Date.new(2018, 03, 10), + end_date: Date.new(2018, 03, 12) + } + + available_rooms = @admin.get_unreserved_rooms(date_range) + available_rooms.must_equal @all_rooms + end + end end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 061c8e8fd..ab04e9efd 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -7,7 +7,8 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - room = Hotel::Room.new(1) + + room = Hotel::Room.new(1, false) @reservation = Hotel::Reservation.new(date_range, room) end @@ -35,7 +36,7 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 05) } - room = Hotel::Room.new(1) + room = Hotel::Room.new(1, false) reservation = Hotel::Reservation.new(one_day, room) reservation.cost.must_equal 200 end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index 51ff1fbd0..755d1d280 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -3,7 +3,7 @@ describe "Room class" do before do id = 1 - @room = Hotel::Room.new(id) + @room = Hotel::Room.new(id, false) end describe "Initializer" do @@ -12,7 +12,7 @@ end it "creates initial data structures" do - @room.is_reserved.must_equal true + @room.is_reserved.must_equal false @room.room_id.must_be_kind_of Integer end end From 81984d47d3fb188d67d1d6aaf2eb32f27709cc9c Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 15:11:24 -0800 Subject: [PATCH 30/72] Modifies #add_reservation to change is_reserved variable --- lib/admin.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index a8ab07353..dbf3d3efa 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -40,11 +40,9 @@ def create_room_instance(id, is_reserved) def add_reservation(date_range, room_id) #is there an available room (WAVE #2) if check_date_range(date_range) - # reservation = create_reservation(date_range) - room = create_room_instance(room_id, true) - # room.is_reserved = true + room = @rooms.select {|room| room.room_id == room_id}.first + room.is_reserved = true new_reservation = Hotel::Reservation.new(date_range, room) - # new_reservation.room.is_reserved = true reservations << new_reservation else raise StandardError.new("Date range is invalid") From 4ec64425df43d8e05c925cf3a837c79c0ad6e38f Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 15:30:19 -0800 Subject: [PATCH 31/72] Refactors and adds tests for #get_unreserved_rooms --- specs/admin_spec.rb | 79 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 71826d51f..2a3110ecb 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -230,8 +230,6 @@ start_date: Date.new(2018, 05, 19), end_date: Date.new(2018, 05, 25) } - - @all_rooms = (1..20).to_a end it "returns an Array of Integers (Room Ids)" do @@ -249,37 +247,84 @@ available_rooms.must_equal [] end - it "returns correct Array of Integers when there are multiple reservations" do - room_id1 = 1 - room_id2 = 17 - room_id3 = 20 - @admin.add_reservation(@date_range1, room_id1) - @admin.add_reservation(@date_range2, room_id2) - @admin.add_reservation(@date_range3, room_id3) - # binding.pry + it "returns all room ids when start_date of new reservation == end date of one previous reservation" do + room_id = 1 + @admin.add_reservation(@date_range1, room_id) date_range = { - start_date: Date.new(2018, 04, 02), - end_date: Date.new(2018, 04, 06) + start_date: Date.new(2018, 03, 10), + end_date: Date.new(2018, 03, 12) } available_rooms = @admin.get_unreserved_rooms(date_range) - #all rooms EXCEPT #17 should be available - available_rooms.must_equal [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20] + available_rooms.must_equal (1..20).to_a end - it "returns all rooms when start_date of new reservation == end date of one previous reservation" do + it "returns 19 room ids when date range is completely within an established reservation range" do room_id = 1 @admin.add_reservation(@date_range1, room_id) date_range = { - start_date: Date.new(2018, 03, 10), + start_date: Date.new(2018, 03, 06), + end_date: Date.new(2018, 03, 9) + } + + available_rooms = @admin.get_unreserved_rooms(date_range) + available_rooms.must_equal (2..20).to_a + end + + it "returns 19 room ids when date range is exactly the same as an established reservation range" do + room_id = 1 + @admin.add_reservation(@date_range1, room_id) + + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + + available_rooms = @admin.get_unreserved_rooms(date_range) + available_rooms.must_equal (2..20).to_a + end + + it "returns 20 room ids when date range is completely outside of an established reservation range" do + room_id = 1 + @admin.add_reservation(@date_range1, room_id) + + date_range = { + start_date: Date.new(2018, 03, 12), + end_date: Date.new(2018, 03, 15) + } + + available_rooms = @admin.get_unreserved_rooms(date_range) + available_rooms.must_equal (1..20).to_a + end + + it "returns 19 room ids when date range overlaps an established reservation range once" do + room_id = 1 + @admin.add_reservation(@date_range1, room_id) + + date_range = { + start_date: Date.new(2018, 03, 4), + end_date: Date.new(2018, 03, 9) + } + + available_rooms = @admin.get_unreserved_rooms(date_range) + available_rooms.must_equal (2..20).to_a + end + + it "returns 19 room ids when date range overlaps an established reservation range twice" do + room_id = 1 + @admin.add_reservation(@date_range1, room_id) + + date_range = { + start_date: Date.new(2018, 03, 4), end_date: Date.new(2018, 03, 12) } available_rooms = @admin.get_unreserved_rooms(date_range) - available_rooms.must_equal @all_rooms + available_rooms.must_equal (2..20).to_a end + end end From 7c91037092216699bf55f976a6c2f67f1524fe27 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 15:39:38 -0800 Subject: [PATCH 32/72] Raises standard error if reservation is requested for unavailable room & tests --- lib/admin.rb | 8 +++----- specs/admin_spec.rb | 8 ++++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index dbf3d3efa..e9df347c4 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -39,7 +39,7 @@ def create_room_instance(id, is_reserved) def add_reservation(date_range, room_id) #is there an available room (WAVE #2) - if check_date_range(date_range) + if check_date_range(date_range) && get_unreserved_rooms(date_range).include?(room_id) room = @rooms.select {|room| room.room_id == room_id}.first room.is_reserved = true new_reservation = Hotel::Reservation.new(date_range, room) @@ -89,7 +89,6 @@ def compare_dates(reservation, date) #---------------------------------------------------------------------# def get_unreserved_rooms(date_range) - #TODO: FIGURE OUT HOW TO GET ROOM IDS THAT ARE NOT INCLUDED IN RESERVATIONS ARRAY desired_start_date = date_range[:start_date] desired_end_date = date_range[:end_date] unreserved_rooms = [] @@ -100,15 +99,14 @@ def get_unreserved_rooms(date_range) if desired_end_date <= reservation_start || desired_start_date >= reservation_end unreserved_rooms << reservation.room.room_id end - end - #iterate through rooms array and return array of rooms where is_available is true (call available_rooms) + rooms.each do |room| if room.is_reserved == false unreserved_rooms << room.room_id end end - #return unreserved_rooms + available rooms (get rid of duplicates and sort) + return unreserved_rooms.sort.uniq end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 2a3110ecb..e36e65cdd 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -83,6 +83,14 @@ new_length.must_equal initial_length + 1 end + + it "raises a StandardError if room is unavailable" do + room_id = 1 + @admin.add_reservation(@date_range, room_id) + proc { + @admin.add_reservation(@date_range, room_id) + }.must_raise StandardError + end end describe "#check_date_range" do From 251340a349c962734c9303c5d19de6a04bccc82e Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 15:44:19 -0800 Subject: [PATCH 33/72] Changes return values for #compare_dates --- lib/admin.rb | 13 ++++++------- specs/admin_spec.rb | 8 ++++---- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index e9df347c4..4e5b130aa 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -38,7 +38,6 @@ def create_room_instance(id, is_reserved) #---------------------------------------------------------------------# def add_reservation(date_range, room_id) - #is there an available room (WAVE #2) if check_date_range(date_range) && get_unreserved_rooms(date_range).include?(room_id) room = @rooms.select {|room| room.room_id == room_id}.first room.is_reserved = true @@ -64,7 +63,7 @@ def check_date_range(date_range) #TODO: add error if date is not a date object def get_reservation_list(date) if reservations.length != 0 - reservation_list = reservations.select { |reservation| compare_dates(reservation, date) >= 0 } + reservation_list = reservations.select { |reservation| compare_dates(reservation, date) } return reservation_list else return [] @@ -74,15 +73,15 @@ def get_reservation_list(date) def compare_dates(reservation, date) start_date = reservation.start_date end_date = reservation.end_date - # date is w/i the reservation date_range (TRUE) + # date is w/i the reservation date_range if ((date <=> start_date) == 1) && ((end_date <=> date) == 1) - return 1 - # date is NOT w/i the reservation date_range (FALSE) + return true + # date is NOT w/i the reservation date_range ( elsif ((date <=> start_date) == -1) || ((end_date <=> date) == -1) - return -1 + return false # date is either equal to the start_date or to the end_date (TRUE) elsif ((date <=> start_date) == 0) || ((end_date <=> date) == 0) - return 0 + return true end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index e36e65cdd..af76e6df5 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -200,25 +200,25 @@ it "returns true if date is w/i date range of the reservation" do date = Date.new(2018, 03, 07) compare = @admin.compare_dates(@reservation, date) - compare.must_be :>=, 0 + compare.must_equal true end it "returns true if date == start_date of a reservation" do date = Date.new(2018, 03, 05) compare = @admin.compare_dates(@reservation, date) - compare.must_be :>=, 0 + compare.must_equal true end it "returns true if date == end_date of a reservation" do date = Date.new(2018, 03, 10) compare = @admin.compare_dates(@reservation, date) - compare.must_be :>=, 0 + compare.must_equal true end it "returns false if date is NOT w/i date range of the reservation" do date = Date.new(2018, 04, 01) compare = @admin.compare_dates(@reservation, date) - compare.must_be :<, 0 + compare.must_equal false end end From 163009b5ce1b6b604faffed141ba6fc4bd33bd14 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 16:02:13 -0800 Subject: [PATCH 34/72] Cleans and refactors Admin class and tests --- lib/admin.rb | 9 +++++---- specs/admin_spec.rb | 32 ++++++++++++++++++-------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 4e5b130aa..ff8b0bfa3 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -27,6 +27,7 @@ def create_rooms_array return rooms end + #TODO: Add check if id is within desired range def create_room_instance(id, is_reserved) if id.class == Integer return Hotel::Room.new(id, is_reserved) @@ -39,12 +40,12 @@ def create_room_instance(id, is_reserved) def add_reservation(date_range, room_id) if check_date_range(date_range) && get_unreserved_rooms(date_range).include?(room_id) - room = @rooms.select {|room| room.room_id == room_id}.first - room.is_reserved = true - new_reservation = Hotel::Reservation.new(date_range, room) + selected_room = @rooms.select {|room| room.room_id == room_id}.first + selected_room.is_reserved = true + new_reservation = Hotel::Reservation.new(date_range, selected_room) reservations << new_reservation else - raise StandardError.new("Date range is invalid") + raise StandardError.new("Date range OR room ID is invalid") end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index af76e6df5..c154ea103 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -2,7 +2,7 @@ require 'date' require 'pry' -describe "Admin class" do +describe "Admin Class" do before do @admin = Hotel::Admin.new @@ -104,6 +104,11 @@ start_date: Date.new(2018, 05, 05), end_date: Date.new(2018, 01, 01) } + + @one_day = { + start_date: Date.new(2018, 05, 05), + end_date: Date.new(2018, 05, 05) + } end it "returns true for a valid date range" do @@ -115,6 +120,11 @@ reservation = @admin.check_date_range(@bad_date_range) reservation.must_equal false end + + it "returns true if start_date == end_date" do + reservation = @admin.check_date_range(@one_day) + reservation.must_equal true + end end describe "#get_reservation_list(date)" do @@ -129,7 +139,7 @@ @admin.get_reservation_list(date).must_equal [] end - it "returns correct array if date is end_date of a reservation" do + it "returns one reservation if date is end_date of a reservation" do date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) @@ -138,11 +148,12 @@ @admin.add_reservation(date_range, room_id) list = @admin.get_reservation_list(Date.new(2018, 03, 10)) + list.length.must_equal 1 list.first.start_date.must_equal Date.new(2018, 03, 05) list.last.end_date.must_equal Date.new(2018, 03, 10) end - it "returns correct array if date is start_date of a reservation" do + it "returns one reservation if date is start_date of a reservation" do date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) @@ -151,11 +162,12 @@ @admin.add_reservation(date_range, room_id) list = @admin.get_reservation_list(Date.new(2018, 03, 05)) + list.length.must_equal 1 list.first.start_date.must_equal Date.new(2018, 03, 05) list.last.end_date.must_equal Date.new(2018, 03, 10) end - it "returns correct array if date is in between start_date and end_date" do + it "returns one reservation if date is in between start_date and end_date" do date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) @@ -164,6 +176,7 @@ @admin.add_reservation(date_range, room_id) list = @admin.get_reservation_list(Date.new(2018, 03, 06)) + list.length.must_equal 1 list.first.start_date.must_equal Date.new(2018, 03, 05) list.last.end_date.must_equal Date.new(2018, 03, 10) end @@ -228,16 +241,6 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - - @date_range2 = { - start_date: Date.new(2018, 03, 01), - end_date: Date.new(2018, 05, 20) - } - - @date_range3 = { - start_date: Date.new(2018, 05, 19), - end_date: Date.new(2018, 05, 25) - } end it "returns an Array of Integers (Room Ids)" do @@ -251,6 +254,7 @@ @admin.num_rooms.times do |num| @admin.add_reservation(@date_range1, num + 1) end + available_rooms = @admin.get_unreserved_rooms(@date_range1) available_rooms.must_equal [] end From b0831a94a47e942c5408015b8da065d79a4042ef Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 16:16:02 -0800 Subject: [PATCH 35/72] Refactors and cleans Reservation class --- lib/reservation.rb | 23 +++++++++++------------ specs/reservation_spec.rb | 25 +++++++++++++++---------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 80c28f9d7..ea5c40d8c 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,30 +1,29 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :cost_per_day, :cost, :room, :reservation_id + attr_reader :start_date, :end_date, :cost_per_night, :cost, :room, :reservation_id def initialize(date_range, room) @start_date = date_range[:start_date] @end_date = date_range[:end_date] - @cost_per_day = 200 + @cost_per_night = 200 @cost = calculate_cost @room = room - #TODO: @reservation_id = get_id end def calculate_cost - total_days = (end_date - start_date).to_i - if total_days > 0 - cost = (total_days - 1) * cost_per_day - return cost + total_nights = (end_date - start_date).to_i + + if total_nights == 0 + raise StandardError.new("Start date cannot equal end date.") + elsif total_nights == 1 + cost = cost_per_night else - return cost_per_day + cost = (total_nights - 1) * cost_per_night end + + return cost end - # def get_id - # - # end - end end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index ab04e9efd..e7bc45cf1 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -1,8 +1,7 @@ require_relative 'spec_helper' -describe "Reservation class" do +describe "Reservation Class" do before do - # cost = 800 date_range = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) @@ -22,7 +21,6 @@ @reservation.end_date.must_be_kind_of Date @reservation.cost.must_be_kind_of Integer @reservation.room.must_be_instance_of Hotel::Room - # @reservation.reservation_id.must_be_kind_of Integer end end @@ -31,20 +29,27 @@ @reservation.cost.must_equal 800 end + it "raises error if start_date == end_date" do + zero_days = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 05) + } + room = Hotel::Room.new(1, true) + + proc { + Hotel::Reservation.new(one_day, room) + }.must_raise StandardError + end + it "accurately calculates cost for one day" do one_day = { start_date: Date.new(2018, 03, 05), - end_date: Date.new(2018, 03, 05) + end_date: Date.new(2018, 03, 06) } - room = Hotel::Room.new(1, false) + room = Hotel::Room.new(1, true) reservation = Hotel::Reservation.new(one_day, room) reservation.cost.must_equal 200 end end - # describe "#get_id" do - # it "returns an Integer" do - # @reservation.get_id.must_be_kind_of Integer - # end - # end end From 3b57b8518fadb7a46e0ed4e434e4dfe8023ca7e9 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 16:17:24 -0800 Subject: [PATCH 36/72] Refactors and cleans Room class and tests --- specs/room_spec.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/specs/room_spec.rb b/specs/room_spec.rb index 755d1d280..c4bed4126 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -1,9 +1,10 @@ require_relative 'spec_helper' -describe "Room class" do +describe "Room Class" do before do id = 1 - @room = Hotel::Room.new(id, false) + is_reserved = false + @room = Hotel::Room.new(id, is_reserved) end describe "Initializer" do From 683c9de7bec022cc161f935d23bbb961affd33ff Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 7 Mar 2018 16:22:01 -0800 Subject: [PATCH 37/72] Changes local var unreserved_rooms to unreserved_rooms_ids in #get_unreserved_rooms --- lib/admin.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index ff8b0bfa3..b80e040a4 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -91,23 +91,23 @@ def compare_dates(reservation, date) def get_unreserved_rooms(date_range) desired_start_date = date_range[:start_date] desired_end_date = date_range[:end_date] - unreserved_rooms = [] + unreserved_room_ids = [] reservations.each do |reservation| reservation_start = reservation.start_date reservation_end = reservation.end_date if desired_end_date <= reservation_start || desired_start_date >= reservation_end - unreserved_rooms << reservation.room.room_id + unreserved_room_ids << reservation.room.room_id end end rooms.each do |room| if room.is_reserved == false - unreserved_rooms << room.room_id + unreserved_room_ids << room.room_id end end - return unreserved_rooms.sort.uniq + return unreserved_room_ids.sort.uniq end end From ce523539182ea2560baebbdfa22291f7872763de Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 08:59:12 -0800 Subject: [PATCH 38/72] Changes #calculate_cost in Reservation class --- lib/reservation.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index ea5c40d8c..d3bbdfc3f 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -12,16 +12,16 @@ def initialize(date_range, room) end def calculate_cost - total_nights = (end_date - start_date).to_i + total_days = (end_date - start_date).to_i - if total_nights == 0 + if total_days == 0 raise StandardError.new("Start date cannot equal end date.") - elsif total_nights == 1 + elsif total_days == 1 cost = cost_per_night else - cost = (total_nights - 1) * cost_per_night + cost = (total_days - 1) * cost_per_night end - + return cost end From 9bb863dedf52eeeae6ec8d101f9982f7e481c791 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 09:00:38 -0800 Subject: [PATCH 39/72] Removes require 'time' --- specs/spec_helper.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index 5172ff6e2..867f5c5b0 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -1,5 +1,3 @@ -# require 'time' - require 'simplecov' SimpleCov.start From 0de6bfbdcb82fc2dfcb1f8b9c9d367d263ca86b1 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 17:44:50 -0800 Subject: [PATCH 40/72] Adds method stubs/pseudocode/todos for Wave 3 requirements --- lib/admin.rb | 52 +++++++++++++++++++++++++++++++++++++++++++++- lib/reservation.rb | 2 ++ lib/room.rb | 1 + 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/lib/admin.rb b/lib/admin.rb index b80e040a4..c4a1ea51c 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -37,11 +37,30 @@ def create_room_instance(id, is_reserved) end #---------------------------------------------------------------------# + #TODO: add calculate_room_rate(# of rooms) + + #TODO: add #make_block(date_range {}, # of rooms) + # def make_block(date_range, # of rooms) + # call get_unreserved_rooms(date_range) + # check if #rooms if available + # calculate room_rate(# of rooms) + # make block hash and push into block array (@blocks) + # end + + #TODO: add #add_reservation_in_block(room_id) + # def add_reservation_in_block(room_id) + # check if room is in block + # if T, get date range and cost/night from block hash + # call add_reservation(date_range, room_id) + # Hotel::Reservation.new(date_range, room, cost/night) + # end def add_reservation(date_range, room_id) if check_date_range(date_range) && get_unreserved_rooms(date_range).include?(room_id) + #TODO: user get_room(id) method for selected_room selected_room = @rooms.select {|room| room.room_id == room_id}.first selected_room.is_reserved = true + #TODO: add cost cost_per_night parameter below new_reservation = Hotel::Reservation.new(date_range, selected_room) reservations << new_reservation else @@ -87,10 +106,13 @@ def compare_dates(reservation, date) end #---------------------------------------------------------------------# - + #NOTE: will not return rooms in blocks. def get_unreserved_rooms(date_range) desired_start_date = date_range[:start_date] desired_end_date = date_range[:end_date] + + #TODO: make each do block below a separate helper method -> check_reservations(date_range). returns unreserved_room_ids + #TODO: add if statement that checks if reservation.room.is_in_block is false unreserved_room_ids = [] reservations.each do |reservation| reservation_start = reservation.start_date @@ -101,7 +123,9 @@ def get_unreserved_rooms(date_range) end end + #TODO: make separate helper method -> check_rooms(array of rooms). returns array of unreserved_room_ids rooms.each do |room| + #TODO: change below if statement to room.is_reserved == false && is_in_block == false if room.is_reserved == false unreserved_room_ids << room.room_id end @@ -110,5 +134,31 @@ def get_unreserved_rooms(date_range) return unreserved_room_ids.sort.uniq end +#---------------------------------------------------------------------# + + # def check_reservations(array_of_reservations) + # + # end + + # def check_rooms(array_of_rooms) + # + # end + + # def check_block(array_of_blocks) + # => call check_rooms(array of rooms from block) + # end + + private + + #TODO: add PRIVATE get_room(id) method + # def get_room(id) + # => returns Room instance + # end + + #TODO: add PRIVATE get_block(id) method + # def get_block(room_id) + # => returns block hash + # end + end end diff --git a/lib/reservation.rb b/lib/reservation.rb index d3bbdfc3f..f12d8aeeb 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -3,9 +3,11 @@ class Reservation attr_reader :start_date, :end_date, :cost_per_night, :cost, :room, :reservation_id + #TODO: add cost per night to parameters and attr_reader. default cost is 200. def initialize(date_range, room) @start_date = date_range[:start_date] @end_date = date_range[:end_date] + # @cost_per_night = cost_per_night @cost_per_night = 200 @cost = calculate_cost @room = room diff --git a/lib/room.rb b/lib/room.rb index c1e5b4aa8..d8324a90c 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -7,6 +7,7 @@ class Room def initialize(id, is_reserved) @room_id = id @is_reserved = is_reserved + #TODO: add @is_in_block end end From 53de6832fb061ca88f9f1179fefbb36928c942c7 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 18:00:30 -0800 Subject: [PATCH 41/72] Adds test stubs/comments for existing methods before Wave 3 changes --- lib/admin.rb | 3 +-- specs/admin_spec.rb | 15 +++++++++++++++ specs/room_spec.rb | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index c4a1ea51c..aaa7f0929 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -6,13 +6,12 @@ module Hotel class Admin - attr_reader :reservations, :num_rooms, :rooms, :reservation_id_tracker + attr_reader :reservations, :num_rooms, :rooms def initialize @reservations = [] @num_rooms = 20 @rooms = create_rooms_array - # @reservation_id_tracker = 0 end #---------------------------------------------------------------------# diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index c154ea103..a3a59d694 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -337,6 +337,21 @@ available_rooms.must_equal (2..20).to_a end + it "does not return rooms within a block" do + skip + # make a block + # call get_unreserved_rooms + # unreserved_room_ids should not include any ids in block + end + + it "returns rooms within a block if start_date == end_date of block" do + skip + # make_block + # make date range that starts the same day block ends + # call get_unreserved_rooms(date_range) + # unreserved_room_ids should into include ids in block + end + end end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index c4bed4126..781caa586 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -15,6 +15,7 @@ it "creates initial data structures" do @room.is_reserved.must_equal false @room.room_id.must_be_kind_of Integer + #@room.is_in_block.must_equal false end end end From b0176f36820b1f0e7a6e58a190c41a58a47be35c Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 18:01:19 -0800 Subject: [PATCH 42/72] Pre-wave 3 clean up --- lib/reservation.rb | 2 +- specs/reservation_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index f12d8aeeb..9e89da66c 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,7 +1,7 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :cost_per_night, :cost, :room, :reservation_id + attr_reader :start_date, :end_date, :cost_per_night, :cost, :room #TODO: add cost per night to parameters and attr_reader. default cost is 200. def initialize(date_range, room) diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index e7bc45cf1..08ead1784 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -29,7 +29,7 @@ @reservation.cost.must_equal 800 end - it "raises error if start_date == end_date" do + it "raises StandardError if start_date == end_date" do zero_days = { start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 05) From b1b9e04f2981792acc2f0e9e0e54dce94fa3d2ed Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 19:48:40 -0800 Subject: [PATCH 43/72] Adds is_in_block instance variable to Room class --- lib/admin.rb | 1 + lib/room.rb | 6 +++--- specs/room_spec.rb | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index aaa7f0929..a70ece96b 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -19,6 +19,7 @@ def initialize def create_rooms_array rooms = [] is_reserved = false + # is_in_block = false num_rooms.times do |i| id = i + 1 rooms << create_room_instance(id, is_reserved) diff --git a/lib/room.rb b/lib/room.rb index d8324a90c..94b1b6e18 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -2,12 +2,12 @@ module Hotel class Room attr_reader :room_id - attr_accessor :is_reserved + attr_accessor :is_reserved, :is_in_block - def initialize(id, is_reserved) + def initialize(id, is_reserved, is_in_block: false) @room_id = id @is_reserved = is_reserved - #TODO: add @is_in_block + @is_in_block = is_in_block end end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index 781caa586..c161fd278 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -4,7 +4,8 @@ before do id = 1 is_reserved = false - @room = Hotel::Room.new(id, is_reserved) + @room = Hotel::Room.new(id, is_reserved, is_in_block: false) + # @room = Hotel::Room.new(id, is_reserved) end describe "Initializer" do @@ -15,7 +16,7 @@ it "creates initial data structures" do @room.is_reserved.must_equal false @room.room_id.must_be_kind_of Integer - #@room.is_in_block.must_equal false + @room.is_in_block.must_equal false end end end From cba162f57105e9a035bb23acaeda51bc41c77c8e Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 19:55:50 -0800 Subject: [PATCH 44/72] Adds is_in_block logic to existing methods --- lib/admin.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index a70ece96b..cd4a3d112 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -60,6 +60,7 @@ def add_reservation(date_range, room_id) #TODO: user get_room(id) method for selected_room selected_room = @rooms.select {|room| room.room_id == room_id}.first selected_room.is_reserved = true + selected_room.is_in_block = true #TODO: add cost cost_per_night parameter below new_reservation = Hotel::Reservation.new(date_range, selected_room) reservations << new_reservation @@ -112,7 +113,7 @@ def get_unreserved_rooms(date_range) desired_end_date = date_range[:end_date] #TODO: make each do block below a separate helper method -> check_reservations(date_range). returns unreserved_room_ids - #TODO: add if statement that checks if reservation.room.is_in_block is false + #TODO: add if statement that checks if reservation.room.is_in_block is false (IS THIS REDUNDANT!!) unreserved_room_ids = [] reservations.each do |reservation| reservation_start = reservation.start_date @@ -125,8 +126,7 @@ def get_unreserved_rooms(date_range) #TODO: make separate helper method -> check_rooms(array of rooms). returns array of unreserved_room_ids rooms.each do |room| - #TODO: change below if statement to room.is_reserved == false && is_in_block == false - if room.is_reserved == false + if room.is_reserved == false && room.is_in_block == false unreserved_room_ids << room.room_id end end From 979173610fc39e294f54014a4eaabadd19d7cc53 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 20:01:34 -0800 Subject: [PATCH 45/72] Creates default value for @cost_per_night and @cost to @total_cost --- lib/reservation.rb | 11 +++++------ specs/reservation_spec.rb | 7 ++++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 9e89da66c..54223057a 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,15 +1,14 @@ module Hotel class Reservation - attr_reader :start_date, :end_date, :cost_per_night, :cost, :room + attr_reader :start_date, :end_date, :cost_per_night, :total_cost, :room - #TODO: add cost per night to parameters and attr_reader. default cost is 200. - def initialize(date_range, room) + def initialize(date_range, room, cost_per_night: 200) @start_date = date_range[:start_date] @end_date = date_range[:end_date] - # @cost_per_night = cost_per_night - @cost_per_night = 200 - @cost = calculate_cost + # @cost_per_night = 200 + @cost_per_night = cost_per_night + @total_cost = calculate_cost @room = room end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 08ead1784..cfda72bb7 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -19,14 +19,15 @@ it "correctly initializes instance variables" do @reservation.start_date.must_be_kind_of Date @reservation.end_date.must_be_kind_of Date - @reservation.cost.must_be_kind_of Integer + @reservation.cost_per_night.must_be_kind_of Integer + @reservation.total_cost.must_be_kind_of Integer @reservation.room.must_be_instance_of Hotel::Room end end describe "#calculate_cost" do it "accurately calculates cost" do - @reservation.cost.must_equal 800 + @reservation.total_cost.must_equal 800 end it "raises StandardError if start_date == end_date" do @@ -48,7 +49,7 @@ } room = Hotel::Room.new(1, true) reservation = Hotel::Reservation.new(one_day, room) - reservation.cost.must_equal 200 + reservation.total_cost.must_equal 200 end end From ca848b72203fa57977fbe40d959a3edaa6e2c707 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 20:16:05 -0800 Subject: [PATCH 46/72] Adds test for #total_cost using non-default cost_per_night val --- specs/reservation_spec.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index cfda72bb7..d03d78eec 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -51,6 +51,18 @@ reservation = Hotel::Reservation.new(one_day, room) reservation.total_cost.must_equal 200 end + + it "accurately calculates cost for room in a block with 4 rooms" do + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + # calculate cost using cost_per_night function in admin + room = Hotel::Room.new(1, true, is_in_block: true) + cost = 160 #cost_per_night for 4 rooms + reservation = Hotel::Reservation.new(date_range, room, cost_per_night: cost) + reservation.total_cost.must_equal 640 + end end end From 7db56fbe2fb3f313847892e46210a4d24ca7d93f Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 20:31:57 -0800 Subject: [PATCH 47/72] Adds @base_rate, @discount_rate, #cost_per_night --- lib/admin.rb | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index cd4a3d112..c27cdd278 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -4,14 +4,19 @@ require 'date' module Hotel + class Admin - attr_reader :reservations, :num_rooms, :rooms + + + attr_reader :reservations, :num_rooms, :rooms, :base_rate, :discount_rate def initialize @reservations = [] @num_rooms = 20 @rooms = create_rooms_array + @base_rate = 200 + @discount_rate = 0.05 end #---------------------------------------------------------------------# @@ -37,7 +42,6 @@ def create_room_instance(id, is_reserved) end #---------------------------------------------------------------------# - #TODO: add calculate_room_rate(# of rooms) #TODO: add #make_block(date_range {}, # of rooms) # def make_block(date_range, # of rooms) @@ -62,7 +66,9 @@ def add_reservation(date_range, room_id) selected_room.is_reserved = true selected_room.is_in_block = true #TODO: add cost cost_per_night parameter below - new_reservation = Hotel::Reservation.new(date_range, selected_room) + cost = cost_per_night(4) + new_reservation = Hotel::Reservation.new(date_range, selected_room, cost_per_night: cost) + # new_reservation = Hotel::Reservation.new(date_range, selected_room) reservations << new_reservation else raise StandardError.new("Date range OR room ID is invalid") @@ -148,8 +154,14 @@ def get_unreserved_rooms(date_range) # => call check_rooms(array of rooms from block) # end + def cost_per_night(num_rooms) + return base_rate - (base_rate*(discount_rate * num_rooms)) + end + private + + #TODO: add PRIVATE get_room(id) method # def get_room(id) # => returns Room instance From 13c39eef4a9db377358e609117497427737680c3 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 20:36:49 -0800 Subject: [PATCH 48/72] Adds tests for @base_rate and @discount_rate. Adds comments for future code --- lib/admin.rb | 9 +++++---- specs/admin_spec.rb | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index c27cdd278..d84da6955 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -65,10 +65,11 @@ def add_reservation(date_range, room_id) selected_room = @rooms.select {|room| room.room_id == room_id}.first selected_room.is_reserved = true selected_room.is_in_block = true - #TODO: add cost cost_per_night parameter below - cost = cost_per_night(4) - new_reservation = Hotel::Reservation.new(date_range, selected_room, cost_per_night: cost) - # new_reservation = Hotel::Reservation.new(date_range, selected_room) + + # num_rooms = 4 + # cost = cost_per_night(num_rooms) + # new_reservation = Hotel::Reservation.new(date_range, selected_room, cost_per_night: cost) + new_reservation = Hotel::Reservation.new(date_range, selected_room) reservations << new_reservation else raise StandardError.new("Date range OR room ID is invalid") diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index a3a59d694..b8bc289ff 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -3,7 +3,6 @@ require 'pry' describe "Admin Class" do - before do @admin = Hotel::Admin.new end @@ -17,6 +16,8 @@ @admin.reservations.must_be_kind_of Array @admin.num_rooms.must_be_kind_of Integer @admin.rooms.must_be_kind_of Array + @admin.base_rate.must_be_kind_of Integer + @admin.discount_rate.must_be_kind_of Float end end From c99a49a4a67024fdcd267f3a69ef172136383bf0 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 20:39:50 -0800 Subject: [PATCH 49/72] Adds #get_room(id) helper method --- lib/admin.rb | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index d84da6955..7a7b493c2 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -61,8 +61,7 @@ def create_room_instance(id, is_reserved) def add_reservation(date_range, room_id) if check_date_range(date_range) && get_unreserved_rooms(date_range).include?(room_id) - #TODO: user get_room(id) method for selected_room - selected_room = @rooms.select {|room| room.room_id == room_id}.first + selected_room = get_room(room_id) selected_room.is_reserved = true selected_room.is_in_block = true @@ -155,18 +154,18 @@ def get_unreserved_rooms(date_range) # => call check_rooms(array of rooms from block) # end - def cost_per_night(num_rooms) - return base_rate - (base_rate*(discount_rate * num_rooms)) - end - private + private + def cost_per_night(num_rooms) + return base_rate - (base_rate*(discount_rate * num_rooms)) + end #TODO: add PRIVATE get_room(id) method - # def get_room(id) - # => returns Room instance - # end + def get_room(id) + return rooms.select {|room| room.room_id == id}.first + end #TODO: add PRIVATE get_block(id) method # def get_block(room_id) From f5ba6e78c37cf6768d1e870c3034884439cf1ead Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 20:54:43 -0800 Subject: [PATCH 50/72] Adds #check_rooms(array_of_rooms) and test --- lib/admin.rb | 20 +++++++++++--------- specs/admin_spec.rb | 6 ++++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 7a7b493c2..3c673a8e4 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -130,12 +130,7 @@ def get_unreserved_rooms(date_range) end end - #TODO: make separate helper method -> check_rooms(array of rooms). returns array of unreserved_room_ids - rooms.each do |room| - if room.is_reserved == false && room.is_in_block == false - unreserved_room_ids << room.room_id - end - end + unreserved_room_ids += check_rooms(rooms) return unreserved_room_ids.sort.uniq end @@ -146,9 +141,16 @@ def get_unreserved_rooms(date_range) # # end - # def check_rooms(array_of_rooms) - # - # end + #TODO: raise error if parameter is not an Array + def check_rooms(array_of_rooms) + unreserved_room_ids = [] + array_of_rooms.each do |room| + if room.is_reserved == false && room.is_in_block == false + unreserved_room_ids << room.room_id + end + end + return unreserved_room_ids + end # def check_block(array_of_blocks) # => call check_rooms(array of rooms from block) diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index b8bc289ff..5372e8f05 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -352,7 +352,13 @@ # call get_unreserved_rooms(date_range) # unreserved_room_ids should into include ids in block end + end + describe "#check_rooms" do + it "returns array" do + rooms = @admin.rooms + @admin.check_rooms(rooms).must_be_kind_of Array + end end end From a5b991de126ca72c6ff8973781053e563a7c2f9b Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 21:02:50 -0800 Subject: [PATCH 51/72] Adds #check_reservations(date_range, reservations) and test --- lib/admin.rb | 22 +++++++++++----------- specs/admin_spec.rb | 13 ++++++++++++- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 3c673a8e4..02706cccc 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -113,13 +113,21 @@ def compare_dates(reservation, date) end #---------------------------------------------------------------------# + #NOTE: will not return rooms in blocks. def get_unreserved_rooms(date_range) + unreserved_room_ids = check_reservations(date_range, reservations) + check_rooms(rooms) + + return unreserved_room_ids.sort.uniq + end + +#---------------------------------------------------------------------# + + def check_reservations(date_range, array_of_reservations) + #TODO: add if statement that checks if reservation.room.is_in_block is false (IS THIS REDUNDANT!!) desired_start_date = date_range[:start_date] desired_end_date = date_range[:end_date] - #TODO: make each do block below a separate helper method -> check_reservations(date_range). returns unreserved_room_ids - #TODO: add if statement that checks if reservation.room.is_in_block is false (IS THIS REDUNDANT!!) unreserved_room_ids = [] reservations.each do |reservation| reservation_start = reservation.start_date @@ -130,17 +138,9 @@ def get_unreserved_rooms(date_range) end end - unreserved_room_ids += check_rooms(rooms) - - return unreserved_room_ids.sort.uniq + return unreserved_room_ids end -#---------------------------------------------------------------------# - - # def check_reservations(array_of_reservations) - # - # end - #TODO: raise error if parameter is not an Array def check_rooms(array_of_rooms) unreserved_room_ids = [] diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 5372e8f05..0a1365ad1 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -354,8 +354,19 @@ end end + describe "#check_reservations" do + it "returns an array" do + date_range = { + start_date: Date.new(2018, 03, 5), + end_date: Date.new(2018, 03, 10) + } + reservations = @admin.reservations + @admin.check_reservations(date_range, reservations).must_be_kind_of Array + end + end + describe "#check_rooms" do - it "returns array" do + it "returns an array" do rooms = @admin.rooms @admin.check_rooms(rooms).must_be_kind_of Array end From 8f11854d091e7fce3d89aac076a4e558f6485339 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Thu, 8 Mar 2018 21:05:51 -0800 Subject: [PATCH 52/72] Adds @blocks in Admin class and adds one test --- lib/admin.rb | 6 +++--- specs/admin_spec.rb | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 02706cccc..d40e0d9c5 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -7,12 +7,11 @@ module Hotel class Admin - - - attr_reader :reservations, :num_rooms, :rooms, :base_rate, :discount_rate + attr_reader :reservations, :num_rooms, :rooms, :base_rate, :discount_rate, :blocks def initialize @reservations = [] + @blocks = [] @num_rooms = 20 @rooms = create_rooms_array @base_rate = 200 @@ -152,6 +151,7 @@ def check_rooms(array_of_rooms) return unreserved_room_ids end + #TODO: add check_block(array_of_blocks) # def check_block(array_of_blocks) # => call check_rooms(array of rooms from block) # end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 0a1365ad1..c9330f83c 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -14,6 +14,7 @@ it "creates initial data structures" do @admin.reservations.must_be_kind_of Array + @admin.blocks.must_be_kind_of Array @admin.num_rooms.must_be_kind_of Integer @admin.rooms.must_be_kind_of Array @admin.base_rate.must_be_kind_of Integer From 1c46182e9c71c1a6071b8eb5829ec3eda0024a4e Mon Sep 17 00:00:00 2001 From: Phoebe Date: Fri, 9 Mar 2018 13:00:00 -0800 Subject: [PATCH 53/72] Adds #make_block and related tests --- lib/admin.rb | 35 +++++++++++++++++++++++++++------ specs/admin_spec.rb | 47 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index d40e0d9c5..5d5b8e8a2 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -43,12 +43,35 @@ def create_room_instance(id, is_reserved) #---------------------------------------------------------------------# #TODO: add #make_block(date_range {}, # of rooms) - # def make_block(date_range, # of rooms) - # call get_unreserved_rooms(date_range) - # check if #rooms if available - # calculate room_rate(# of rooms) - # make block hash and push into block array (@blocks) - # end + def make_block(date_range, num_rooms) + if num_rooms < 2 + raise StandardError.new("Blocks must contain > 1 room") + end + + unreserved_room_ids = get_unreserved_rooms(date_range) + if unreserved_room_ids.length >= num_rooms + room_objs = [] + i = 0 + while i < num_rooms + room = get_room(unreserved_room_ids[i]) + room.is_in_block = true + room_objs << room + i += 1 + end + + block = { + start_date: date_range[:start_date], + end_date: date_range[:end_date], + rooms: room_objs, + room_rate: cost_per_night(num_rooms) + } + + blocks << block + return block + else + return nil + end + end #TODO: add #add_reservation_in_block(room_id) # def add_reservation_in_block(room_id) diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index c9330f83c..fce300e5e 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -57,6 +57,53 @@ end end + describe "#make_block" do + before do + @date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + end + + it "returns a hash" do + num_rooms = 2 + block = @admin.make_block(@date_range, num_rooms) + block.must_be_kind_of Hash + end + + it "raises a StandardError if num_rooms < 2" do + num_rooms = 1 + proc { + @admin.make_block(@date_range, num_rooms) + }.must_raise StandardError + end + + it "returns nil if there are not enough rooms available" do + @admin.num_rooms.times do |num| + @admin.add_reservation(@date_range, num + 1) + end + num_rooms = 2 + block = @admin.make_block(@date_range, num_rooms) + block.must_equal nil + end + + it "returns the correct block" do + num_rooms = 5 + block = @admin.make_block(@date_range, num_rooms) + block[:start_date].must_equal Date.new(2018, 03, 05) + block[:end_date].must_equal Date.new(2018, 03, 10) + block[:rooms].must_be_kind_of Array + block[:room_rate].must_equal 150 + end + + it "returns a block with an Array of Room objs" do + num_rooms = 5 + block = @admin.make_block(@date_range, num_rooms) + rooms = block[:rooms] + rooms.all? {|room| room.must_be_instance_of Hotel::Room} + end + end + describe "#add_reservation" do before do @date_range = { From 406579ae2363a09ba5cc5417043d40738640820f Mon Sep 17 00:00:00 2001 From: Phoebe Date: Fri, 9 Mar 2018 13:10:20 -0800 Subject: [PATCH 54/72] Adds private #get_room_objs --- lib/admin.rb | 21 ++++++++++++++------- specs/admin_spec.rb | 1 + 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 5d5b8e8a2..bae31a7b1 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -42,7 +42,6 @@ def create_room_instance(id, is_reserved) #---------------------------------------------------------------------# - #TODO: add #make_block(date_range {}, # of rooms) def make_block(date_range, num_rooms) if num_rooms < 2 raise StandardError.new("Blocks must contain > 1 room") @@ -50,13 +49,10 @@ def make_block(date_range, num_rooms) unreserved_room_ids = get_unreserved_rooms(date_range) if unreserved_room_ids.length >= num_rooms - room_objs = [] - i = 0 - while i < num_rooms - room = get_room(unreserved_room_ids[i]) + + room_objs = get_room_objs(unreserved_room_ids) + room_objs.each do |room| room.is_in_block = true - room_objs << room - i += 1 end block = { @@ -73,6 +69,7 @@ def make_block(date_range, num_rooms) end end + #TODO: add #add_reservation_in_block(room_id) # def add_reservation_in_block(room_id) # check if room is in block @@ -192,6 +189,16 @@ def get_room(id) return rooms.select {|room| room.room_id == id}.first end + def get_room_objs(room_ids) + room_objs = [] + i = 0 + while i < num_rooms + room_objs << get_room(room_ids[i]) + i += 1 + end + return room_objs + end + #TODO: add PRIVATE get_block(id) method # def get_block(room_id) # => returns block hash diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index fce300e5e..2ca557828 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -101,6 +101,7 @@ block = @admin.make_block(@date_range, num_rooms) rooms = block[:rooms] rooms.all? {|room| room.must_be_instance_of Hotel::Room} + rooms.all? {|room| room.is_in_block.must_equal true} end end From bf6e31e7a4ad7b129486b27962fb74a1355d82c4 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Fri, 9 Mar 2018 13:32:52 -0800 Subject: [PATCH 55/72] Adds test in #get_unreserved_rooms for blocks --- lib/admin.rb | 6 ++---- specs/admin_spec.rb | 11 +++++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index bae31a7b1..702393c45 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -50,7 +50,7 @@ def make_block(date_range, num_rooms) unreserved_room_ids = get_unreserved_rooms(date_range) if unreserved_room_ids.length >= num_rooms - room_objs = get_room_objs(unreserved_room_ids) + room_objs = get_room_objs(unreserved_room_ids.shift(num_rooms)) room_objs.each do |room| room.is_in_block = true end @@ -176,8 +176,6 @@ def check_rooms(array_of_rooms) # => call check_rooms(array of rooms from block) # end - - private def cost_per_night(num_rooms) @@ -192,7 +190,7 @@ def get_room(id) def get_room_objs(room_ids) room_objs = [] i = 0 - while i < num_rooms + while i < room_ids.length room_objs << get_room(room_ids[i]) i += 1 end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 2ca557828..aacf7c8fa 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -93,6 +93,7 @@ block[:start_date].must_equal Date.new(2018, 03, 05) block[:end_date].must_equal Date.new(2018, 03, 10) block[:rooms].must_be_kind_of Array + block[:rooms].length.must_equal 5 block[:room_rate].must_equal 150 end @@ -388,10 +389,12 @@ end it "does not return rooms within a block" do - skip - # make a block - # call get_unreserved_rooms - # unreserved_room_ids should not include any ids in block + num_rooms = 4 + block = @admin.make_block(@date_range1, num_rooms) + unreserved_rooms_ids = @admin.get_unreserved_rooms(@date_range1) + rooms = block[:rooms] + + rooms.any?{|room| unreserved_rooms_ids.include?(room.room_id)}.must_equal false end it "returns rooms within a block if start_date == end_date of block" do From 63a5582adb415eefb7fd94ef98ba3a373fabf9bd Mon Sep 17 00:00:00 2001 From: Phoebe Date: Fri, 9 Mar 2018 17:26:00 -0800 Subject: [PATCH 56/72] Adds #get_block(room_id) and tests --- lib/admin.rb | 22 +++++++++++++++++----- specs/admin_spec.rb | 23 ++++++++++++++++++++++- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 702393c45..2aad80352 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -176,13 +176,28 @@ def check_rooms(array_of_rooms) # => call check_rooms(array of rooms from block) # end + #TODO: add PRIVATE get_block(id) method + def get_block(room_id) + block = {} + + blocks.each do |b| + rooms = b[:rooms] + rooms.each do |r| + if r.room_id == room_id + block = b + break + end + end + end + return block + end + private def cost_per_night(num_rooms) return base_rate - (base_rate*(discount_rate * num_rooms)) end - #TODO: add PRIVATE get_room(id) method def get_room(id) return rooms.select {|room| room.room_id == id}.first end @@ -197,10 +212,7 @@ def get_room_objs(room_ids) return room_objs end - #TODO: add PRIVATE get_block(id) method - # def get_block(room_id) - # => returns block hash - # end + end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index aacf7c8fa..34c4819af 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -393,7 +393,7 @@ block = @admin.make_block(@date_range1, num_rooms) unreserved_rooms_ids = @admin.get_unreserved_rooms(@date_range1) rooms = block[:rooms] - + rooms.any?{|room| unreserved_rooms_ids.include?(room.room_id)}.must_equal false end @@ -424,4 +424,25 @@ end end + describe "#get_block" do + before do + date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + num_rooms = 3 + @block = @admin.make_block(date_range, num_rooms) + end + + it "returns a block for rooms in block" do + @admin.get_block(1).must_equal @block + @admin.get_block(2).must_equal @block + @admin.get_block(3).must_equal @block + end + + it "returns empty {} if id is not in block" do + @admin.get_block(4).wont_equal @block + end + end + end From afef7559f626c89a18b64ed457754064e1a070aa Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sat, 10 Mar 2018 20:19:38 -0800 Subject: [PATCH 57/72] Adds #add_reservation_in_block and related tests --- lib/admin.rb | 32 ++++++++++++++++++++++++-------- specs/admin_spec.rb | 42 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 2aad80352..6293b1412 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -71,18 +71,36 @@ def make_block(date_range, num_rooms) #TODO: add #add_reservation_in_block(room_id) - # def add_reservation_in_block(room_id) + def add_reservation_in_block(room_id) + + if room_id.class != Integer || room_id <= 0 || room_id > num_rooms + raise ArgumentError.new("Invalid room ID") + end # check if room is in block - # if T, get date range and cost/night from block hash - # call add_reservation(date_range, room_id) - # Hotel::Reservation.new(date_range, room, cost/night) - # end + block = get_block(room_id) + if block != {} + #get date range + date_range = {} + date_range[:start_date] = block[:start_date] + date_range[:end_date] = block[:end_date] + room = get_room(room_id) + room.is_reserved = true + cost = block[:room_rate] + # add_reservation(date_range, room_id) + # create reservation here + new_reservation = Hotel::Reservation.new(date_range, room, cost_per_night: cost) + reservations << new_reservation + else + raise StandardError.new("That room is not in a block.") + end + + end def add_reservation(date_range, room_id) if check_date_range(date_range) && get_unreserved_rooms(date_range).include?(room_id) selected_room = get_room(room_id) selected_room.is_reserved = true - selected_room.is_in_block = true + # selected_room.is_in_block = true # num_rooms = 4 # cost = cost_per_night(num_rooms) @@ -212,7 +230,5 @@ def get_room_objs(room_ids) return room_objs end - - end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 34c4819af..528fec3bc 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -106,6 +106,46 @@ end end + describe "#add_reservation_in_block" do + before do + @date_range = { + start_date: Date.new(2018, 03, 05), + end_date: Date.new(2018, 03, 10) + } + end + + it "raises a StandardError if room with room_id is not in a block" do + room_id = 4 + @admin.add_reservation(@date_range, room_id) + proc { + @admin.add_reservation_in_block(room_id) + }.must_raise StandardError + end + + it "raises a ArgumentError if room_id is not valid integer" do + room_id = "4" + room_id2 = 55 + proc { + @admin.add_reservation_in_block(room_id) + @admin.add_reservation_in_block(room_id2) + }.must_raise ArgumentError + end + + it "successfully creates new reservation for valid room in block" do + num_rooms = 2 + block = @admin.make_block(@date_range, num_rooms) + rooms = block[:rooms] + first_room = rooms.first + + first_room.is_reserved.must_equal false + @admin.add_reservation_in_block(1) + rooms = block[:rooms] + rooms.first.is_in_block.must_equal true + rooms.first.is_reserved.must_equal true + end + + end + describe "#add_reservation" do before do @date_range = { @@ -433,7 +473,7 @@ num_rooms = 3 @block = @admin.make_block(date_range, num_rooms) end - + it "returns a block for rooms in block" do @admin.get_block(1).must_equal @block @admin.get_block(2).must_equal @block From dc1e7c277405878c1cb2c38a3d4018e14448f901 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sat, 10 Mar 2018 20:35:49 -0800 Subject: [PATCH 58/72] Adds #check_block(block) and tests --- lib/admin.rb | 16 ++++++++++++---- specs/admin_spec.rb | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 6293b1412..159d7ade2 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -189,10 +189,18 @@ def check_rooms(array_of_rooms) return unreserved_room_ids end - #TODO: add check_block(array_of_blocks) - # def check_block(array_of_blocks) - # => call check_rooms(array of rooms from block) - # end + #TODO: add check_block(block) + def check_block(block) + unreserved_rooms = [] + rooms = block[:rooms] + rooms.each do |room| + if room.is_reserved == false + unreserved_rooms << room.room_id + end + end + return unreserved_rooms + # check_rooms(array of rooms from block) + end #TODO: add PRIVATE get_block(id) method def get_block(room_id) diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 528fec3bc..b09cd0d5e 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -440,9 +440,19 @@ it "returns rooms within a block if start_date == end_date of block" do skip # make_block + num_rooms = 2 + block = @admin.make_block(@date_range1, num_rooms) # make date range that starts the same day block ends + new_date_range = { + start_date: Date.new(2018, 03, 10), + end_date: Date.new(2018, 03, 12) + } # call get_unreserved_rooms(date_range) + unreserved_room_ids = @admin.get_unreserved_rooms(new_date_range) + binding.pry # unreserved_room_ids should into include ids in block + unreserved_room_ids.include?(1).must_equal true + unreserved_room_ids.include?(2).must_equal true end end @@ -464,6 +474,32 @@ end end + describe "#check_block(block)" do + before do + @date_range = { + start_date: Date.new(2018, 03, 5), + end_date: Date.new(2018, 03, 10) + } + end + + it "returns non-empty array if there are available rooms" do + num_rooms = 2 + block = @admin.make_block(@date_range, num_rooms) + @admin.check_block(block).must_equal [1,2] + end + + it "returns empty array if there are no rooms available" do + num_rooms = 2 + block = @admin.make_block(@date_range, num_rooms) + rooms = block[:rooms] + rooms.each do |room| + id = room.room_id + @admin.add_reservation_in_block(id) + end + @admin.check_block(block).must_equal [] + end + end + describe "#get_block" do before do date_range = { From 6f6ea5429a20e7934b2aa5e44736378c9ccae56d Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sat, 10 Mar 2018 20:42:03 -0800 Subject: [PATCH 59/72] Refactors tests --- lib/admin.rb | 7 ++++++- specs/admin_spec.rb | 11 ++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 159d7ade2..bcf1a4ded 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -155,6 +155,10 @@ def compare_dates(reservation, date) def get_unreserved_rooms(date_range) unreserved_room_ids = check_reservations(date_range, reservations) + check_rooms(rooms) + blocks.each do |block| + unreserved_room_ids += check_block(block) + end + return unreserved_room_ids.sort.uniq end @@ -182,7 +186,8 @@ def check_reservations(date_range, array_of_reservations) def check_rooms(array_of_rooms) unreserved_room_ids = [] array_of_rooms.each do |room| - if room.is_reserved == false && room.is_in_block == false + # if room.is_reserved == false && room.is_in_block == false + if room.is_reserved == false unreserved_room_ids << room.room_id end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index b09cd0d5e..0ea8c6a50 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -433,24 +433,21 @@ block = @admin.make_block(@date_range1, num_rooms) unreserved_rooms_ids = @admin.get_unreserved_rooms(@date_range1) rooms = block[:rooms] + block_room_ids = rooms.map {|room| room.room_id} - rooms.any?{|room| unreserved_rooms_ids.include?(room.room_id)}.must_equal false + unreserved_rooms_ids.wont_include block_room_ids end it "returns rooms within a block if start_date == end_date of block" do - skip - # make_block num_rooms = 2 block = @admin.make_block(@date_range1, num_rooms) - # make date range that starts the same day block ends + new_date_range = { start_date: Date.new(2018, 03, 10), end_date: Date.new(2018, 03, 12) } - # call get_unreserved_rooms(date_range) unreserved_room_ids = @admin.get_unreserved_rooms(new_date_range) - binding.pry - # unreserved_room_ids should into include ids in block + unreserved_room_ids.include?(1).must_equal true unreserved_room_ids.include?(2).must_equal true end From 07ad4c3e29ef8ab3ab1acae73ef29a16f0c5b3d0 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sat, 10 Mar 2018 20:45:42 -0800 Subject: [PATCH 60/72] Code/comment cleanup and #check_block refactor --- lib/admin.rb | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index bcf1a4ded..70058917d 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -23,7 +23,6 @@ def initialize def create_rooms_array rooms = [] is_reserved = false - # is_in_block = false num_rooms.times do |i| id = i + 1 rooms << create_room_instance(id, is_reserved) @@ -69,7 +68,6 @@ def make_block(date_range, num_rooms) end end - #TODO: add #add_reservation_in_block(room_id) def add_reservation_in_block(room_id) @@ -86,8 +84,7 @@ def add_reservation_in_block(room_id) room = get_room(room_id) room.is_reserved = true cost = block[:room_rate] - # add_reservation(date_range, room_id) - # create reservation here + new_reservation = Hotel::Reservation.new(date_range, room, cost_per_night: cost) reservations << new_reservation else @@ -100,11 +97,6 @@ def add_reservation(date_range, room_id) if check_date_range(date_range) && get_unreserved_rooms(date_range).include?(room_id) selected_room = get_room(room_id) selected_room.is_reserved = true - # selected_room.is_in_block = true - - # num_rooms = 4 - # cost = cost_per_night(num_rooms) - # new_reservation = Hotel::Reservation.new(date_range, selected_room, cost_per_night: cost) new_reservation = Hotel::Reservation.new(date_range, selected_room) reservations << new_reservation else @@ -158,14 +150,13 @@ def get_unreserved_rooms(date_range) blocks.each do |block| unreserved_room_ids += check_block(block) end - + return unreserved_room_ids.sort.uniq end #---------------------------------------------------------------------# def check_reservations(date_range, array_of_reservations) - #TODO: add if statement that checks if reservation.room.is_in_block is false (IS THIS REDUNDANT!!) desired_start_date = date_range[:start_date] desired_end_date = date_range[:end_date] @@ -186,7 +177,6 @@ def check_reservations(date_range, array_of_reservations) def check_rooms(array_of_rooms) unreserved_room_ids = [] array_of_rooms.each do |room| - # if room.is_reserved == false && room.is_in_block == false if room.is_reserved == false unreserved_room_ids << room.room_id end @@ -194,20 +184,11 @@ def check_rooms(array_of_rooms) return unreserved_room_ids end - #TODO: add check_block(block) def check_block(block) - unreserved_rooms = [] rooms = block[:rooms] - rooms.each do |room| - if room.is_reserved == false - unreserved_rooms << room.room_id - end - end - return unreserved_rooms - # check_rooms(array of rooms from block) + return check_rooms(rooms) end - #TODO: add PRIVATE get_block(id) method def get_block(room_id) block = {} From 33aa7f31f7523609e053352af5769a201d50ea46 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sat, 10 Mar 2018 20:48:07 -0800 Subject: [PATCH 61/72] Adds conditional to #make_block and creates related test --- lib/admin.rb | 4 ++-- specs/admin_spec.rb | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 70058917d..ea5019803 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -42,8 +42,8 @@ def create_room_instance(id, is_reserved) #---------------------------------------------------------------------# def make_block(date_range, num_rooms) - if num_rooms < 2 - raise StandardError.new("Blocks must contain > 1 room") + if num_rooms < 2 || num_rooms > 5 + raise StandardError.new("Blocks can only contain 2-5 rooms") end unreserved_room_ids = get_unreserved_rooms(date_range) diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 0ea8c6a50..34af8fba1 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -78,6 +78,13 @@ }.must_raise StandardError end + it "raises a StandardError if num_rooms > 5" do + num_rooms = 6 + proc { + @admin.make_block(@date_range, num_rooms) + }.must_raise StandardError + end + it "returns nil if there are not enough rooms available" do @admin.num_rooms.times do |num| @admin.add_reservation(@date_range, num + 1) From c4bc0280cf18fd9d3a39c7f1a68087d8cf93dede Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sun, 11 Mar 2018 20:20:12 -0700 Subject: [PATCH 62/72] Fixes get_unreserved_rooms in Admin --- lib/admin.rb | 27 ++++++++++++++++++++++++--- specs/admin_spec.rb | 2 +- specs/reservation_spec.rb | 3 +-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index ea5019803..412170cd1 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -99,11 +99,13 @@ def add_reservation(date_range, room_id) selected_room.is_reserved = true new_reservation = Hotel::Reservation.new(date_range, selected_room) reservations << new_reservation + return new_reservation else raise StandardError.new("Date range OR room ID is invalid") end end + #TODO: make this private? def check_date_range(date_range) start_time = date_range[:start_date].to_time end_time = date_range[:end_date].to_time @@ -147,8 +149,27 @@ def compare_dates(reservation, date) def get_unreserved_rooms(date_range) unreserved_room_ids = check_reservations(date_range, reservations) + check_rooms(rooms) + # blocks.each do |block| + # unreserved_room_ids += check_block(block) + # end + + desired_start_date = date_range[:start_date] + desired_end_date = date_range[:end_date] + blocks.each do |block| - unreserved_room_ids += check_block(block) + block_start = block[:start_date] + block_end = block[:end_date] + + if desired_end_date <= block_start || desired_start_date >= block_end + room_objs = block[:rooms] + room_ids = room_objs.map {|room| room.room_id} + room_ids.each do |id| + # if unreserved_room_ids.include?(id) + unreserved_room_ids << id + # end + end + end + end return unreserved_room_ids.sort.uniq @@ -156,7 +177,7 @@ def get_unreserved_rooms(date_range) #---------------------------------------------------------------------# - def check_reservations(date_range, array_of_reservations) + def check_reservations(date_range, reservations) desired_start_date = date_range[:start_date] desired_end_date = date_range[:end_date] @@ -225,4 +246,4 @@ def get_room_objs(room_ids) end end -end +end #end of module diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 34af8fba1..ceadbe398 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -447,7 +447,7 @@ it "returns rooms within a block if start_date == end_date of block" do num_rooms = 2 - block = @admin.make_block(@date_range1, num_rooms) + @admin.make_block(@date_range1, num_rooms) new_date_range = { start_date: Date.new(2018, 03, 10), diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index d03d78eec..78b37c549 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -38,7 +38,7 @@ room = Hotel::Room.new(1, true) proc { - Hotel::Reservation.new(one_day, room) + Hotel::Reservation.new(zero_days, room) }.must_raise StandardError end @@ -57,7 +57,6 @@ start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } - # calculate cost using cost_per_night function in admin room = Hotel::Room.new(1, true, is_in_block: true) cost = 160 #cost_per_night for 4 rooms reservation = Hotel::Reservation.new(date_range, room, cost_per_night: cost) From b22fad91b0fad826cec098c528b1c66590e50017 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sun, 11 Mar 2018 20:22:22 -0700 Subject: [PATCH 63/72] Initial hotel cli --- hotel_cli.rb | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 hotel_cli.rb diff --git a/hotel_cli.rb b/hotel_cli.rb new file mode 100644 index 000000000..74b0df887 --- /dev/null +++ b/hotel_cli.rb @@ -0,0 +1,160 @@ +require 'pry' + +require_relative 'lib/admin' +require_relative 'lib/reservation' +require_relative 'lib/room' + +HOTEL = Hotel::Admin.new + +def display_options + puts + puts "----------------- OPTIONS ----------------" + puts "SHOW all reservations - reservations OR 1" + puts "ADD reservation - add reservation OR 2" + puts "ADD block - add block OR 3" + puts "To exit this program - exit" + puts "------------------------------------------" + puts "OPTION: " + puts +end + +def show_rooms(rooms) + i = 0 + while i < rooms.length + print "\nRoom ID: #{rooms[i].room_id} | " + print "Reserved?: #{rooms[i].is_reserved.to_s} | " + print "In block?: #{rooms[i].is_in_block.to_s}" + i += 1 + end + puts +end + +def show_reservations(reservations) + if reservations.length == 0 + puts "\nThere are no current reservations." + else + i = 0 + while i < reservations.length + print "\nRoom ID: #{reservations[i].room.room_id} | " + print "Start Date: #{reservations[i].start_date} | " + print "End Date: #{reservations[i].end_date} | " + print "Cost per night: #{reservations[i].cost_per_night} | " + print "Total Cost: #{reservations[i].total_cost}" + i += 1 + end + puts + end +end + +def valid_input_loop(pattern) + input = gets.chomp + while !pattern.match(input) + puts "Please enter info in the valid format." + input = gets.chomp + end + return input +end + +def get_date_range + pattern = /^\d{4}\-\d{2}\-\d{2}$/ + valid_date = false + until valid_date == true + date_range = {} + puts "Please enter start date in the following format -> yyyy-mm-dd: " + start_date_input = valid_input_loop(pattern) + start_date = Date.strptime( start_date_input, '%Y-%m-%d') + date_range[:start_date] = start_date + puts "Please enter end date in the following format -> yyyy-mm-dd: " + end_date_input = valid_input_loop(pattern) + end_date = Date.strptime( end_date_input, '%Y-%m-%d') + date_range[:end_date] = end_date + if HOTEL.check_date_range(date_range) + valid_date = true + else + puts "Invalid date range - try again" + end + end + return date_range +end + +def show_available_rooms(date_range) + puts "\nThe following rooms are available for reservation: " + available_rooms = HOTEL.get_unreserved_rooms(date_range) + available_rooms.each do |room| + print "#{room} | " + end + puts + return available_rooms +end + +def show_reservation(reservation) + puts " - Start Date: #{reservation.start_date}" + puts " - End Date: #{reservation.end_date}" + puts " - Room ID: #{reservation.room.room_id}" + puts +end + +def get_reservation + date_range = get_date_range + available_rooms = show_available_rooms(date_range) + + puts "\nPlease enter an available room ID" + pattern = /^[1-9]{1}[0-9]{0,1}$/ + room_id = valid_input_loop(pattern).to_i + until room_id <= HOTEL.num_rooms && room_id > 0 && available_rooms.include?(room_id) + puts "\nInvalid room ID" + show_available_rooms(date_range) + room_id = valid_input_loop(pattern).to_i + end + + return HOTEL.add_reservation(date_range, room_id) +end + +def show_block(block) + puts " - Start Date: #{block[:start_date]}" + puts " - End Date: #{block[:end_date]}" + puts " - Rooms: " + rooms = block[:rooms] + rooms.each do |room| + print "#{room.room_id} | " + end + puts " - Cost/Night: $#{block[:room_rate]}" +end + +def get_block + date_range = get_date_range + # available_rooms = show_available_rooms(date_range) + puts "\nPlease enter # of rooms in block [1-5]." + pattern = /^[1-5]{1}/ + num_rooms = valid_input_loop(pattern).to_i + return HOTEL.make_block(date_range, num_rooms) +end + +puts "Welcome to [insert name here] Hotel!" +puts "\n--------------- HOTEL INFO ---------------" +puts "Number of rooms: #{HOTEL.num_rooms}" +puts "Base room rate: #{HOTEL.base_rate}" +puts "Discount rate/room for block reservation: #{HOTEL.discount_rate * 100}%" +puts + +display_options +command = gets.chomp + +while command != "exit" + if command == "reservations" || command == "1" + show_reservations(HOTEL.reservations) + elsif command == "add reservation" || command == "2" + reservation = get_reservation + puts "\nReservation Complete!" + show_reservation(reservation) + elsif command == "add block" || command == "3" + block = get_block + puts "\nBlock Complete!" + show_block(block) + else + puts "Please enter a valid command." + end + puts + display_options + command = gets.chomp +end From d895a9b8fb81f80cc1824f1041e9854c58ea29e6 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sun, 11 Mar 2018 23:35:30 -0700 Subject: [PATCH 64/72] Fixes get_unreserved_rooms --- lib/admin.rb | 59 +++++++++++++++++++++++++-------------------- specs/admin_spec.rb | 25 ++++++++++++------- 2 files changed, 49 insertions(+), 35 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 412170cd1..d78df6cc8 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -41,15 +41,15 @@ def create_room_instance(id, is_reserved) #---------------------------------------------------------------------# - def make_block(date_range, num_rooms) - if num_rooms < 2 || num_rooms > 5 + def make_block(date_range, num_rooms_in_block) + if num_rooms_in_block < 2 || num_rooms_in_block > 5 raise StandardError.new("Blocks can only contain 2-5 rooms") end unreserved_room_ids = get_unreserved_rooms(date_range) - if unreserved_room_ids.length >= num_rooms + if unreserved_room_ids.length >= num_rooms_in_block - room_objs = get_room_objs(unreserved_room_ids.shift(num_rooms)) + room_objs = get_room_objs(unreserved_room_ids.shift(num_rooms_in_block)) room_objs.each do |room| room.is_in_block = true end @@ -58,7 +58,7 @@ def make_block(date_range, num_rooms) start_date: date_range[:start_date], end_date: date_range[:end_date], rooms: room_objs, - room_rate: cost_per_night(num_rooms) + room_rate: cost_per_night(num_rooms_in_block) } blocks << block @@ -147,11 +147,7 @@ def compare_dates(reservation, date) #NOTE: will not return rooms in blocks. def get_unreserved_rooms(date_range) - unreserved_room_ids = check_reservations(date_range, reservations) + check_rooms(rooms) - - # blocks.each do |block| - # unreserved_room_ids += check_block(block) - # end + unreserved_room_ids = check_reservations(date_range, reservations) desired_start_date = date_range[:start_date] desired_end_date = date_range[:end_date] @@ -159,17 +155,19 @@ def get_unreserved_rooms(date_range) blocks.each do |block| block_start = block[:start_date] block_end = block[:end_date] - - if desired_end_date <= block_start || desired_start_date >= block_end - room_objs = block[:rooms] - room_ids = room_objs.map {|room| room.room_id} - room_ids.each do |id| - # if unreserved_room_ids.include?(id) - unreserved_room_ids << id - # end + room_objs = block[:rooms] + room_ids = room_objs.map {|room| room.room_id} + + if desired_start_date >= block_end == true + next + else + # new range isnt > reservation end == overlap + if desired_end_date <= block_start == false + room_ids.each do |id| + unreserved_room_ids.delete(id) + end end end - end return unreserved_room_ids.sort.uniq @@ -181,13 +179,16 @@ def check_reservations(date_range, reservations) desired_start_date = date_range[:start_date] desired_end_date = date_range[:end_date] - unreserved_room_ids = [] - reservations.each do |reservation| + unreserved_room_ids = (1..@num_rooms).to_a + @reservations.each do |reservation| reservation_start = reservation.start_date reservation_end = reservation.end_date - - if desired_end_date <= reservation_start || desired_start_date >= reservation_end - unreserved_room_ids << reservation.room.room_id + if desired_start_date >= reservation_end == true + next + else + if desired_end_date <= reservation_start == false + unreserved_room_ids.delete(reservation.room.room_id) + end end end @@ -198,7 +199,7 @@ def check_reservations(date_range, reservations) def check_rooms(array_of_rooms) unreserved_room_ids = [] array_of_rooms.each do |room| - if room.is_reserved == false + if room.is_reserved == false && room.is_in_block == false unreserved_room_ids << room.room_id end end @@ -206,8 +207,14 @@ def check_rooms(array_of_rooms) end def check_block(block) + unreserved_room_ids = [] rooms = block[:rooms] - return check_rooms(rooms) + rooms.each do |room| + if room.is_reserved == false + unreserved_room_ids << room.room_id + end + end + return unreserved_room_ids end def get_block(room_id) diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index ceadbe398..52ba7422a 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -438,25 +438,32 @@ it "does not return rooms within a block" do num_rooms = 4 block = @admin.make_block(@date_range1, num_rooms) - unreserved_rooms_ids = @admin.get_unreserved_rooms(@date_range1) + + unreserved_room_ids = @admin.get_unreserved_rooms(@date_range1) rooms = block[:rooms] block_room_ids = rooms.map {|room| room.room_id} - unreserved_rooms_ids.wont_include block_room_ids + unreserved_room_ids.each do |id| + block_room_ids.include?(id).must_equal false + end end it "returns rooms within a block if start_date == end_date of block" do num_rooms = 2 - @admin.make_block(@date_range1, num_rooms) + date_range = { + start_date: Date.new(2018, 03, 4), + end_date: Date.new(2018, 03, 12) + } + block = @admin.make_block(date_range, num_rooms) new_date_range = { - start_date: Date.new(2018, 03, 10), - end_date: Date.new(2018, 03, 12) + start_date: Date.new(2018, 03, 12), + end_date: Date.new(2018, 03, 15) } - unreserved_room_ids = @admin.get_unreserved_rooms(new_date_range) - unreserved_room_ids.include?(1).must_equal true - unreserved_room_ids.include?(2).must_equal true + room_ids = @admin.get_unreserved_rooms(new_date_range) + room_ids.include?(1).must_equal true + room_ids.include?(2).must_equal true end end @@ -481,7 +488,7 @@ describe "#check_block(block)" do before do @date_range = { - start_date: Date.new(2018, 03, 5), + start_date: Date.new(2018, 03, 05), end_date: Date.new(2018, 03, 10) } end From 8764a5245576f531caf9e0df36ab4b6512b9129b Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sun, 11 Mar 2018 23:44:14 -0700 Subject: [PATCH 65/72] Updated but incomplete cli --- hotel_cli.rb | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/hotel_cli.rb b/hotel_cli.rb index 74b0df887..c07e2ad95 100644 --- a/hotel_cli.rb +++ b/hotel_cli.rb @@ -11,7 +11,8 @@ def display_options puts "----------------- OPTIONS ----------------" puts "SHOW all reservations - reservations OR 1" puts "ADD reservation - add reservation OR 2" - puts "ADD block - add block OR 3" + puts "SHOW all blocks - blocks OR 3" + puts "ADD block - add block OR 4" puts "To exit this program - exit" puts "------------------------------------------" puts "OPTION: " @@ -147,7 +148,17 @@ def get_block reservation = get_reservation puts "\nReservation Complete!" show_reservation(reservation) - elsif command == "add block" || command == "3" + elsif command == "blocks" || command == "3" + if HOTEL.blocks.length == 0 + puts "There are no blocks" + else + HOTEL.blocks.each do |block| + show_block(block) + puts + end + end + puts + elsif command == "add block" || command == "4" block = get_block puts "\nBlock Complete!" show_block(block) From 5ea8cab705d2eaf6cdd8d00673be0867699fbe3b Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sun, 11 Mar 2018 23:47:08 -0700 Subject: [PATCH 66/72] Deletes #check_rooms --- lib/admin.rb | 19 +++++++++---------- specs/admin_spec.rb | 10 ++-------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index d78df6cc8..5c24c0867 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -161,7 +161,6 @@ def get_unreserved_rooms(date_range) if desired_start_date >= block_end == true next else - # new range isnt > reservation end == overlap if desired_end_date <= block_start == false room_ids.each do |id| unreserved_room_ids.delete(id) @@ -196,15 +195,15 @@ def check_reservations(date_range, reservations) end #TODO: raise error if parameter is not an Array - def check_rooms(array_of_rooms) - unreserved_room_ids = [] - array_of_rooms.each do |room| - if room.is_reserved == false && room.is_in_block == false - unreserved_room_ids << room.room_id - end - end - return unreserved_room_ids - end + # def check_rooms(array_of_rooms) + # unreserved_room_ids = [] + # array_of_rooms.each do |room| + # if room.is_reserved == false && room.is_in_block == false + # unreserved_room_ids << room.room_id + # end + # end + # return unreserved_room_ids + # end def check_block(block) unreserved_room_ids = [] diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 52ba7422a..8e1396395 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -140,6 +140,7 @@ it "successfully creates new reservation for valid room in block" do num_rooms = 2 + block = @admin.make_block(@date_range, num_rooms) rooms = block[:rooms] first_room = rooms.first @@ -477,14 +478,7 @@ @admin.check_reservations(date_range, reservations).must_be_kind_of Array end end - - describe "#check_rooms" do - it "returns an array" do - rooms = @admin.rooms - @admin.check_rooms(rooms).must_be_kind_of Array - end - end - + describe "#check_block(block)" do before do @date_range = { From 33e93a5ffb67b15b9819b7da1f0db59a24310820 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sun, 11 Mar 2018 23:47:49 -0700 Subject: [PATCH 67/72] Deletes #check_rooms --- lib/admin.rb | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 5c24c0867..36610cb34 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -194,17 +194,6 @@ def check_reservations(date_range, reservations) return unreserved_room_ids end - #TODO: raise error if parameter is not an Array - # def check_rooms(array_of_rooms) - # unreserved_room_ids = [] - # array_of_rooms.each do |room| - # if room.is_reserved == false && room.is_in_block == false - # unreserved_room_ids << room.room_id - # end - # end - # return unreserved_room_ids - # end - def check_block(block) unreserved_room_ids = [] rooms = block[:rooms] From cb2af267e62877e5710af2dd5ff736ff34469f48 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sun, 11 Mar 2018 23:49:14 -0700 Subject: [PATCH 68/72] Code clean up --- lib/admin.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 36610cb34..b93fa32a8 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -30,7 +30,6 @@ def create_rooms_array return rooms end - #TODO: Add check if id is within desired range def create_room_instance(id, is_reserved) if id.class == Integer return Hotel::Room.new(id, is_reserved) @@ -68,16 +67,13 @@ def make_block(date_range, num_rooms_in_block) end end - #TODO: add #add_reservation_in_block(room_id) def add_reservation_in_block(room_id) if room_id.class != Integer || room_id <= 0 || room_id > num_rooms raise ArgumentError.new("Invalid room ID") end - # check if room is in block block = get_block(room_id) if block != {} - #get date range date_range = {} date_range[:start_date] = block[:start_date] date_range[:end_date] = block[:end_date] From bf9eba4d7f287fefe202df6ccad700776f699bd7 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Sun, 25 Mar 2018 12:02:39 -0700 Subject: [PATCH 69/72] removes local variables as suggested --- lib/admin.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index b93fa32a8..a7849fc63 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -145,8 +145,8 @@ def compare_dates(reservation, date) def get_unreserved_rooms(date_range) unreserved_room_ids = check_reservations(date_range, reservations) - desired_start_date = date_range[:start_date] - desired_end_date = date_range[:end_date] + # desired_start_date = date_range[:start_date] + # desired_end_date = date_range[:end_date] blocks.each do |block| block_start = block[:start_date] @@ -154,10 +154,10 @@ def get_unreserved_rooms(date_range) room_objs = block[:rooms] room_ids = room_objs.map {|room| room.room_id} - if desired_start_date >= block_end == true + if date_range[:start_date] >= block_end == true next else - if desired_end_date <= block_start == false + if date_range[:end_date] <= block_start == false room_ids.each do |id| unreserved_room_ids.delete(id) end From 7cacac9d2f260b87c12c0e3c40e69dcf138617fa Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 28 Mar 2018 15:04:11 -0700 Subject: [PATCH 70/72] design-activity --- design-activity.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..fcd4ea4b1 --- /dev/null +++ b/design-activity.md @@ -0,0 +1,34 @@ +1. What classes does each implementation include? Are the lists the same? + Each implementation has a CartEntry, ShoppingCart, and Order class. + +2. Write down a sentence to describe each class. + The CartEntry class is responsible for the individual item(s) inside the shopping cart. + + The ShoppingCart class is responsible for all of the items in the shopping cart (instances of CartEntry). + + The Order class is responsible for one instance of a shopping trip (shopping cart). + +3. How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. + The Order class contains one instance of the ShoppingCart class. The ShoppingCart class contains an array of CartEntry class instances. + +4. What data does each class store? How (if at all) does this differ between the two implementations? + For both implementations, the CartEntry class contains the unit price and quantity of a cart item. The ShoppingCart class contains an array of CartEntry instances. The Order class contains an instance of the ShoppingCart class and a Sales_Tax constant variable. + +5. What methods does each class have? How (if at all) does this differ between the two implementations? + All of the classes have initialize methods. In implementation A, the Order class has a total_price method. In implementation B, all three classes have price methods. + +6. Consider the Order#total_price method. In each implementation: + a. Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? + In implementation A, the logic to compute price is retained in the Order class. In implementation B, the logic to compute price is delegated to lower level classes. + + b. Does total_price directly manipulate the instance variables of other classes? + In implementation A, the total_price method does manipulate instance variables of other classes. In implementation B, the total_price method does not directly manipulate instance variables. The instance variables of other classes are manipulated through class methods. + +7. If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + In order to implement this change, a new method would have to be added to the CartEntry class to contain the logic for changing the price based on quantity. It would be easier to change implementation B because it already contains a price method. + +8. Which implementation better adheres to the single responsibility principle? + Implementation B better adheres to the single responsibility principle because the logic of calculating the total cost is passed off to "lower level" classes. The Order class, in implementation B, calls the methods of other classes instead of directly manipulating instance variables. + +9. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? + Implementation B is more loosely coupled because each of the classes have less dependency. In implementation A, the data in the CartEntry and ShoppingCart classes are not useful without the Order class. But in implementation B, the CartEntry and ShoppingCart classes do not necessarily need the Order class. They are still dependent on each other but not as dependent as in implementation A. From c0366b5a73a771456018a69bd5a9aef786c636a3 Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 28 Mar 2018 15:13:03 -0700 Subject: [PATCH 71/72] adds methods to Room class to handle variable manipulation --- lib/admin.rb | 6 ++++-- lib/room.rb | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index a7849fc63..3fe35ff71 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -50,7 +50,8 @@ def make_block(date_range, num_rooms_in_block) room_objs = get_room_objs(unreserved_room_ids.shift(num_rooms_in_block)) room_objs.each do |room| - room.is_in_block = true + # room.is_in_block = true + room.is_in_block = room.in_block end block = { @@ -78,7 +79,8 @@ def add_reservation_in_block(room_id) date_range[:start_date] = block[:start_date] date_range[:end_date] = block[:end_date] room = get_room(room_id) - room.is_reserved = true + # room.is_reserved = true + room.is_reserved = room.reserved cost = block[:room_rate] new_reservation = Hotel::Reservation.new(date_range, room, cost_per_night: cost) diff --git a/lib/room.rb b/lib/room.rb index 94b1b6e18..d2f15bcf8 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -10,5 +10,13 @@ def initialize(id, is_reserved, is_in_block: false) @is_in_block = is_in_block end + def in_block + return @is_in_block == true ? false : true + end + + def reserved + return @is_reserved == true ? false : true + end + end end From 17e73d82064ded3e5b9c5e41b9e9b9fcb4979e2c Mon Sep 17 00:00:00 2001 From: Phoebe Date: Wed, 28 Mar 2018 15:14:26 -0700 Subject: [PATCH 72/72] code cleanup --- lib/admin.rb | 6 ------ 1 file changed, 6 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 3fe35ff71..fb348c595 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -50,7 +50,6 @@ def make_block(date_range, num_rooms_in_block) room_objs = get_room_objs(unreserved_room_ids.shift(num_rooms_in_block)) room_objs.each do |room| - # room.is_in_block = true room.is_in_block = room.in_block end @@ -79,7 +78,6 @@ def add_reservation_in_block(room_id) date_range[:start_date] = block[:start_date] date_range[:end_date] = block[:end_date] room = get_room(room_id) - # room.is_reserved = true room.is_reserved = room.reserved cost = block[:room_rate] @@ -103,7 +101,6 @@ def add_reservation(date_range, room_id) end end - #TODO: make this private? def check_date_range(date_range) start_time = date_range[:start_date].to_time end_time = date_range[:end_date].to_time @@ -147,9 +144,6 @@ def compare_dates(reservation, date) def get_unreserved_rooms(date_range) unreserved_room_ids = check_reservations(date_range, reservations) - # desired_start_date = date_range[:start_date] - # desired_end_date = date_range[:end_date] - blocks.each do |block| block_start = block[:start_date] block_end = block[:end_date]