Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Binary file added .DS_Store
Binary file not shown.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,4 @@ build-iPhoneSimulator/

# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc
coverage
29 changes: 29 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "extensionHost",
"request": "launch",
"name": "Launch Extension",
"runtimeExecutable": "${execPath}",
"args": [
"--extensionDevelopmentPath=${workspaceFolder}"
],
"outFiles": [
"${workspaceFolder}/out/**/*.js"
],
"preLaunchTask": "npm"
},


{
"name": "Debug Local File",
"type": "Ruby",
"request": "launch",
"program": "${workspaceRoot}"
}
]
}
28 changes: 28 additions & 0 deletions lib/date_range.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
require 'date'

module Hotel
class DateRange
attr_accessor :start_date, :end_date

def initialize(start_date, end_date)
@start_date = start_date
@end_date = end_date

if @start_date >= @end_date || @start_date && end_date == nil
raise ArgumentError
end
end

def length_of_stay
return (@end_date - @start_date) - 1
end

def overlap?(range)
if @start_date >= range.end_date || @end_date <= range.start_date
return false
else
return true
end
Comment on lines +21 to +25

Choose a reason for hiding this comment

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

This is good start, but you are missing a few important cases with this logic! In situations like this, I try drawing a picture where I can visualize all the possibilities for input data.

end
end
end
48 changes: 48 additions & 0 deletions lib/hotel_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
require_relative 'date_range'
require_relative 'reservation'
module Hotel
class HotelController
attr_reader :reservations, :rooms
def initialize
@reservations = []
@rooms = []
(1..20).each do |room|
@rooms << room
end
end
# Wave 1
# def rooms
# return @rooms
# end

def reserve_room(start_date, end_date)
if start_date.class != Date || end_date.class != Date
raise ArgumentError.new("Please input valid dates")
else
reservation = Reservation.new(start_date, end_date)
@reservations << reservation
return reservation
end
end

def reservations(date)
reservation_list = []
@reservations.each do |reservation|
if reservation.include?(date)
reservation_list << reservation
end
end
return reservation_list
end

# # Wave 2
def available_rooms(start_date, end_date)
room_list = []
range = DateRange.new(start_date, end_date)
# start_date and end_date should be instances of class Date
taken_rooms = reservations(range)
room_list = @rooms - taken_rooms
return room_list
end
end
end
17 changes: 17 additions & 0 deletions lib/reservation.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
require_relative 'date_range'
module Hotel
class Reservation
attr_accessor :start_date, :end_date, :room_rate, :room
# Feel free to change this method signature as needed. Make sure to update the tests!
def initialize(start_date, end_date, room_rate = 200)
@start_date = start_date
@end_date = end_date
@room = room
@room_rate = room_rate
end

def cost
return DateRange.new(start_date, end_date).length_of_stay * @room_rate
end
end
end
53 changes: 53 additions & 0 deletions test/date_range_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
require_relative "test_helper"

describe Hotel::DateRange do
describe "consructor" do
it "Can be initialized with two dates" do
start_date = Date.new(2017, 01, 01)
end_date = start_date + 3

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

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

it "is an an error for negative-length ranges" do
start_date = Date.new(2017, 01, 01)
end_date = start_date - 3

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 = 0
end_date = 0
expect {Hotel::DateRange.new(start_date, end_date)}.must_raise ArgumentError
end
end

describe "overlap?" do
before do
start_date = Date.new(2017, 01, 01)
end_date = start_date + 3

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

it "returns false" do
start_date = @range.end_date
end_date = @range.end_date
test_range = Hotel::DateRange.new(start_date, end_date)

expect(@range.overlap?(test_range)).must_equal false
Comment on lines +37 to +42

Choose a reason for hiding this comment

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

This test is failing, and I'm pretty sure it's failing because of line 11 in the DateRange class.

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
end
end
54 changes: 54 additions & 0 deletions test/hotel_controller_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
require_relative "test_helper"

describe Hotel::HotelController do
before do
@hotel_controller = Hotel::HotelController.new
@date = Date.parse("2020-08-04")
end
describe "wave 1" do
describe "rooms" do
it "returns a list" do
rooms = @hotel_controller.rooms
expect(rooms).must_be_kind_of Array
end
end
describe "reserve_room" do
it "raises ArgumentError for invalid dates" do
start_date = @date
end_date = 1

expect {Hotel::HotelController.new.reserve_room(start_date, end_date)}.must_raise ArgumentError
end
it "takes two Date objects and returns a Reservation" do
start_date = @date
end_date = start_date + 3
reservation = @hotel_controller.reserve_room(start_date, end_date)
expect(reservation).must_be_kind_of Hotel::Reservation
end
end

describe "reservations" do
it "takes a Date and returns a list of Reservations" do
reservation_list = @hotel_controller.reservations(@date)

expect(reservation_list).must_be_kind_of Array
reservation_list.each do |res|
res.must_be_kind_of Reservation
end
Comment on lines +32 to +37

Choose a reason for hiding this comment

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

I don't see you putting any reservations in this list, so this test ends up passing without actually checking that the code works, if you get my meaning.

end
end
end

describe "wave 2" do
describe "available_rooms" do
it "takes two dates and returns a list" do
start_date = @date
end_date = start_date + 3

room_list = @hotel_controller.available_rooms(start_date, end_date)

expect(room_list).must_be_kind_of Array
end
end
end
end
20 changes: 20 additions & 0 deletions test/reservation_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
require_relative "test_helper"

describe Hotel::Reservation do
describe "cost" do
it "returns a number" do
start_date = Date.new(2017, 01, 01)
end_date = start_date + 3
room_rate = 200
reservation = Hotel::Reservation.new(start_date, end_date, room_rate)
expect(reservation.cost).must_be_kind_of Numeric
end
it "calculates cost accurately" do
start_date = Date.new(2017, 01, 01)
end_date = start_date + 3
room_rate = 200
reservation = Hotel::Reservation.new(start_date, end_date, room_rate)
expect(reservation.cost).must_equal 400
end
end
end
9 changes: 9 additions & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
# Add simplecov
require 'simplecov'
SimpleCov.start do
add_filter 'test/'
end
require "minitest"
require "minitest/autorun"
require "minitest/reporters"

require "date"

Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new

# require_relative your lib files here!
require_relative "../lib/hotel_controller.rb"
require_relative "../lib/reservation.rb"
require_relative "../lib/date_range.rb"