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..7048dc2db --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,35 @@ +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..d9850c4f0 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,30 @@ +# creating reservation class +require_relative "system.rb" + +module Hotel + class Reservation + attr_reader :date_range, :room_num, :cost_per_night + + 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 + + # 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..53fbe54e8 --- /dev/null +++ b/lib/system.rb @@ -0,0 +1,74 @@ +require "date" +require "pry" +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..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 + 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_num == room } + if !room_reservation.any? { |reservation| DateRange.overlap?(reservation.date_range, date_range) } + return room + end + end + return + 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) } + end + + def search_by_date(date) + return reservations.select { |reservation| reservation.date_range.with_in_range?(date) } + end + end +end + +# 1) Write pseudocode +# 2) Write test(s) +# 3) Write code +# 4) Refactor +# 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)(done) + +# 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 + +# 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..07a46ada1 --- /dev/null +++ b/test/system_test.rb @@ -0,0 +1,53 @@ +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 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 + res_array = system.search_by_date(date) + + #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 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"