Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions lib/date_range.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
module Hotel
class DateRange
attr_accessor :start_date, :end_date

def initialize(start_date, end_date)
if !(start_date.is_a? Date) || !(end_date.is_a? Date)
raise ArgumentError.new("If the start_date and end_date is not a Date")
end

if end_date < start_date
raise ArgumentError.new("If the start_date is biger then the end_date")
end

if start_date == end_date
raise ArgumentError.new("If the start_date date is same with end_date")
end
Comment on lines +6 to +16

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great validation here!


@start_date = start_date
@end_date = end_date
end

def ==(other)
start_date == other.start_date && end_date == other.end_date
end

def overlap?(other)
start_date < other.end_date && other.start_date < end_date

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very clever!

end

def include?(date)
start_date <= date && date < end_date
end

def calculate_nights
nights = (end_date - start_date).to_i
return nights
end
end
end
71 changes: 71 additions & 0 deletions lib/hotel_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
require_relative "room"
require_relative "date_range"
require_relative "reservation"
require_relative "no_room_available"


module Hotel
class HotelController
attr_accessor :reservations
attr_reader :rooms

def initialize
@rooms = Array.new(20){|i| Hotel::Room.new(i+1)}
@reservations = []
end

#I can access the list of reservations for a specific date, so that I can track reservations by date
def reservation(date)
result = []
@reservations.each do |reservation|
if reservation.date_range.include?(date)
result << reservation
end
end
return result
end

# Cost for giving reservation
def total_cost(reservation)
total_cost = reservation.cost
return total_cost
end

#Make new reservation
def reserve_room(start_date, end_date)
avalable_room = available_rooms(start_date, end_date)
raise NoRoomAvailable.new ("No room available") if avalable_room == []

new_restervation = Hotel::Reservation.new(start_date, end_date, avalable_room.first)
reservations << new_restervation
return new_restervation
end

#I access the list of reservations for a specified room and a given date range
def reservations_for_room(date_range, room)
result = []
reservations.each do |reservation|
if reservation.date_range.overlap?(date_range) && room.room_nr == reservation.room.room_nr
result << reservation
end
end
return result
end

# Avalable rooms
def available_rooms(start_date, end_date)
unavalable_room = []
another_range = Hotel::DateRange.new(start_date, end_date)

@reservations.each do |reservation|
if reservation.date_range.overlap?(another_range)
unavalable_room << reservation.room
end
end

avalable_room = @rooms - unavalable_room
return avalable_room
end

end
end
4 changes: 4 additions & 0 deletions lib/no_room_available.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module Hotel
class NoRoomAvailable < StandardError
end
end
21 changes: 21 additions & 0 deletions lib/reservation.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
require_relative "date_range"
require_relative "room"


module Hotel
class Reservation

# Feel free to change this method signature as needed. Make sure to update the tests!
attr_reader :id, :date_range, :room
def initialize(start_date, end_date, room)
@date_range = Hotel::DateRange.new(start_date, end_date)
@room = room
end

def cost
total = date_range.calculate_nights * 200.00
return total
end

end
end
15 changes: 15 additions & 0 deletions lib/room.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

module Hotel
class Room
attr_reader :room_nr, :cost
def initialize(room_nr, cost = 200)
@room_nr = room_nr
@cost = cost
end
end

# def ==(other)
# room_nr == other.room_nr
# end

end
170 changes: 170 additions & 0 deletions test/date_range_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
require_relative "test_helper"

describe Hotel::DateRange do

describe "consructor" do

it "Creates an instance of date_range" do
start_date = Date.new(2020, 01, 20)
end_date = Date.new(2020, 01, 25)
date_range = Hotel::DateRange.new(start_date, end_date)
date_range.must_be_kind_of Hotel::DateRange
end

it "Keeps track of start_date and end_date" do
start_date = Date.today
end_date = start_date + 3

range = Hotel::DateRange.new(start_date, end_date)

expect(range).must_respond_to :start_date
expect(range.start_date).must_equal start_date
expect(range).must_respond_to :end_date
expect(range.end_date).must_equal end_date
end

it " Rais an argument ArgumentError if end_date is smaller then a start date" do
start_date = Date.today
end_date = Date.today - 3
expect{Hotel::DateRange.new(start_date, end_date)}.must_raise ArgumentError
end

it "is an an error for negative-lenght ranges" do
start_date = Date.today -5
end_date = Date.today
expect{Hotel::DateRange.new(start_date, end_date)}.must_raise ArgumentError

end

it "is an error to create a 0-length range" do
start_date = Date.today
end_date = Date.today
Comment on lines +26 to +41

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Love that you tested all this on the constructor!

expect{Hotel::DateRange.new(start_date, end_date)}.must_raise ArgumentError
end

it "is an error if the start and end date are not the Date" do
start_date = Date.today + 10
end_date = Date.today + 15
expect{Hotel::DateRange.new("2020/03/25", end_date)}.must_raise ArgumentError
expect{Hotel::DateRange.new(start_date, 20200325)}.must_raise ArgumentError
end
end

describe "==other" do
before do
start_date = Date.today + 5
end_date = start_date + 3
@range = Hotel::DateRange.new(start_date, end_date)
end
it "returne true if other start_date is not equal with start_date" do
start_date = @range.start_date
end_date = @range.end_date
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.==(test_range)).must_equal true
end

it "returne false if other start_date is not equal with start_date" do
start_date = Date.today
end_date = Date.today + 3
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.==(test_range)).must_equal false
end
end

describe "overlap?" do

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great test coverage!

before do
start_date = Date.today + 5
end_date = start_date + 3
@range = Hotel::DateRange.new(start_date, end_date)
end
it "returns true for the same range" do
start_date = @range.start_date
end_date = @range.end_date
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal true
end
it "returns true for a contained range" do
start_date = Date.today + 3
end_date = start_date + 9
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal true
end
it "returns true for a range that overlaps in front" do
start_date = Date.today + 3
end_date = start_date + 6
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal true
end
it "returns true for a range that overlaps in the back" do
start_date = Date.today + 6
end_date = start_date + 4
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal true
end
it "returns true for a containing range" do
start_date = Date.today + 6
end_date = start_date + 1
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal true
end
it "returns false for a range starting on the end_date date" do
start_date = Date.today + 8
end_date = start_date + 2
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal false
end
it "returns false for a range ending on the start_date date" do
start_date = Date.today + 1
end_date = start_date + 4
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal false
end
it "returns false for a range completely before" do
start_date = Date.today + 9
end_date = start_date + 3
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal false
end
it "returns false for a date completely after" do
start_date = Date.today + 1
end_date = start_date + 2
test_range = Hotel::DateRange.new(start_date, end_date)
expect(@range.overlap?(test_range)).must_equal false
end
end


describe "include?" do
before do
start_date = Date.new(2017, 02, 15)
end_date = start_date + 3
@range = Hotel::DateRange.new(start_date, end_date)
end
it "reutrns false if the date is clearly out" do
date = Date.new(2017, 03, 15)
expect(@range.include?(date)).must_equal false
end

it "returns true for dates in the range" do
date = Date.new(2017, 02, 17)
expect(@range.include?(date)).must_equal true
end

it "returns false for the end_date date" do
date = Date.new(2017, 02, 18)
expect(@range.include?(date)).must_equal false
end
end

describe "calculate nights" do
it "returns the correct number of nights" do
start_date = Date.today
end_date = start_date + 3

range = Hotel::DateRange.new(start_date, end_date)

expect(range.calculate_nights).must_equal 3
expect(range.calculate_nights).must_be_kind_of Integer
end
end
end
Loading