From 8833393fefdeea72f21df1954fad6bef2a24a651 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Tue, 3 Sep 2019 14:20:59 -0700 Subject: [PATCH 01/22] Added SimpleCov and require_relative files --- test/test_helper.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..eb12a2bdb 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,7 +2,19 @@ require "minitest" require "minitest/autorun" require "minitest/reporters" +require 'simplecov' +SimpleCov.start do + add_filter 'test/' # Tests should not be checked for coverage. +end + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new # require_relative your lib files here! + +require_relative '../lib/date_range' +require_relative '../lib/reserv_system' +require_relative '../lib/reservation' +require_relative '../lib/room' + + From 9ede58b249bf1d345fa517d1e9b71ecb3d47e58f Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Tue, 3 Sep 2019 14:21:23 -0700 Subject: [PATCH 02/22] Created classes and tests for their instantiation --- lib/date_range.rb | 8 ++++++++ lib/reserv_system.rb | 8 ++++++++ lib/reservation.rb | 9 +++++++++ lib/room.rb | 9 +++++++++ test/date_range_test.rb | 13 +++++++++++++ test/reserv_system_test.rb | 13 +++++++++++++ test/reservation_test.rb | 13 +++++++++++++ test/room_test.rb | 13 +++++++++++++ 8 files changed, 86 insertions(+) create mode 100644 lib/date_range.rb create mode 100644 lib/reserv_system.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 test/date_range_test.rb create mode 100644 test/reserv_system_test.rb create mode 100644 test/reservation_test.rb create mode 100644 test/room_test.rb diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..22bacc5a8 --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,8 @@ +module Hotel + class DateRange + def initialize(start_time, end_time) + # @start_time = start_time + # @end_time = end_time + end + end +end \ No newline at end of file diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb new file mode 100644 index 000000000..de95d9d2e --- /dev/null +++ b/lib/reserv_system.rb @@ -0,0 +1,8 @@ +module Hotel + class ReservSystem + def initialize() + # @id + # @rooms = Room.new + end + end +end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..c3077de83 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,9 @@ +require_relative 'reserv_system' + +module Hotel + class Reservation < ReservSystem + def initialize() + # super(id) + end + end +end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..db1a51545 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,9 @@ +require_relative 'reserv_system' + +module Hotel + class Room < ReservSystem + def initialize() + # super(id) + end + end +end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100644 index 000000000..a4f4b1c27 --- /dev/null +++ b/test/date_range_test.rb @@ -0,0 +1,13 @@ +require_relative 'test_helper' + +describe "DateRange class" do + describe "DateRange instantiation" do + before do + @date = Hotel::DateRange.new(Date.new(2019, 4, 16), Date.new(2019, 4, 18)) + end + + it "is an instance of DateRange" do + expect(@date).must_be_kind_of Hotel::DateRange + end + end +end \ No newline at end of file diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb new file mode 100644 index 000000000..115dbb205 --- /dev/null +++ b/test/reserv_system_test.rb @@ -0,0 +1,13 @@ +require_relative 'test_helper' + +describe "ReservSystem class" do + describe "ReservSystem instantiation" do + before do + @reserv_system = Hotel::ReservSystem.new + end + + it "is an instance of ReservSystem" do + expect(@reserv_system).must_be_kind_of Hotel::ReservSystem + end + end +end \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..d575b6c94 --- /dev/null +++ b/test/reservation_test.rb @@ -0,0 +1,13 @@ +require_relative 'test_helper' + +describe "Reservation class" do + describe "Reservation instantiation" do + before do + @reservation = Hotel::Reservation.new + end + + it "is an instance of Reservation" do + expect(@reservation).must_be_kind_of Hotel::Reservation + end + end +end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb new file mode 100644 index 000000000..19af4bf86 --- /dev/null +++ b/test/room_test.rb @@ -0,0 +1,13 @@ +require_relative 'test_helper' + +describe "Room class" do + describe "Room instantiation" do + before do + @room = Hotel::Room.new + end + + it "is an instance of Room" do + expect(@room).must_be_kind_of Hotel::Room + end + end +end \ No newline at end of file From 561b82575db7cf4b801037da1d59a7dd44df13ae Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Tue, 3 Sep 2019 14:32:43 -0700 Subject: [PATCH 03/22] Changed class structure --- lib/reserv_system.rb | 6 ++++-- lib/reservation.rb | 5 +---- lib/room.rb | 5 +---- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index de95d9d2e..0f6104efa 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -1,8 +1,10 @@ +require_relative 'room' +require_relative 'reservation' +require_relative 'date_range' + module Hotel class ReservSystem def initialize() - # @id - # @rooms = Room.new end end end \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb index c3077de83..6f812914f 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,9 +1,6 @@ -require_relative 'reserv_system' - module Hotel - class Reservation < ReservSystem + class Reservation def initialize() - # super(id) end end end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb index db1a51545..dc50b2266 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,9 +1,6 @@ -require_relative 'reserv_system' - module Hotel - class Room < ReservSystem + class Room def initialize() - # super(id) end end end \ No newline at end of file From de600afdbd86148232959019ad1913ed94be5dae Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Tue, 3 Sep 2019 14:44:37 -0700 Subject: [PATCH 04/22] Added parameters to DateRange class --- lib/date_range.rb | 8 ++++++-- test/date_range_test.rb | 11 +++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 22bacc5a8..6648249be 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,8 +1,12 @@ +require 'date' + module Hotel class DateRange + attr_reader :start_time, :end_time + def initialize(start_time, end_time) - # @start_time = start_time - # @end_time = end_time + @start_time = start_time + @end_time = end_time end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index a4f4b1c27..55f4b06d8 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -9,5 +9,16 @@ it "is an instance of DateRange" do expect(@date).must_be_kind_of Hotel::DateRange end + + it "correctly saves the start time" do + expect(@date.start_time).must_be_kind_of Date + expect(@date.start_time.to_s).must_equal "2019-04-16" + end + + it "correctly saves the end time" do + expect(@date.end_time).must_be_kind_of Date + expect(@date.end_time.to_s).must_equal "2019-04-18" + end + end end \ No newline at end of file From ced3a8a2c66600df482f641cc83918ec72baf655 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Tue, 3 Sep 2019 15:01:15 -0700 Subject: [PATCH 05/22] Added parameters and tests to Room class --- lib/reserv_system.rb | 6 ++++++ lib/room.rb | 11 ++++++++++- test/date_range_test.rb | 1 - test/room_test.rb | 9 ++++++++- test/test_helper.rb | 5 ----- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index 0f6104efa..b745831cd 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -5,6 +5,12 @@ module Hotel class ReservSystem def initialize() + @rooms = [] + + counter = 1 + NUM_OF_ROOMS.times do + Room.new(counter) + end end end end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb index dc50b2266..d3f25bc6c 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,6 +1,15 @@ +RATE_OF_ROOM = 200 +NUM_OF_ROOMS = 20 + module Hotel class Room - def initialize() + attr_reader :id + attr_accessor :reservation, :rate + + def initialize(id, reservation: nil, rate: nil) + @id = id + @reservation = [] + @rate = RATE_OF_ROOM end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 55f4b06d8..99b1ef305 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -19,6 +19,5 @@ expect(@date.end_time).must_be_kind_of Date expect(@date.end_time.to_s).must_equal "2019-04-18" end - end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 19af4bf86..e2b714c29 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -3,11 +3,18 @@ describe "Room class" do describe "Room instantiation" do before do - @room = Hotel::Room.new + @room = Hotel::Room.new(1) end it "is an instance of Room" do expect(@room).must_be_kind_of Hotel::Room end + + it "correctly saves parameters" do + expect(@room.id).must_equal 1 + expect(@room.reservation).must_be_kind_of Array + expect(@room.reservation.length).must_equal 0 + expect(@room.rate).must_equal 200 + end end end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index eb12a2bdb..1eaab3524 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,4 +1,3 @@ -# Add simplecov require "minitest" require "minitest/autorun" require "minitest/reporters" @@ -7,14 +6,10 @@ add_filter 'test/' # Tests should not be checked for coverage. end - Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -# require_relative your lib files here! - require_relative '../lib/date_range' require_relative '../lib/reserv_system' require_relative '../lib/reservation' require_relative '../lib/room' - From 4c60a31182d308be039b881cc7d6ee63273a318a Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Tue, 3 Sep 2019 15:07:35 -0700 Subject: [PATCH 06/22] Added all room instances to ReservSystem class --- lib/reserv_system.rb | 7 +++++-- test/reserv_system_test.rb | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index b745831cd..48457415d 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -4,12 +4,15 @@ module Hotel class ReservSystem + attr_reader :rooms + def initialize() @rooms = [] - counter = 1 + room_num = 1 NUM_OF_ROOMS.times do - Room.new(counter) + rooms << Room.new(room_num) + room_num +=1 end end end diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index 115dbb205..775bb7e23 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -9,5 +9,13 @@ it "is an instance of ReservSystem" do expect(@reserv_system).must_be_kind_of Hotel::ReservSystem end + + it "correctly saves all instances of Room" do + expect(@reserv_system.rooms).must_be_kind_of Array + expect(@reserv_system.rooms.length).must_equal 20 + expect(@reserv_system.rooms.first.id).must_equal 1 + expect(@reserv_system.rooms.last.id).must_equal 20 + expect(@reserv_system.rooms[10].id).must_equal 11 + end end end \ No newline at end of file From d6fbdc2b63df4dfc9132a1589ecf3fd83ab1c065 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Tue, 3 Sep 2019 15:56:18 -0700 Subject: [PATCH 07/22] Added parameters and test to Reservation class --- lib/reservation.rb | 10 +++++++++- test/date_range_test.rb | 2 +- test/reservation_test.rb | 8 +++++++- test/room_test.rb | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 6f812914f..6815f3881 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,6 +1,14 @@ module Hotel class Reservation - def initialize() + attr_reader :start_time, :end_time, :room_assigned, :date_range + + def initialize(start_time, end_time, room_assigned: nil) + + # @room_assigned = (method to assign a room) + @date_range = DateRange.new(start_time, end_time) + + + end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 99b1ef305..4e935b2d6 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -3,7 +3,7 @@ describe "DateRange class" do describe "DateRange instantiation" do before do - @date = Hotel::DateRange.new(Date.new(2019, 4, 16), Date.new(2019, 4, 18)) + @date = Hotel::DateRange.new(Date.parse('2019-4-16'), Date.parse('2019-4-18')) end it "is an instance of DateRange" do diff --git a/test/reservation_test.rb b/test/reservation_test.rb index d575b6c94..8cb094059 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -3,11 +3,17 @@ describe "Reservation class" do describe "Reservation instantiation" do before do - @reservation = Hotel::Reservation.new + @reservation = Hotel::Reservation.new('2019-1-1', '2019-1-3') end it "is an instance of Reservation" do expect(@reservation).must_be_kind_of Hotel::Reservation end + + it "correctly saves instance variables" do + expect(@reservation.date_range).must_be_kind_of Hotel::DateRange + # expect(@reservation.room_assigned).must_be_kind_of Room + + end end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index e2b714c29..d43b47e46 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -10,7 +10,7 @@ expect(@room).must_be_kind_of Hotel::Room end - it "correctly saves parameters" do + it "correctly saves instance variables" do expect(@room.id).must_equal 1 expect(@room.reservation).must_be_kind_of Array expect(@room.reservation.length).must_equal 0 From 51dd6ae66fe5ebf2fcf3258ece9d27ad74689a67 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Tue, 3 Sep 2019 17:05:27 -0700 Subject: [PATCH 08/22] Added exception if end time is before start time --- lib/date_range.rb | 17 +++++++++++++---- lib/reserv_system.rb | 10 +++++++--- lib/reservation.rb | 6 ++---- lib/room.rb | 3 --- test/date_range_test.rb | 21 +++++++++++++++++++-- test/reservation_test.rb | 3 ++- test/room_test.rb | 2 ++ 7 files changed, 45 insertions(+), 17 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 6648249be..ef2317347 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,12 +1,21 @@ -require 'date' - module Hotel class DateRange attr_reader :start_time, :end_time def initialize(start_time, end_time) - @start_time = start_time - @end_time = end_time + start_time = Date.parse(start_time) + end_time = Date.parse(end_time) + + if end_time < start_time + raise ArgumentError.new("The end time cannot be before the start time.") + else + @start_time = start_time + @end_time = end_time + end + end + + def days_between + return @end_time - @start_time end end end \ No newline at end of file diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index 48457415d..3307d0fe0 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -1,6 +1,10 @@ -require_relative 'room' -require_relative 'reservation' -require_relative 'date_range' +# require_relative 'room' +# require_relative 'reservation' +# require_relative 'date_range' + + +RATE_OF_ROOM = 200 +NUM_OF_ROOMS = 20 module Hotel class ReservSystem diff --git a/lib/reservation.rb b/lib/reservation.rb index 6815f3881..eb0840e9d 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,14 +1,12 @@ module Hotel class Reservation - attr_reader :start_time, :end_time, :room_assigned, :date_range + attr_reader :start_time, :end_time, :room_assigned, :date_range, :cost def initialize(start_time, end_time, room_assigned: nil) # @room_assigned = (method to assign a room) @date_range = DateRange.new(start_time, end_time) - - - + @cost = @date_range.days_between * RATE_OF_ROOM end end end \ No newline at end of file diff --git a/lib/room.rb b/lib/room.rb index d3f25bc6c..9c3d97162 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,6 +1,3 @@ -RATE_OF_ROOM = 200 -NUM_OF_ROOMS = 20 - module Hotel class Room attr_reader :id diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 4e935b2d6..a0ad333d7 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -3,7 +3,7 @@ describe "DateRange class" do describe "DateRange instantiation" do before do - @date = Hotel::DateRange.new(Date.parse('2019-4-16'), Date.parse('2019-4-18')) + @date = Hotel::DateRange.new('2019-4-16', '2019-4-18') end it "is an instance of DateRange" do @@ -19,5 +19,22 @@ expect(@date.end_time).must_be_kind_of Date expect(@date.end_time.to_s).must_equal "2019-04-18" end + + it "raises an exception if start&end times are invalid" do + expect { + Hotel::DateRange.new('2019-4-20', '2019-4-18') + }.must_raise ArgumentError + end + end + + + describe "DateRange methods" do + before do + @date = Hotel::DateRange.new('2019-4-16', '2019-4-20') + end + + it "correctly calculates the number of days between start&end times" do + expect(@date.days_between).must_equal 4 + end end -end \ No newline at end of file +end diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 8cb094059..7aa888b1a 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -3,7 +3,7 @@ describe "Reservation class" do describe "Reservation instantiation" do before do - @reservation = Hotel::Reservation.new('2019-1-1', '2019-1-3') + @reservation = Hotel::Reservation.new('2019-1-1', '2019-1-5') end it "is an instance of Reservation" do @@ -12,6 +12,7 @@ it "correctly saves instance variables" do expect(@reservation.date_range).must_be_kind_of Hotel::DateRange + expect(@reservation.cost).must_equal 800 # expect(@reservation.room_assigned).must_be_kind_of Room end diff --git a/test/room_test.rb b/test/room_test.rb index d43b47e46..3cf3665e1 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -16,5 +16,7 @@ expect(@room.reservation.length).must_equal 0 expect(@room.rate).must_equal 200 end + + end end \ No newline at end of file From f6d860836777cb6f5b2f24772d30898c61bf413c Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Wed, 4 Sep 2019 15:51:08 -0700 Subject: [PATCH 09/22] Added making new reservation and tests --- lib/reserv_system.rb | 22 ++++++++++++++++++++-- lib/reservation.rb | 5 ++--- test/date_range_test.rb | 1 - test/reserv_system_test.rb | 22 +++++++++++++++++++++- test/reservation_test.rb | 7 ++++--- test/room_test.rb | 2 -- 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index 3307d0fe0..43e84baa5 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -8,7 +8,7 @@ module Hotel class ReservSystem - attr_reader :rooms + attr_reader :rooms, :reservations def initialize() @rooms = [] @@ -18,6 +18,24 @@ def initialize() rooms << Room.new(room_num) room_num +=1 end + + @reservations = [] + end + + def make_reservation(start_time, end_time) + room_assigned = nil + @rooms.each do |curr_room| + if curr_room.reservation.length == 0 + room_assigned = curr_room + break + end + end + + if room_assigned == nil + raise ArgumentError.new("No rooms are available.") + end + + @reservations << Reservation.new(start_time, end_time, room_assigned) end end -end \ No newline at end of file +end diff --git a/lib/reservation.rb b/lib/reservation.rb index eb0840e9d..66aa9aa5f 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -2,9 +2,8 @@ module Hotel class Reservation attr_reader :start_time, :end_time, :room_assigned, :date_range, :cost - def initialize(start_time, end_time, room_assigned: nil) - - # @room_assigned = (method to assign a room) + def initialize(start_time, end_time, room_assigned) + @room_assigned = room_assigned @date_range = DateRange.new(start_time, end_time) @cost = @date_range.days_between * RATE_OF_ROOM end diff --git a/test/date_range_test.rb b/test/date_range_test.rb index a0ad333d7..14eadec11 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -27,7 +27,6 @@ end end - describe "DateRange methods" do before do @date = Hotel::DateRange.new('2019-4-16', '2019-4-20') diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index 775bb7e23..e5b10c0c8 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -17,5 +17,25 @@ expect(@reserv_system.rooms.last.id).must_equal 20 expect(@reserv_system.rooms[10].id).must_equal 11 end + + end + + describe "ReservSystem methods" do + before do + @reserv_system = Hotel::ReservSystem.new + @reserv_system.make_reservation('2019-3-1', '2019-3-6') + end + + it "can make a new reservation" do + expect(@reserv_system.reservations).must_be_kind_of Array + expect(@reserv_system.reservations.length).must_equal 1 + end + + it "can assign a room to a new reservation" do + expect(@reserv_system.reservations[0]).must_be_kind_of Hotel::Reservation + expect(@reserv_system.reservations[0].room_assigned).must_be_kind_of Hotel::Room + expect(@reserv_system.reservations[0].room_assigned.id).must_equal 1 + end end -end \ No newline at end of file +end + diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 7aa888b1a..78642ad2c 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -3,7 +3,8 @@ describe "Reservation class" do describe "Reservation instantiation" do before do - @reservation = Hotel::Reservation.new('2019-1-1', '2019-1-5') + @room = Hotel::Room.new(3) + @reservation = Hotel::Reservation.new('2019-1-1', '2019-1-5', @room) end it "is an instance of Reservation" do @@ -13,8 +14,8 @@ it "correctly saves instance variables" do expect(@reservation.date_range).must_be_kind_of Hotel::DateRange expect(@reservation.cost).must_equal 800 - # expect(@reservation.room_assigned).must_be_kind_of Room - + expect(@reservation.room_assigned).must_be_kind_of Hotel::Room + expect(@reservation.room_assigned.id).must_equal 3 end end end \ No newline at end of file diff --git a/test/room_test.rb b/test/room_test.rb index 3cf3665e1..d43b47e46 100644 --- a/test/room_test.rb +++ b/test/room_test.rb @@ -16,7 +16,5 @@ expect(@room.reservation.length).must_equal 0 expect(@room.rate).must_equal 200 end - - end end \ No newline at end of file From 8513b957426d0afabef01b1879255d971cb8a4f2 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Wed, 4 Sep 2019 16:17:44 -0700 Subject: [PATCH 10/22] Fixed simplecov, added no room available exception --- test/reserv_system_test.rb | 39 ++++++++++++++++++++++++-------------- test/test_helper.rb | 7 ++++--- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index e5b10c0c8..c5b8c2aea 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -21,20 +21,31 @@ end describe "ReservSystem methods" do - before do - @reserv_system = Hotel::ReservSystem.new - @reserv_system.make_reservation('2019-3-1', '2019-3-6') - end - - it "can make a new reservation" do - expect(@reserv_system.reservations).must_be_kind_of Array - expect(@reserv_system.reservations.length).must_equal 1 - end - - it "can assign a room to a new reservation" do - expect(@reserv_system.reservations[0]).must_be_kind_of Hotel::Reservation - expect(@reserv_system.reservations[0].room_assigned).must_be_kind_of Hotel::Room - expect(@reserv_system.reservations[0].room_assigned.id).must_equal 1 + describe "making a new reservation" do + before do + @reserv_system = Hotel::ReservSystem.new + @reserv_system.make_reservation('2019-3-1', '2019-3-6') + end + + it "can make a new reservation" do + expect(@reserv_system.reservations).must_be_kind_of Array + expect(@reserv_system.reservations.length).must_equal 1 + end + + it "can assign a room to a new reservation" do + expect(@reserv_system.reservations[0]).must_be_kind_of Hotel::Reservation + expect(@reserv_system.reservations[0].room_assigned).must_be_kind_of Hotel::Room + expect(@reserv_system.reservations[0].room_assigned.id).must_equal 1 + end + + it "raises an exception if no rooms are available" do + @reserv_system.rooms.each do |curr_room| + curr_room.reservation = ["full"] + end + expect{ + @reserv_system.make_reservation('2019-3-1', '2019-3-6') + }.must_raise ArgumentError + end end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 1eaab3524..509c6d09e 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,11 +1,12 @@ -require "minitest" -require "minitest/autorun" -require "minitest/reporters" require 'simplecov' SimpleCov.start do add_filter 'test/' # Tests should not be checked for coverage. end +require "minitest" +require "minitest/autorun" +require "minitest/reporters" + Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new require_relative '../lib/date_range' From c37ee8ef30a8dde412f3f39914ee00c6fb87fd93 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Wed, 4 Sep 2019 17:06:38 -0700 Subject: [PATCH 11/22] Added accessing reservations by date --- lib/reserv_system.rb | 16 ++++++++++++++++ test/reserv_system_test.rb | 24 +++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index 43e84baa5..875fad7af 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -37,5 +37,21 @@ def make_reservation(start_time, end_time) @reservations << Reservation.new(start_time, end_time, room_assigned) end + + def reservations_on_date(date) + date = Date.parse(date) + reservations_on_date = [] + @reservations.each do |curr_res| + if date >= curr_res.date_range.start_time && date <= curr_res.date_range.end_time + reservations_on_date << curr_res + end + end + + if reservations_on_date.length == 0 + raise ArgumentError.new("There are no reservations on this date.") + end + + return reservations_on_date + end end end diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index c5b8c2aea..ddee2bb57 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -17,7 +17,6 @@ expect(@reserv_system.rooms.last.id).must_equal 20 expect(@reserv_system.rooms[10].id).must_equal 11 end - end describe "ReservSystem methods" do @@ -47,6 +46,29 @@ }.must_raise ArgumentError end end + + describe "searching for reservations on a given date" do + before do + @reserv_system = Hotel::ReservSystem.new + @reserv_system.make_reservation('2019-3-1', '2019-3-6') + @reserv_system.make_reservation('2019-3-4', '2019-3-6') + end + + it "can return all reservations on a given date" do + expect(@reserv_system.reservations_on_date('2019-3-4')).must_be_kind_of Array + expect(@reserv_system.reservations_on_date('2019-3-4').length).must_equal 2 + expect(@reserv_system.reservations_on_date('2019-3-4')[0]).must_be_kind_of Hotel::Reservation + expect(@reserv_system.reservations_on_date('2019-3-4')[0].date_range.start_time).must_be_kind_of Date + expect(@reserv_system.reservations_on_date('2019-3-4')[0].date_range.start_time.to_s).must_equal '2019-03-01' + end + + it "raises an exception if no reservations are on a given date" do + expect{ + @reserv_system.reservations_on_date('2019-2-16') + }.must_raise ArgumentError + end + end end end + From 3cb3eb0347d86c36cf7466cf972bcf76054c4aa2 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Fri, 6 Sep 2019 10:34:09 -0700 Subject: [PATCH 12/22] Refactored: added a room.all method --- lib/reserv_system.rb | 9 +-------- lib/room.rb | 10 ++++++++++ test/date_range_test.rb | 2 ++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index 875fad7af..c99fce2d8 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -11,14 +11,7 @@ class ReservSystem attr_reader :rooms, :reservations def initialize() - @rooms = [] - - room_num = 1 - NUM_OF_ROOMS.times do - rooms << Room.new(room_num) - room_num +=1 - end - + @rooms = Hotel::Room.all @reservations = [] end diff --git a/lib/room.rb b/lib/room.rb index 9c3d97162..4827df22e 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -8,5 +8,15 @@ def initialize(id, reservation: nil, rate: nil) @reservation = [] @rate = RATE_OF_ROOM end + + def self.all + all_rooms = [] + room_num = 1 + NUM_OF_ROOMS.times do + all_rooms << Room.new(room_num) + room_num +=1 + end + return all_rooms + end end end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 14eadec11..f5e1d6645 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -25,6 +25,8 @@ Hotel::DateRange.new('2019-4-20', '2019-4-18') }.must_raise ArgumentError end + + # check for correct format end describe "DateRange methods" do From fc7faba952386a2b960bc7600643ab75ae05d264 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Fri, 6 Sep 2019 11:30:58 -0700 Subject: [PATCH 13/22] Completed wave-1 --- lib/reserv_system.rb | 8 ++++++-- test/reserv_system_test.rb | 12 ++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index c99fce2d8..ccd1aaa4d 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -25,12 +25,16 @@ def make_reservation(start_time, end_time) end if room_assigned == nil - raise ArgumentError.new("No rooms are available.") + return ("No rooms are available for that date range.") end @reservations << Reservation.new(start_time, end_time, room_assigned) end + # def find_avail_room + + # end + def reservations_on_date(date) date = Date.parse(date) reservations_on_date = [] @@ -41,7 +45,7 @@ def reservations_on_date(date) end if reservations_on_date.length == 0 - raise ArgumentError.new("There are no reservations on this date.") + return ("There are no reservations on this date.") end return reservations_on_date diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index ddee2bb57..3de805d3e 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -37,13 +37,11 @@ expect(@reserv_system.reservations[0].room_assigned.id).must_equal 1 end - it "raises an exception if no rooms are available" do + it "returns a 'no rooms are available on given date' if so" do @reserv_system.rooms.each do |curr_room| curr_room.reservation = ["full"] end - expect{ - @reserv_system.make_reservation('2019-3-1', '2019-3-6') - }.must_raise ArgumentError + expect(@reserv_system.make_reservation('2019-3-1', '2019-3-6')).must_equal "No rooms are available for that date range." end end @@ -62,10 +60,8 @@ expect(@reserv_system.reservations_on_date('2019-3-4')[0].date_range.start_time.to_s).must_equal '2019-03-01' end - it "raises an exception if no reservations are on a given date" do - expect{ - @reserv_system.reservations_on_date('2019-2-16') - }.must_raise ArgumentError + it "returns a 'no reservations are on a given date' message if so" do + expect(@reserv_system.reservations_on_date('2019-2-16')).must_equal "There are no reservations on this date." end end end From c239f601342518c404d88bb8109faa35f3c3620c Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Sun, 8 Sep 2019 22:26:31 -0700 Subject: [PATCH 14/22] Completed wave-2 --- lib/date_range.rb | 9 +++-- lib/reserv_system.rb | 62 +++++++++++++++++++++-------------- test/reserv_system_test.rb | 67 +++++++++++++++++++++++++++++--------- 3 files changed, 95 insertions(+), 43 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index ef2317347..f8110c2b4 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -3,8 +3,13 @@ class DateRange attr_reader :start_time, :end_time def initialize(start_time, end_time) - start_time = Date.parse(start_time) - end_time = Date.parse(end_time) + if start_time.class != Date + start_time = Date.parse(start_time) + end + + if end_time.class != Date + end_time = Date.parse(end_time) + end if end_time < start_time raise ArgumentError.new("The end time cannot be before the start time.") diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index ccd1aaa4d..32b6bd69d 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -2,7 +2,6 @@ # require_relative 'reservation' # require_relative 'date_range' - RATE_OF_ROOM = 200 NUM_OF_ROOMS = 20 @@ -16,39 +15,52 @@ def initialize() end def make_reservation(start_time, end_time) - room_assigned = nil - @rooms.each do |curr_room| - if curr_room.reservation.length == 0 - room_assigned = curr_room - break - end - end + not_reserved_rooms = not_reserved_on_date_range(start_time, end_time) - if room_assigned == nil - return ("No rooms are available for that date range.") + if not_reserved_rooms.class == Array + new_res = Reservation.new(start_time, end_time, not_reserved_rooms[0]) + @reservations << new_res + not_reserved_rooms[0].reservation << new_res + else + return ("Cannot make a reservation for that date range. No rooms available.") end - - @reservations << Reservation.new(start_time, end_time, room_assigned) end - # def find_avail_room - # end - - def reservations_on_date(date) - date = Date.parse(date) - reservations_on_date = [] - @reservations.each do |curr_res| - if date >= curr_res.date_range.start_time && date <= curr_res.date_range.end_time - reservations_on_date << curr_res + def not_reserved_on_date_range(start_time, end_time) + start_time = Date.parse(start_time) + end_time = Date.parse(end_time) + + not_reserved_rooms = [] + + @rooms.each do |curr_room| + if curr_room.reservation.length == 0 + not_reserved_rooms << curr_room + else + curr_room.reservation.each do |each_res| + if overlap?(start_time, end_time, + each_res.date_range.start_time, each_res.date_range.end_time) == true + break + else + not_reserved_rooms << curr_room + end + end end end - if reservations_on_date.length == 0 - return ("There are no reservations on this date.") + if not_reserved_rooms.length == 0 + return ("There are no rooms available for that date range.") + else + return not_reserved_rooms + end + end + + def overlap?(first_start, first_end, second_start, second_end) + if first_start < second_end && second_start < first_end + return true + else + return false end - - return reservations_on_date end end end diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index 3de805d3e..da17b4fef 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -31,40 +31,75 @@ expect(@reserv_system.reservations.length).must_equal 1 end - it "can assign a room to a new reservation" do + it "can correctly assign a room to a new reservation" do expect(@reserv_system.reservations[0]).must_be_kind_of Hotel::Reservation expect(@reserv_system.reservations[0].room_assigned).must_be_kind_of Hotel::Room expect(@reserv_system.reservations[0].room_assigned.id).must_equal 1 + + @reserv_system.make_reservation('2019-3-4', '2019-3-8') + expect(@reserv_system.reservations.length).must_equal 2 + expect(@reserv_system.reservations[1].room_assigned.id).must_equal 2 end it "returns a 'no rooms are available on given date' if so" do @reserv_system.rooms.each do |curr_room| - curr_room.reservation = ["full"] + curr_room.reservation = [Hotel::Reservation.new('2019-1-1', '2019-1-5', curr_room)] end - expect(@reserv_system.make_reservation('2019-3-1', '2019-3-6')).must_equal "No rooms are available for that date range." + expect(@reserv_system.make_reservation('2019-1-1', '2019-1-5')).must_equal "Cannot make a reservation for that date range. No rooms available." end end - describe "searching for reservations on a given date" do - before do + describe "determining date overlap" do + before do @reserv_system = Hotel::ReservSystem.new - @reserv_system.make_reservation('2019-3-1', '2019-3-6') - @reserv_system.make_reservation('2019-3-4', '2019-3-6') + @date_1 = Date.parse('2019-4-06') + @date_2 = Date.parse('2019-4-10') + @date_3 = Date.parse('2019-4-14') + @date_4 = Date.parse('2019-4-18') + end + + it "returns false if the end of one date range overlaps the beginning of another" do + expect(@reserv_system.overlap?(@date_1, @date_3, @date_2, @date_4)).must_equal true + expect(@reserv_system.overlap?(@date_2, @date_4, @date_1, @date_3)).must_equal true + end + + it "returns false if a date range is inside the other" do + expect(@reserv_system.overlap?(@date_1, @date_4, @date_2, @date_3)).must_equal true + expect(@reserv_system.overlap?(@date_2, @date_3, @date_1, @date_4)).must_equal true end - it "can return all reservations on a given date" do - expect(@reserv_system.reservations_on_date('2019-3-4')).must_be_kind_of Array - expect(@reserv_system.reservations_on_date('2019-3-4').length).must_equal 2 - expect(@reserv_system.reservations_on_date('2019-3-4')[0]).must_be_kind_of Hotel::Reservation - expect(@reserv_system.reservations_on_date('2019-3-4')[0].date_range.start_time).must_be_kind_of Date - expect(@reserv_system.reservations_on_date('2019-3-4')[0].date_range.start_time.to_s).must_equal '2019-03-01' + it "returns true if the end of one date range is on the same day as the start of another" do + expect(@reserv_system.overlap?(@date_1, @date_2, @date_2, @date_3)).must_equal false + expect(@reserv_system.overlap?(@date_2, @date_3, @date_1, @date_2)).must_equal false end - it "returns a 'no reservations are on a given date' message if so" do - expect(@reserv_system.reservations_on_date('2019-2-16')).must_equal "There are no reservations on this date." + it "returns true if the date ranges do not overlap" do + expect(@reserv_system.overlap?(@date_1, @date_2, @date_3, @date_4)).must_equal false + end + end + + describe "listing all available rooms for a date range" do + before do + @reserv_system = Hotel::ReservSystem.new + end + + it "can correctly return all available rooms" do + @reserv_system.make_reservation('2019-3-1', '2019-3-6') + @reserv_system.make_reservation('2019-3-5', '2019-3-8') + @reserv_system.make_reservation('2019-4-1', '2019-4-5') + + @all_rooms = @reserv_system.not_reserved_on_date_range('2019-3-2', '2019-4-3') + expect(@all_rooms).must_be_kind_of Array + expect(@all_rooms.length).must_equal 18 + end + + it "returns a 'no rooms are available on given date' if so" do + 20.times do + @reserv_system.make_reservation('2019-3-1', '2019-3-6') + end + expect(@reserv_system.not_reserved_on_date_range('2019-3-1', '2019-3-6')).must_equal "There are no rooms available for that date range." end end end end - From 1874fc65014495e86434526caf01233ada5df1f6 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Sun, 8 Sep 2019 22:41:06 -0700 Subject: [PATCH 15/22] Refactored, removed DateRange class --- .DS_Store | Bin 0 -> 6148 bytes lib/reserv_system.rb | 6 +----- lib/reservation.rb | 10 ++++++++-- test/.DS_Store | Bin 0 -> 6148 bytes test/date_range_test.rb | 41 --------------------------------------- test/reservation_test.rb | 2 +- test/test_helper.rb | 2 +- 7 files changed, 11 insertions(+), 50 deletions(-) create mode 100644 .DS_Store create mode 100644 test/.DS_Store delete mode 100644 test/date_range_test.rb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..cd439cf56ebc1c22582145394cf6a1cc6729e33b GIT binary patch literal 6148 zcmeHK&2G~`5T0!UtWzO!Kx&V^AaRIL+9Il|LNaM8)B_U22o8W+J9b;EuD7zCMkNIK z!aD$Oz@zX4JO~c}-~OcJk84HIjx_s?cW1^spS8PQB4V9>v_{kUZ=hKqa$M@1 zESVk$$W)G;0y?62FBQExZ`)xRunhcb49K<1sYim&DW-|_8>S+}nA{k)q4$3&fkm`T zhwzOlq7du7M5yx+}v!p+=m;FMk9x> z+*^CRcW`>~e)wVZ@e7K9Fl^*X?id`yR~VN>ocno}itGq|WB;+A#cRWW`E-2w+RWHa z)G}ZhxGDzZ{@_9-dIl?vYU@Cwt^mL~x|P6|zYH?QHRu_vG-3q8bSO}VGIPaXIvoA3 z@$(E;8g)1^bNOKA&CJ|Tn0h<%yULxIr_r{S0n5NN12z5Fl;{8M-|zp^LH5ZqU>W$Y z7-03T-|e6zbGFVEC(l|JdH|Io{VI(r1dTb4l_8JfRj3k-xzYf71}lx|f!H4bMT2cD I16RtxZ#W#Oi~s-t literal 0 HcmV?d00001 diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index 32b6bd69d..083948875 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -1,7 +1,3 @@ -# require_relative 'room' -# require_relative 'reservation' -# require_relative 'date_range' - RATE_OF_ROOM = 200 NUM_OF_ROOMS = 20 @@ -39,7 +35,7 @@ def not_reserved_on_date_range(start_time, end_time) else curr_room.reservation.each do |each_res| if overlap?(start_time, end_time, - each_res.date_range.start_time, each_res.date_range.end_time) == true + each_res.start_time, each_res.end_time) == true break else not_reserved_rooms << curr_room diff --git a/lib/reservation.rb b/lib/reservation.rb index 66aa9aa5f..990ce9f37 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -4,8 +4,14 @@ class Reservation def initialize(start_time, end_time, room_assigned) @room_assigned = room_assigned - @date_range = DateRange.new(start_time, end_time) - @cost = @date_range.days_between * RATE_OF_ROOM + @start_time = Date.parse(start_time) + @end_time = Date.parse(end_time) + # @date_range = DateRange.new(start_time, end_time) + @cost = days_between * RATE_OF_ROOM + end + + def days_between + return @end_time - @start_time end end end \ No newline at end of file diff --git a/test/.DS_Store b/test/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b8b902d64f1ff9a5261857d3c3a3a1fa5b495b22 GIT binary patch literal 6148 zcmeHK%}N774E|Dks3=kp(c>IF3BJKn>cO)QP+cu3tgf^wc-xB)WnQU=?^##^b{8UD(CY>@?!J#A`<*D; zj8gNrW_Ee$`0cc7o#2|Qu5h3Cv|{D**70REBp3(=f`Na-0CTp=V9PLUFc1s`11$sk zeMnTr!m%;TpAMS*1R&})G7HOkF;t)ASU5I@?4gLc63tcoi6Q3B_T=LV$HvgyA^!Lf zpIQ8cB6)VkPkA_`Fbo?E1Otl6i{qfmUMlUD}-H t+C)94s_3}JuytV}r(%xPRD3|q!uF&EV&T{rvV{^CflNb~VBkj?_y7} Date: Sun, 8 Sep 2019 23:27:54 -0700 Subject: [PATCH 16/22] Added refactos.txt, tidied up code --- lib/date_range.rb | 26 -------------------------- lib/reserv_system.rb | 3 +-- lib/reservation.rb | 1 - refactors.txt | 23 +++++++++++++++++++++++ test/reserv_system_test.rb | 4 ++-- test/test_helper.rb | 1 - 6 files changed, 26 insertions(+), 32 deletions(-) delete mode 100644 lib/date_range.rb create mode 100644 refactors.txt diff --git a/lib/date_range.rb b/lib/date_range.rb deleted file mode 100644 index f8110c2b4..000000000 --- a/lib/date_range.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Hotel - class DateRange - attr_reader :start_time, :end_time - - def initialize(start_time, end_time) - if start_time.class != Date - start_time = Date.parse(start_time) - end - - if end_time.class != Date - end_time = Date.parse(end_time) - end - - if end_time < start_time - raise ArgumentError.new("The end time cannot be before the start time.") - else - @start_time = start_time - @end_time = end_time - end - end - - def days_between - return @end_time - @start_time - end - end -end \ No newline at end of file diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index 083948875..633ec7018 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -18,11 +18,10 @@ def make_reservation(start_time, end_time) @reservations << new_res not_reserved_rooms[0].reservation << new_res else - return ("Cannot make a reservation for that date range. No rooms available.") + raise ArgumentError.new("Cannot make a reservation for that date range. No rooms available.") end end - def not_reserved_on_date_range(start_time, end_time) start_time = Date.parse(start_time) end_time = Date.parse(end_time) diff --git a/lib/reservation.rb b/lib/reservation.rb index 990ce9f37..f2c55e790 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -6,7 +6,6 @@ def initialize(start_time, end_time, room_assigned) @room_assigned = room_assigned @start_time = Date.parse(start_time) @end_time = Date.parse(end_time) - # @date_range = DateRange.new(start_time, end_time) @cost = days_between * RATE_OF_ROOM end diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..f23bcb15b --- /dev/null +++ b/refactors.txt @@ -0,0 +1,23 @@ +Refactors I've done so far: + +1. Added a room.all method, instead of initializing all room instances + inside of the ReservSystem initialization +2. Removed the DateRange class because it was not being used much. + Most of the string-to-Date conversion was being done elsewhere + + +Refactors I would like to do: + +1. A lot of my tests seem redundant. While I want to make sure every + possible scenario is covered and that my code is doing what I want it + to, I may be able to cut some out + - use let instead of before/do +2. The reserv_system class has some bulky methods. Not sure at the + moment if I could remove some of the responsibilities in each to + its own method, but want to look into it more +3. Will need to complete wave-3, adding hotel blocks + - potentially add a subclass to Reservation class, or make it its own + class with object composition +4. I just realized I didn't put in any errors for wrong input + - incorrect start/end time formats, data types + - tests to make sure these are being caught diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index da17b4fef..c7ab2ba59 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -41,11 +41,11 @@ expect(@reserv_system.reservations[1].room_assigned.id).must_equal 2 end - it "returns a 'no rooms are available on given date' if so" do + it "raises an error if a reservation is made when all rooms are booked" do @reserv_system.rooms.each do |curr_room| curr_room.reservation = [Hotel::Reservation.new('2019-1-1', '2019-1-5', curr_room)] end - expect(@reserv_system.make_reservation('2019-1-1', '2019-1-5')).must_equal "Cannot make a reservation for that date range. No rooms available." + expect{@reserv_system.make_reservation('2019-1-1', '2019-1-5')}.must_raise ArgumentError end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 90abf69ab..0bfe6c157 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -9,7 +9,6 @@ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new -# require_relative '../lib/date_range' require_relative '../lib/reserv_system' require_relative '../lib/reservation' require_relative '../lib/room' From ccc83b66d19238c4a149212b06229344ce51a3e0 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Sun, 29 Sep 2019 18:03:06 -0700 Subject: [PATCH 17/22] Added design activity file from revisit hotel --- design-activity.md | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..f8101d2cd --- /dev/null +++ b/design-activity.md @@ -0,0 +1,47 @@ +What classes does each implementation include? Are the lists the same? + +Implementation A: CartEntry, ShoppingCart, Order +Implementation B: CartEntry, ShoppingCart, Order +The lists are the same. + +Write down a sentence to describe each class. + +CartEntry is one instance that holds a unit price and quantity. +ShoppingCart is one instance that holds an array of entries. +Order is one instance that holds a new instance of ShoppingCart. + +How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. + +When a new Order is created, a new instance of ShoppingCart is created as well. Order holds the ShoppingCart. Inside the ShoppingCart is an array of CartEntry instances, which hold specific item information. + +What data does each class store? How (if at all) does this differ between the two implementations? + +CartEntry holds the data for a single item and its unit price and quantity. ShoppingCart holds an array of CartEntry instances. An Order creates a new ShoppingCart. This is the same between the two implementations. + +What methods does each class have? How (if at all) does this differ between the two implementations? + +In Implementation A, the only class method is part of the Order class, where total price is calculated. +In Implementation B, the CartEntry class has a method that calculates the price for each item. The ShoppingCart class has a method to calculate the sum of all CartEntrys. The Order class has a method to calculate the total price including sales tax. +These two implementations have completely different methods. + +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? + +A: Retained in Order +B: Delegated to other classes + +Does total_price directly manipulate the instance variables of other classes? + +A&B: Does not manipulate instance variables of other classes + +If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + +Implementation B is much easier to modify. Only the price method in the CartEntry class would need to be modified, instead of the entire Order#total_price method in Implementation A. + +Which implementation better adheres to the single responsibility principle? + +Implementation B. + +Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? + +Implementation B. \ No newline at end of file From 1c2efb0e000e5116b8d5d5e2657f469a1d47fab5 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Sun, 29 Sep 2019 19:01:23 -0700 Subject: [PATCH 18/22] Added tests to overlap? method --- test/reservation_test.rb | 41 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index 7243807cd..cc1f2cba1 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -18,4 +18,43 @@ expect(@reservation.room_assigned.id).must_equal 3 end end -end \ No newline at end of file + + describe "determining date overlap" do + before do + @reserv_system = Hotel::ReservSystem.new + @room = Hotel::Room.new(1) + @date_1 = '2019-4-06' + @date_2 = '2019-4-10' + @date_3 = '2019-4-14' + @date_4 = '2019-4-18' + end + + it "returns true if the end of one date range overlaps the beginning of another" do + new_res = Hotel::Reservation.new(@date_1, @date_3, @room) + new_res2 = Hotel::Reservation.new(@date_2, @date_4, @room) + expect(new_res.overlap?(@date_2, @date_4)).must_equal true + expect(new_res2.overlap?(@date_1, @date_3)).must_equal true + end + + + it "returns true if a date range is inside the other" do + new_res = Hotel::Reservation.new(@date_1, @date_4, @room) + new_res2 = Hotel::Reservation.new(@date_2, @date_3, @room) + expect(new_res.overlap?(@date_2, @date_3)).must_equal true + expect(new_res2.overlap?(@date_1, @date_4)).must_equal true + end + + it "returns false if the end of one date range is on the same day as the start of another" do + new_res = Hotel::Reservation.new(@date_1, @date_2, @room) + new_res2 = Hotel::Reservation.new(@date_2, @date_3, @room) + expect(new_res.overlap?(@date_2, @date_3)).must_equal false + expect(new_res2.overlap?(@date_1, @date_2)).must_equal false + end + + it "returns false if the date ranges do not overlap" do + new_res = Hotel::Reservation.new(@date_1, @date_2, @room) + expect(new_res.overlap?(@date_3, @date_4)).must_equal false + end + end +end + From 1e47bc28213e150304851bbc065378a3db33a380 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Sun, 29 Sep 2019 19:01:41 -0700 Subject: [PATCH 19/22] Removed overlap? method tests --- test/reserv_system_test.rb | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index c7ab2ba59..dd145def4 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -49,35 +49,6 @@ end end - describe "determining date overlap" do - before do - @reserv_system = Hotel::ReservSystem.new - @date_1 = Date.parse('2019-4-06') - @date_2 = Date.parse('2019-4-10') - @date_3 = Date.parse('2019-4-14') - @date_4 = Date.parse('2019-4-18') - end - - it "returns false if the end of one date range overlaps the beginning of another" do - expect(@reserv_system.overlap?(@date_1, @date_3, @date_2, @date_4)).must_equal true - expect(@reserv_system.overlap?(@date_2, @date_4, @date_1, @date_3)).must_equal true - end - - it "returns false if a date range is inside the other" do - expect(@reserv_system.overlap?(@date_1, @date_4, @date_2, @date_3)).must_equal true - expect(@reserv_system.overlap?(@date_2, @date_3, @date_1, @date_4)).must_equal true - end - - it "returns true if the end of one date range is on the same day as the start of another" do - expect(@reserv_system.overlap?(@date_1, @date_2, @date_2, @date_3)).must_equal false - expect(@reserv_system.overlap?(@date_2, @date_3, @date_1, @date_2)).must_equal false - end - - it "returns true if the date ranges do not overlap" do - expect(@reserv_system.overlap?(@date_1, @date_2, @date_3, @date_4)).must_equal false - end - end - describe "listing all available rooms for a date range" do before do @reserv_system = Hotel::ReservSystem.new From 2d3ca377cd6a1c5e864d991ee8f45fe32b0efb21 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Sun, 29 Sep 2019 19:02:10 -0700 Subject: [PATCH 20/22] Added overlap? method to Reservation class --- lib/reservation.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/reservation.rb b/lib/reservation.rb index f2c55e790..35dfc4f24 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -12,5 +12,15 @@ def initialize(start_time, end_time, room_assigned) def days_between return @end_time - @start_time end + + def overlap?(inquired_start, inquired_end) + inquired_start = Date.parse(inquired_start) + inquired_end = Date.parse(inquired_end) + if @start_time < inquired_end && inquired_start < @end_time + return true + else + return false + end + end end end \ No newline at end of file From d9dc2c8f35c3506f59694c3e980976929133e2b8 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Sun, 29 Sep 2019 20:31:52 -0700 Subject: [PATCH 21/22] Refactored: removed overlap? from ReservSystem --- lib/reserv_system.rb | 29 ++++++----------------------- test/reserv_system_test.rb | 21 ++++++++++----------- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/lib/reserv_system.rb b/lib/reserv_system.rb index 633ec7018..aa8d22fda 100644 --- a/lib/reserv_system.rb +++ b/lib/reserv_system.rb @@ -1,5 +1,6 @@ RATE_OF_ROOM = 200 NUM_OF_ROOMS = 20 +require 'pry' module Hotel class ReservSystem @@ -13,19 +14,16 @@ def initialize() def make_reservation(start_time, end_time) not_reserved_rooms = not_reserved_on_date_range(start_time, end_time) - if not_reserved_rooms.class == Array + if not_reserved_rooms.length == 0 + raise ArgumentError.new("Cannot make a reservation for that date range. No rooms available.") + else new_res = Reservation.new(start_time, end_time, not_reserved_rooms[0]) @reservations << new_res not_reserved_rooms[0].reservation << new_res - else - raise ArgumentError.new("Cannot make a reservation for that date range. No rooms available.") end end def not_reserved_on_date_range(start_time, end_time) - start_time = Date.parse(start_time) - end_time = Date.parse(end_time) - not_reserved_rooms = [] @rooms.each do |curr_room| @@ -33,29 +31,14 @@ def not_reserved_on_date_range(start_time, end_time) not_reserved_rooms << curr_room else curr_room.reservation.each do |each_res| - if overlap?(start_time, end_time, - each_res.start_time, each_res.end_time) == true - break - else + if each_res.overlap?(start_time, end_time) == false not_reserved_rooms << curr_room end end end end - if not_reserved_rooms.length == 0 - return ("There are no rooms available for that date range.") - else - return not_reserved_rooms - end - end - - def overlap?(first_start, first_end, second_start, second_end) - if first_start < second_end && second_start < first_end - return true - else - return false - end + return not_reserved_rooms end end end diff --git a/test/reserv_system_test.rb b/test/reserv_system_test.rb index dd145def4..b516e1702 100644 --- a/test/reserv_system_test.rb +++ b/test/reserv_system_test.rb @@ -54,21 +54,20 @@ @reserv_system = Hotel::ReservSystem.new end - it "can correctly return all available rooms" do + it "can return all rooms as available for first-ever reservation" do + all_rooms = @reserv_system.not_reserved_on_date_range('2019-3-1', '2019-3-6') + expect(all_rooms).must_be_kind_of Array + expect(all_rooms.length).must_equal 20 + end + + it "can correctly return all available rooms after previous reservations have been made" do @reserv_system.make_reservation('2019-3-1', '2019-3-6') @reserv_system.make_reservation('2019-3-5', '2019-3-8') @reserv_system.make_reservation('2019-4-1', '2019-4-5') - @all_rooms = @reserv_system.not_reserved_on_date_range('2019-3-2', '2019-4-3') - expect(@all_rooms).must_be_kind_of Array - expect(@all_rooms.length).must_equal 18 - end - - it "returns a 'no rooms are available on given date' if so" do - 20.times do - @reserv_system.make_reservation('2019-3-1', '2019-3-6') - end - expect(@reserv_system.not_reserved_on_date_range('2019-3-1', '2019-3-6')).must_equal "There are no rooms available for that date range." + all_rooms = @reserv_system.not_reserved_on_date_range('2019-3-2', '2019-4-3') + expect(all_rooms).must_be_kind_of Array + expect(all_rooms.length).must_equal 18 end end end From aecacaee7f62a7b3de48ac5f466169bb13dfc925 Mon Sep 17 00:00:00 2001 From: Ga-Young Jin Date: Sun, 29 Sep 2019 20:43:07 -0700 Subject: [PATCH 22/22] Added comments about refactoring Hotel --- design-activity.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/design-activity.md b/design-activity.md index f8101d2cd..e0a5e0fab 100644 --- a/design-activity.md +++ b/design-activity.md @@ -44,4 +44,11 @@ Implementation B. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled? -Implementation B. \ No newline at end of file +Implementation B. + + + +Refactoring Hotel: +One place in my Hotel project that takes on multiple roles was the ReservSystem#not_reserved_on_date_range method. It was reaching inside of each room, then each reservation of that room, then the start/end times of that reservation to determine if there was an overlap of dates between that of the existing reservation and the dates of the new reservation. The changes I need to make are moving the ReservSystem#overlap? method into the Reservation class, making sure that ReservSystem just receives a boolean back from the Reservation#overlap? method, and making minor adjustments to my test codes to fit the new syntax. Changing the tests would involve moving the overlap? tests from reserv_system_test.rb to reservations_test.rb. + +This design change would be an improvement because ReservSystem will be less coupled with Reservation. ReservSystem would no longer be reaching through Reservation and getting info from those reservation instances. Instead, ReservSystem will be asking Reservation for info, and Reservation will be passing back a boolean. If any changes were made to reservations in the future, this decoupling now would make that easier later. \ No newline at end of file