diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 000000000..49ed81a4b Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 5e1422c9c..c0ac3dc53 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ build-iPhoneSimulator/ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: .rvmrc +coverage diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..03988ec62 --- /dev/null +++ b/.vscode/launch.json @@ -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}" + } + ] +} \ No newline at end of file diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..40572c26f --- /dev/null +++ b/lib/date_range.rb @@ -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 \ No newline at end of file diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb new file mode 100644 index 000000000..0609cc498 --- /dev/null +++ b/lib/hotel_controller.rb @@ -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 \ No newline at end of file diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..5195271dc --- /dev/null +++ b/lib/reservation.rb @@ -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 \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb new file mode 100644 index 000000000..32b0cb60d --- /dev/null +++ b/test/date_range_test.rb @@ -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 + 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 \ No newline at end of file diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb new file mode 100644 index 000000000..4dacdacdf --- /dev/null +++ b/test/hotel_controller_test.rb @@ -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 + 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 \ No newline at end of file diff --git a/test/reservation_test.rb b/test/reservation_test.rb new file mode 100644 index 000000000..a8a60ee08 --- /dev/null +++ b/test/reservation_test.rb @@ -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 \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index c3a7695cf..2d3d808fc 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -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" \ No newline at end of file