From 812d5ff92b4a1a2f5f194f9597c1411a8ac0b097 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Tue, 4 Sep 2018 14:55:50 -0700 Subject: [PATCH 01/22] Add coverage directory to .gitignore file --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 5e1422c9c..c0ac3dc53 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ build-iPhoneSimulator/ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: .rvmrc +coverage From fc90cbb4fa43ec3a54c61f41bcf7d3384971d9df Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Tue, 4 Sep 2018 15:07:11 -0700 Subject: [PATCH 02/22] set up the room class and the initialize method --- .DS_Store | Bin 0 -> 6148 bytes lib/hotel.rb | 0 lib/reservation.rb | 0 lib/room.rb | 18 ++++++++++++++++++ spec/hotel_spec.rb | 1 + spec/reservation_spec.rb | 1 + spec/room_spec.rb | 26 ++++++++++++++++++++++++++ spec/spec_helper.rb | 11 +++++++++-- 8 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 .DS_Store create mode 100644 lib/hotel.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 spec/hotel_spec.rb create mode 100644 spec/reservation_spec.rb create mode 100644 spec/room_spec.rb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..26755594cc2d54abbbce849f9b70946070aaca4d GIT binary patch literal 6148 zcmeHKy-ve05dNHYNY$kqj2W4bm{~&A3Nf(I7obUhR5diHsGYO$Fgy(p!vnx~KC4i- ztf)eF()qK`cNgc2W#<66{$_Fo^Z=w(!KB0Hh{(L?fh55qlg{T@V~jbbcU4^;c$?uA z8PJbgqQ(|e{P=!FRTo?^H%9VKy!iCuUm->0za6btRlS;Xmiqu*%$RG62@39q5=&g- z2@}~B-&x&Rl(mCfZ0Nsc+zbm;x{rQDyhaf%`YcfF=f!p8mEwU}mt4>BtRInohyFv{ zV1Rq#k(DRoD58xQJTre8t>i880 p6%oHiaTmglzl!NASMfR33+ 20 || room_num.to_i < 1 + raise ArgumentError + else + @id = room_num + @rate = 200 + @reservations = [] + end + end +end diff --git a/spec/hotel_spec.rb b/spec/hotel_spec.rb new file mode 100644 index 000000000..ae9c220ea --- /dev/null +++ b/spec/hotel_spec.rb @@ -0,0 +1 @@ +require_relative 'spec_helper' diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb new file mode 100644 index 000000000..ae9c220ea --- /dev/null +++ b/spec/reservation_spec.rb @@ -0,0 +1 @@ +require_relative 'spec_helper' diff --git a/spec/room_spec.rb b/spec/room_spec.rb new file mode 100644 index 000000000..7201ebe89 --- /dev/null +++ b/spec/room_spec.rb @@ -0,0 +1,26 @@ +require_relative 'spec_helper' + + +describe "Room in Wave 1" do + describe "#initialize" do + it "Takes a room number" do + id = 1 + room_1 = Room.new(id) + + expect(room_1).must_respond_to :id + expect(room_1.id).must_equal id + expect(room_1.rate).must_equal 200 + expect(room_1.reservations).must_equal [] + + end + + it "Raises an ArgumentError for invalid room numbers" do + expect { + Room.new('a') + }.must_raise ArgumentError + expect { + Room.new(21) + }.must_raise ArgumentError + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4d1e3fdc8..f9447a221 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,8 +1,15 @@ +require 'simplecov' + + require 'minitest' +SimpleCov.start + require 'minitest/autorun' require 'minitest/reporters' -# Add simplecov + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -# Require_relative your lib files here! + require_relative '../lib/hotel' + require_relative '../lib/reservation' + require_relative '../lib/room' From d8195c62ab03bbca54ac03c4f2a8fd1f0096122e Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Tue, 4 Sep 2018 17:08:05 -0700 Subject: [PATCH 03/22] add the initialize method for reservation.rb --- lib/reservation.rb | 20 ++++++++++++++++++++ lib/room.rb | 5 +++-- spec/reservation_spec.rb | 38 ++++++++++++++++++++++++++++++++++++++ spec/room_spec.rb | 4 ++-- spec/spec_helper.rb | 11 ++++------- 5 files changed, 67 insertions(+), 11 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index e69de29bb..6034bf9d3 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -0,0 +1,20 @@ +require 'pry' +require 'date' + +class Reservation + attr_reader :id, :customer_name, :room_num, :start_date, :end_date + + def initialize(id, customer_name, start_date, end_date) + if start_date >= end_date || start_date < Date.today + raise ArgumentError + else + @id = id + @customer_name = customer_name + @room_num = '' + @start_date = start_date + @end_date = end_date + end + end + + +end diff --git a/lib/room.rb b/lib/room.rb index e597bb2bd..ba2e7aa47 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -4,15 +4,16 @@ class Room - attr_reader :id, :rate, :reservations + attr_reader :room_num, :rate, :reservations def initialize(room_num) if room_num.to_i > 20 || room_num.to_i < 1 raise ArgumentError else - @id = room_num + @room_num = room_num @rate = 200 @reservations = [] + end end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index ae9c220ea..0395b4b63 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -1 +1,39 @@ require_relative 'spec_helper' + +describe "Reservation in Wave 1" do + before do + @id = 2 + @customer_name = "Mike Bogdon" + @start_date = Date.new(2018,10,2) + + end + describe "#initialize" do + it "Takes a reservation id, start_date, end_date " do + end_date = Date.new(2018,10,5) + rsv_1 = Reservation.new(@id, @customer_name, @start_date, end_date) + expect(rsv_1).must_respond_to :id + expect(rsv_1).must_respond_to :start_date + expect(rsv_1).must_respond_to :end_date + expect(rsv_1).must_respond_to :customer_name + expect(rsv_1.id).must_equal @id + expect(rsv_1.start_date).must_equal @start_date + expect(rsv_1.end_date).must_equal end_date + expect(rsv_1.customer_name).must_equal @customer_name + end + + it "Raises an ArgumentError for invalid date input, end_date is not later than start_date" do + end_date = Date.new(2018,10,2) + expect { + Reservation.new(@id, @customer_name, @start_date, end_date) + }.must_raise ArgumentError + end + + it "Raises an ArgumentError for invalid date input, start_date is a day earlier than today" do + start_date_2= Date.new(2018,8,2) + end_date_2 = Date.new(2018,10,2) + expect { + Reservation.new(@id, @customer_name, start_date_2, end_date_2) + }.must_raise ArgumentError + end + end +end diff --git a/spec/room_spec.rb b/spec/room_spec.rb index 7201ebe89..d52a98930 100644 --- a/spec/room_spec.rb +++ b/spec/room_spec.rb @@ -7,8 +7,8 @@ id = 1 room_1 = Room.new(id) - expect(room_1).must_respond_to :id - expect(room_1.id).must_equal id + expect(room_1).must_respond_to :room_num + expect(room_1.room_num).must_equal id expect(room_1.rate).must_equal 200 expect(room_1.reservations).must_equal [] diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f9447a221..b523bdcc5 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,15 +1,12 @@ require 'simplecov' - - -require 'minitest' SimpleCov.start +require 'minitest' require 'minitest/autorun' require 'minitest/reporters' - Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new - require_relative '../lib/hotel' - require_relative '../lib/reservation' - require_relative '../lib/room' +require_relative '../lib/hotel' +require_relative '../lib/reservation' +require_relative '../lib/room' From 4c9bec163ce4bc2e23678e64b606e2ac646543ed Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Wed, 5 Sep 2018 14:02:32 -0700 Subject: [PATCH 04/22] changed the hotel.rb to admin.rb , added add_reservation method in room class --- lib/{hotel.rb => admin.rb} | 0 lib/room.rb | 12 ++++++++++++ spec/{hotel_spec.rb => admin_spec.rb} | 0 spec/room_spec.rb | 25 +++++++++++++++++++++++++ spec/spec_helper.rb | 8 +++++--- 5 files changed, 42 insertions(+), 3 deletions(-) rename lib/{hotel.rb => admin.rb} (100%) rename spec/{hotel_spec.rb => admin_spec.rb} (100%) diff --git a/lib/hotel.rb b/lib/admin.rb similarity index 100% rename from lib/hotel.rb rename to lib/admin.rb diff --git a/lib/room.rb b/lib/room.rb index ba2e7aa47..e670bd18f 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -16,4 +16,16 @@ def initialize(room_num) end end + + def add_reservation(new_reservation) + if new_reservation.class != Reservation + raise ArgumentError, "A reservation was not provided" + end + @reservations.each do |item| + if item == new_reservation + raise ArgumentError, "Duplicated reservation" + end + end + @reservations << new_reservation + end end diff --git a/spec/hotel_spec.rb b/spec/admin_spec.rb similarity index 100% rename from spec/hotel_spec.rb rename to spec/admin_spec.rb diff --git a/spec/room_spec.rb b/spec/room_spec.rb index d52a98930..91a8b662c 100644 --- a/spec/room_spec.rb +++ b/spec/room_spec.rb @@ -23,4 +23,29 @@ }.must_raise ArgumentError end end + + describe "#add_reservation" do + before do + @room_1 = Room.new(3) + @reservation_1 = Reservation.new(123, "Mike Smith", Date.new(2018,10,4), Date.new(2018,10,7)) + end + + it "throws an argument error if reservation is not provided" do + + expect{ @room_1.add_reservation('') }.must_raise ArgumentError + end + + it "will throw ArgumentError if attemps to add reservation objects to the reservation array more than once" do + + @room_1.add_reservation(@reservation_1) + expect{ @room_1.add_reservation(@reservation_1) }.must_raise ArgumentError + end + + + it "increases the reservation count by one" do + previous = @room_1.reservations.length + @room_1.add_reservation(@reservation_1) + expect(@room_1.reservations.length).must_equal previous + 1 + end + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index b523bdcc5..18d2bb6d8 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,12 +1,14 @@ -require 'simplecov' -SimpleCov.start require 'minitest' require 'minitest/autorun' require 'minitest/reporters' +require 'simplecov' +SimpleCov.start do + add_filter "/spec/" +end Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -require_relative '../lib/hotel' +require_relative '../lib/admin' require_relative '../lib/reservation' require_relative '../lib/room' From 5e3f9b0afc87fd2817c993690c239ffd0f281ded Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Wed, 5 Sep 2018 14:37:08 -0700 Subject: [PATCH 05/22] add a dates_booked method in reservation class --- lib/reservation.rb | 10 +++++++++- spec/reservation_spec.rb | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 6034bf9d3..2c302f158 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -16,5 +16,13 @@ def initialize(id, customer_name, start_date, end_date) end end - + def dates_booked + result = [] + date_enter = @start_date + while date_enter < @end_date + result << date_enter + date_enter += 1 + end + return result + end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 0395b4b63..14550e751 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -36,4 +36,22 @@ }.must_raise ArgumentError end end + + describe "#dates_booked" do + before do + @end_date = Date.new(2018,10,6) + @rsv_2 = Reservation.new(@id, @customer_name, @start_date, @end_date) + end + it "returns an array" do + expect(@rsv_2.dates_booked).must_be_kind_of Array + end + it "returns an array of date" do + expect(@rsv_2.dates_booked.first).must_be_kind_of Date + expect(@rsv_2.dates_booked.first).must_equal @start_date + end + + it "end_date should not be included into the array" do + expect(@rsv_2.dates_booked.include?@end_date).must_equal false + end + end end From 8f3294b878c2e63607f76dadb765c534a25ba800 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Wed, 5 Sep 2018 16:03:14 -0700 Subject: [PATCH 06/22] finish the initialize for Admin class --- lib/admin.rb | 37 +++++++++++++++++++++++++++++++++++++ lib/reservation.rb | 4 +++- spec/admin_spec.rb | 35 +++++++++++++++++++++++++++++++++++ spec/reservation_spec.rb | 1 + 4 files changed, 76 insertions(+), 1 deletion(-) diff --git a/lib/admin.rb b/lib/admin.rb index e69de29bb..369ddc21d 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -0,0 +1,37 @@ +require 'pry' +require 'date' +require_relative 'reservation' +require_relative 'room' + +class Admin + attr_reader :reservations, :rooms + + def initialize + @rooms = [] + @reservations = [] + 20.times do |i| + room_new = Room.new(i+1) + @rooms << room_new + end + end + + # def make_reservation + # + # end + # + # def find_room(id) + # check_id(id) + # return @rooms.find { |room| room.room_num == id } + # end + # + # def calculate_cost + # + # end + # + # private + # def check_id(id) + # raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 + # end + # + +end diff --git a/lib/reservation.rb b/lib/reservation.rb index 2c302f158..f68c07603 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,7 +2,7 @@ require 'date' class Reservation - attr_reader :id, :customer_name, :room_num, :start_date, :end_date + attr_reader :id, :customer_name, :room_num, :start_date, :end_date, :cost def initialize(id, customer_name, start_date, end_date) if start_date >= end_date || start_date < Date.today @@ -13,6 +13,7 @@ def initialize(id, customer_name, start_date, end_date) @room_num = '' @start_date = start_date @end_date = end_date + @cost = 0 end end @@ -25,4 +26,5 @@ def dates_booked end return result end + end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index ae9c220ea..a872163ec 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -1 +1,36 @@ +require 'pry' require_relative 'spec_helper' + +describe "Admin class" do + before do + @admin_1 = Admin.new + end + + describe "Initializer" do + it "is an instance of Admin" do + expect(@admin_1).must_be_kind_of Admin + end + + it "establishes the base data structures when instantiated" do + # binding.pry + expect(@admin_1.reservations).must_be_kind_of Array + expect(@admin_1.rooms).must_be_kind_of Array + end + end + + # describe "find_room method" do + # before do + # @admin = Admin.new(3) + # end + # + # it "throws an argument error for a bad ID" do + # expect{ @admin.find_room(0) }.must_raise ArgumentError + # end + # + # it "finds a room instance" do + # room_found = @admin.find_room(2) + # expect(passenger).must_be_kind_of Room + # end + # end + +end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 14550e751..876d4a371 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -54,4 +54,5 @@ expect(@rsv_2.dates_booked.include?@end_date).must_equal false end end + end From a3835a3b18c5ed4b403d3c72063f736a9ef5a968 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Fri, 7 Sep 2018 10:54:06 -0700 Subject: [PATCH 07/22] remove add_reservation method from room.rb, changed reservation.rb initialize method --- lib/admin.rb | 29 +++++++++++++++-- lib/reservation.rb | 14 +++++--- lib/room.rb | 22 ++++++------- spec/admin_spec.rb | 69 ++++++++++++++++++++++++++++++++++++++++ spec/reservation_spec.rb | 14 +++++--- spec/room_spec.rb | 48 ++++++++++++++-------------- 6 files changed, 150 insertions(+), 46 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 369ddc21d..91d110ec3 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -12,13 +12,38 @@ def initialize 20.times do |i| room_new = Room.new(i+1) @rooms << room_new + booked_dates = [] + {room_id: i+1, booked_dates: booked_dates } end end - # def make_reservation + # def list_reservations(date_selected) + # + # end + + # def make_reservation(start_date, end_date) + # # reservations array should have a room hash inside it + # # room: Room, dates_booked: [] + # + # # change the start_date and end_date to an array by calling a help method, return a dates_required array + # + # # loop through the existing reservation array, by room, compare the booked dates array under each room with the dates_required + # + # # if we found the dates_required do not have a date in common with the dates booked, return the that room, create a new reservation item, and add it to the reservation array . + # + # if start_date.class != Date || end_date.class != Date + # raise ArgumentError, "start_date and end_Date should be Date objects" + # end + # if start_date >= end_date || start_date < Date.today + # raise ArgumentError, "invlid dates entered" + # end # # end # + # def cost_of_reservation(reservation_id) + # return find_reservation(reservation_id).cost + # end + # def find_room(id) # check_id(id) # return @rooms.find { |room| room.room_num == id } @@ -28,7 +53,7 @@ def initialize # # end # - # private + # def check_id(id) # raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 # end diff --git a/lib/reservation.rb b/lib/reservation.rb index f68c07603..f677d00b3 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,18 +2,17 @@ require 'date' class Reservation - attr_reader :id, :customer_name, :room_num, :start_date, :end_date, :cost + attr_reader :id, :customer_name, :room, :start_date, :end_date - def initialize(id, customer_name, start_date, end_date) + def initialize(id, customer_name, room, start_date, end_date) if start_date >= end_date || start_date < Date.today raise ArgumentError else @id = id @customer_name = customer_name - @room_num = '' + @room = room @start_date = start_date @end_date = end_date - @cost = 0 end end @@ -27,4 +26,11 @@ def dates_booked return result end + # def cost + # calucate the dates of booking + # based on the room cost, calculate the total cost + # + # end + # + end diff --git a/lib/room.rb b/lib/room.rb index e670bd18f..9ebfc77a7 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -17,15 +17,15 @@ def initialize(room_num) end end - def add_reservation(new_reservation) - if new_reservation.class != Reservation - raise ArgumentError, "A reservation was not provided" - end - @reservations.each do |item| - if item == new_reservation - raise ArgumentError, "Duplicated reservation" - end - end - @reservations << new_reservation - end + # def add_reservation(new_reservation) + # if new_reservation.class != Reservation + # raise ArgumentError, "A reservation was not provided" + # end + # @reservations.each do |item| + # if item == new_reservation + # raise ArgumentError, "Duplicated reservation" + # end + # end + # @reservations << new_reservation + # end end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index a872163ec..e1d2e63c8 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -18,6 +18,75 @@ end end + # describe "make_reservation" do + # + # it "will add a reservation object to Reservation array" do + # reservation_made = @admin.make_reservation() + # driven_trips = trip_generated.room.driven_trips + # + # expect(driven_trips).must_include trip_generated + # end + # + # + # it "will add the object to passenger's trips array" do + # trip_generated = @dispatcher.request_trip(1) + # trips = trip_generated.passenger.trips + # + # expect(trips).must_include trip_generated + # end + # + # it "will add the trip object to the collection of all trips in trip dispatcher" do + # all_trips = @dispatcher.trips + # trip_count = all_trips.length + # trip_generated = @dispatcher.request_trip(1) + # + # expect(all_trips).must_include trip_generated + # expect(all_trips.length).must_equal trip_count + 1 + # + # end + # + # it "will change the driver status to unavailabe" do + # trip_generated = @dispatcher.request_trip(1) + # status = trip_generated.driver.status + # + # expect(status).must_equal :UNAVAILABLE + # + # end + # + # it "will return the trip" do + # trip_generated = @dispatcher.request_trip(1) + # + # expect(trip_generated).must_be_kind_of RideShare::Trip + # + # end + # + # it "will return a message when no driver is available for trip" do + # @dispatcher.drivers.each do |driver| + # driver.status = :UNAVAILABLE + # end + # + # expect(@dispatcher.request_trip(6)).must_equal "No driver available at this time." + # end + # + # it "will not create a trip if no driver is available" do + # @dispatcher.drivers.each do |driver| + # driver.status = :UNAVAILABLE + # end + # trip_count = @dispatcher.trips.length + # @dispatcher.request_trip(6) + # + # expect(@dispatcher.trips.length).must_equal trip_count + # + # end + # + # end + + # describe "list_reservations on a specific date" do + # it "returns an array of reservations" do + # expect + # + # end + # describe "find_room method" do # before do # @admin = Admin.new(3) diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 876d4a371..c7fcc4ce0 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -5,26 +5,28 @@ @id = 2 @customer_name = "Mike Bogdon" @start_date = Date.new(2018,10,2) - + @room = Room.new(1) end describe "#initialize" do it "Takes a reservation id, start_date, end_date " do end_date = Date.new(2018,10,5) - rsv_1 = Reservation.new(@id, @customer_name, @start_date, end_date) + rsv_1 = Reservation.new(@id, @customer_name, @room, @start_date, end_date) expect(rsv_1).must_respond_to :id expect(rsv_1).must_respond_to :start_date expect(rsv_1).must_respond_to :end_date expect(rsv_1).must_respond_to :customer_name + expect(rsv_1).must_respond_to :room expect(rsv_1.id).must_equal @id expect(rsv_1.start_date).must_equal @start_date expect(rsv_1.end_date).must_equal end_date expect(rsv_1.customer_name).must_equal @customer_name + expect(rsv_1.room).must_equal @room end it "Raises an ArgumentError for invalid date input, end_date is not later than start_date" do end_date = Date.new(2018,10,2) expect { - Reservation.new(@id, @customer_name, @start_date, end_date) + Reservation.new(@id, @customer_name, @room_1, @start_date, end_date) }.must_raise ArgumentError end @@ -32,7 +34,7 @@ start_date_2= Date.new(2018,8,2) end_date_2 = Date.new(2018,10,2) expect { - Reservation.new(@id, @customer_name, start_date_2, end_date_2) + Reservation.new(@id, @customer_name,@room_1, start_date_2, end_date_2) }.must_raise ArgumentError end end @@ -40,7 +42,7 @@ describe "#dates_booked" do before do @end_date = Date.new(2018,10,6) - @rsv_2 = Reservation.new(@id, @customer_name, @start_date, @end_date) + @rsv_2 = Reservation.new(@id, @customer_name,@room_1, @start_date, @end_date) end it "returns an array" do expect(@rsv_2.dates_booked).must_be_kind_of Array @@ -55,4 +57,6 @@ end end + + end diff --git a/spec/room_spec.rb b/spec/room_spec.rb index 91a8b662c..4aa412250 100644 --- a/spec/room_spec.rb +++ b/spec/room_spec.rb @@ -24,28 +24,28 @@ end end - describe "#add_reservation" do - before do - @room_1 = Room.new(3) - @reservation_1 = Reservation.new(123, "Mike Smith", Date.new(2018,10,4), Date.new(2018,10,7)) - end - - it "throws an argument error if reservation is not provided" do - - expect{ @room_1.add_reservation('') }.must_raise ArgumentError - end - - it "will throw ArgumentError if attemps to add reservation objects to the reservation array more than once" do - - @room_1.add_reservation(@reservation_1) - expect{ @room_1.add_reservation(@reservation_1) }.must_raise ArgumentError - end - - - it "increases the reservation count by one" do - previous = @room_1.reservations.length - @room_1.add_reservation(@reservation_1) - expect(@room_1.reservations.length).must_equal previous + 1 - end - end + # describe "#add_reservation" do + # before do + # @room_1 = Room.new(3) + # @reservation_1 = Reservation.new(123, "Mike Smith", Date.new(2018,10,4), Date.new(2018,10,7)) + # end + # + # it "throws an argument error if reservation is not provided" do + # + # expect{ @room_1.add_reservation('') }.must_raise ArgumentError + # end + # + # it "will throw ArgumentError if attemps to add reservation objects to the reservation array more than once" do + # + # @room_1.add_reservation(@reservation_1) + # expect{ @room_1.add_reservation(@reservation_1) }.must_raise ArgumentError + # end + # + # + # it "increases the reservation count by one" do + # previous = @room_1.reservations.length + # @room_1.add_reservation(@reservation_1) + # expect(@room_1.reservations.length).must_equal previous + 1 + # end + # end end From 211378812b52cea1c002fcaff3d63fb83eb644af Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Fri, 7 Sep 2018 13:12:06 -0700 Subject: [PATCH 08/22] complete the add_reserve_date method in room.rb, adjust the initialize method too --- lib/reservation.rb | 11 ++++----- lib/room.rb | 23 ++++++++---------- spec/reservation_spec.rb | 28 +++++++++++++++++++--- spec/room_spec.rb | 50 ++++++++++++++++++++-------------------- spec/spec_helper.rb | 11 +++++---- 5 files changed, 71 insertions(+), 52 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index f677d00b3..c8b2425bf 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -16,6 +16,7 @@ def initialize(id, customer_name, room, start_date, end_date) end end + # list all the dates been covered in the reservation def dates_booked result = [] date_enter = @start_date @@ -26,11 +27,9 @@ def dates_booked return result end - # def cost - # calucate the dates of booking - # based on the room cost, calculate the total cost - # - # end - # + # calculate the cost of the reservation + def reserve_cost + return (end_date - start_date) * @room.rate + end end diff --git a/lib/room.rb b/lib/room.rb index 9ebfc77a7..bc0ec9aa0 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -4,7 +4,7 @@ class Room - attr_reader :room_num, :rate, :reservations + attr_reader :room_num, :rate, :reserve_dates def initialize(room_num) if room_num.to_i > 20 || room_num.to_i < 1 @@ -12,20 +12,17 @@ def initialize(room_num) else @room_num = room_num @rate = 200 - @reservations = [] + @reserve_dates = [] end end - # def add_reservation(new_reservation) - # if new_reservation.class != Reservation - # raise ArgumentError, "A reservation was not provided" - # end - # @reservations.each do |item| - # if item == new_reservation - # raise ArgumentError, "Duplicated reservation" - # end - # end - # @reservations << new_reservation - # end + def add_reserve_dates(new_reserve_dates) + duplicated = @reserve_dates & new_reserve_dates + if duplicated.length > 0 + raise ArgumentError, "Duplicated reservation" + else + @reserve_dates += new_reserve_dates + end + end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index c7fcc4ce0..248b38f65 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -1,4 +1,5 @@ require_relative 'spec_helper' +require 'pry' describe "Reservation in Wave 1" do before do @@ -26,7 +27,7 @@ it "Raises an ArgumentError for invalid date input, end_date is not later than start_date" do end_date = Date.new(2018,10,2) expect { - Reservation.new(@id, @customer_name, @room_1, @start_date, end_date) + Reservation.new(@id, @customer_name, @room, @start_date, end_date) }.must_raise ArgumentError end @@ -34,7 +35,7 @@ start_date_2= Date.new(2018,8,2) end_date_2 = Date.new(2018,10,2) expect { - Reservation.new(@id, @customer_name,@room_1, start_date_2, end_date_2) + Reservation.new(@id, @customer_name,@room, start_date_2, end_date_2) }.must_raise ArgumentError end end @@ -42,7 +43,7 @@ describe "#dates_booked" do before do @end_date = Date.new(2018,10,6) - @rsv_2 = Reservation.new(@id, @customer_name,@room_1, @start_date, @end_date) + @rsv_2 = Reservation.new(@id, @customer_name,@room, @start_date, @end_date) end it "returns an array" do expect(@rsv_2.dates_booked).must_be_kind_of Array @@ -57,6 +58,27 @@ end end + describe "#reserve_cost" do + before do + @end_date = Date.new(2018,10,6) + @rsv_3 = Reservation.new(@id, @customer_name,@room, @start_date, @end_date) + end + it "returns a number" do + expect(@rsv_3.reserve_cost).must_be_kind_of Numeric + end + it "do the calculation correctly" do + expect(@rsv_3.reserve_cost).must_equal 800 + end + it "calculation correctly for a one day stay" do + id = 5 + customer_name = "Jezz Bogdon" + start_date = Date.new(2018,10,5) + end_date = Date.new(2018,10,6) + room = Room.new(4) + rsv_4 = Reservation.new(id,customer_name,room,start_date,end_date) + expect(rsv_4.reserve_cost).must_equal 200 + end + end end diff --git a/spec/room_spec.rb b/spec/room_spec.rb index 4aa412250..edab05407 100644 --- a/spec/room_spec.rb +++ b/spec/room_spec.rb @@ -10,7 +10,7 @@ expect(room_1).must_respond_to :room_num expect(room_1.room_num).must_equal id expect(room_1.rate).must_equal 200 - expect(room_1.reservations).must_equal [] + expect(room_1.reserve_dates).must_equal [] end @@ -24,28 +24,28 @@ end end - # describe "#add_reservation" do - # before do - # @room_1 = Room.new(3) - # @reservation_1 = Reservation.new(123, "Mike Smith", Date.new(2018,10,4), Date.new(2018,10,7)) - # end - # - # it "throws an argument error if reservation is not provided" do - # - # expect{ @room_1.add_reservation('') }.must_raise ArgumentError - # end - # - # it "will throw ArgumentError if attemps to add reservation objects to the reservation array more than once" do - # - # @room_1.add_reservation(@reservation_1) - # expect{ @room_1.add_reservation(@reservation_1) }.must_raise ArgumentError - # end - # - # - # it "increases the reservation count by one" do - # previous = @room_1.reservations.length - # @room_1.add_reservation(@reservation_1) - # expect(@room_1.reservations.length).must_equal previous + 1 - # end - # end + describe "#update_reserve_dates" do + before do + @room_1 = Room.new(3) + @date1 = Date.new(2018,10,4) + @date2 = Date.new(2018,10,5) + @new_reserve_dates = [ @date1, @date2 ] + @previous = @room_1.reserve_dates.length + @room_1.add_reserve_dates(@new_reserve_dates) + end + + it "increases the reserve_dates array length correctly" do + expect(@room_1.reserve_dates.length).must_equal @previous + 2 + end + + it "the updated reseve_dates array should include the newly added dates" do + expect(@room_1.reserve_dates).must_include @date1 + expect(@room_1.reserve_dates).must_include @date2 + end + + it "throw ArgumentError if attemp to add a specific date to the list twice or more" do + expect{ @room_1.add_reserve_dates([@date1]) }.must_raise ArgumentError + end + + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 18d2bb6d8..4e3f067f4 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,12 +1,13 @@ - -require 'minitest' -require 'minitest/autorun' -require 'minitest/reporters' require 'simplecov' - +require 'minitest' SimpleCov.start do add_filter "/spec/" end +require 'minitest/autorun' +require 'minitest/reporters' + + + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new require_relative '../lib/admin' From 54e9502f4336a428165aeca5ccee3e569cd3c991 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Fri, 7 Sep 2018 20:26:54 -0700 Subject: [PATCH 09/22] add make_reservation method in admin.rb --- lib/admin.rb | 91 ++++++++++++++++------------ lib/reservation.rb | 5 +- lib/room.rb | 29 ++++++--- spec/admin_spec.rb | 148 ++++++++++++++++++++++++--------------------- spec/room_spec.rb | 53 ++++++++-------- 5 files changed, 183 insertions(+), 143 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 91d110ec3..4aebb4b7b 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -12,51 +12,66 @@ def initialize 20.times do |i| room_new = Room.new(i+1) @rooms << room_new - booked_dates = [] - {room_id: i+1, booked_dates: booked_dates } end end + + + def make_reservation(reservation_id, room_id, customer_name, start_date, end_date) + + # loop through the existing reservation array, by room, compare the booked dates array under each room with the dates_required + + # if we found the dates_required do not have a date in common with the dates booked, return the that room, create a new reservation item, and add it to the reservation array . + + # call the add_reserve_dates method under that room, and add it to room + + if start_date.class != Date || end_date.class != Date + raise ArgumentError, "start_date and end_Date should be Date objects" + end + if start_date >= end_date || start_date < Date.today + raise ArgumentError, "invlid dates entered" + end + + room = find_room(room_id) + + result = Reservation.new(reservation_id, room, customer_name, start_date, end_date) + + @reservations << result + return result + + end + + + # # input a string of date, to return the list of the reservations on that date # def list_reservations(date_selected) - # + # # check the input date is a valid date , can be converted to Date class + # # loop through the resrvations array, check each elements.dates_booked includes daate_selected , if yes, add to the result Array + # # return the result array. # end +# - # def make_reservation(start_date, end_date) - # # reservations array should have a room hash inside it - # # room: Room, dates_booked: [] - # - # # change the start_date and end_date to an array by calling a help method, return a dates_required array - # - # # loop through the existing reservation array, by room, compare the booked dates array under each room with the dates_required - # - # # if we found the dates_required do not have a date in common with the dates booked, return the that room, create a new reservation item, and add it to the reservation array . - # - # if start_date.class != Date || end_date.class != Date - # raise ArgumentError, "start_date and end_Date should be Date objects" - # end - # if start_date >= end_date || start_date < Date.today - # raise ArgumentError, "invlid dates entered" - # end - # - # end - # - # def cost_of_reservation(reservation_id) - # return find_reservation(reservation_id).cost - # end + def find_room(id) + check_id(id) + return @rooms.find { |room| room.room_num == id } + end - # def find_room(id) - # check_id(id) - # return @rooms.find { |room| room.room_num == id } - # end - # - # def calculate_cost - # - # end - # + def calculate_cost + + end + + private + def list_dates(start_date, end_date) + dates = [] + + while start_date < end_date + dates << start_date + start_date += end_date + end + end + + def check_id(id) + raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 + end - # def check_id(id) - # raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 - # end - # end diff --git a/lib/reservation.rb b/lib/reservation.rb index c8b2425bf..9ac37fa9a 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,7 +4,7 @@ class Reservation attr_reader :id, :customer_name, :room, :start_date, :end_date - def initialize(id, customer_name, room, start_date, end_date) + def initialize(id, customer_name,room,start_date, end_date) if start_date >= end_date || start_date < Date.today raise ArgumentError else @@ -13,6 +13,7 @@ def initialize(id, customer_name, room, start_date, end_date) @room = room @start_date = start_date @end_date = end_date + end end @@ -29,7 +30,7 @@ def dates_booked # calculate the cost of the reservation def reserve_cost - return (end_date - start_date) * @room.rate + return (@end_date - @start_date) * @room.rate end end diff --git a/lib/room.rb b/lib/room.rb index bc0ec9aa0..a72d5ab17 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -4,7 +4,7 @@ class Room - attr_reader :room_num, :rate, :reserve_dates + attr_reader :room_num, :rate def initialize(room_num) if room_num.to_i > 20 || room_num.to_i < 1 @@ -12,17 +12,26 @@ def initialize(room_num) else @room_num = room_num @rate = 200 - @reserve_dates = [] + # @reserve_dates = [] end end - def add_reserve_dates(new_reserve_dates) - duplicated = @reserve_dates & new_reserve_dates - if duplicated.length > 0 - raise ArgumentError, "Duplicated reservation" - else - @reserve_dates += new_reserve_dates - end - end + # def add_reserve_dates(new_reserve_dates) + # if new_reserve_dates.class != Array + # throw ArgumentError, "An Array of Date is required" + # else + # new_reserve_dates.each do |item| + # if item.class != Date + # throw throw ArgumentError, "An Array of Date is required" + # end + # end + # end + # duplicated = @reserve_dates & new_reserve_dates + # if duplicated.length > 0 + # raise ArgumentError, "Duplicated reservation" + # else + # @reserve_dates += new_reserve_dates + # end + # end end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index e1d2e63c8..2c3f09c61 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -12,94 +12,104 @@ end it "establishes the base data structures when instantiated" do - # binding.pry expect(@admin_1.reservations).must_be_kind_of Array expect(@admin_1.rooms).must_be_kind_of Array + expect(@admin_1.rooms.first).must_be_kind_of Room end end - # describe "make_reservation" do - # - # it "will add a reservation object to Reservation array" do - # reservation_made = @admin.make_reservation() - # driven_trips = trip_generated.room.driven_trips - # - # expect(driven_trips).must_include trip_generated - # end - # - # - # it "will add the object to passenger's trips array" do - # trip_generated = @dispatcher.request_trip(1) - # trips = trip_generated.passenger.trips - # - # expect(trips).must_include trip_generated - # end - # - # it "will add the trip object to the collection of all trips in trip dispatcher" do - # all_trips = @dispatcher.trips - # trip_count = all_trips.length - # trip_generated = @dispatcher.request_trip(1) - # - # expect(all_trips).must_include trip_generated - # expect(all_trips.length).must_equal trip_count + 1 - # - # end + + describe "make_reservation" do + before do + @start_date_1 = Date.new(2018,12,4) + @end_date_1 = Date.new(2018,12,6) + @res_1 = @admin_1.make_reservation(2,1,"Mike Murry",@start_date_1, @end_date_1) + @count_1 = @admin_1.reservations.count + @start_date_2 = Date.new(2018,12,5) + @end_date_2 = Date.new(2018,12,7) + @res_2 = @admin_1.make_reservation(3,2,"Julie Smith",@start_date_2, @end_date_2) + @count_2 = @admin_1.reservations.count + + end + + it "will add a reservation object to reservation array" do + expect(@admin_1.reservations).must_include @res_1 + expect(@count_2).must_equal @count_1 + 1 + end + + it "will return a reservation object " do + expect(@res_1).must_be_kind_of Reservation + expect(@res_2).must_be_kind_of Reservation + end + + # it "will add the reserved dates to room.reserve_dates" do + # expect(@res_1.room.reserve_dates).must_include @start_date_1 + # expect(@res_1.room.reserve_dates).must_not_include @end_date_1 + # expect(@res_2.room.reserve_dates).must_include @start_date_2 + # expect(@res_2.room.reserve_dates).must_not_include @end_date_2 + # end + + it "raise ArgumentError if start_date is not ealier than end_date" do + start_date_3 = Date.new(2018,12,5) + end_date_3 = Date.new(2018,12,3) + expect{@admin_1.make_reservation(4,3,"Jessie lee",start_date_3,end_date_3)}.must_raise ArgumentError + + end + + it "raise ArgumentError if start_date is ealier than today" do + start_date_3 = Date.new(2018,8,5) + end_date_3 = Date.new(2018,12,3) + expect{@admin_1.make_reservation(4,3,"Jessie lee",start_date_3,end_date_3)}.must_raise ArgumentError + + + end + + # it "will return a message when no room is available for trip" do + # + # + # expect(@dispatcher.request_trip(6)).must_equal "No driver available at this time." + # end + # + # it "will not create a reservation if no room is available" do + # + # + # expect(@dispatcher.trips.length).must_equal trip_count + # + # end + + end + + # # describe "list_reservations on a specific date" do + # before do # - # it "will change the driver status to unavailabe" do - # trip_generated = @dispatcher.request_trip(1) - # status = trip_generated.driver.status # - # expect(status).must_equal :UNAVAILABLE # - # end + # end # - # it "will return the trip" do - # trip_generated = @dispatcher.request_trip(1) + # it "returns nil if no result being found" do # - # expect(trip_generated).must_be_kind_of RideShare::Trip + # end # - # end + # it "if result being found, must return an array of resrvations " do # - # it "will return a message when no driver is available for trip" do - # @dispatcher.drivers.each do |driver| - # driver.status = :UNAVAILABLE # end # - # expect(@dispatcher.request_trip(6)).must_equal "No driver available at this time." - # end + # if "must return the right list of reservations " do # - # it "will not create a trip if no driver is available" do - # @dispatcher.drivers.each do |driver| - # driver.status = :UNAVAILABLE # end - # trip_count = @dispatcher.trips.length - # @dispatcher.request_trip(6) - # - # expect(@dispatcher.trips.length).must_equal trip_count # # end - # - # end - # describe "list_reservations on a specific date" do - # it "returns an array of reservations" do - # expect - # - # end + describe "find_room method" do - # describe "find_room method" do - # before do - # @admin = Admin.new(3) - # end - # - # it "throws an argument error for a bad ID" do - # expect{ @admin.find_room(0) }.must_raise ArgumentError - # end - # - # it "finds a room instance" do - # room_found = @admin.find_room(2) - # expect(passenger).must_be_kind_of Room - # end - # end + it "throws an argument error for a bad ID" do + expect{ @admin_1.find_room(0) }.must_raise ArgumentError + end + + it "finds a room instance" do + room_found = @admin_1.find_room(2) + expect(room_found).must_be_kind_of Room + end + end end diff --git a/spec/room_spec.rb b/spec/room_spec.rb index edab05407..2202f27e7 100644 --- a/spec/room_spec.rb +++ b/spec/room_spec.rb @@ -10,7 +10,7 @@ expect(room_1).must_respond_to :room_num expect(room_1.room_num).must_equal id expect(room_1.rate).must_equal 200 - expect(room_1.reserve_dates).must_equal [] + # expect(room_1.reserve_dates).must_equal [] end @@ -24,28 +24,33 @@ end end - describe "#update_reserve_dates" do - before do - @room_1 = Room.new(3) - @date1 = Date.new(2018,10,4) - @date2 = Date.new(2018,10,5) - @new_reserve_dates = [ @date1, @date2 ] - @previous = @room_1.reserve_dates.length - @room_1.add_reserve_dates(@new_reserve_dates) - end - - it "increases the reserve_dates array length correctly" do - expect(@room_1.reserve_dates.length).must_equal @previous + 2 - end - - it "the updated reseve_dates array should include the newly added dates" do - expect(@room_1.reserve_dates).must_include @date1 - expect(@room_1.reserve_dates).must_include @date2 - end - - it "throw ArgumentError if attemp to add a specific date to the list twice or more" do - expect{ @room_1.add_reserve_dates([@date1]) }.must_raise ArgumentError - end + # describe "# add_reserve_dates" do + # before do + # @room_1 = Room.new(3) + # @date1 = Date.new(2018,10,4) + # @date2 = Date.new(2018,10,5) + # @new_reserve_dates = [ @date1, @date2 ] + # @previous = @room_1.reserve_dates.length + # @room_1.add_reserve_dates(@new_reserve_dates) + # end + # + # it "increases the reserve_dates array length correctly" do + # expect(@room_1.reserve_dates.length).must_equal @previous + 2 + # end + # + # it "the updated reseve_dates array should include the newly added dates" do + # expect(@room_1.reserve_dates).must_include @date1 + # expect(@room_1.reserve_dates).must_include @date2 + # end + # + # it "throw ArgumentError if attemp to add a specific date to the list twice or more" do + # expect{ @room_1.add_reserve_dates([@date1]) }.must_raise ArgumentError + # end + # + # it "if not adding an array of dates, throw ArgumentError " do + # expect{ @room_1.add_reserve_dates("date") }.must_raise ArgumentError + # expect{ @room_1.add_reserve_dates(["date1","date2"]) }.must_raise ArgumentError + # end + # end - end end From 65b3d8a37566a9b64da274c294a4bd1dc0612106 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sat, 8 Sep 2018 11:36:18 -0700 Subject: [PATCH 10/22] finish list reservations on a date and return the reservation cost method --- lib/admin.rb | 27 ++++++++----- spec/admin_spec.rb | 98 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 91 insertions(+), 34 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 4aebb4b7b..1fcf4d136 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -17,7 +17,7 @@ def initialize - def make_reservation(reservation_id, room_id, customer_name, start_date, end_date) + def make_reservation(reservation_id, customer_name,room_id, start_date, end_date) # loop through the existing reservation array, by room, compare the booked dates array under each room with the dates_required @@ -34,7 +34,7 @@ def make_reservation(reservation_id, room_id, customer_name, start_date, end_dat room = find_room(room_id) - result = Reservation.new(reservation_id, room, customer_name, start_date, end_date) + result = Reservation.new(reservation_id, customer_name, room, start_date, end_date) @reservations << result return result @@ -42,20 +42,27 @@ def make_reservation(reservation_id, room_id, customer_name, start_date, end_dat end - # # input a string of date, to return the list of the reservations on that date - # def list_reservations(date_selected) - # # check the input date is a valid date , can be converted to Date class - # # loop through the resrvations array, check each elements.dates_booked includes daate_selected , if yes, add to the result Array - # # return the result array. - # end -# + # input a string of date, to return the list of the reservations on that date + def list_reservations(date_selected) + return @reservations.select {|reserve| reserve.dates_booked.include? date_selected} + + end + def find_room(id) check_id(id) return @rooms.find { |room| room.room_num == id } end - def calculate_cost + def find_reservation(id) + check_id(id) + return @reservations.find {|reserve| reserve.id == id } + + end + + def calculate_cost(reservation_id) + + return find_reservation(reservation_id).reserve_cost end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index 2c3f09c61..06162f661 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -23,11 +23,11 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,1,"Mike Murry",@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,2,"Julie Smith",@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count end @@ -52,14 +52,14 @@ it "raise ArgumentError if start_date is not ealier than end_date" do start_date_3 = Date.new(2018,12,5) end_date_3 = Date.new(2018,12,3) - expect{@admin_1.make_reservation(4,3,"Jessie lee",start_date_3,end_date_3)}.must_raise ArgumentError + expect{@admin_1.make_reservation(4,"Jessie lee",3,start_date_3,end_date_3)}.must_raise ArgumentError end it "raise ArgumentError if start_date is ealier than today" do start_date_3 = Date.new(2018,8,5) end_date_3 = Date.new(2018,12,3) - expect{@admin_1.make_reservation(4,3,"Jessie lee",start_date_3,end_date_3)}.must_raise ArgumentError + expect{@admin_1.make_reservation(4,"Jessie lee",3,start_date_3,end_date_3)}.must_raise ArgumentError end @@ -79,26 +79,32 @@ end - # # describe "list_reservations on a specific date" do - # before do - # - # - # - # end - # - # it "returns nil if no result being found" do - # - # end - # - # it "if result being found, must return an array of resrvations " do - # - # end - # - # if "must return the right list of reservations " do - # - # end - # - # end + describe "list_reservations on a specific date" do + before do + @start_date_1 = Date.new(2018,12,4) + @end_date_1 = Date.new(2018,12,6) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + @count_1 = @admin_1.reservations.count + @start_date_2 = Date.new(2018,12,5) + @end_date_2 = Date.new(2018,12,7) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + @count_2 = @admin_1.reservations.count + + end + + it "returns nil if no result being found" do + expect(@admin_1.list_reservations(Date.new(2018,12,10))).must_equal [] + end + + it "if result being found, must return an array of resrvations " do + expect(@admin_1.list_reservations(Date.new(2018,12,5))).must_include @res_1 + expect(@admin_1.list_reservations(Date.new(2018,12,5))).must_include @res_2 + end + + it "must return the right list of reservations " do + expect(@admin_1.list_reservations(Date.new(2018,12,5)).length).must_equal 2 + end + end describe "find_room method" do @@ -112,4 +118,48 @@ end end + describe "find_reservation method" do + before do + @start_date_1 = Date.new(2018,12,4) + @end_date_1 = Date.new(2018,12,6) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + @count_1 = @admin_1.reservations.count + @start_date_2 = Date.new(2018,12,5) + @end_date_2 = Date.new(2018,12,7) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + @count_2 = @admin_1.reservations.count + + end + + it "throws an argument error for a bad ID" do + expect{ @admin_1.find_reservation(0) }.must_raise ArgumentError + + end + + it "finds a reservation instance" do + reserve_found = @admin_1.find_reservation(2) + # binding.pry + expect(reserve_found).must_be_kind_of Reservation + expect(reserve_found).must_equal @res_1 + end + end + + describe "calculate_cost" do + before do + @start_date_1 = Date.new(2018,12,4) + @end_date_1 = Date.new(2018,12,6) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + @count_1 = @admin_1.reservations.count + @start_date_2 = Date.new(2018,12,5) + @end_date_2 = Date.new(2018,12,7) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + @count_2 = @admin_1.reservations.count + + end + + it "returns the right number" do + cost = @admin_1.calculate_cost(2) + expect(cost).must_equal 400 + end + end end From 7dea527590df5ea98e536ca345a517e9c82cdd3b Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sat, 8 Sep 2018 11:37:23 -0700 Subject: [PATCH 11/22] finish wave 1 --- lib/admin.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 1fcf4d136..0f7e60190 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -79,6 +79,4 @@ def list_dates(start_date, end_date) def check_id(id) raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 end - - end From 7e10ae1d6387922dfe23a367bf8685658499560b Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sat, 8 Sep 2018 23:38:16 -0700 Subject: [PATCH 12/22] add @room_unbooked_dates as the instance attribut for admin.rb, update the make_reservation method accordingly --- lib/admin.rb | 39 ++++++++++++++++------------- spec/admin_spec.rb | 61 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 76 insertions(+), 24 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 0f7e60190..fb8389398 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -4,17 +4,27 @@ require_relative 'room' class Admin - attr_reader :reservations, :rooms + attr_reader :reservations, :rooms, :room_unbooked_dates def initialize @rooms = [] @reservations = [] + @room_unbooked_dates = [] + 20.times do |i| room_new = Room.new(i+1) @rooms << room_new + 365.times do |i| + date_new = Date.today + i + @room_unbooked_dates << {room_n: room_new, unbooked_date: date_new} + end end end + def find_room_available(start_date, end_date) + + + end def make_reservation(reservation_id, customer_name,room_id, start_date, end_date) @@ -28,7 +38,7 @@ def make_reservation(reservation_id, customer_name,room_id, start_date, end_date if start_date.class != Date || end_date.class != Date raise ArgumentError, "start_date and end_Date should be Date objects" end - if start_date >= end_date || start_date < Date.today + if start_date >= end_date || start_date < Date.today || end_date > (Date.today + 365) raise ArgumentError, "invlid dates entered" end @@ -37,6 +47,14 @@ def make_reservation(reservation_id, customer_name,room_id, start_date, end_date result = Reservation.new(reservation_id, customer_name, room, start_date, end_date) @reservations << result + + start_d = start_date + + while start_d < end_date + @room_unbooked_dates.reject! {|item| item == {room_n: room, unbooked_date: start_d}} + start_d += 1 + end + return result end @@ -50,12 +68,12 @@ def list_reservations(date_selected) def find_room(id) - check_id(id) + raise ArgumentError, "ID cannot be blank, less than zero or more than 20. (got #{id})" if id.nil? || id <= 0 || id > 20 return @rooms.find { |room| room.room_num == id } end def find_reservation(id) - check_id(id) + raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 return @reservations.find {|reserve| reserve.id == id } end @@ -66,17 +84,4 @@ def calculate_cost(reservation_id) end - private - def list_dates(start_date, end_date) - dates = [] - - while start_date < end_date - dates << start_date - start_date += end_date - end - end - - def check_id(id) - raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 - end end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index 06162f661..1be634542 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -14,7 +14,10 @@ it "establishes the base data structures when instantiated" do expect(@admin_1.reservations).must_be_kind_of Array expect(@admin_1.rooms).must_be_kind_of Array + expect(@admin_1.room_unbooked_dates).must_be_kind_of Array expect(@admin_1.rooms.first).must_be_kind_of Room + expect(@admin_1.room_unbooked_dates.length).must_equal 7300 + expect(@admin_1.room_unbooked_dates.first[:unbooked_date]).must_equal Date.today end end @@ -42,12 +45,25 @@ expect(@res_2).must_be_kind_of Reservation end - # it "will add the reserved dates to room.reserve_dates" do - # expect(@res_1.room.reserve_dates).must_include @start_date_1 - # expect(@res_1.room.reserve_dates).must_not_include @end_date_1 - # expect(@res_2.room.reserve_dates).must_include @start_date_2 - # expect(@res_2.room.reserve_dates).must_not_include @end_date_2 - # end + it "will reduce the room_unbooked_dates array correctly" do + room_1 = @admin_1.find_room(1) + room_2 = @admin_1.find_room(2) + result = false + selected = @admin_1.room_unbooked_dates.select {|a, b| a == room_1 && b == @start_date_1} + if selected == [] + result = true + end + + result_2 = false + selected_2 = @admin_1.room_unbooked_dates.select {|a, b| a == room_1 && b == @end_date_1} + if selected_2 == [] + result = true + end + expect(result).must_equal true + expect(result_2).must_equal false + expect(@admin_1.room_unbooked_dates.length).must_equal 7296 + + end it "raise ArgumentError if start_date is not ealier than end_date" do start_date_3 = Date.new(2018,12,5) @@ -61,7 +77,6 @@ end_date_3 = Date.new(2018,12,3) expect{@admin_1.make_reservation(4,"Jessie lee",3,start_date_3,end_date_3)}.must_raise ArgumentError - end # it "will return a message when no room is available for trip" do @@ -162,4 +177,36 @@ expect(cost).must_equal 400 end end + + # describe "find room availabe " do + # before do + # @start_date_1 = Date.new(2018,12,4) + # @end_date_1 = Date.new(2018,12,6) + # @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + # + # @start_date_2 = Date.new(2018,12,5) + # @end_date_2 = Date.new(2018,12,7) + # @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + # + # end + # + # it "returns an array of rooms" do + # room_list_1 = @admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)) + # + # expect(room_list_1).must_be_kind_of Array + # expect(room_list_1.first).must_be_kind_of Room + # end + # + # it "returns the right number of rooms " do + # room_three = @admin_1.find_room(3) + # expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)).length).must_equal 18 + # expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5))).must_include room_three + # + # end + # + # it " will not include a room already booked on that day" do + # room_first = @admin_1.find_room(1) + # expect(@admin_1.find_room_available(Date.new(2018,12,4), Date.new(2018,12,5))).must_not_include room_first + # end + # end end From 8ff8351d955d2b3586a6f86721f2e847fd4ee085 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sun, 9 Sep 2018 08:29:54 -0700 Subject: [PATCH 13/22] complete the room_available_list in a given date range method --- lib/admin.rb | 29 ++++++++++++++++++-- spec/admin_spec.rb | 68 ++++++++++++++++++++++++---------------------- 2 files changed, 62 insertions(+), 35 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index fb8389398..89a84ba75 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -14,20 +14,43 @@ def initialize 20.times do |i| room_new = Room.new(i+1) @rooms << room_new - 365.times do |i| - date_new = Date.today + i + 365.times do |num| + date_new = Date.today + num @room_unbooked_dates << {room_n: room_new, unbooked_date: date_new} end end end def find_room_available(start_date, end_date) + if start_date.class != Date || end_date.class != Date + raise ArgumentError, "start_date and end_Date should be Date objects" + end + if start_date >= end_date + raise ArgumentError, "invlid dates entered, start_date should be ealier than end_date" + end + + dates_available_rooms = [] + + @rooms.each do |room| + dates_needed = [] + start_d = start_date + while start_d <= end_date + dates_needed << {room_n: room, unbooked_date: start_d} + start_d += 1 + end + + if (@room_unbooked_dates & dates_needed) == dates_needed + dates_available_rooms << room + end + + end + return dates_available_rooms end - def make_reservation(reservation_id, customer_name,room_id, start_date, end_date) + def make_reservation(reservation_id, customer_name, room_id, start_date, end_date) # loop through the existing reservation array, by room, compare the booked dates array under each room with the dates_required diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index 1be634542..526ae2c17 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -47,7 +47,7 @@ it "will reduce the room_unbooked_dates array correctly" do room_1 = @admin_1.find_room(1) - room_2 = @admin_1.find_room(2) + # room_2 = @admin_1.find_room(2) result = false selected = @admin_1.room_unbooked_dates.select {|a, b| a == room_1 && b == @start_date_1} if selected == [] @@ -178,35 +178,39 @@ end end - # describe "find room availabe " do - # before do - # @start_date_1 = Date.new(2018,12,4) - # @end_date_1 = Date.new(2018,12,6) - # @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) - # - # @start_date_2 = Date.new(2018,12,5) - # @end_date_2 = Date.new(2018,12,7) - # @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) - # - # end - # - # it "returns an array of rooms" do - # room_list_1 = @admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)) - # - # expect(room_list_1).must_be_kind_of Array - # expect(room_list_1.first).must_be_kind_of Room - # end - # - # it "returns the right number of rooms " do - # room_three = @admin_1.find_room(3) - # expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)).length).must_equal 18 - # expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5))).must_include room_three - # - # end - # - # it " will not include a room already booked on that day" do - # room_first = @admin_1.find_room(1) - # expect(@admin_1.find_room_available(Date.new(2018,12,4), Date.new(2018,12,5))).must_not_include room_first - # end - # end + describe "find room availabe " do + before do + @start_date_1 = Date.new(2018,12,4) + @end_date_1 = Date.new(2018,12,6) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + + @start_date_2 = Date.new(2018,12,5) + @end_date_2 = Date.new(2018,12,7) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + + end + + it "returns an array of rooms" do + room_list_1 = @admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)) + + expect(room_list_1).must_be_kind_of Array + expect(room_list_1.first).must_be_kind_of Room + end + + it "returns the right number of rooms " do + room_three = @admin_1.find_room(3) + expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)).length).must_equal 18 + expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5))).must_include room_three + + end + + it " will not include a room already booked on that day" do + room_first = @admin_1.find_room(1) + room_selected = @admin_1.find_room_available(Date.new(2018,12,4), Date.new(2018,12,5)) + + expect(room_selected.include? room_first).must_equal false + end + + + end end From 548059f21424d51e5c64ea5cb4de7924a19164c3 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sun, 9 Sep 2018 09:03:36 -0700 Subject: [PATCH 14/22] update make_reservaion method to allow system pick the first room which is available --- lib/admin.rb | 23 ++++++++----------- spec/admin_spec.rb | 55 +++++++++++++++++++++++----------------------- 2 files changed, 37 insertions(+), 41 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 89a84ba75..ea5532be8 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -43,34 +43,31 @@ def find_room_available(start_date, end_date) if (@room_unbooked_dates & dates_needed) == dates_needed dates_available_rooms << room end - end - return dates_available_rooms end - def make_reservation(reservation_id, customer_name, room_id, start_date, end_date) - - # loop through the existing reservation array, by room, compare the booked dates array under each room with the dates_required - - # if we found the dates_required do not have a date in common with the dates booked, return the that room, create a new reservation item, and add it to the reservation array . - - # call the add_reserve_dates method under that room, and add it to room + def make_reservation(reservation_id, customer_name, start_date, end_date) if start_date.class != Date || end_date.class != Date raise ArgumentError, "start_date and end_Date should be Date objects" end + if start_date >= end_date || start_date < Date.today || end_date > (Date.today + 365) raise ArgumentError, "invlid dates entered" end - room = find_room(room_id) + rooms_not_booked = find_room_available(start_date, end_date) - result = Reservation.new(reservation_id, customer_name, room, start_date, end_date) + if rooms_not_booked == [] + return "No room available at this time." + else + room = rooms_not_booked.first + end + result = Reservation.new(reservation_id, customer_name, room, start_date, end_date) @reservations << result - start_d = start_date while start_d < end_date @@ -79,10 +76,8 @@ def make_reservation(reservation_id, customer_name, room_id, start_date, end_dat end return result - end - # input a string of date, to return the list of the reservations on that date def list_reservations(date_selected) return @reservations.select {|reserve| reserve.dates_booked.include? date_selected} diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index 526ae2c17..f2aa3a629 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -26,13 +26,16 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation(1,"Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation(2,"Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count + 20.times do |i| + @admin_1.make_reservation(@count_2 + i + 1, "Lily Xia", Date.new(2018,9,25), Date.new(2018,9,27)) + end end it "will add a reservation object to reservation array" do @@ -61,36 +64,34 @@ end expect(result).must_equal true expect(result_2).must_equal false - expect(@admin_1.room_unbooked_dates.length).must_equal 7296 + expect(@admin_1.room_unbooked_dates.length).must_equal 7256 end it "raise ArgumentError if start_date is not ealier than end_date" do start_date_3 = Date.new(2018,12,5) end_date_3 = Date.new(2018,12,3) - expect{@admin_1.make_reservation(4,"Jessie lee",3,start_date_3,end_date_3)}.must_raise ArgumentError + expect{@admin_1.make_reservation(23,"Jessica lee", start_date_3,end_date_3)}.must_raise ArgumentError end it "raise ArgumentError if start_date is ealier than today" do start_date_3 = Date.new(2018,8,5) end_date_3 = Date.new(2018,12,3) - expect{@admin_1.make_reservation(4,"Jessie lee",3,start_date_3,end_date_3)}.must_raise ArgumentError + expect{@admin_1.make_reservation(23,"Jessca lee",start_date_3,end_date_3)}.must_raise ArgumentError + + end + + it "will return a message when no room is available for trip" do + expect(@admin_1.make_reservation(23,"Jessica lee",Date.new(2018,9,25),Date.new(2018,9,26))).must_equal "No room available at this time." end - # it "will return a message when no room is available for trip" do - # - # - # expect(@dispatcher.request_trip(6)).must_equal "No driver available at this time." - # end - # - # it "will not create a reservation if no room is available" do - # - # - # expect(@dispatcher.trips.length).must_equal trip_count - # - # end + it "will not create a reservation if no room is available" do + + expect(@admin_1.reservations.length).must_equal 22 + + end end @@ -98,11 +99,11 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count end @@ -137,11 +138,11 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count end @@ -163,11 +164,11 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count end @@ -182,11 +183,11 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",1,@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation(2,"Mike Murry",@start_date_1, @end_date_1) @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",2,@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation(3,"Julie Smith",@start_date_2, @end_date_2) end @@ -198,9 +199,9 @@ end it "returns the right number of rooms " do - room_three = @admin_1.find_room(3) + room_book = @admin_1.find_room(3) expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)).length).must_equal 18 - expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5))).must_include room_three + expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5))).must_include room_book end From a2925c182c645fa030a70bf7746c58c7d1bd330c Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sun, 9 Sep 2018 12:48:30 -0700 Subject: [PATCH 15/22] change the admin.rb initailze method to add more parameters --- lib/admin.rb | 55 ++++++++++++++++++++++++++-------------- lib/block_admin.rb | 0 spec/admin_spec.rb | 20 ++++++++++++++- spec/block_admin_spec.rb | 0 4 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 lib/block_admin.rb create mode 100644 spec/block_admin_spec.rb diff --git a/lib/admin.rb b/lib/admin.rb index ea5532be8..fec46885a 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -4,31 +4,33 @@ require_relative 'room' class Admin - attr_reader :reservations, :rooms, :room_unbooked_dates + attr_reader :reservations, :rooms, :room_unbooked_dates, :room_blocks, :start_date, :end_date - def initialize + def initialize(room_id_list, start_date, end_date) + check_input_dates(start_date, end_date) @rooms = [] @reservations = [] @room_unbooked_dates = [] + @room_blocks =[] + @start_date = start_date + @end_date = end_date - 20.times do |i| - room_new = Room.new(i+1) + room_id_list.each do |i| + room_new = Room.new(i) @rooms << room_new - 365.times do |num| - date_new = Date.today + num - @room_unbooked_dates << {room_n: room_new, unbooked_date: date_new} + start_d = start_date + + while start_d < end_date + date_new = start_d + @room_unbooked_dates << {room_n: room_new, unbooked_date: start_d} + start_d += 1 end end end def find_room_available(start_date, end_date) - if start_date.class != Date || end_date.class != Date - raise ArgumentError, "start_date and end_Date should be Date objects" - end - if start_date >= end_date - raise ArgumentError, "invlid dates entered, start_date should be ealier than end_date" - end + check_input_dates(start_date, end_date) dates_available_rooms = [] @rooms.each do |room| @@ -50,12 +52,9 @@ def find_room_available(start_date, end_date) def make_reservation(reservation_id, customer_name, start_date, end_date) - if start_date.class != Date || end_date.class != Date - raise ArgumentError, "start_date and end_Date should be Date objects" - end - - if start_date >= end_date || start_date < Date.today || end_date > (Date.today + 365) - raise ArgumentError, "invlid dates entered" + check_input_dates(start_date, end_date) + if start_date < @start_date || (end_date > @end_date) + raise ArgumentError, "can only book reservations between #{@start_date} and #{@end_date}" end rooms_not_booked = find_room_available(start_date, end_date) @@ -78,6 +77,14 @@ def make_reservation(reservation_id, customer_name, start_date, end_date) return result end + # create room blocks + def create_room_block(name_of_block, room_collection, discounted_rate, start_date, end_date) + # make sure room_collection.length are not more than 5 + # make sure rooms in collection are available with the given date range + # raise argument error if the above is not structures + # initialize a room_block_class object and put into the room ,block array + end + # input a string of date, to return the list of the reservations on that date def list_reservations(date_selected) return @reservations.select {|reserve| reserve.dates_booked.include? date_selected} @@ -102,4 +109,14 @@ def calculate_cost(reservation_id) end + private + def check_input_dates(start_date, end_date) + if start_date.class != Date || end_date.class != Date + raise ArgumentError, "start_date and end_Date should be Date objects" + end + if start_date >= end_date + raise ArgumentError, "invlid dates entered, start_date should be ealier than end_date" + end + end + end diff --git a/lib/block_admin.rb b/lib/block_admin.rb new file mode 100644 index 000000000..e69de29bb diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index f2aa3a629..8b07f6fd7 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -3,7 +3,8 @@ describe "Admin class" do before do - @admin_1 = Admin.new + list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] + @admin_1 = Admin.new(list, Date.today, Date.today + 365) end describe "Initializer" do @@ -18,6 +19,7 @@ expect(@admin_1.rooms.first).must_be_kind_of Room expect(@admin_1.room_unbooked_dates.length).must_equal 7300 expect(@admin_1.room_unbooked_dates.first[:unbooked_date]).must_equal Date.today + expect(@admin_1.room_blocks).must_equal [] end end @@ -211,7 +213,23 @@ expect(room_selected.include? room_first).must_equal false end + end + describe "create_room_block" do + before do + @start_date_1 = Date.new(2018,12,4) + @end_date_1 = Date.new(2018,12,6) + @res_1 = @admin_1.make_reservation(1,"Mike Murry",@start_date_1, @end_date_1) + @count_1 = @admin_1.reservations.count + @start_date_2 = Date.new(2018,12,5) + @end_date_2 = Date.new(2018,12,7) + @res_2 = @admin_1.make_reservation(2,"Julie Smith",@start_date_2, @end_date_2) + @count_2 = @admin_1.reservations.count + + 20.times do |i| + @admin_1.make_reservation(@count_2 + i + 1, "Lily Xia", Date.new(2018,9,25), Date.new(2018,9,27)) + end + end end end diff --git a/spec/block_admin_spec.rb b/spec/block_admin_spec.rb new file mode 100644 index 000000000..e69de29bb From dcf4a38f12027ede83a20a07aec7328da7b70470 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sun, 9 Sep 2018 13:27:39 -0700 Subject: [PATCH 16/22] add a BlockAdmin class which is a child class of Admin class --- lib/admin.rb | 3 ++- lib/block_admin.rb | 18 ++++++++++++++++++ spec/admin_spec.rb | 2 +- spec/block_admin_spec.rb | 21 +++++++++++++++++++++ spec/spec_helper.rb | 1 + 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index fec46885a..4e207d48b 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -3,6 +3,7 @@ require_relative 'reservation' require_relative 'room' + class Admin attr_reader :reservations, :rooms, :room_unbooked_dates, :room_blocks, :start_date, :end_date @@ -21,7 +22,7 @@ def initialize(room_id_list, start_date, end_date) start_d = start_date while start_d < end_date - date_new = start_d + @room_unbooked_dates << {room_n: room_new, unbooked_date: start_d} start_d += 1 end diff --git a/lib/block_admin.rb b/lib/block_admin.rb index e69de29bb..5da86acae 100644 --- a/lib/block_admin.rb +++ b/lib/block_admin.rb @@ -0,0 +1,18 @@ +require 'pry' +require 'date' +require_relative 'reservation' +require_relative 'room' +require_relative 'admin' + +class BlockAdmin < Admin + attr_reader :discount + + def initialize(room_id_list, start_date, end_date, discounted_rate) + super(room_id_list, start_date, end_date) + @discount = discounted_rate + end + + def calculate_cost(reservation_id) + return find_reservation(reservation_id).reserve_cost * @discount + end +end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index 8b07f6fd7..4273f05de 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -4,7 +4,7 @@ describe "Admin class" do before do list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] - @admin_1 = Admin.new(list, Date.today, Date.today + 365) + @admin_1 = Admin.new(list, Date.today, (Date.today + 365)) end describe "Initializer" do diff --git a/spec/block_admin_spec.rb b/spec/block_admin_spec.rb index e69de29bb..63980753b 100644 --- a/spec/block_admin_spec.rb +++ b/spec/block_admin_spec.rb @@ -0,0 +1,21 @@ +require 'pry' +require_relative 'spec_helper' + +describe "Block Admin class" do + + before do + list = [6,7,8,9,10] + @admin_b = BlockAdmin.new(list, Date.new(2018,10,5), Date.new(2018,10,12),0.80) + end + + describe "Initializer" do + it "is an instance of BlockAdmin" do + expect(@admin_b).must_be_kind_of BlockAdmin + end + + it "establishes the base data structures when instantiated" do + expect(@admin_b.discount).must_equal 0.80 + end + + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4e3f067f4..518314421 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -13,3 +13,4 @@ require_relative '../lib/admin' require_relative '../lib/reservation' require_relative '../lib/room' +require_relative '../lib/block_admin' From 8505abee692fd08df7449edf606208611ab3ee0a Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 10 Sep 2018 00:05:11 -0700 Subject: [PATCH 17/22] finished create_room_block method in admin.rb --- lib/admin.rb | 90 +++++++++++++++++++++++++++++++++++----- lib/block_admin.rb | 13 ++++-- spec/admin_spec.rb | 42 +++++++++++++++++-- spec/block_admin_spec.rb | 22 ++++++++-- 4 files changed, 147 insertions(+), 20 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 4e207d48b..92c69527a 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -17,7 +17,7 @@ def initialize(room_id_list, start_date, end_date) @end_date = end_date room_id_list.each do |i| - room_new = Room.new(i) + room_new = create_room(i) @rooms << room_new start_d = start_date @@ -29,6 +29,7 @@ def initialize(room_id_list, start_date, end_date) end end + # find availabe rooms in a given period def find_room_available(start_date, end_date) check_input_dates(start_date, end_date) @@ -38,7 +39,7 @@ def find_room_available(start_date, end_date) dates_needed = [] start_d = start_date - while start_d <= end_date + while start_d < end_date dates_needed << {room_n: room, unbooked_date: start_d} start_d += 1 end @@ -50,7 +51,7 @@ def find_room_available(start_date, end_date) return dates_available_rooms end - + # make new reservations def make_reservation(reservation_id, customer_name, start_date, end_date) check_input_dates(start_date, end_date) @@ -61,12 +62,12 @@ def make_reservation(reservation_id, customer_name, start_date, end_date) rooms_not_booked = find_room_available(start_date, end_date) if rooms_not_booked == [] - return "No room available at this time." + raise ArgumentError, "No room available at this time." else room = rooms_not_booked.first end - result = Reservation.new(reservation_id, customer_name, room, start_date, end_date) + result = create_reservation(reservation_id, customer_name, room, start_date, end_date) @reservations << result start_d = start_date @@ -79,11 +80,61 @@ def make_reservation(reservation_id, customer_name, start_date, end_date) end # create room blocks - def create_room_block(name_of_block, room_collection, discounted_rate, start_date, end_date) - # make sure room_collection.length are not more than 5 - # make sure rooms in collection are available with the given date range - # raise argument error if the above is not structures - # initialize a room_block_class object and put into the room ,block array + def create_room_block(name_of_block, room_collection, start_date, end_date, discount_rate) + if discount_rate < 0 || discount_rate > 1 + raise ArgumentError + end + + if room_collection.nil? || room_collection == [] || room_collection.length > 5 + raise ArgumentError, "room list can not be nil, empty array or more than 5 in the list" + end + + if start_date.class != Date || end_date.class != Date + raise ArgumentError, "start_date and end_Date should be Date objects" + end + if start_date >= end_date + raise ArgumentError, "invlid dates entered, start_date should be ealier than end_date" + end + + if start_date < @start_date || end_date > @end_date + raise ArgumentError, "start_date and end_date of room block must be in the working period" + end + + available_rooms = find_room_available(start_date, end_date) + room_entered = room_collection.map {|item| find_room(item)} + + if (available_rooms & room_entered) != room_entered + raise ArgumentError, "rooms are not available in given period" + else + start_d = start_date + # room_entered.each do |room| + # while start_d < end_date + # @room_unbooked_dates.reject! {|item| item == {room_n: room, unbooked_date: start_d}} + # start_d += 1 + # end + # end + date_list = [] + while start_d < end_date + date_list << start_d + start_d += 1 + end + + room_date_list = [] + date_list.each do |item| + room_entered.each do |r| + room_date_list << {room_n: r, unbooked_date: item} + end + end + + @room_unbooked_dates = @room_unbooked_dates - room_date_list + end + + + + new_block = create_block_admin(name_of_block,room_collection, start_date, end_date, discount_rate) + room_blocks << new_block + return new_block + end # input a string of date, to return the list of the reservations on that date @@ -92,18 +143,20 @@ def list_reservations(date_selected) end - + # find room obj by id def find_room(id) raise ArgumentError, "ID cannot be blank, less than zero or more than 20. (got #{id})" if id.nil? || id <= 0 || id > 20 return @rooms.find { |room| room.room_num == id } end + # find reservation obj by id def find_reservation(id) raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 return @reservations.find {|reserve| reserve.id == id } end + # calculate reservation cost by reservation id def calculate_cost(reservation_id) return find_reservation(reservation_id).reserve_cost @@ -111,6 +164,7 @@ def calculate_cost(reservation_id) end private + # check inputed start_date and end_date to make sure they are valid def check_input_dates(start_date, end_date) if start_date.class != Date || end_date.class != Date raise ArgumentError, "start_date and end_Date should be Date objects" @@ -120,4 +174,18 @@ def check_input_dates(start_date, end_date) end end + # create new instance of reservation object + def create_reservation(reservation_id, customer_name, room, start_date, end_date) + return Reservation.new(reservation_id, customer_name, room, start_date, end_date) + end + + # create new room object + def create_room(id) + return Room.new(id) + end + + # create new room_block admin object + def create_block_admin(name, room_id_list, start_date, end_date, discount_rate) + return BlockAdmin.new(name, room_id_list, start_date, end_date, discount_rate) + end end diff --git a/lib/block_admin.rb b/lib/block_admin.rb index 5da86acae..dc0c038dc 100644 --- a/lib/block_admin.rb +++ b/lib/block_admin.rb @@ -5,14 +5,21 @@ require_relative 'admin' class BlockAdmin < Admin - attr_reader :discount + attr_reader :discount, :block_name - def initialize(room_id_list, start_date, end_date, discounted_rate) + def initialize(name, room_id_list, start_date, end_date, discounted_rate) super(room_id_list, start_date, end_date) @discount = discounted_rate + @block_name = name end def calculate_cost(reservation_id) - return find_reservation(reservation_id).reserve_cost * @discount + return find_reservation(reservation_id).reserve_cost * (1-@discount) end + + def make_reservation(reservation_id,customer_name) + super(reservation_id,customer_name, start_date, end_date) + + end + end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index 4273f05de..c663bd314 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -84,9 +84,9 @@ end - it "will return a message when no room is available for trip" do + it "will raise ArgumentError when no room is available for trip" do - expect(@admin_1.make_reservation(23,"Jessica lee",Date.new(2018,9,25),Date.new(2018,9,26))).must_equal "No room available at this time." + expect{@admin_1.make_reservation(23,"Jessica lee",Date.new(2018,9,25),Date.new(2018,9,26))}.must_raise ArgumentError end it "will not create a reservation if no room is available" do @@ -202,7 +202,7 @@ it "returns the right number of rooms " do room_book = @admin_1.find_room(3) - expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)).length).must_equal 18 + expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5)).length).must_equal 19 expect(@admin_1.find_room_available(Date.new(2018,12,4),Date.new(2018,12,5))).must_include room_book end @@ -229,7 +229,43 @@ 20.times do |i| @admin_1.make_reservation(@count_2 + i + 1, "Lily Xia", Date.new(2018,9,25), Date.new(2018,9,27)) end + + @name_of_block = "tech_forum" + @list_3 = [10,11,12,13,14] + @list_6 = [10,11,12,13,14,15] + @start_3 = Date.new(2018,12,1) + @end_3 = Date.new(2018,12,11) + @discount = 0.1 + end + + it "returns a new object of BlockAdmin " do + expect(@admin_1.create_room_block("block1",@list_3, @start_3, @end_3, @discount)).must_be_kind_of BlockAdmin + end + + it "increase the length of room_blocks array be 1" do + @admin_1.create_room_block("block1",@list_3, @start_3, @end_3, @discount) + expect(@admin_1.room_blocks.length).must_equal 1 + end + + it "remove the related rooms from the room_unbooked_dates array in the specified date " do + @admin_1.create_room_block("block1",@list_3, @start_3, @end_3, @discount) + expect(@admin_1.room_unbooked_dates.length).must_equal 7206 end + it "raise ArgumentError if room_id_list has more than 5 elements" do + expect{@admin_1.create_room_block("block1",@list_6, @start_3, @end_3, @discount)}.must_raise ArgumentError + end + + it "raise ArgumentError if room specified was not available in that period" do + expect{@admin_1.create_room_block("block1",[1,2], Date.new(2018,9,25), Date.new(2018,9,27),@discount)}.must_raise ArgumentError + end + + it "raise ArgumentError if the period requested for set up room block is outside of the current working period )" do + expect{@admin_1.create_room_block("block1",[1,2], Date.new(2019,10,25), Date.new(2019,10,27),0.1)}.must_raise ArgumentError + end + + it "raise ArgumentError if the discount_rate is < 0 or > 1" do + expect{@admin_1.create_room_block("block1",[1,2], Date.new(2018,11,2), Date.new(2018,11,5),1.1)}.must_raise ArgumentError + end end end diff --git a/spec/block_admin_spec.rb b/spec/block_admin_spec.rb index 63980753b..de563f512 100644 --- a/spec/block_admin_spec.rb +++ b/spec/block_admin_spec.rb @@ -4,8 +4,9 @@ describe "Block Admin class" do before do - list = [6,7,8,9,10] - @admin_b = BlockAdmin.new(list, Date.new(2018,10,5), Date.new(2018,10,12),0.80) + list = [6,7,8,9] + @admin_b = BlockAdmin.new("block1",list, Date.new(2018,10,5), Date.new(2018,10,10),0.10) + end describe "Initializer" do @@ -14,8 +15,23 @@ end it "establishes the base data structures when instantiated" do - expect(@admin_b.discount).must_equal 0.80 + expect(@admin_b.discount).must_equal 0.10 end + end + describe "make_reservation" do + it "will only allow to the period same as the block set up period" do + @admin_b.make_reservation(1,"Mike lee") + expect(@admin_b.reservations.first.start_date).must_equal Date.new(2018,10,5) + expect(@admin_b.reservations.first.end_date).must_equal Date.new(2018,10,10) + end + end + + describe "calculate_cost" do + + it "returns a right number" do + @admin_b.make_reservation(1,"Mike lee") + expect(@admin_b.calculate_cost(1)).must_equal 900.0 + end end end From 87de2a4fd67bbbc950e76d687828af25d98a02be Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 10 Sep 2018 00:39:06 -0700 Subject: [PATCH 18/22] add a main.rb for test run purpose --- lib/admin.rb | 11 ++--------- lib/block_admin.rb | 2 +- lib/main.rb | 19 +++++++++++++++++++ lib/room.rb | 20 ++------------------ spec/admin_spec.rb | 2 +- spec/block_admin_spec.rb | 4 ++-- spec/spec_helper.rb | 1 + 7 files changed, 28 insertions(+), 31 deletions(-) create mode 100644 lib/main.rb diff --git a/lib/admin.rb b/lib/admin.rb index 92c69527a..9ec26a73b 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -107,12 +107,7 @@ def create_room_block(name_of_block, room_collection, start_date, end_date, disc raise ArgumentError, "rooms are not available in given period" else start_d = start_date - # room_entered.each do |room| - # while start_d < end_date - # @room_unbooked_dates.reject! {|item| item == {room_n: room, unbooked_date: start_d}} - # start_d += 1 - # end - # end + date_list = [] while start_d < end_date date_list << start_d @@ -129,8 +124,6 @@ def create_room_block(name_of_block, room_collection, start_date, end_date, disc @room_unbooked_dates = @room_unbooked_dates - room_date_list end - - new_block = create_block_admin(name_of_block,room_collection, start_date, end_date, discount_rate) room_blocks << new_block return new_block @@ -186,6 +179,6 @@ def create_room(id) # create new room_block admin object def create_block_admin(name, room_id_list, start_date, end_date, discount_rate) - return BlockAdmin.new(name, room_id_list, start_date, end_date, discount_rate) + return Block.new(name, room_id_list, start_date, end_date, discount_rate) end end diff --git a/lib/block_admin.rb b/lib/block_admin.rb index dc0c038dc..dba9c349f 100644 --- a/lib/block_admin.rb +++ b/lib/block_admin.rb @@ -4,7 +4,7 @@ require_relative 'room' require_relative 'admin' -class BlockAdmin < Admin +class Block < Admin attr_reader :discount, :block_name def initialize(name, room_id_list, start_date, end_date, discounted_rate) diff --git a/lib/main.rb b/lib/main.rb new file mode 100644 index 000000000..423c45de6 --- /dev/null +++ b/lib/main.rb @@ -0,0 +1,19 @@ +require 'pry' +require 'date' +require_relative 'admin' +require_relative 'block_admin' + +class Main + #create 20 rooms for period today to one year later + room_list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] + start = Date.today + last = start + 365 + work_space = Admin.new(room_list,start,last) + work_space.create_room_block("block1",[1,2],Date.new(2018,10,1),Date.new(2018,10,3),0.1) + work_space.room_blocks.first.make_reservation(1,"jessie") + puts work_space.room_blocks.first.reservations.first + puts work_space.room_blocks.first.reservations.first.customer_name + puts work_space.room_blocks.first.reservations.first.room.room_num + puts work_space.room_blocks.first.reservations.first.start_date + puts work_space.room_blocks.first.reservations.first.end_date +end diff --git a/lib/room.rb b/lib/room.rb index a72d5ab17..ab73894e4 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -12,26 +12,10 @@ def initialize(room_num) else @room_num = room_num @rate = 200 - # @reserve_dates = [] + end end - # def add_reserve_dates(new_reserve_dates) - # if new_reserve_dates.class != Array - # throw ArgumentError, "An Array of Date is required" - # else - # new_reserve_dates.each do |item| - # if item.class != Date - # throw throw ArgumentError, "An Array of Date is required" - # end - # end - # end - # duplicated = @reserve_dates & new_reserve_dates - # if duplicated.length > 0 - # raise ArgumentError, "Duplicated reservation" - # else - # @reserve_dates += new_reserve_dates - # end - # end + end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index c663bd314..ba763ddf4 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -239,7 +239,7 @@ end it "returns a new object of BlockAdmin " do - expect(@admin_1.create_room_block("block1",@list_3, @start_3, @end_3, @discount)).must_be_kind_of BlockAdmin + expect(@admin_1.create_room_block("block1",@list_3, @start_3, @end_3, @discount)).must_be_kind_of Block end it "increase the length of room_blocks array be 1" do diff --git a/spec/block_admin_spec.rb b/spec/block_admin_spec.rb index de563f512..14110de8d 100644 --- a/spec/block_admin_spec.rb +++ b/spec/block_admin_spec.rb @@ -5,13 +5,13 @@ before do list = [6,7,8,9] - @admin_b = BlockAdmin.new("block1",list, Date.new(2018,10,5), Date.new(2018,10,10),0.10) + @admin_b = Block.new("block1",list, Date.new(2018,10,5), Date.new(2018,10,10),0.10) end describe "Initializer" do it "is an instance of BlockAdmin" do - expect(@admin_b).must_be_kind_of BlockAdmin + expect(@admin_b).must_be_kind_of Block end it "establishes the base data structures when instantiated" do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 518314421..bcdef60d3 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -14,3 +14,4 @@ require_relative '../lib/reservation' require_relative '../lib/room' require_relative '../lib/block_admin' +require_relative '../lib/main' From 6f563a7228e2194b0fdd3cf2ccb2338f7d5615fe Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Mon, 10 Sep 2018 01:01:55 -0700 Subject: [PATCH 19/22] change a typo --- spec/admin_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index ba763ddf4..c8b12c7d2 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -238,7 +238,7 @@ @discount = 0.1 end - it "returns a new object of BlockAdmin " do + it "returns a new object of Block " do expect(@admin_1.create_room_block("block1",@list_3, @start_3, @end_3, @discount)).must_be_kind_of Block end From 9b716153f5b34ec607d1da320bf9c3be38959a5d Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sun, 30 Sep 2018 08:43:14 -0700 Subject: [PATCH 20/22] added sesign-activity.md --- design-activity.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..0750dc8a4 --- /dev/null +++ b/design-activity.md @@ -0,0 +1,54 @@ +# What classes does each implementation include? Are the lists the same? +Each implementation include: CartEntry, ShoppingCart and Order. +The lists are the same. + +# Write down a sentence to describe each class. + CartEntry: each time when the user add new items into the Cart , taking care of that addition + + ShoppingCart: holding a list of the cart entries , represents all the items user has added to the Shopping Cart. + + Order: taking care of the order. + +# How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. + + ShoppingCart contains a list of CartEntry instances. + Order is generated based on the current items holding in the ShoppingCart. + +# What data does each class store? How (if at all) does this differ between the two implementations? + CartEntry class: stores unit_price and quantity of the entry item. + ShoppingCart class: stores a list of the CartEntry. + Order class: stores sales tax rate, a new instance of the SHoppingCart class + + two implementations has no difference. + +# What methods does each class have? How (if at all) does this differ between the two implementations? + + CartEntry: A has read, write methods on instance variable @unit_price and @quantity. B has a price method to calculate the price of each CartEntry. + + ShoppingCart: A has a read write method on instance variable @entries. B has a price method on ShoppingCart to calculate the total price of the ShoppingCart + + Order : A has a method to calculate the total price of the order. B is the same as A. + +# Consider the Order#total_price method. In each implementation: +#Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? + + B : The logic to compute the price delegated to the lower level classes. + A : it is retained all in order. + +# Does total_price directly manipulate the instance variables of other classes? + + B: does not directly manipulate the instance variable s of other classes. + A: need to access the price and quantity of CartEntry class through ShoppingCart class . + +# If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + we need to add a conditional statement when calculating the price of that entry, the price should be discounted based on the quantity. + B is easier for implementation. + since in B, order only need to know the price of ShoppingCart, don't need to know how many CartEntries that instance of ShoppingCart holds, and the price & quantity of each CartEntries. The change will only need to be made to the CartEntry class, ShoppingCart class and Order class do not need to know what happened, and no change needed to these two classes. + while in A, order need to know what happened in other two classes. order need to know how many instances of CartEntry are contained in the ShoppingCart instance, the entry unit_price and entry quantity. + Order need to access the unit_price and quantity of CartEntry class through the SHoppingCart class to decide if a bulk bought has happened, and to calculate a new total price. + +# Which implementation better adheres to the single responsibility principle? + B is better + +# Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? + B is loosely coupled. From 0d2503deeffea10dbaed63d01bb9db79ca90b017 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sun, 30 Sep 2018 09:04:23 -0700 Subject: [PATCH 21/22] add the change plan to design-activity.md --- design-activity.md | 6 +++++- refactor.txt | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 refactor.txt diff --git a/design-activity.md b/design-activity.md index 0750dc8a4..5edc64dc0 100644 --- a/design-activity.md +++ b/design-activity.md @@ -38,7 +38,7 @@ The lists are the same. # Does total_price directly manipulate the instance variables of other classes? B: does not directly manipulate the instance variable s of other classes. - A: need to access the price and quantity of CartEntry class through ShoppingCart class . + A: need to access the price and quantity of CartEntry class through ShoppingCart class . # If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? we need to add a conditional statement when calculating the price of that entry, the price should be discounted based on the quantity. @@ -52,3 +52,7 @@ The lists are the same. # Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? B is loosely coupled. + +# What changes need to make to the design of the hotel class? pick one. + the block_admin class is a child class of admin class, which made the design very complicated, will keep the block class, but instead of make it inherit from admin class, will make it totally independent. + diff --git a/refactor.txt b/refactor.txt new file mode 100644 index 000000000..a54483bda --- /dev/null +++ b/refactor.txt @@ -0,0 +1,5 @@ +refactor plan for hotel project + +#1. in hotel project, I have used an array of the available room & date combinations as the instant variable in the admin class, which need to occupy lot of the space. Each time, when a reservation made, a list of the room_date combination need to be removed from the the available list, which might need a long processing time to accomplish that. To improve, I plan to change the that design . I will use the list of reservations to replace the list of the available room & date combinations. in that case, although the logic to check if a room is available on a specific period is more complicated than my original design, it might save the space and the time needed to processing. + +#2 the block_admin class is a child class of admin class, which made the design very complicated, will keep the block class, but instead of make it inherit from admin class, will make it a totally independent. From d44bbac27bed21629a74afaa2890110626755794 Mon Sep 17 00:00:00 2001 From: Jessie Zhang Date: Sun, 30 Sep 2018 19:50:13 -0700 Subject: [PATCH 22/22] remove main.rb, change the block class to be indepentaant, remove id from the parameters to generate new reservation instance --- design-activity.md | 5 ++-- lib/admin.rb | 12 +++++----- lib/block_admin.rb | 49 ++++++++++++++++++++++++++++++++++------ lib/main.rb | 19 ---------------- lib/reservation.rb | 5 ++-- spec/admin_spec.rb | 48 +++++++++++++++++++-------------------- spec/block_admin_spec.rb | 8 ++++--- spec/reservation_spec.rb | 18 +++++++-------- spec/spec_helper.rb | 1 - 9 files changed, 92 insertions(+), 73 deletions(-) delete mode 100644 lib/main.rb diff --git a/design-activity.md b/design-activity.md index 5edc64dc0..f583702fa 100644 --- a/design-activity.md +++ b/design-activity.md @@ -53,6 +53,7 @@ The lists are the same. # Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? B is loosely coupled. -# What changes need to make to the design of the hotel class? pick one. +# What changes need to make to the design of the hotel class? + changed the Reservation.new method, to remove the reservation id from the parameters. Instead, generate the reservation id by the program. + the block_admin class is a child class of admin class, which made the design very complicated, will keep the block class, but instead of make it inherit from admin class, will make it totally independent. - diff --git a/lib/admin.rb b/lib/admin.rb index 9ec26a73b..301989ed6 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -2,7 +2,7 @@ require 'date' require_relative 'reservation' require_relative 'room' - +require_relative 'block_admin' class Admin attr_reader :reservations, :rooms, :room_unbooked_dates, :room_blocks, :start_date, :end_date @@ -52,7 +52,7 @@ def find_room_available(start_date, end_date) end # make new reservations - def make_reservation(reservation_id, customer_name, start_date, end_date) + def make_reservation(customer_name, start_date, end_date) check_input_dates(start_date, end_date) if start_date < @start_date || (end_date > @end_date) @@ -67,7 +67,7 @@ def make_reservation(reservation_id, customer_name, start_date, end_date) room = rooms_not_booked.first end - result = create_reservation(reservation_id, customer_name, room, start_date, end_date) + result = create_reservation(customer_name, room, start_date, end_date) @reservations << result start_d = start_date @@ -144,7 +144,7 @@ def find_room(id) # find reservation obj by id def find_reservation(id) - raise ArgumentError, "ID cannot be blank or less than zero. (got #{id})" if id.nil? || id <= 0 + return @reservations.find {|reserve| reserve.id == id } end @@ -168,8 +168,8 @@ def check_input_dates(start_date, end_date) end # create new instance of reservation object - def create_reservation(reservation_id, customer_name, room, start_date, end_date) - return Reservation.new(reservation_id, customer_name, room, start_date, end_date) + def create_reservation(customer_name, room, start_date, end_date) + return Reservation.new(customer_name, room, start_date, end_date) end # create new room object diff --git a/lib/block_admin.rb b/lib/block_admin.rb index dba9c349f..a2e4f5ddf 100644 --- a/lib/block_admin.rb +++ b/lib/block_admin.rb @@ -2,24 +2,59 @@ require 'date' require_relative 'reservation' require_relative 'room' -require_relative 'admin' -class Block < Admin - attr_reader :discount, :block_name + +class Block + attr_reader :discount, :block_name, :rooms, :reservations, :start_date, :end_date, :rooms_available def initialize(name, room_id_list, start_date, end_date, discounted_rate) - super(room_id_list, start_date, end_date) @discount = discounted_rate @block_name = name + @rooms = [] + @reservations = [] + @start_date = start_date + @end_date = end_date + @rooms_available = [] + + room_id_list.each do |i| + room_new = create_room(i) + @rooms << room_new + @rooms_available << room_new + end end def calculate_cost(reservation_id) - return find_reservation(reservation_id).reserve_cost * (1-@discount) + return find_reservation(reservation_id).reserve_cost * (1 - @discount) + end + + def make_reservation(customer_name) + + if @rooms_available == [] + raise ArgumentError, "No room available at this time." + else + room = @rooms_available.pop + end + + result = create_reservation(customer_name, room, @start_date, @end_date) + @reservations << result + + return result + end + + + private + + def create_reservation(customer_name, room, start_date, end_date) + return Reservation.new(customer_name, room, start_date, end_date) + end + + def create_room(id) + return Room.new(id) end - def make_reservation(reservation_id,customer_name) - super(reservation_id,customer_name, start_date, end_date) + def find_reservation(id) + return @reservations.find {|reserve| reserve.id == id } end end diff --git a/lib/main.rb b/lib/main.rb deleted file mode 100644 index 423c45de6..000000000 --- a/lib/main.rb +++ /dev/null @@ -1,19 +0,0 @@ -require 'pry' -require 'date' -require_relative 'admin' -require_relative 'block_admin' - -class Main - #create 20 rooms for period today to one year later - room_list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] - start = Date.today - last = start + 365 - work_space = Admin.new(room_list,start,last) - work_space.create_room_block("block1",[1,2],Date.new(2018,10,1),Date.new(2018,10,3),0.1) - work_space.room_blocks.first.make_reservation(1,"jessie") - puts work_space.room_blocks.first.reservations.first - puts work_space.room_blocks.first.reservations.first.customer_name - puts work_space.room_blocks.first.reservations.first.room.room_num - puts work_space.room_blocks.first.reservations.first.start_date - puts work_space.room_blocks.first.reservations.first.end_date -end diff --git a/lib/reservation.rb b/lib/reservation.rb index 9ac37fa9a..b582f4b2d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,11 +4,11 @@ class Reservation attr_reader :id, :customer_name, :room, :start_date, :end_date - def initialize(id, customer_name,room,start_date, end_date) + def initialize (customer_name,room,start_date, end_date) if start_date >= end_date || start_date < Date.today raise ArgumentError else - @id = id + @id = sprintf("%20.10f", Time.now.to_f).delete('.').to_i.to_s(36) @customer_name = customer_name @room = room @start_date = start_date @@ -33,4 +33,5 @@ def reserve_cost return (@end_date - @start_date) * @room.rate end + end diff --git a/spec/admin_spec.rb b/spec/admin_spec.rb index c8b12c7d2..25f1d6abd 100644 --- a/spec/admin_spec.rb +++ b/spec/admin_spec.rb @@ -28,15 +28,15 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(1,"Mike Murry",@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation("Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(2,"Julie Smith",@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation("Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count 20.times do |i| - @admin_1.make_reservation(@count_2 + i + 1, "Lily Xia", Date.new(2018,9,25), Date.new(2018,9,27)) + @admin_1.make_reservation("Lily Xia", Date.new(2018,10,25), Date.new(2018,10,27)) end end @@ -73,20 +73,20 @@ it "raise ArgumentError if start_date is not ealier than end_date" do start_date_3 = Date.new(2018,12,5) end_date_3 = Date.new(2018,12,3) - expect{@admin_1.make_reservation(23,"Jessica lee", start_date_3,end_date_3)}.must_raise ArgumentError + expect{@admin_1.make_reservation("Jessica lee", start_date_3,end_date_3)}.must_raise ArgumentError end it "raise ArgumentError if start_date is ealier than today" do start_date_3 = Date.new(2018,8,5) end_date_3 = Date.new(2018,12,3) - expect{@admin_1.make_reservation(23,"Jessca lee",start_date_3,end_date_3)}.must_raise ArgumentError + expect{@admin_1.make_reservation("Jessca lee",start_date_3,end_date_3)}.must_raise ArgumentError end it "will raise ArgumentError when no room is available for trip" do - expect{@admin_1.make_reservation(23,"Jessica lee",Date.new(2018,9,25),Date.new(2018,9,26))}.must_raise ArgumentError + expect{@admin_1.make_reservation("Jessica lee",Date.new(2018,10,25),Date.new(2018,10,26))}.must_raise ArgumentError end it "will not create a reservation if no room is available" do @@ -101,11 +101,11 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation("Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation("Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count end @@ -140,22 +140,21 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation("Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation("Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count end - it "throws an argument error for a bad ID" do - expect{ @admin_1.find_reservation(0) }.must_raise ArgumentError - end it "finds a reservation instance" do - reserve_found = @admin_1.find_reservation(2) + res_id = @res_1.id + + reserve_found = @admin_1.find_reservation(res_id) # binding.pry expect(reserve_found).must_be_kind_of Reservation expect(reserve_found).must_equal @res_1 @@ -166,17 +165,18 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation("Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation("Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count end it "returns the right number" do - cost = @admin_1.calculate_cost(2) + res_id = @res_1.id + cost = @admin_1.calculate_cost(res_id) expect(cost).must_equal 400 end end @@ -185,11 +185,11 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(2,"Mike Murry",@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation("Mike Murry",@start_date_1, @end_date_1) @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(3,"Julie Smith",@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation("Julie Smith",@start_date_2, @end_date_2) end @@ -219,15 +219,15 @@ before do @start_date_1 = Date.new(2018,12,4) @end_date_1 = Date.new(2018,12,6) - @res_1 = @admin_1.make_reservation(1,"Mike Murry",@start_date_1, @end_date_1) + @res_1 = @admin_1.make_reservation("Mike Murry",@start_date_1, @end_date_1) @count_1 = @admin_1.reservations.count @start_date_2 = Date.new(2018,12,5) @end_date_2 = Date.new(2018,12,7) - @res_2 = @admin_1.make_reservation(2,"Julie Smith",@start_date_2, @end_date_2) + @res_2 = @admin_1.make_reservation("Julie Smith",@start_date_2, @end_date_2) @count_2 = @admin_1.reservations.count 20.times do |i| - @admin_1.make_reservation(@count_2 + i + 1, "Lily Xia", Date.new(2018,9,25), Date.new(2018,9,27)) + @admin_1.make_reservation("Lily Xia", Date.new(2018,10,25), Date.new(2018,10,27)) end @name_of_block = "tech_forum" @@ -257,11 +257,11 @@ end it "raise ArgumentError if room specified was not available in that period" do - expect{@admin_1.create_room_block("block1",[1,2], Date.new(2018,9,25), Date.new(2018,9,27),@discount)}.must_raise ArgumentError + expect{@admin_1.create_room_block("block1",[1,2], Date.new(2018,10,25), Date.new(2018,10,27),@discount)}.must_raise ArgumentError end it "raise ArgumentError if the period requested for set up room block is outside of the current working period )" do - expect{@admin_1.create_room_block("block1",[1,2], Date.new(2019,10,25), Date.new(2019,10,27),0.1)}.must_raise ArgumentError + expect{@admin_1.create_room_block("block1",[1,2], Date.new(2019,11,25), Date.new(2019,11,27),0.1)}.must_raise ArgumentError end it "raise ArgumentError if the discount_rate is < 0 or > 1" do diff --git a/spec/block_admin_spec.rb b/spec/block_admin_spec.rb index 14110de8d..e8d8bc6bf 100644 --- a/spec/block_admin_spec.rb +++ b/spec/block_admin_spec.rb @@ -21,7 +21,7 @@ describe "make_reservation" do it "will only allow to the period same as the block set up period" do - @admin_b.make_reservation(1,"Mike lee") + @admin_b.make_reservation("Mike lee") expect(@admin_b.reservations.first.start_date).must_equal Date.new(2018,10,5) expect(@admin_b.reservations.first.end_date).must_equal Date.new(2018,10,10) end @@ -30,8 +30,10 @@ describe "calculate_cost" do it "returns a right number" do - @admin_b.make_reservation(1,"Mike lee") - expect(@admin_b.calculate_cost(1)).must_equal 900.0 + @admin_b.make_reservation("Mike lee") + res_id = @admin_b.reservations.first.id + + expect(@admin_b.calculate_cost(res_id)).must_equal 900.0 end end end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb index 248b38f65..9fb1ca87d 100644 --- a/spec/reservation_spec.rb +++ b/spec/reservation_spec.rb @@ -3,21 +3,21 @@ describe "Reservation in Wave 1" do before do - @id = 2 + @customer_name = "Mike Bogdon" @start_date = Date.new(2018,10,2) @room = Room.new(1) end describe "#initialize" do - it "Takes a reservation id, start_date, end_date " do + it "Takes a reservation start_date, end_date " do end_date = Date.new(2018,10,5) - rsv_1 = Reservation.new(@id, @customer_name, @room, @start_date, end_date) + rsv_1 = Reservation.new(@customer_name, @room, @start_date, end_date) expect(rsv_1).must_respond_to :id expect(rsv_1).must_respond_to :start_date expect(rsv_1).must_respond_to :end_date expect(rsv_1).must_respond_to :customer_name expect(rsv_1).must_respond_to :room - expect(rsv_1.id).must_equal @id + expect(rsv_1.start_date).must_equal @start_date expect(rsv_1.end_date).must_equal end_date expect(rsv_1.customer_name).must_equal @customer_name @@ -27,7 +27,7 @@ it "Raises an ArgumentError for invalid date input, end_date is not later than start_date" do end_date = Date.new(2018,10,2) expect { - Reservation.new(@id, @customer_name, @room, @start_date, end_date) + Reservation.new(@customer_name, @room, @start_date, end_date) }.must_raise ArgumentError end @@ -35,7 +35,7 @@ start_date_2= Date.new(2018,8,2) end_date_2 = Date.new(2018,10,2) expect { - Reservation.new(@id, @customer_name,@room, start_date_2, end_date_2) + Reservation.new(@customer_name,@room, start_date_2, end_date_2) }.must_raise ArgumentError end end @@ -43,7 +43,7 @@ describe "#dates_booked" do before do @end_date = Date.new(2018,10,6) - @rsv_2 = Reservation.new(@id, @customer_name,@room, @start_date, @end_date) + @rsv_2 = Reservation.new(@customer_name,@room, @start_date, @end_date) end it "returns an array" do expect(@rsv_2.dates_booked).must_be_kind_of Array @@ -61,7 +61,7 @@ describe "#reserve_cost" do before do @end_date = Date.new(2018,10,6) - @rsv_3 = Reservation.new(@id, @customer_name,@room, @start_date, @end_date) + @rsv_3 = Reservation.new(@customer_name,@room, @start_date, @end_date) end it "returns a number" do expect(@rsv_3.reserve_cost).must_be_kind_of Numeric @@ -76,7 +76,7 @@ start_date = Date.new(2018,10,5) end_date = Date.new(2018,10,6) room = Room.new(4) - rsv_4 = Reservation.new(id,customer_name,room,start_date,end_date) + rsv_4 = Reservation.new(customer_name,room,start_date,end_date) expect(rsv_4.reserve_cost).must_equal 200 end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index bcdef60d3..518314421 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -14,4 +14,3 @@ require_relative '../lib/reservation' require_relative '../lib/room' require_relative '../lib/block_admin' -require_relative '../lib/main'