From 872cf571cbf3ec802ba41db6c23ff1055fd4ace9 Mon Sep 17 00:00:00 2001 From: Hannah Tekie Date: Thu, 5 Mar 2020 21:23:32 -0800 Subject: [PATCH 1/4] two complete classes --- .gitignore | 3 +- Rakefile | 4 +- lib/date_range.rb | 37 +++++++++++++ lib/reservation.rb | 31 +++++++++++ lib/room.rb | 1 + lib/system.rb | 73 ++++++++++++++++++++++++ test/date_range_test.rb | 116 +++++++++++++++++++++++++++++++++++++++ test/reservation_test.rb | 18 ++++++ test/room_test.rb | 2 + test/system_test.rb | 38 +++++++++++++ test/test_helper.rb | 11 +++- 11 files changed, 329 insertions(+), 5 deletions(-) create mode 100644 lib/date_range.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 lib/system.rb create mode 100644 test/date_range_test.rb create mode 100644 test/reservation_test.rb create mode 100644 test/room_test.rb create mode 100644 test/system_test.rb diff --git a/.gitignore b/.gitignore index 5e1422c9c..2b42312c5 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,8 @@ /test/tmp/ /test/version_tmp/ /tmp/ - +.vscode/ +.DS_Store # Used by dotenv library to load environment variables. # .env diff --git a/Rakefile b/Rakefile index 0c2d13fe8..8aebe3bda 100644 --- a/Rakefile +++ b/Rakefile @@ -1,9 +1,9 @@ -require 'rake/testtask' +require "rake/testtask" Rake::TestTask.new do |t| t.libs = ["lib"] t.warning = true - t.test_files = FileList['test/*_test.rb'] + t.test_files = FileList["test/*_test.rb"] end task default: :test diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..19999ddf3 --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,37 @@ + + class DateRange + attr_reader :start_date, :end_date + + def initialize(start_date_str, end_date_str) # give it Date.parse(year-month) + @start_date = Date.parse(start_date_str) + @end_date = Date.parse(end_date_str) + end + + def with_in_range?(date) + return date >= start_date && date < end_date + end + + def duration + # to get duration subtract the two dates + return end_date - start_date + end + + def self.overlap?(date_range1, date_range2) + if date_range1.end_date <= date_range2.start_date || date_range1.start_date >= date_range2.end_date + return false + else + return true + end + # if date_range1.start_date <= date_range2.start_date && date_range1.end_date >= date_range2.end_date + # return true + # elsif date_range1.start_date < date_range2.end_date && date_range1.start_date >= date_range2.start_date + # return true + # elsif date_range1.end_date >date_range2.start_date && date_range1.end_date <= date_range2.end_date + # return true + # else + # return false + # end + + end + end + diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..797db04e4 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,31 @@ +# creating reservation class +require_relative "system.rb" +module Hotel + + +class Reservation + attr_reader :date_range, :room_number, :cost_per_night + + def initialize(date_range, room_number) + @date_range = date_range + @room_number = room_number + @cost_per_night = 200 + end + + def get_cost + return date_range.duration * cost_per_night + end + + # to get the total cost, need the duration (as input wont be able to dirctly get duration but will get res id) + # go throught the reservation array to get one one rervation which matches the id + # get that reservation_id to get the duration + # after getting duration, calculate cost + + # found_reservation = @reservations.find do |reservation| + # reservation.reservation_id == reservation_id + # end + + # duration = found_reservation.date_range.duration() + +end +end diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1 @@ + diff --git a/lib/system.rb b/lib/system.rb new file mode 100644 index 000000000..8b1c84134 --- /dev/null +++ b/lib/system.rb @@ -0,0 +1,73 @@ +require "date" + +require_relative "room.rb" +require_relative "reservation.rb" +require_relative "date_range.rb" + +module Hotel + class System + attr_reader :reservations, :rooms + + def initialize(number_of_rooms) + @reservations = [] + @rooms = (1..20).to_a + end + + def create_reservation(start_date, end_date) + date_range = DateRange.new(start_date, end_date) + room = find_avail_room(date_range) + if !room + raise "there is no available room" + end + reservation = Reservation.new(date_range, room) + reservations << reservation + end + + #helper method + def find_avail_room(date_range) + rooms.each do |room| + room_reservation = reservations.select { |reservation| reservation.room == room } + if !room_reservation.any? { |reservation| reservation.overlap?(date_range) } + return room + end + end + return + end + + def get_reservation + # get room_num, get start_date and end_date as inputs and return reservations + end + + # def get reservations for specific date + # # for that one specific date get all the reservations + # end + + end +end + +# 1) Write pseudocode +# 2) Write test(s) +# 3) Write code +# 4) Refactor +# 5) Commit + +# WAVE 1 +# write the functionality for the system to track valid reservations +# Your job is to only build the classes that store information and handle business logic + +# I can access the list of all of the rooms in the hotel (done) +# I access the list of reservations for a specified room and a given date range (change the date using parse method) +# I can access the list of reservations for a specific date, so that I can track reservations by date +# I can get the total cost for a given reservation + +# I want exception raised when an invalid date range is provided, so that I can't make a reservation for an invalid date range + +# Detail +# The hotel has 20 rooms, and they are numbered 1 through 20 +# Every room is identical, and a room always costs $200/night +# The last day of a reservation is the checkout day, so the guest should not be charged for that night +# When reserving a room, the user provides only the start and end dates +# the library should determine which room to use for the reservation +# For this wave, any room can be reserved at any time, and you don't need to check whether reservations conflict with each other (this will come in wave 2!) + +# WAVE 2 diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100644 index 000000000..e209547f9 --- /dev/null +++ b/test/date_range_test.rb @@ -0,0 +1,116 @@ +# writting a test for duration +require_relative "test_helper" + +describe "date range class" do + it "calculates duration" do + # Arrange + date_range_instance = DateRange.new("2020-02-27", "2020-03-02") + # Act + + duration = date_range_instance.duration() + + # Assert + expect (duration).must_equal 4 + end + describe "overlap" do + it "case 1 " do + #Arrange + date_one = DateRange.new("2020-03-27", "2020-04-02") + date_two = DateRange.new("2020-04-04", "2020-04-06") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(false) + end + it "case 2" do + #Arrange + date_one = DateRange.new("2020-03-27", "2020-04-02") + date_two = DateRange.new("2020-04-02", "2020-04-03") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(false) + end + it "case 3" do + #Arrange + date_one = DateRange.new("2020-03-27", "2020-04-02") + date_two = DateRange.new("2020-04-01", "2020-04-27") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(true) + end + it "case 4" do + #Arrange + date_one = DateRange.new("2020-03-27", "2020-04-02") + date_two = DateRange.new("2020-03-27", "2020-04-02") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(true) + end + it "case 5" do + #Arrange + date_one = DateRange.new("2020-03-27", "2020-04-02") + date_two = DateRange.new("2020-03-27", "2020-04-05") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(true) + end + it "case 6" do + #Arrange + date_one = DateRange.new("2020-03-17", "2020-04-05") + date_two = DateRange.new("2020-03-06", "2020-04-05") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(true) + end + it "case 7" do + #Arrange + date_one = DateRange.new("2020-04-03", "2020-04-07") + date_two = DateRange.new("2020-04-04", "2020-04-05") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(true) + end + it "case 8" do + #Arrange + date_one = DateRange.new("2020-04-03", "2020-04-05") + date_two = DateRange.new("2020-03-31", "2020-04-07") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(true) + end + it "case 9" do + #Arrange + date_one = DateRange.new("2020-03-17", "2020-04-05") + date_two = DateRange.new("2020-03-06", "2020-03-17") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(false) + end + it "case 10" do + #Arrange + date_one = DateRange.new("2020-03-17", "2020-04-05") + date_two = DateRange.new("2020-03-06", "2020-03-19") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(true) + end + it "case 11" do + #Arrange + date_one = DateRange.new("2020-05-05", "2020-05-07") + date_two = DateRange.new("2020-03-06", "2020-03-17") + #Act + result = DateRange.overlap?(date_one, date_two) + #Assert + expect(result).must_equal(false) + end + end +end diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..fafd4117a --- /dev/null +++ b/test/reservation_test.rb @@ -0,0 +1,18 @@ +require "simplecov" +SimpleCov.start + +require_relative "test_helper" + +describe "Reservation class" do + it "calculate cost" do + #Arrange + date_range = DateRange.new("02-10-2020", "02-12-2020") + reservation = Hotel::Reservation.new(date_range, 8) + + #Act + cost = reservation.get_cost + + #Assert + expect(cost).must_equal(date_range.duration * reservation.cost_per_night) + end +end diff --git a/test/room_test.rb b/test/room_test.rb new file mode 100644 index 000000000..2ffef0c00 --- /dev/null +++ b/test/room_test.rb @@ -0,0 +1,2 @@ +require "simplecov" +SimpleCov.start diff --git a/test/system_test.rb b/test/system_test.rb new file mode 100644 index 000000000..7bd600c41 --- /dev/null +++ b/test/system_test.rb @@ -0,0 +1,38 @@ +require "date" + +require "simplecov" +SimpleCov.start + +require_relative "test_helper" + +describe "System class" do + it "gets lists of rooms" do + #Arrange + system = Hotel::System.new(20) + + #Act + rooms = system.rooms + + #Assert + expect(rooms).must_equal (1..20).to_a + end + + it "create reservation" do + #Arrange + system = Hotel::System.new(20) + #Act + system.create_reservation("01/01/2020", "01/10/2020") + #Assert + expect(system.reservations.length).must_equal 1 + end + + # it "gets list of reservation given one date" do + # #Arrange + # date = Date.parse ("03/02/2020") + # system = Hotel::System.new(20) + + # #Act + + # #Assert + # end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..b5c1dc51b 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,8 +1,15 @@ -# Add simplecov +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 your lib files here! +require_relative "../lib/date_range.rb" +require_relative "../lib/reservation.rb" +require_relative "../lib/system.rb" +require_relative "../lib/room.rb" From e64ec29285e685826af1032ccf934b7b0e455ad3 Mon Sep 17 00:00:00 2001 From: Hannah Tekie Date: Thu, 5 Mar 2020 21:40:10 -0800 Subject: [PATCH 2/4] added get reservation method --- lib/system.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/system.rb b/lib/system.rb index 8b1c84134..169b25d87 100644 --- a/lib/system.rb +++ b/lib/system.rb @@ -38,9 +38,9 @@ def get_reservation # get room_num, get start_date and end_date as inputs and return reservations end - # def get reservations for specific date - # # for that one specific date get all the reservations - # end + def get_reservations(date) + return reservation.select {|reservation| reservation.date_range.with_in_range(date)} + end end end @@ -57,7 +57,9 @@ def get_reservation # I can access the list of all of the rooms in the hotel (done) # I access the list of reservations for a specified room and a given date range (change the date using parse method) + # I can access the list of reservations for a specific date, so that I can track reservations by date + # I can get the total cost for a given reservation # I want exception raised when an invalid date range is provided, so that I can't make a reservation for an invalid date range From 01f8cefb3abc66339314495d14671f1668530b83 Mon Sep 17 00:00:00 2001 From: Hannah Tekie Date: Sat, 7 Mar 2020 17:20:17 -0800 Subject: [PATCH 3/4] added a method and a test --- lib/date_range.rb | 58 ++++++++++++++++++++++----------------------- lib/reservation.rb | 41 ++++++++++++++++---------------- lib/system.rb | 24 ++++++++++--------- test/system_test.rb | 18 ++++++++------ 4 files changed, 72 insertions(+), 69 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 19999ddf3..7048dc2db 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -1,37 +1,35 @@ +class DateRange + attr_reader :start_date, :end_date - class DateRange - attr_reader :start_date, :end_date + def initialize(start_date_str, end_date_str) # give it Date.parse(year-month) + @start_date = Date.parse(start_date_str) + @end_date = Date.parse(end_date_str) + end - def initialize(start_date_str, end_date_str) # give it Date.parse(year-month) - @start_date = Date.parse(start_date_str) - @end_date = Date.parse(end_date_str) - end + def with_in_range?(date) + return date >= start_date && date < end_date + end - def with_in_range?(date) - return date >= start_date && date < end_date - end + def duration + # to get duration subtract the two dates + return end_date - start_date + end - def duration - # to get duration subtract the two dates - return end_date - start_date + def self.overlap?(date_range1, date_range2) + if date_range1.end_date <= date_range2.start_date || date_range1.start_date >= date_range2.end_date + return false + else + return true end + # if date_range1.start_date <= date_range2.start_date && date_range1.end_date >= date_range2.end_date + # return true + # elsif date_range1.start_date < date_range2.end_date && date_range1.start_date >= date_range2.start_date + # return true + # elsif date_range1.end_date >date_range2.start_date && date_range1.end_date <= date_range2.end_date + # return true + # else + # return false + # end - def self.overlap?(date_range1, date_range2) - if date_range1.end_date <= date_range2.start_date || date_range1.start_date >= date_range2.end_date - return false - else - return true - end - # if date_range1.start_date <= date_range2.start_date && date_range1.end_date >= date_range2.end_date - # return true - # elsif date_range1.start_date < date_range2.end_date && date_range1.start_date >= date_range2.start_date - # return true - # elsif date_range1.end_date >date_range2.start_date && date_range1.end_date <= date_range2.end_date - # return true - # else - # return false - # end - - end end - +end diff --git a/lib/reservation.rb b/lib/reservation.rb index 797db04e4..d9850c4f0 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,31 +1,30 @@ # creating reservation class require_relative "system.rb" -module Hotel - -class Reservation - attr_reader :date_range, :room_number, :cost_per_night +module Hotel + class Reservation + attr_reader :date_range, :room_num, :cost_per_night - def initialize(date_range, room_number) - @date_range = date_range - @room_number = room_number - @cost_per_night = 200 - end + def initialize(date_range, room_num) + @date_range = date_range + @room_num = room_num + @cost_per_night = 200 + end - def get_cost - return date_range.duration * cost_per_night - end + def get_cost + return date_range.duration * cost_per_night + end - # to get the total cost, need the duration (as input wont be able to dirctly get duration but will get res id) - # go throught the reservation array to get one one rervation which matches the id - # get that reservation_id to get the duration - # after getting duration, calculate cost + # to get the total cost, need the duration (as input wont be able to dirctly get duration but will get res id) + # go throught the reservation array to get one one rervation which matches the id + # get that reservation_id to get the duration + # after getting duration, calculate cost - # found_reservation = @reservations.find do |reservation| - # reservation.reservation_id == reservation_id - # end + # found_reservation = @reservations.find do |reservation| + # reservation.reservation_id == reservation_id + # end - # duration = found_reservation.date_range.duration() + # duration = found_reservation.date_range.duration() -end + end end diff --git a/lib/system.rb b/lib/system.rb index 169b25d87..8a74d2b26 100644 --- a/lib/system.rb +++ b/lib/system.rb @@ -26,20 +26,22 @@ def create_reservation(start_date, end_date) #helper method def find_avail_room(date_range) rooms.each do |room| - room_reservation = reservations.select { |reservation| reservation.room == room } - if !room_reservation.any? { |reservation| reservation.overlap?(date_range) } + room_reservation = reservations.select { |reservation| reservation.room_num == room } + if !room_reservation.any? { |reservation| DateRange.overlap?(reservation.date_range, date_range)} return room end end return end - def get_reservation - # get room_num, get start_date and end_date as inputs and return reservations + def get_reservation(room_num, given_date_range) + room_reservations = reservations.select{|res|res.room_num = room_num} + return room_reservations.select {|res|DateRange.overlap?(res.date_range, given_date_range)} + end - def get_reservations(date) - return reservation.select {|reservation| reservation.date_range.with_in_range(date)} + def search_by_date(date) + return reservations.select {|reservation| reservation.date_range.with_in_range?(date)} end end @@ -49,14 +51,14 @@ def get_reservations(date) # 2) Write test(s) # 3) Write code # 4) Refactor -# 5) Commit +# 5) Commit (15 of them) # WAVE 1 # write the functionality for the system to track valid reservations # Your job is to only build the classes that store information and handle business logic # I can access the list of all of the rooms in the hotel (done) -# I access the list of reservations for a specified room and a given date range (change the date using parse method) +# I access the list of reservations for a specified room and a given date range (change the date using parse method)(done) # I can access the list of reservations for a specific date, so that I can track reservations by date @@ -65,9 +67,9 @@ def get_reservations(date) # I want exception raised when an invalid date range is provided, so that I can't make a reservation for an invalid date range # Detail -# The hotel has 20 rooms, and they are numbered 1 through 20 -# Every room is identical, and a room always costs $200/night -# The last day of a reservation is the checkout day, so the guest should not be charged for that night + + + # When reserving a room, the user provides only the start and end dates # the library should determine which room to use for the reservation # For this wave, any room can be reserved at any time, and you don't need to check whether reservations conflict with each other (this will come in wave 2!) diff --git a/test/system_test.rb b/test/system_test.rb index 7bd600c41..ac511c1e7 100644 --- a/test/system_test.rb +++ b/test/system_test.rb @@ -26,13 +26,17 @@ expect(system.reservations.length).must_equal 1 end - # it "gets list of reservation given one date" do - # #Arrange - # date = Date.parse ("03/02/2020") - # system = Hotel::System.new(20) + it "gets list of reservation and given a date" do + # #Arrange + date = Date.parse ("02/02/2020") + system = Hotel::System.new(20) + system.create_reservation("03/12/2020", "03/12/2020") + system.create_reservation("02/02/2020", "02/04/2020") - # #Act + # #Act + res_array = system.search_by_date(date) - # #Assert - # end + # #Assert + expect(res_array.length).must_equal 1 + end end From 6dd358fca229f39140847857508008751c9258a1 Mon Sep 17 00:00:00 2001 From: Hannah Tekie Date: Sat, 7 Mar 2020 17:42:00 -0800 Subject: [PATCH 4/4] added another test --- lib/system.rb | 19 ++++++++----------- test/system_test.rb | 17 ++++++++++++++--- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/lib/system.rb b/lib/system.rb index 8a74d2b26..53fbe54e8 100644 --- a/lib/system.rb +++ b/lib/system.rb @@ -1,5 +1,5 @@ require "date" - +require "pry" require_relative "room.rb" require_relative "reservation.rb" require_relative "date_range.rb" @@ -10,12 +10,13 @@ class System def initialize(number_of_rooms) @reservations = [] - @rooms = (1..20).to_a + @rooms = (1..number_of_rooms).to_a end def create_reservation(start_date, end_date) date_range = DateRange.new(start_date, end_date) room = find_avail_room(date_range) + if !room raise "there is no available room" end @@ -27,7 +28,7 @@ def create_reservation(start_date, end_date) def find_avail_room(date_range) rooms.each do |room| room_reservation = reservations.select { |reservation| reservation.room_num == room } - if !room_reservation.any? { |reservation| DateRange.overlap?(reservation.date_range, date_range)} + if !room_reservation.any? { |reservation| DateRange.overlap?(reservation.date_range, date_range) } return room end end @@ -35,15 +36,13 @@ def find_avail_room(date_range) end def get_reservation(room_num, given_date_range) - room_reservations = reservations.select{|res|res.room_num = room_num} - return room_reservations.select {|res|DateRange.overlap?(res.date_range, given_date_range)} - + room_reservations = reservations.select { |res| res.room_num = room_num } + return room_reservations.select { |res| DateRange.overlap?(res.date_range, given_date_range) } end - def search_by_date(date) - return reservations.select {|reservation| reservation.date_range.with_in_range?(date)} + def search_by_date(date) + return reservations.select { |reservation| reservation.date_range.with_in_range?(date) } end - end end @@ -68,8 +67,6 @@ def search_by_date(date) # Detail - - # When reserving a room, the user provides only the start and end dates # the library should determine which room to use for the reservation # For this wave, any room can be reserved at any time, and you don't need to check whether reservations conflict with each other (this will come in wave 2!) diff --git a/test/system_test.rb b/test/system_test.rb index ac511c1e7..07a46ada1 100644 --- a/test/system_test.rb +++ b/test/system_test.rb @@ -27,16 +27,27 @@ end it "gets list of reservation and given a date" do - # #Arrange + #Arrange date = Date.parse ("02/02/2020") system = Hotel::System.new(20) system.create_reservation("03/12/2020", "03/12/2020") system.create_reservation("02/02/2020", "02/04/2020") - # #Act + #Act res_array = system.search_by_date(date) - # #Assert + #Assert expect(res_array.length).must_equal 1 end + + it "raises exception, if no available rooms" do + #Arrange + system = Hotel::System.new(1) + system.create_reservation("03/03/2010", "03/04/2020") + #Act + expect{system.create_reservation("03/03/2010", "03/04/2020")}.must_raise Exception + #Assert + end + + end