-
Notifications
You must be signed in to change notification settings - Fork 40
Space - Jeta #19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Space - Jeta #19
Changes from all commits
5f0ebb0
f9cf4ea
c12e357
cf68389
b28f321
4a241fd
7e3b893
9f59a27
d908c94
4115962
f753ae9
652245b
c61ea76
d063526
9fbd3bd
7687992
2795523
ad00f10
57ccf03
3100a2c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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 | ||
|
|
||
| @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 | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
| 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 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| module Hotel | ||
| class NoRoomAvailable < StandardError | ||
| end | ||
| end |
| 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 |
| 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 |
| 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great validation here!