-
Notifications
You must be signed in to change notification settings - Fork 40
Space - Antonia #41
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 - Antonia #41
Changes from all commits
eb2b17b
a898987
f6b896a
b659188
cdefed6
c46f2dc
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 | ||
| coverage | ||
| 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}" | ||
| } | ||
| ] | ||
| } |
| 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 | ||
| end | ||
| end | ||
| end | ||
| 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 |
| 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 |
| 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
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. 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 | ||
| 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
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. 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 | ||
| 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 |
| 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" |
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.
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.