-
Notifications
You must be signed in to change notification settings - Fork 40
Time - Vera #36
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?
Time - Vera #36
Changes from all commits
0306f64
6ec5568
ea0b574
65a70fa
5c77079
b001173
8dfa860
f14c6d8
52f72df
d16c528
2f9c593
feac28b
9ab9811
46606d9
53f0d55
1003ece
e5f0003
513447d
54ee1ed
6ef1bab
18338dd
5537aee
4bc07a8
6754ecb
93145f2
c103e39
aa930c5
c53640c
d7bf771
4135156
b01c327
d5dfde7
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 |
|---|---|---|
|
|
@@ -48,3 +48,4 @@ build-iPhoneSimulator/ | |
|
|
||
| # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: | ||
| .rvmrc | ||
| .vscode | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| require 'date' | ||
|
|
||
| module Hotel | ||
| class DateRange | ||
| attr_accessor :start_date, :end_date | ||
|
|
||
| def initialize(start_date, end_date) | ||
| self.class.validate_date?(start_date,end_date) | ||
| @start_date = start_date | ||
| @end_date = end_date | ||
| end | ||
|
|
||
| # An input range given will not be part of any other date_range | ||
| # It returns true if there is an overlap or false if there is not. | ||
| # input_range = Hotel::DataRange instance. | ||
| def overlap?(input_range) | ||
| a = self.start_date >= input_range.end_date | ||
| b = self.end_date <= input_range.start_date | ||
| return a || b ? false : true | ||
| end | ||
|
|
||
| def nights | ||
| nights_number = (end_date - start_date).to_i | ||
| return nights_number | ||
| end | ||
|
|
||
| private | ||
| # validate_date? validates that start and end date have valid format. | ||
| # start date cannot be after the end date | ||
| # Exception raised when an invalid date range is provided | ||
| def self.validate_date?(start_date, end_date) | ||
|
|
||
| date_format = '%Y-%m-%d' | ||
| if !DateTime.strptime(start_date.to_s, date_format) || !DateTime.strptime(end_date.to_s, date_format) | ||
| raise ArgumentError | ||
| end | ||
|
|
||
| if start_date > end_date | ||
| raise ArgumentError.new("The end time is before the start time.") | ||
| end | ||
|
|
||
| if start_date - end_date == 0 | ||
| raise ArgumentError.new("Start date and end date are the same.") | ||
| end | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,90 @@ | ||
|
|
||
| module Hotel | ||
| class FrontDesk | ||
| attr_reader :rooms, :date_range, :reservations | ||
|
|
||
| def initialize | ||
| @rooms = generate_rooms | ||
| @reservations = [] | ||
| end | ||
|
|
||
| def generate_rooms | ||
| hotel_rooms = Array.new | ||
| (1..20).each do |room_id| | ||
| hotel_rooms << Room.new(room_id) | ||
| end | ||
| return hotel_rooms | ||
| end | ||
|
|
||
| def room_list | ||
| return @rooms | ||
| end | ||
|
|
||
| def total_reservations | ||
|
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. Consider whether this reader method is necessary. Would |
||
| return @reservations | ||
| end | ||
|
|
||
| # list of rooms that are not reserved for a given date range, | ||
| # so that I can see all available rooms for that day. | ||
| # It retuns an arrary with rooms with not reservations with a given date. | ||
| def get_available_rooms(date_range) | ||
| unavailable_rooms = [] | ||
| # Send the room to unavailable rooms if room has a reservation for a specific data_range. | ||
| @reservations.each do |reservation| | ||
| if reservation.daterange.overlap?(date_range) == true | ||
| unavailable_rooms << reservation.room | ||
| end | ||
| end | ||
| # Array substrating total_rooms minus unavailable rooms. | ||
| return @rooms - unavailable_rooms | ||
| end | ||
|
|
||
| # The list of reservations for a specified room and a given date range. | ||
| # room = room_i d. | ||
| # date_range = data_range instance. | ||
| # It returns an array of reservation. | ||
| def reservations_by_room_date (room_number, date_range) | ||
| # reservations_by_room contains all the reservations match | ||
| # based on the room and a given date range. | ||
| reservations_by_room = @reservations.select do |reservation| | ||
| reservation.room.room_id == room_number && | ||
| reservation.daterange.overlap?(date_range) | ||
| end | ||
| return reservations_by_room | ||
| end | ||
|
|
||
| # It returns an array with the list of reservations for a specific date. | ||
| # date = date instance. | ||
| def reservations_by_date(date) | ||
| total_by_date = @reservations.select do |reservation| | ||
|
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. Good use of an enumerable method. |
||
| reservation.daterange.start_date == date | ||
| end | ||
| return total_by_date | ||
| end | ||
|
|
||
| # Get the total cost for a given reservation | ||
| # reservation_number = reservartion_id | ||
| # It returns nil if reservation id not found. | ||
| def cost_by_reservation(reservation_number) | ||
| @reservations.each do |reservation| | ||
| if reservation.id == reservation_number | ||
| return reservation.total_cost | ||
| end | ||
| end | ||
| return nil | ||
| end | ||
|
|
||
| # Make a reservation of a room for a given date range, | ||
| # and that room will not be part of any other reservation overlapping that date range | ||
| # an exception raised if I try to reserve a room during a date range when all rooms are reserved. | ||
| def make_resevation(date_range) | ||
| available_rooms = get_available_rooms(date_range) | ||
| if available_rooms.length < 1 | ||
| raise ArgumentError | ||
|
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. Consider whether a custom exception would be appropriate here. |
||
| end | ||
| new_reservation = Hotel::Reservation.new(date_range,available_rooms[0]) | ||
| @reservations << new_reservation | ||
| return new_reservation | ||
| end | ||
| end | ||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
|
|
||
| require 'securerandom' | ||
|
|
||
| module Hotel | ||
|
|
||
| class Reservation | ||
|
|
||
| attr_reader :daterange, :room, :id | ||
|
|
||
| def initialize(daterange, room) | ||
| @daterange = daterange | ||
| @room = room | ||
| @id = generate_id | ||
| end | ||
|
|
||
| # It retuns a secureRandom ID per each reservation made. | ||
| def generate_id | ||
| return SecureRandom.hex(5) | ||
| end | ||
|
|
||
| def total_cost | ||
| return daterange.nights * @room.cost | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
|
|
||
| module Hotel | ||
| class Room | ||
| attr_reader :room_id, :capacity, :cost | ||
|
|
||
| def initialize(room_id, capacity: 2, cost: 200) | ||
| @room_id = room_id | ||
| @capacity = capacity | ||
| @cost = cost | ||
| end | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,122 @@ | ||
| require_relative "test_helper" | ||
| require 'date' | ||
|
|
||
| # The start day cannnot be in the past | ||
| describe Hotel::DateRange do | ||
|
|
||
|
|
||
| describe "Initilize" 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-lenght ranges" do | ||
| start_date = Date.new(2017, 01, 01) | ||
| end_date = Date.new(2015, 01, 01) | ||
|
|
||
| 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.new(2017, 01, 01) | ||
| end_date = Date.new(2017, 01, 01) | ||
|
|
||
| expect{ | ||
| Hotel::DateRange.new(start_date, end_date) | ||
| }.must_raise ArgumentError | ||
|
|
||
| end | ||
|
|
||
| it "raises an error for incorrect dates format" do | ||
| start_date = "" | ||
| end_date = "" | ||
|
|
||
| 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 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 range that overlaps in front." do | ||
| start_date = Date.new(2017, 01, 02) | ||
| 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 range that overlaps in the back." do | ||
| start_date = Date.new(2016, 12, 30) | ||
| end_date = start_date + 3 | ||
| test_range = Hotel::DateRange.new(start_date, end_date) | ||
|
|
||
| expect(@range.overlap?(test_range)).must_equal true | ||
| end | ||
|
|
||
| it "returns false for a range ending on the start_date date." do | ||
| start_date = Date.new(2016, 12, 30) | ||
| end_date = Date.new(2017, 01, 01) | ||
| test_range = Hotel::DateRange.new(start_date, end_date) | ||
|
|
||
| expect(@range.overlap?(test_range)).must_equal false | ||
| end | ||
|
|
||
| it "returns false for a range starting on the end_date date." do | ||
| start_date = Date.new(2017, 01, 04) | ||
| end_date = start_date + 7 | ||
| test_range = Hotel::DateRange.new(start_date, end_date) | ||
|
|
||
| expect(@range.overlap?(test_range)).must_equal false | ||
| end | ||
|
|
||
| it "returns true for a contained range." do | ||
| start_date = Date.new(2017, 01, 02) | ||
| end_date = start_date + 1 | ||
| test_range = Hotel::DateRange.new(start_date, end_date) | ||
|
|
||
| expect(@range.overlap?(test_range)).must_equal true | ||
| end | ||
| end | ||
|
|
||
| describe "nights" do | ||
| it "returns the correct number of nights" do | ||
| start_date = Date.new(2017, 01, 01) | ||
| end_date = Date.new(2017, 01, 02) | ||
|
|
||
| @range = Hotel::DateRange.new(start_date, end_date) | ||
|
|
||
| expect(@range.nights).must_be_kind_of Integer | ||
| expect(@range.nights).must_equal 1 | ||
|
|
||
| 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.
Good use of a helper method.