From a2c2c4de7b1568d68c3bf16d814357854df1be93 Mon Sep 17 00:00:00 2001 From: Dan Roberts Date: Thu, 25 Jul 2019 15:57:31 -0700 Subject: [PATCH 01/24] Build design scaffolding --- README.md | 1 - lib/date_range.rb | 20 +++++++++ lib/hotel_controller.rb | 24 +++++++++++ lib/reservation.rb | 11 +++++ spec/date_range_spec.rb | 78 +++++++++++++++++++++++++++++++++++ spec/hotel_controller_spec.rb | 42 +++++++++++++++++++ spec/reservation_spec.rb | 12 ++++++ spec/spec_helper.rb | 13 ++++-- 8 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 lib/date_range.rb create mode 100644 lib/hotel_controller.rb create mode 100644 lib/reservation.rb create mode 100644 spec/date_range_spec.rb create mode 100644 spec/hotel_controller_spec.rb create mode 100644 spec/reservation_spec.rb diff --git a/README.md b/README.md index 07dc42bcf..db6077382 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ Reinforce and practice all of the Ruby and programming concepts we've covered in This is a [stage 3](https://github.com/Ada-Developers-Academy/pedagogy/blob/master/rule-of-three.md), individual project. - ## Introduction Your company has been contracted to build a booking system for a small hotel. This system will be used by employees working at the front desk, and will not be available to the general public. diff --git a/lib/date_range.rb b/lib/date_range.rb new file mode 100644 index 000000000..da2197f22 --- /dev/null +++ b/lib/date_range.rb @@ -0,0 +1,20 @@ +module Hotel + class DateRange + attr_accessor :start_date, :end_date + + def initialize(start_date, end_date) + end + + def overlap?(other) + return false + end + + def include?(date) + return false + end + + def nights + return 3 + end + end +end diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb new file mode 100644 index 000000000..accca6de4 --- /dev/null +++ b/lib/hotel_controller.rb @@ -0,0 +1,24 @@ +module Hotel + class HotelController + # Wave 1 + def rooms + # You might want to replace this method with an attr_reader + return [] + end + + def reserve_room(start_date, end_date) + # start_date and end_date should be instances of class Date + return Reservation.new(start_date, end_date, nil) + end + + def reservations(date) + return [] + end + + # Wave 2 + def available_rooms(start_date, end_date) + # start_date and end_date should be instances of class Date + return [] + end + end +end diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..7587837e7 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,11 @@ +module Hotel + class Reservation + # Feel free to change this method signature as needed. Make sure to update the tests! + def initialize(start_date, end_date, room) + end + + def cost + return 3 + end + end +end diff --git a/spec/date_range_spec.rb b/spec/date_range_spec.rb new file mode 100644 index 000000000..7c155a0b1 --- /dev/null +++ b/spec/date_range_spec.rb @@ -0,0 +1,78 @@ +require_relative "spec_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 + + xit "is an an error for negative-lenght ranges" do + end + + xit "is an error to create a 0-length range" do + 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 + + xit "returns true for a contained range" do + end + + xit "returns true for a range that overlaps in front" do + end + + xit "returns true for a range that overlaps in the back" do + end + + xit "returns true for a containing range" do + end + + xit "returns false for a range starting on the end_date date" do + end + + xit "returns false for a range ending on the start_date date" do + end + + xit "returns false for a range completely before" do + end + + xit "returns false for a date completely after" do + end + end + + xdescribe "include?" do + it "reutrns false if the date is clearly out" do + end + + it "returns true for dates in the range" do + end + + it "returns false for the end_date date" do + end + end + + xdescribe "nights" do + it "returns the correct number of nights" do + end + end +end diff --git a/spec/hotel_controller_spec.rb b/spec/hotel_controller_spec.rb new file mode 100644 index 000000000..5f6cbe264 --- /dev/null +++ b/spec/hotel_controller_spec.rb @@ -0,0 +1,42 @@ +require_relative "spec_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 "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 + end + end +end diff --git a/spec/reservation_spec.rb b/spec/reservation_spec.rb new file mode 100644 index 000000000..a3be669c0 --- /dev/null +++ b/spec/reservation_spec.rb @@ -0,0 +1,12 @@ +require_relative "spec_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 + reservation = Hotel::Reservation.new(start_date, end_date, nil) + expect(reservation.cost).must_be_kind_of Numeric + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4d1e3fdc8..f4a246774 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,8 +1,15 @@ -require 'minitest' -require 'minitest/autorun' -require 'minitest/reporters' # Add simplecov +require "date" + +require "minitest" +require "minitest/autorun" +require "minitest/reporters" +require "minitest/skip_dsl" + 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" From df7c9b8a5ef7ed5ad1668f131c9a12502b7346e0 Mon Sep 17 00:00:00 2001 From: Dan Roberts Date: Thu, 25 Jul 2019 16:12:22 -0700 Subject: [PATCH 02/24] Update notes about design scaffolding --- design-scaffolding-notes.md | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 design-scaffolding-notes.md diff --git a/design-scaffolding-notes.md b/design-scaffolding-notes.md new file mode 100644 index 000000000..250bacd3b --- /dev/null +++ b/design-scaffolding-notes.md @@ -0,0 +1,38 @@ +# Hotel Design Scaffolding + +## Purpose + +This scaffolding is intended for students who are feeling overwhelmed by the open-ended nature of the Hotel project. Its goal is to answer some of the initial questions about how project files should be laid out, so that students can focus on designing the object interactions and complex Ruby logic that are the core learning goals of the project. The hope is to do so without removing too much of the interesting design work. + +This document and the associated code is intended to be student-facing - if you have a student you think would benefit from this, send them a link! + +### What it includes + +- Three class stubs, `HotelController`, `Reservation` and `DateRange` +- Stubs for public methods of each class from waves 1 and 2, as described in the user stories +- "Interface" tests for each class method that invoke it with the right parameters and verify the return type +- Full test stubs for the `DateRange` class + +### What it does not include + +- Opinions about how classes should interact or data should be stored +- Opinions about whether there should be a `Room` class, or whether it should know about `Reservation`s +- Private helper methods to keep code organized + +Students should feel free to modify any code as they see fit, including changing method signatures, adding new classes and methods, reordering things, not looking at the `DateRange` tests because they want to give it a shot on their own, etc. + +## How to use this code + +Design scaffolding code lives on the `design-scaffolding` branch. + +You can use this code either as inspiration, or as a starting point. If using it as an inspiration, it follows our standard project layout, with product code under `lib/` and tests under `spec/`. + +If you choose to use the code on this branch as a starting point, follow these steps to start your project: + +``` +$ git clone +$ cd hotel +$ git merge design-scaffolding +``` + +You can try to merge in the design scaffolding after you've started, but you'll probably end up with merge conflicts. See an instructor if you're not able to resolve them yourself. \ No newline at end of file From a673135ffa12e9d39db8e0dbd8a3f7c32307ab49 Mon Sep 17 00:00:00 2001 From: Dan Roberts Date: Thu, 25 Jul 2019 16:25:51 -0700 Subject: [PATCH 03/24] Add interface test for HotelController#available_rooms --- spec/hotel_controller_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/hotel_controller_spec.rb b/spec/hotel_controller_spec.rb index 5f6cbe264..daf78c0b3 100644 --- a/spec/hotel_controller_spec.rb +++ b/spec/hotel_controller_spec.rb @@ -37,6 +37,14 @@ 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 From d5489c477d86ced2d300979fe4d76bcf94ca1fb9 Mon Sep 17 00:00:00 2001 From: Dan Roberts Date: Mon, 29 Jul 2019 12:36:36 -0700 Subject: [PATCH 04/24] Correct branch name for merge instructions --- design-scaffolding-notes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/design-scaffolding-notes.md b/design-scaffolding-notes.md index 250bacd3b..141f71585 100644 --- a/design-scaffolding-notes.md +++ b/design-scaffolding-notes.md @@ -32,7 +32,7 @@ If you choose to use the code on this branch as a starting point, follow these s ``` $ git clone $ cd hotel -$ git merge design-scaffolding +$ git merge origin/design-scaffolding ``` -You can try to merge in the design scaffolding after you've started, but you'll probably end up with merge conflicts. See an instructor if you're not able to resolve them yourself. \ No newline at end of file +You can try to merge in the design scaffolding after you've started, but you'll probably end up with merge conflicts. See an instructor if you're not able to resolve them yourself. From b454eb19d613f4a9d2286c05828993014bbac19b Mon Sep 17 00:00:00 2001 From: Kaida Masaki Date: Thu, 5 Sep 2019 10:48:32 -0700 Subject: [PATCH 05/24] spec -> test --- Guardfile | 6 +++--- README.md | 4 ++-- Rakefile | 2 +- design-scaffolding-notes.md | 2 +- spec/date_range_spec.rb => test/date_range_test.rb | 2 +- .../hotel_controller_test.rb | 2 +- spec/reservation_spec.rb => test/reservation_test.rb | 2 +- spec/spec_helper.rb => test/test_helper.rb | 0 8 files changed, 10 insertions(+), 10 deletions(-) rename spec/date_range_spec.rb => test/date_range_test.rb (98%) rename spec/hotel_controller_spec.rb => test/hotel_controller_test.rb (97%) rename spec/reservation_spec.rb => test/reservation_test.rb (90%) rename spec/spec_helper.rb => test/test_helper.rb (100%) diff --git a/Guardfile b/Guardfile index fa59fc3ef..020b42bd9 100644 --- a/Guardfile +++ b/Guardfile @@ -1,6 +1,6 @@ guard :minitest, bundler: false, autorun: false, rubygems: false do # with Minitest::Spec - watch(%r{^spec/(.*)_spec\.rb$}) - watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } - watch(%r{^spec/spec_helper\.rb$}) { 'spec' } + watch(%r{^test/(.*)_test\.rb$}) + watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" } + watch(%r{^test/test_helper\.rb$}) { 'test' } end diff --git a/README.md b/README.md index ed9c1abc0..0e6bd85d4 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ This project is both a culmination of our Intro to Ruby unit and our first stage ## Getting Started -We will use the same project structure we used for the previous project. Library code (such as classes) should be in files in the `lib` folder, and tests should be in files in the `spec` folder. +We will use the same project structure we used for the previous project. Library code (such as classes) should be in files in the `lib` folder, and tests should be in files in the `test` folder. 1. Fork this repository in GitHub 1. Clone the repository to your computer @@ -139,7 +139,7 @@ If you are not familiar with what a block of hotel rooms, here is a brief descri ### Testing Requirements -- Utilize the spec helper file +- Utilize the test helper file - Run tests automatically whenever files are added or changed using the `guard` command - The final project submission should have **95% code coverage** using `simplecov` diff --git a/Rakefile b/Rakefile index 372ce806f..0c2d13fe8 100644 --- a/Rakefile +++ b/Rakefile @@ -3,7 +3,7 @@ require 'rake/testtask' Rake::TestTask.new do |t| t.libs = ["lib"] t.warning = true - t.test_files = FileList['spec/*_spec.rb'] + t.test_files = FileList['test/*_test.rb'] end task default: :test diff --git a/design-scaffolding-notes.md b/design-scaffolding-notes.md index 141f71585..143651531 100644 --- a/design-scaffolding-notes.md +++ b/design-scaffolding-notes.md @@ -25,7 +25,7 @@ Students should feel free to modify any code as they see fit, including changing Design scaffolding code lives on the `design-scaffolding` branch. -You can use this code either as inspiration, or as a starting point. If using it as an inspiration, it follows our standard project layout, with product code under `lib/` and tests under `spec/`. +You can use this code either as inspiration, or as a starting point. If using it as an inspiration, it follows our standard project layout, with product code under `lib/` and tests under `test/`. If you choose to use the code on this branch as a starting point, follow these steps to start your project: diff --git a/spec/date_range_spec.rb b/test/date_range_test.rb similarity index 98% rename from spec/date_range_spec.rb rename to test/date_range_test.rb index 7c155a0b1..70bd65115 100644 --- a/spec/date_range_spec.rb +++ b/test/date_range_test.rb @@ -1,4 +1,4 @@ -require_relative "spec_helper" +require_relative "test_helper" describe Hotel::DateRange do describe "consructor" do diff --git a/spec/hotel_controller_spec.rb b/test/hotel_controller_test.rb similarity index 97% rename from spec/hotel_controller_spec.rb rename to test/hotel_controller_test.rb index daf78c0b3..bd50dece0 100644 --- a/spec/hotel_controller_spec.rb +++ b/test/hotel_controller_test.rb @@ -1,4 +1,4 @@ -require_relative "spec_helper" +require_relative "test_helper" describe Hotel::HotelController do before do diff --git a/spec/reservation_spec.rb b/test/reservation_test.rb similarity index 90% rename from spec/reservation_spec.rb rename to test/reservation_test.rb index a3be669c0..ec4204774 100644 --- a/spec/reservation_spec.rb +++ b/test/reservation_test.rb @@ -1,4 +1,4 @@ -require_relative "spec_helper" +require_relative "test_helper" describe Hotel::Reservation do describe "cost" do diff --git a/spec/spec_helper.rb b/test/test_helper.rb similarity index 100% rename from spec/spec_helper.rb rename to test/test_helper.rb From 5717d12568cd5740a4968112cfcd6f2a122ce0a7 Mon Sep 17 00:00:00 2001 From: dee <30602862+tildeee@users.noreply.github.com> Date: Tue, 25 Feb 2020 10:59:56 -0800 Subject: [PATCH 06/24] conforms the text to imply more of an activity --- design-scaffolding-notes.md | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/design-scaffolding-notes.md b/design-scaffolding-notes.md index 143651531..8bdd8abe8 100644 --- a/design-scaffolding-notes.md +++ b/design-scaffolding-notes.md @@ -1,10 +1,18 @@ # Hotel Design Scaffolding -## Purpose +## How to Read This Scaffolding to Create a Second Draft -This scaffolding is intended for students who are feeling overwhelmed by the open-ended nature of the Hotel project. Its goal is to answer some of the initial questions about how project files should be laid out, so that students can focus on designing the object interactions and complex Ruby logic that are the core learning goals of the project. The hope is to do so without removing too much of the interesting design work. +This scaffolding is one solution that answers some of the initial questions about how project files can be laid out. -This document and the associated code is intended to be student-facing - if you have a student you think would benefit from this, send them a link! +Use GitHub.com to explore the files that exist on this repo. + - What classes exist? + - Why? What are they named, what do they represent, and what state and behavior do they have? + - What tests exist? + - What parts of this design inspires you, and you want to steal? + - What parts of this design are you unsure about, and need to consider again later? + - What parts of this design do you think you can do without? + +Spend **no more than 1 hour** answering those questions and adjusting your project's first draft design. After one hour, get started; don't forget that a useful skill for the programmer is the ability to get started, and adjust in small ways often. ### What it includes @@ -27,12 +35,15 @@ Design scaffolding code lives on the `design-scaffolding` branch. You can use this code either as inspiration, or as a starting point. If using it as an inspiration, it follows our standard project layout, with product code under `lib/` and tests under `test/`. -If you choose to use the code on this branch as a starting point, follow these steps to start your project: +If you choose to use the code on this branch as a starting point, you can either: -``` -$ git clone -$ cd hotel -$ git merge origin/design-scaffolding -``` +1. Copy and paste each file from this project into your existing `hotel` folder +2. Or start your project anew with the following steps: -You can try to merge in the design scaffolding after you've started, but you'll probably end up with merge conflicts. See an instructor if you're not able to resolve them yourself. + ``` + $ git clone + $ cd hotel + $ git merge origin/design-scaffolding + ``` + + - Note: You can try to merge in the design scaffolding after you've started, but you'll probably end up with merge conflicts. See an instructor if you're not able to resolve them yourself. From e7381218b450d3d17866d033abfef4ccee3b1ce8 Mon Sep 17 00:00:00 2001 From: dee <30602862+tildeee@users.noreply.github.com> Date: Tue, 25 Feb 2020 11:06:37 -0800 Subject: [PATCH 07/24] direct link to this repo and branch --- design-scaffolding-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/design-scaffolding-notes.md b/design-scaffolding-notes.md index 8bdd8abe8..8efb3d487 100644 --- a/design-scaffolding-notes.md +++ b/design-scaffolding-notes.md @@ -4,7 +4,7 @@ This scaffolding is one solution that answers some of the initial questions about how project files can be laid out. -Use GitHub.com to explore the files that exist on this repo. +Use [this view of our branch on GitHub.com](https://github.com/AdaGold/hotel/tree/design-scaffolding) to explore the files that exist on this repo. - What classes exist? - Why? What are they named, what do they represent, and what state and behavior do they have? - What tests exist? From c6c1817b463a8ff9a67eba6733389b45198d05ce Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Thu, 5 Mar 2020 12:38:03 -0800 Subject: [PATCH 08/24] Added all 4 classes and tests were passed --- lib/date_range.rb | 26 ++++++++--- lib/hotel_controller.rb | 31 ++++++++----- lib/reservation.rb | 15 +++++-- lib/room.rb | 15 +++++++ test/date_range_test.rb | 83 +++++++++++++++++++++++++++++------ test/hotel_controller_test.rb | 24 +++++++--- test/reservation_test.rb | 26 +++++++++-- test/room_test.rb | 32 ++++++++++++++ 8 files changed, 208 insertions(+), 44 deletions(-) create mode 100644 lib/room.rb create mode 100644 test/room_test.rb diff --git a/lib/date_range.rb b/lib/date_range.rb index da2197f22..2b05c47c5 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -3,18 +3,32 @@ class DateRange attr_accessor :start_date, :end_date def initialize(start_date, end_date) + unless start_date.instance_of?(Date) || end_date.instance_of?(Date) + raise ArgumentError.new("start_date and end_date have to be a date type") + end + + if end_date < start_date + raise ArgumentError.new("The end_date cannot be less than start_end") + end + + if start_date == end_date + raise ArgumentError.new("The start_date cannot be the same as end_date") + end + @start_date = start_date + @end_date = end_date end - def overlap?(other) - return false + def overlap?(other) #other is another instance of date_range + start_date < other.end_date && other.start_date < end_date end - def include?(date) - return false + def include?(date) + start_date <= date && end_date > date end - def nights - return 3 + def count_nights + total_nights = (end_date - start_date).to_i + return total_nights end end end diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index accca6de4..eed6fee81 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -1,18 +1,29 @@ module Hotel class HotelController - # Wave 1 - def rooms - # You might want to replace this method with an attr_reader - return [] + attr_reader :rooms + attr_accessor :reservations + def initialize + @rooms = Array.new(20){|i| Hotel::Room.new(i+1)} + @reservations = [] end + + # Wave 1 + # def rooms + # @hotel_controller = Hotel::HotelController.new + # room_list = @hotel_controller.rooms + # return room_list + # end - def reserve_room(start_date, end_date) - # start_date and end_date should be instances of class Date - return Reservation.new(start_date, end_date, nil) - end + # def reserve_room(start_date, end_date) + # # start_date and end_date should be instances of class Date + # return Reservation.new(start_date, end_date, nil) + # end - def reservations(date) - return [] + def reservations_list(date) + reservation_list = reservations.select do |res| + res.date_range.include?(date) + end + return reservation_list end # Wave 2 diff --git a/lib/reservation.rb b/lib/reservation.rb index 7587837e7..c194d5607 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,11 +1,20 @@ +require 'date' module Hotel class Reservation - # Feel free to change this method signature as needed. Make sure to update the tests! - def initialize(start_date, end_date, room) + attr_reader :id, :start_date, :end_date, :room, :date_range + def initialize(id,date_range,room) + unless id.instance_of?(Integer) && id >0 + raise ArgumentError.new("Id must be a positive integer") + end + @id = id + @start_date = start_date + @end_date = end_date + @date_range = date_range + @room = room end def cost - return 3 + total_cost = date_range.count_nights * 200 end end end diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..db7d5e396 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,15 @@ +module Hotel + class Room + attr_reader :id, :cost + def initialize(id, cost = 200) + unless id.instance_of?(Integer) && id >0 + raise ArgumentError.new("Id must be a positive integer") + end + unless cost.instance_of?(Integer) && cost >= 0 + raise ArgumentError.new("cost must be a positive value") + end + @id = id + @cost = cost + end + end +end \ No newline at end of file diff --git a/test/date_range_test.rb b/test/date_range_test.rb index 70bd65115..719d9f105 100644 --- a/test/date_range_test.rb +++ b/test/date_range_test.rb @@ -3,7 +3,7 @@ describe Hotel::DateRange do describe "consructor" do it "Can be initialized with two dates" do - start_date = Date.new(2017, 01, 01) + start_date = Date.today end_date = start_date + 3 range = Hotel::DateRange.new(start_date, end_date) @@ -12,16 +12,22 @@ expect(range.end_date).must_equal end_date end - xit "is an an error for negative-lenght ranges" do + it "is an an error for negative-lenght ranges" do + start_date = Date.new(2017, 01, 01) + end_date = start_date -2 + expect{Hotel::DateRange.new(start_date, end_date)}.must_raise ArgumentError end - xit "is an error to create a 0-length range" do + it "is an error to create a 0-length range" do + start_date = Date.today + end_date = Date.today + 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) + start_date = Date.new(2017, 02, 01) end_date = start_date + 3 @range = Hotel::DateRange.new(start_date, end_date) @@ -35,44 +41,93 @@ expect(@range.overlap?(test_range)).must_equal true end - xit "returns true for a contained range" do + it "returns true for a contained range" do + start_date = Date.new(2017, 01, 20) + end_date = start_date + 30 + test_range = Hotel::DateRange.new(start_date, end_date) + expect(@range.overlap?(test_range)).must_equal true end - xit "returns true for a range that overlaps in front" do + it "returns true for a range that overlaps in front" do + start_date = Date.new(2017, 01, 20) + end_date = Date.new(2017, 02, 02) + test_range = Hotel::DateRange.new(start_date, end_date) + expect(@range.overlap?(test_range)).must_equal true end - xit "returns true for a range that overlaps in the back" do + it "returns true for a range that overlaps in the back" do + start_date = Date.new(2017, 02, 02) + end_date = start_date + 10 + test_range = Hotel::DateRange.new(start_date, end_date) + expect(@range.overlap?(test_range)).must_equal true end - xit "returns true for a containing range" do + it "returns true for a containing range" do + start_date = Date.new(2017, 02, 02) + end_date = start_date + 1 + test_range = Hotel::DateRange.new(start_date, end_date) + expect(@range.overlap?(test_range)).must_equal true end - xit "returns false for a range starting on the end_date date" do + it "returns false for a range starting on the end_date date" do + start_date = Date.new(2017, 02, 04) + end_date = start_date + 10 + test_range = Hotel::DateRange.new(start_date, end_date) + expect(@range.overlap?(test_range)).must_equal false end - xit "returns false for a range ending on the start_date date" do + it "returns false for a range ending on the start_date date" do + start_date = Date.new(2017, 01, 28) + end_date = Date.new(2017, 02, 01) + test_range = Hotel::DateRange.new(start_date, end_date) + expect(@range.overlap?(test_range)).must_equal false end - xit "returns false for a range completely before" do + it "returns false for a range completely before" do + start_date = Date.new(2017, 01, 20) + end_date = start_date + 2 + test_range = Hotel::DateRange.new(start_date, end_date) + expect(@range.overlap?(test_range)).must_equal false + end - xit "returns false for a date completely after" do + it "returns false for a date completely after" do + start_date = Date.new(2017, 02, 15) + end_date = start_date + 5 + test_range = Hotel::DateRange.new(start_date, end_date) + expect(@range.overlap?(test_range)).must_equal false end end - xdescribe "include?" do + describe "include?" do + before do + start_date = Date.new(2017, 02, 01) + end_date = start_date + 3 + @range = Hotel::DateRange.new(start_date, end_date) + end it "reutrns false if the date is clearly out" do + test_date = Date.new(2017, 03, 01) + expect(@range.include?(test_date)).must_equal false end it "returns true for dates in the range" do + test_date = Date.new(2017, 02, 02) + expect(@range.include?(test_date)).must_equal true end it "returns false for the end_date date" do + test_date = Date.new(2017, 02, 04) + expect(@range.include?(test_date)).must_equal false end end - xdescribe "nights" do + describe "count_nights" do it "returns the correct number of nights" do + start_date = Date.new(2017, 02, 01) + end_date = start_date + 3 + range = Hotel::DateRange.new(start_date, end_date) + expect(range.count_nights).must_equal 3 + expect(range.count_nights).must_be_kind_of Integer end end end diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index bd50dece0..0c55ecf2c 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -1,19 +1,29 @@ require_relative "test_helper" -describe Hotel::HotelController do +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 + describe "initializer" do + it "Creates an instance of hotel controler" do + @hotel_controller.must_be_kind_of Hotel::HotelController + end + + it "create the rooms" do rooms = @hotel_controller.rooms expect(rooms).must_be_kind_of Array end + + it "create 20 rooms" do + rooms = @hotel_controller.rooms + expect(rooms.length).must_equal 20 + end end + describe "reserve_room" do - it "takes two Date objects and returns a Reservation" do + xit "takes two Date objects and returns a Reservation" do start_date = @date end_date = start_date + 3 @@ -25,11 +35,11 @@ describe "reservations" do it "takes a Date and returns a list of Reservations" do - reservation_list = @hotel_controller.reservations(@date) + reservation_list = @hotel_controller.reservations_list(@date) expect(reservation_list).must_be_kind_of Array reservation_list.each do |res| - res.must_be_kind_of Reservation + res.must_be_kind_of Hotel::Reservation end end end @@ -37,7 +47,7 @@ describe "wave 2" do describe "available_rooms" do - it "takes two dates and returns a list" do + xit "takes two dates and returns a list" do start_date = @date end_date = start_date + 3 diff --git a/test/reservation_test.rb b/test/reservation_test.rb index ec4204774..f633a60a0 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -1,12 +1,30 @@ require_relative "test_helper" +require 'date' + describe Hotel::Reservation do + before do + room = Hotel::Room.new(1, 200) + start_date = Date.today + end_date = start_date + 3 + date_range = Hotel::DateRange.new(start_date,end_date) + @reservation = Hotel::Reservation.new(1, date_range,room) + end + describe "#initialize" do + it 'Create an instance of reservation' do + expect(@reservation).must_be_kind_of Hotel::Reservation + end + + it 'Keep track of reservation_id' do + expect(@reservation.id).must_equal 1 + end + end + describe "cost" do it "returns a number" do - start_date = Date.new(2017, 01, 01) - end_date = start_date + 3 - reservation = Hotel::Reservation.new(start_date, end_date, nil) - expect(reservation.cost).must_be_kind_of Numeric + expect(@reservation.room.cost).must_equal 200 + expect(@reservation.cost).must_be_kind_of Numeric + expect(@reservation.cost).must_equal 600 end end end diff --git a/test/room_test.rb b/test/room_test.rb new file mode 100644 index 000000000..c4d210f87 --- /dev/null +++ b/test/room_test.rb @@ -0,0 +1,32 @@ +require_relative "test_helper" +require 'date' + +describe "Room" do + describe "#initialize" do + it 'Create an instance of Room' do + room = Hotel::Room.new(1, 200) + room.must_be_kind_of Hotel::Room + end + + it 'Keeps track of room_id' do + id = 1 + room = Hotel::Room.new(id, 200) + room.must_respond_to :id + room.id.must_equal id + end + + it 'Keeps track of cost' do + id = 1 + cost = 200 + room = Hotel::Room.new(id, cost) + room.must_respond_to :cost + room.cost.must_equal cost + end + + it 'raise ArgumentError when id is a negative number' do + expect{Hotel::Room.new(-2, 200)}.must_raise ArgumentError + end + end +end + + From 71b8182ce825318137705565401331fde07381a6 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Thu, 5 Mar 2020 17:26:21 -0800 Subject: [PATCH 09/24] finished reserve_room methods, created tests, and passed all the tests --- lib/hotel_controller.rb | 71 ++++++++++++++++++++++++++++++----- test/hotel_controller_test.rb | 52 ++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 10 deletions(-) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index eed6fee81..7178bb8b8 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -8,17 +8,64 @@ def initialize end # Wave 1 - # def rooms - # @hotel_controller = Hotel::HotelController.new - # room_list = @hotel_controller.rooms - # return room_list - # end - # def reserve_room(start_date, end_date) - # # start_date and end_date should be instances of class Date - # return Reservation.new(start_date, end_date, nil) - # end + # Access the list of all of the rooms in the hotel + def self.rooms + room_list = HotelController.rooms + return room_list + end + + # Access the list of reservations for a specified room and a given date range + def reservations_list_room_and_date(given_room, given_date_range) + reservations_list_of_given_room_date_range = reservations.select do |res| + res.date_range.overlap?(given_date_range) && res.room == given_room + end + return reservations_list_of_given_room_date_range + end + + # Add reservation + def add_reservation(reservation) + @reservations << reservation + end + + # Create the new reservation + def reserve_room(start_date, end_date) + # start_date and end_date should be instances of class Date + given_date_range = Hotel::DateRange.new(start_date, end_date) + reservations_list = reservations.select do |res| + res.date_range.overlap?(given_date_range) + end + all_reserved_rooms = reservations_list.map do |res| + res.room + end + + avialable_room = nil + rooms.each do |room| + if !(all_reserved_rooms).include?(room) + avialable_room = room + break # stop when find an avialable_room + end + end + + if avialable_room == nil + raise ArgumentError.new " no room" + end + + id = reservations.length + 1 + reservation = Reservation.new(id,given_date_range, avialable_room) + self.add_reservation(reservation) + return reservation + + end + + + # access the list of reservations for a specified room and a given date range + + + + + # access the list of reservations for a specific date, so that I can track reservations by date def reservations_list(date) reservation_list = reservations.select do |res| res.date_range.include?(date) @@ -26,6 +73,12 @@ def reservations_list(date) return reservation_list end + # can get the total cost for a given reservation + + + + # want exception raised when an invalid date range is provided, + # so that I can't make a reservation for an invalid date range # Wave 2 def available_rooms(start_date, end_date) # start_date and end_date should be instances of class Date diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 0c55ecf2c..6b0fa0fed 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -21,9 +21,24 @@ expect(rooms.length).must_equal 20 end end + describe "reservations_list_room_and_date" do + it "return a reservation list for a specified room and a given date range" do + room = Hotel::Room.new(1, 200) + start_date = Date.today + end_date = start_date + 3 + date_range = Hotel::DateRange.new(start_date,end_date) + # @reservation = Hotel::Reservation.new(1, date_range,room) + reservations_list_of_given_room_date_range = @hotel_controller.reservations_list_room_and_date(room, date_range) + + expect(reservations_list_of_given_room_date_range).must_be_kind_of Array + reservations_list_of_given_room_date_range.each do |res| + res.must_be_kind_of Hotel::Reservation + end + end + end describe "reserve_room" do - xit "takes two Date objects and returns a Reservation" do + it "takes two Date objects and returns a Reservation" do start_date = @date end_date = start_date + 3 @@ -31,6 +46,41 @@ expect(reservation).must_be_kind_of Hotel::Reservation end + + it "The ability to reserve room when there are reservations with the same start_date and end_date" do + #Arrange + start_date = Date.today + end_date = start_date + 4 + reservation1 = @hotel_controller.reserve_room(start_date, end_date) + + # Action + reservation2 = @hotel_controller.reserve_room(start_date, end_date) + + + # Assertion + expect(@hotel_controller.reservations.length).must_equal 2 + expect(reservation2.room.id).must_equal 2 + end + + it " ########" do + start_date = Date.today + end_date = start_date + 4 + + num_room = 0 + while num_room < 20 do + @hotel_controller.reserve_room(start_date, end_date) + num_room +=1 + end + + # Action + # reservation21 = @hotel_controller.reserve_room(start_date, end_date) + # p reservation21.room + + expect{(@hotel_controller.reserve_room(start_date, end_date))}.must_raise ArgumentError + + end + + end describe "reservations" do From 2f86780bbd65fd613f213c49a820b828b5eed079 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Thu, 5 Mar 2020 22:56:35 -0800 Subject: [PATCH 10/24] Finished wave 1 --- lib/hotel_controller.rb | 56 ++++++++++++++++++++--------- lib/reservation.rb | 4 +-- test/hotel_controller_test.rb | 68 ++++++++++++++++++++++++++++------- 3 files changed, 96 insertions(+), 32 deletions(-) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 7178bb8b8..06001a000 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -23,14 +23,13 @@ def reservations_list_room_and_date(given_room, given_date_range) return reservations_list_of_given_room_date_range end - # Add reservation + # Add reservation to the list of the reservations def add_reservation(reservation) @reservations << reservation end # Create the new reservation def reserve_room(start_date, end_date) - # start_date and end_date should be instances of class Date given_date_range = Hotel::DateRange.new(start_date, end_date) reservations_list = reservations.select do |res| res.date_range.overlap?(given_date_range) @@ -51,21 +50,13 @@ def reserve_room(start_date, end_date) raise ArgumentError.new " no room" end - id = reservations.length + 1 reservation = Reservation.new(id,given_date_range, avialable_room) self.add_reservation(reservation) return reservation - end - - - # access the list of reservations for a specified room and a given date range - - - - # access the list of reservations for a specific date, so that I can track reservations by date + # Access the list of reservations for a specific date, so that I can track reservations by date def reservations_list(date) reservation_list = reservations.select do |res| res.date_range.include?(date) @@ -74,15 +65,48 @@ def reservations_list(date) end # can get the total cost for a given reservation + def total_cost(reservation) + total_cost = reservation.cost + return total_cost + end + # Wave 2 - # want exception raised when an invalid date range is provided, - # so that I can't make a reservation for an invalid date range - # Wave 2 + # I can view a list of rooms that are not reserved for a given date range, + # so that I can see all available rooms for that day def available_rooms(start_date, end_date) - # start_date and end_date should be instances of class Date - return [] + given_date_range = Hotel::DateRange.new(start_date, end_date) + # get the reservations_list for the given date range + reservations_list = reservations.select do |res| + res.date_range.overlap?(given_date_range) + end + # get all the room that have been reserved for the given date range + all_reserved_rooms = reservations_list.map do |res| + res.room + end + # find the aviable_rooms_list + aviable_rooms_list = rooms.map do |room| + if !(all_reserved_rooms).include?(room) + avialable_room = room + end + end + return aviable_rooms_list end + + + + + end end + + + + # I can 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 + + + # I want an exception raised if I try to reserve a room during a date range when all rooms are reserved, + # so that I cannot make two reservations for the same room that overlap by date + diff --git a/lib/reservation.rb b/lib/reservation.rb index c194d5607..95b3584dd 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,14 +1,12 @@ require 'date' module Hotel class Reservation - attr_reader :id, :start_date, :end_date, :room, :date_range + attr_reader :id, :room, :date_range def initialize(id,date_range,room) unless id.instance_of?(Integer) && id >0 raise ArgumentError.new("Id must be a positive integer") end @id = id - @start_date = start_date - @end_date = end_date @date_range = date_range @room = room end diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 6b0fa0fed..5b8504f1c 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -22,18 +22,52 @@ end end describe "reservations_list_room_and_date" do - it "return a reservation list for a specified room and a given date range" do + it "when there is no reservation, retrun a empty reservation list for a specified room and a given date range" do room = Hotel::Room.new(1, 200) start_date = Date.today end_date = start_date + 3 - date_range = Hotel::DateRange.new(start_date,end_date) - # @reservation = Hotel::Reservation.new(1, date_range,room) - reservations_list_of_given_room_date_range = @hotel_controller.reservations_list_room_and_date(room, date_range) + date_range = Hotel::DateRange.new(start_date,end_date) + reservations_list = @hotel_controller.reservations_list_room_and_date(room,date_range) + + expect(reservations_list).must_equal [] + end + it "return a reservation list for a specified room and a given date range" do + # reservation with date_range1 + room = Hotel::Room.new(1, 200) + start_date1 = Date.new(2017, 01, 03) + end_date1 = start_date1 + 3 + date_range1 = Hotel::DateRange.new(start_date1,end_date1) + reservation1 = Hotel::Reservation.new(1, date_range1,room) + @hotel_controller.add_reservation(reservation1) + + puts + # reservation with data_range2 + room = Hotel::Room.new(1, 200) + start_date2 = Date.new(2017, 01, 10) + end_date2 = start_date2 + 4 + date_range2 = Hotel::DateRange.new(start_date2,end_date2) + reservation2 = Hotel::Reservation.new(1, date_range2,room) + @hotel_controller.add_reservation(reservation2) + print @hotel_controller.reservations + puts + puts + puts @hotel_controller.reservations.length + # test_date_range + test_start_date = Date.new(2017, 01, 01) + test_end_date = test_start_date + 30 + test_date_range = Hotel::DateRange.new(test_start_date,test_end_date) + # we expect to return a list of reservations of the same rooms with different date_ranges + reservations_list_of_given_room_date_range = @hotel_controller.reservations_list_room_and_date(room, test_date_range) + # print reservations_list_of_given_room_date_range + + print reservations_list_of_given_room_date_range expect(reservations_list_of_given_room_date_range).must_be_kind_of Array reservations_list_of_given_room_date_range.each do |res| res.must_be_kind_of Hotel::Reservation end + + expect(reservations_list_of_given_room_date_range.length).must_equal 1 ########need to come back and check this end end @@ -56,13 +90,12 @@ # Action reservation2 = @hotel_controller.reserve_room(start_date, end_date) - # Assertion expect(@hotel_controller.reservations.length).must_equal 2 expect(reservation2.room.id).must_equal 2 end - it " ########" do + it "raise ArgumentError when there is no room avoalable" do start_date = Date.today end_date = start_date + 4 @@ -71,18 +104,22 @@ @hotel_controller.reserve_room(start_date, end_date) num_room +=1 end - - # Action - # reservation21 = @hotel_controller.reserve_room(start_date, end_date) - # p reservation21.room - expect{(@hotel_controller.reserve_room(start_date, end_date))}.must_raise ArgumentError - + expect{(@hotel_controller.reserve_room(start_date, end_date))}.must_raise ArgumentError end end + describe "total_cost" do + it "return a total cost of a given reservation" do + start_date = Date.today + end_date = start_date + 4 + reservation = @hotel_controller.reserve_room(start_date, end_date) + expect(reservation.cost).must_equal 800 + end + + end describe "reservations" do it "takes a Date and returns a list of Reservations" do reservation_list = @hotel_controller.reservations_list(@date) @@ -97,7 +134,7 @@ describe "wave 2" do describe "available_rooms" do - xit "takes two dates and returns a list" do + it "takes two dates and returns a list" do start_date = @date end_date = start_date + 3 @@ -105,6 +142,11 @@ expect(room_list).must_be_kind_of Array end + # I can view a list of rooms that are not reserved for a given date range, + # so that I can see all available rooms for that day + it "take a two dates and re" + + end end end From b3956ecfabaf1a88acc69a14916357c542d43810 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Fri, 6 Mar 2020 13:13:29 -0800 Subject: [PATCH 11/24] make some changes on reserved_room method --- lib/date_range.rb | 6 ++- lib/hotel_controller.rb | 78 +++++++++++++++++------------------ test/hotel_controller_test.rb | 20 +++++++-- 3 files changed, 60 insertions(+), 44 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 2b05c47c5..b23404c7b 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -22,10 +22,14 @@ def overlap?(other) #other is another instance of date_range start_date < other.end_date && other.start_date < end_date end - def include?(date) + def include?(date) # date is a date start_date <= date && end_date > date end + # def include?(other) # other is an instance of date_range + # start_date <= other.start_date && end_date > other.end_date + # end + def count_nights total_nights = (end_date - start_date).to_i return total_nights diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 06001a000..727274723 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -28,33 +28,6 @@ def add_reservation(reservation) @reservations << reservation end - # Create the new reservation - def reserve_room(start_date, end_date) - given_date_range = Hotel::DateRange.new(start_date, end_date) - reservations_list = reservations.select do |res| - res.date_range.overlap?(given_date_range) - end - all_reserved_rooms = reservations_list.map do |res| - res.room - end - - avialable_room = nil - rooms.each do |room| - if !(all_reserved_rooms).include?(room) - avialable_room = room - break # stop when find an avialable_room - end - end - - if avialable_room == nil - raise ArgumentError.new " no room" - end - - id = reservations.length + 1 - reservation = Reservation.new(id,given_date_range, avialable_room) - self.add_reservation(reservation) - return reservation - end # Access the list of reservations for a specific date, so that I can track reservations by date def reservations_list(date) @@ -72,6 +45,12 @@ def total_cost(reservation) # Wave 2 + # Create the new reservation + + + + + # I can view a list of rooms that are not reserved for a given date range, # so that I can see all available rooms for that day @@ -85,28 +64,49 @@ def available_rooms(start_date, end_date) all_reserved_rooms = reservations_list.map do |res| res.room end - # find the aviable_rooms_list - aviable_rooms_list = rooms.map do |room| - if !(all_reserved_rooms).include?(room) - avialable_room = room - end + # get the aviable_rooms_list + avialable_rooms_list = rooms.reject do |room| + all_reserved_rooms.include?(room) end - return aviable_rooms_list + return avialable_rooms_list end - - - - end end - - # I can 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 + # done already in wave 1 + def reserve_room(start_date, end_date) + given_date_range = Hotel::DateRange.new(start_date, end_date) + # reservations_list = reservations.select do |res| + # res.date_range.overlap?(given_date_range) + # end + # all_reserved_rooms = reservations_list.map do |res| + # res.room + # end + + # avialable_room = nil + # rooms.each do |room| + # if !(all_reserved_rooms).include?(room) + # avialable_room = room + # break # stop when find an avialable_room + # end + # end + + # if avialable_room == nil + # raise ArgumentError.new " no room" + # end + avialable_rooms_list = self.available_rooms(start_date, end_date) + id = reservations.length + 1 + reservation = Reservation.new(id,given_date_range, avialable_rooms_list[0]) + self.add_reservation(reservation) + return reservation + end # I want an exception raised if I try to reserve a room during a date range when all rooms are reserved, # so that I cannot make two reservations for the same room that overlap by date + + # done already in wave 1 diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 5b8504f1c..a7b08946b 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -42,7 +42,7 @@ puts # reservation with data_range2 - room = Hotel::Room.new(1, 200) + start_date2 = Date.new(2017, 01, 10) end_date2 = start_date2 + 4 date_range2 = Hotel::DateRange.new(start_date2,end_date2) @@ -67,7 +67,7 @@ res.must_be_kind_of Hotel::Reservation end - expect(reservations_list_of_given_room_date_range.length).must_equal 1 ########need to come back and check this + expect(reservations_list_of_given_room_date_range.length).must_equal 2 ########need to come back and check this end end @@ -137,14 +137,26 @@ it "takes two dates and returns a list" do start_date = @date end_date = start_date + 3 + reservation = @hotel_controller.reserve_room(start_date, end_date) # it will take the first room in the rooms list - room_list = @hotel_controller.available_rooms(start_date, end_date) + print @hotel_controller.reservations + test_start_date = Date.new(2020, 8, 01) + test_end_date = test_start_date + 29 + room_list = @hotel_controller.available_rooms(test_start_date, test_end_date) + puts + puts + # print room_list + puts + puts + print "r###### #{room_list.length}" expect(room_list).must_be_kind_of Array + expect(room_list.length).must_equal 19 + end # I can view a list of rooms that are not reserved for a given date range, # so that I can see all available rooms for that day - it "take a two dates and re" + end From e33d9d62984d47c52b54f09fab2cfc3bccef66ce Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Fri, 6 Mar 2020 15:19:39 -0800 Subject: [PATCH 12/24] Completed Wave 2 and passed all tests --- lib/hotel_controller.rb | 55 +++++---------- lib/no_room_available_error.rb | 4 ++ test/hotel_controller_test.rb | 125 +++++++++++++++------------------ test/test_helper.rb | 1 + 4 files changed, 77 insertions(+), 108 deletions(-) create mode 100644 lib/no_room_available_error.rb diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 727274723..3855f4464 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -1,3 +1,5 @@ + + module Hotel class HotelController attr_reader :rooms @@ -45,13 +47,6 @@ def total_cost(reservation) # Wave 2 - # Create the new reservation - - - - - - # I can view a list of rooms that are not reserved for a given date range, # so that I can see all available rooms for that day def available_rooms(start_date, end_date) @@ -60,53 +55,35 @@ def available_rooms(start_date, end_date) reservations_list = reservations.select do |res| res.date_range.overlap?(given_date_range) end + # get all the room that have been reserved for the given date range all_reserved_rooms = reservations_list.map do |res| res.room end + # get the aviable_rooms_list avialable_rooms_list = rooms.reject do |room| - all_reserved_rooms.include?(room) + all_reserved_rooms.any? do |reserved_room| + reserved_room.id == room.id + end end return avialable_rooms_list end - end -end - # I can 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 # done already in wave 1 def reserve_room(start_date, end_date) given_date_range = Hotel::DateRange.new(start_date, end_date) - # reservations_list = reservations.select do |res| - # res.date_range.overlap?(given_date_range) - # end - # all_reserved_rooms = reservations_list.map do |res| - # res.room - # end - - # avialable_room = nil - # rooms.each do |room| - # if !(all_reserved_rooms).include?(room) - # avialable_room = room - # break # stop when find an avialable_room - # end - # end - - # if avialable_room == nil - # raise ArgumentError.new " no room" - # end - avialable_rooms_list = self.available_rooms(start_date, end_date) + avialable_rooms_list = available_rooms(start_date, end_date) + if avialable_rooms_list.empty? + raise NoRoomAvailableError.new("there is no available room.") + end id = reservations.length + 1 - reservation = Reservation.new(id,given_date_range, avialable_rooms_list[0]) - self.add_reservation(reservation) + reservation = Hotel::Reservation.new(id,given_date_range, avialable_rooms_list.first) + add_reservation(reservation) return reservation - end - - # I want an exception raised if I try to reserve a room during a date range when all rooms are reserved, - # so that I cannot make two reservations for the same room that overlap by date - - # done already in wave 1 - + end + end +end \ No newline at end of file diff --git a/lib/no_room_available_error.rb b/lib/no_room_available_error.rb new file mode 100644 index 000000000..cf5c9a7a5 --- /dev/null +++ b/lib/no_room_available_error.rb @@ -0,0 +1,4 @@ +module Hotel + class NoRoomAvailableError < StandardError + end +end \ No newline at end of file diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index a7b08946b..01f71e6ea 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -40,7 +40,6 @@ reservation1 = Hotel::Reservation.new(1, date_range1,room) @hotel_controller.add_reservation(reservation1) - puts # reservation with data_range2 start_date2 = Date.new(2017, 01, 10) @@ -48,77 +47,31 @@ date_range2 = Hotel::DateRange.new(start_date2,end_date2) reservation2 = Hotel::Reservation.new(1, date_range2,room) @hotel_controller.add_reservation(reservation2) - print @hotel_controller.reservations - puts - puts - puts @hotel_controller.reservations.length + # test_date_range test_start_date = Date.new(2017, 01, 01) test_end_date = test_start_date + 30 test_date_range = Hotel::DateRange.new(test_start_date,test_end_date) + # we expect to return a list of reservations of the same rooms with different date_ranges reservations_list_of_given_room_date_range = @hotel_controller.reservations_list_room_and_date(room, test_date_range) # print reservations_list_of_given_room_date_range - print reservations_list_of_given_room_date_range - expect(reservations_list_of_given_room_date_range).must_be_kind_of Array reservations_list_of_given_room_date_range.each do |res| res.must_be_kind_of Hotel::Reservation end - expect(reservations_list_of_given_room_date_range.length).must_equal 2 ########need to come back and check this + expect(reservations_list_of_given_room_date_range.length).must_equal 2 # end end - - describe "reserve_room" do - 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 - - it "The ability to reserve room when there are reservations with the same start_date and end_date" do - #Arrange - start_date = Date.today - end_date = start_date + 4 - reservation1 = @hotel_controller.reserve_room(start_date, end_date) - - # Action - reservation2 = @hotel_controller.reserve_room(start_date, end_date) - - # Assertion - expect(@hotel_controller.reservations.length).must_equal 2 - expect(reservation2.room.id).must_equal 2 - end - - it "raise ArgumentError when there is no room avoalable" do - start_date = Date.today - end_date = start_date + 4 - - num_room = 0 - while num_room < 20 do - @hotel_controller.reserve_room(start_date, end_date) - num_room +=1 - end - - expect{(@hotel_controller.reserve_room(start_date, end_date))}.must_raise ArgumentError - end - - - end - describe "total_cost" do it "return a total cost of a given reservation" do start_date = Date.today end_date = start_date + 4 reservation = @hotel_controller.reserve_room(start_date, end_date) expect(reservation.cost).must_equal 800 - end - + end end describe "reservations" do it "takes a Date and returns a list of Reservations" do @@ -129,36 +82,70 @@ res.must_be_kind_of Hotel::Reservation end end - end + end end describe "wave 2" do + before do + @hotel_controller = Hotel::HotelController.new + @start_date = Date.new(2020, 8, 10) + @end_date = @start_date + 4 + @date_range = Hotel::DateRange.new(@start_date,@end_date) + end + describe "available_rooms" do it "takes two dates and returns a list" do - start_date = @date - end_date = start_date + 3 - reservation = @hotel_controller.reserve_room(start_date, end_date) # it will take the first room in the rooms list - - print @hotel_controller.reservations + room = @hotel_controller.rooms.first + reservation = Hotel::Reservation.new(1, @date_range,room) + @hotel_controller.add_reservation(reservation) + test_start_date = Date.new(2020, 8, 01) test_end_date = test_start_date + 29 room_list = @hotel_controller.available_rooms(test_start_date, test_end_date) - puts - puts - # print room_list - puts - puts - print "r###### #{room_list.length}" - + expect(room_list).must_be_kind_of Array expect(room_list.length).must_equal 19 - end - # I can view a list of rooms that are not reserved for a given date range, - # so that I can see all available rooms for that day - - + describe "reserve_room" do + it "takes two Date objects and returns a Reservation" do + reservation = @hotel_controller.reserve_room(@start_date, @end_date) + + expect(reservation).must_be_kind_of Hotel::Reservation + end + + it "The ability to reserve room when there are reservations with the same start_date and end_date" do + start_date = Date.today + end_date = start_date + 4 + reservation1 = @hotel_controller.reserve_room(start_date, end_date) + + reservation2 = @hotel_controller.reserve_room(start_date, end_date) + + expect(@hotel_controller.reservations.length).must_equal 2 + expect(reservation2.room.id).must_equal 2 + end + + it "raise ArgumentError when there is no room available" do + start_date = Date.today + end_date = start_date + 4 + + num_room = 0 + while num_room < 20 do + @hotel_controller.reserve_room(start_date, end_date) + num_room +=1 + end + + expect{(@hotel_controller.reserve_room(start_date, end_date))}.must_raise Hotel::NoRoomAvailableError + end + end end end + + + + + + + + end diff --git a/test/test_helper.rb b/test/test_helper.rb index 78845c928..c87d915d6 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -18,3 +18,4 @@ require_relative '../lib/hotel_controller.rb' require_relative '../lib/reservation.rb' require_relative '../lib/room.rb' +require_relative '../lib/no_room_available_error.rb' From 46bb794d31068444d2ca1c31564c9fa6998385c3 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sat, 7 Mar 2020 00:25:04 -0800 Subject: [PATCH 13/24] saved before started wave 3 --- lib/hotel_block.rb | 20 ++++++++++++++++++++ lib/hotel_controller.rb | 5 ++--- test/hotel_block_test.rb | 4 ++++ test/hotel_controller_test.rb | 3 +-- test/test_helper.rb | 1 + 5 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 lib/hotel_block.rb create mode 100644 test/hotel_block_test.rb diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb new file mode 100644 index 000000000..eac41beb4 --- /dev/null +++ b/lib/hotel_block.rb @@ -0,0 +1,20 @@ +module Hotel + class HotelBlock + attr_reader :date_range , :rooms , :discounted_rate + def initialize(date_range, rooms, discounted_rate) + @date_range = date_range + @rooms = [] + @discounted_rate = discounted_rate + end + end +end + +# to create a hotel block + # 1- check to see if the the room is available or not with the given date range + #- check that within the reservations list + # if the room is overap with the given date range + # the room cannot be added to the hotel block + # else add the room to the hotel block with the given date range + + # 2 + diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 3855f4464..d61ed946c 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -1,12 +1,11 @@ - - module Hotel class HotelController attr_reader :rooms - attr_accessor :reservations + attr_accessor :reservations, :hotel_blocks def initialize @rooms = Array.new(20){|i| Hotel::Room.new(i+1)} @reservations = [] + @hotel_block = [] end # Wave 1 diff --git a/test/hotel_block_test.rb b/test/hotel_block_test.rb new file mode 100644 index 000000000..e94f80733 --- /dev/null +++ b/test/hotel_block_test.rb @@ -0,0 +1,4 @@ +require_relative "test_helper" +require 'date' + + diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 01f71e6ea..4a7acb690 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -118,7 +118,6 @@ start_date = Date.today end_date = start_date + 4 reservation1 = @hotel_controller.reserve_room(start_date, end_date) - reservation2 = @hotel_controller.reserve_room(start_date, end_date) expect(@hotel_controller.reservations.length).must_equal 2 @@ -147,5 +146,5 @@ - + end diff --git a/test/test_helper.rb b/test/test_helper.rb index c87d915d6..fdd35223e 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -19,3 +19,4 @@ require_relative '../lib/reservation.rb' require_relative '../lib/room.rb' require_relative '../lib/no_room_available_error.rb' +require_relative '../lib/hotel_block.rb' From d2430ceb9d89babf89f2d3bf72d45ae6dbd60062 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sat, 7 Mar 2020 01:50:40 -0800 Subject: [PATCH 14/24] Initialize the HotelBlock class and create a method called create_hotel_block --- lib/hotel_block.rb | 3 ++- lib/hotel_controller.rb | 47 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb index eac41beb4..90d8a1bef 100644 --- a/lib/hotel_block.rb +++ b/lib/hotel_block.rb @@ -4,7 +4,8 @@ class HotelBlock def initialize(date_range, rooms, discounted_rate) @date_range = date_range @rooms = [] - @discounted_rate = discounted_rate + raise ArgumentError.new "A block can contain a maximum of 5 rooms" if @rooms.length > 5 + @discounted_rate = 0.1 end end end diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index d61ed946c..8944731f1 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -5,7 +5,7 @@ class HotelController def initialize @rooms = Array.new(20){|i| Hotel::Room.new(i+1)} @reservations = [] - @hotel_block = [] + @hotel_block = [] #contain a number of rooms and a specific set of days end # Wave 1 @@ -45,20 +45,28 @@ def total_cost(reservation) end # Wave 2 + # Get reserved_rooms_list - # I can view a list of rooms that are not reserved for a given date range, - # so that I can see all available rooms for that day - def available_rooms(start_date, end_date) + def reserved_rooms_list(start_date, end_date) given_date_range = Hotel::DateRange.new(start_date, end_date) # get the reservations_list for the given date range reservations_list = reservations.select do |res| - res.date_range.overlap?(given_date_range) + res.date_range.overlap?(given_date_range) end # get all the room that have been reserved for the given date range all_reserved_rooms = reservations_list.map do |res| res.room end + return all_reserved_rooms + end + + # I can view a list of rooms that are not reserved for a given date range, + # so that I can see all available rooms for that day + def available_rooms(start_date, end_date) + given_date_range = Hotel::DateRange.new(start_date, end_date) + # get all the room that have been reserved for the given date range + all_reserved_rooms = reserved_rooms_list(start_date, end_date) # get the aviable_rooms_list avialable_rooms_list = rooms.reject do |room| @@ -84,5 +92,34 @@ def reserve_room(start_date, end_date) add_reservation(reservation) return reservation end + + # Wave 3 + + # Add hotel_block method + + def add_hotel_block(hotel_block) + @hotel_blocks << hotel_block + end + + #Create a hotel_block + def create_hotel_block(date_range, rooms_array, discount_rate) + # all rooms of rooms_array must be available room during the given date range + all_reserved_rooms = reserved_rooms_list(start_date, end_date) + + # an exception raised if I try to create a Hotel Block + # and at least one of the rooms is unavailable for the given date range + + @rooms.each do |room| + if all_reserved_rooms.any?(room) + raise ArgumentError.nw "There is reservation conflict" + end + end + hotel_block = Hotel::HotelBlock.new(date_range, rooms_array, discount_rate) + add_hotel_block(hotel_block) + return hotel_block + end + + # A block can contain a maximum of 5 rooms + end end \ No newline at end of file From a539e869a1be847178c34c40c399a70daaa1d1de Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sat, 7 Mar 2020 18:06:19 -0800 Subject: [PATCH 15/24] Created the room_list of hotel_block and worte tests and passed --- lib/hotel_block.rb | 2 +- lib/hotel_controller.rb | 43 ++++++++++++---- test/hotel_block_test.rb | 11 ++++ test/hotel_controller_test.rb | 96 ++++++++++++++++++++++++++++++++++- 4 files changed, 139 insertions(+), 13 deletions(-) diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb index 90d8a1bef..3b642a8ca 100644 --- a/lib/hotel_block.rb +++ b/lib/hotel_block.rb @@ -3,7 +3,7 @@ class HotelBlock attr_reader :date_range , :rooms , :discounted_rate def initialize(date_range, rooms, discounted_rate) @date_range = date_range - @rooms = [] + @rooms = rooms raise ArgumentError.new "A block can contain a maximum of 5 rooms" if @rooms.length > 5 @discounted_rate = 0.1 end diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 8944731f1..74338f999 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -5,7 +5,7 @@ class HotelController def initialize @rooms = Array.new(20){|i| Hotel::Room.new(i+1)} @reservations = [] - @hotel_block = [] #contain a number of rooms and a specific set of days + @hotel_blocks = [] #contain a number of rooms and a specific set of days end # Wave 1 @@ -47,7 +47,7 @@ def total_cost(reservation) # Wave 2 # Get reserved_rooms_list - def reserved_rooms_list(start_date, end_date) + def reserved_rooms_list(start_date, end_date) #reserved_rooms from given_date_range = Hotel::DateRange.new(start_date, end_date) # get the reservations_list for the given date range reservations_list = reservations.select do |res| @@ -65,8 +65,11 @@ def reserved_rooms_list(start_date, end_date) # so that I can see all available rooms for that day def available_rooms(start_date, end_date) given_date_range = Hotel::DateRange.new(start_date, end_date) + # get all the room that have been reserved for the given date range all_reserved_rooms = reserved_rooms_list(start_date, end_date) + # get all rooms that are in the hotel blocks + rooms_list_for_hotel_block = rooms_list_for_hotel_block(start_date, end_date) # get the aviable_rooms_list avialable_rooms_list = rooms.reject do |room| @@ -96,22 +99,40 @@ def reserve_room(start_date, end_date) # Wave 3 # Add hotel_block method - def add_hotel_block(hotel_block) @hotel_blocks << hotel_block end + + # Get the rooms_list_for_hotel_block + def rooms_list_for_hotel_block(start_date, end_date) + given_date_range = Hotel::DateRange.new(start_date, end_date) + # get the list of the hotel_block for the given date + hotel_block_list = hotel_blocks.select do |hotel_block| + hotel_block.date_range.overlap?(given_date_range) + end + + # get all arrays of rooms from the hotel_block_list for the given date + rooms_hotel_block_arrays = hotel_block_list.map do |res| + res.rooms + end + # get all the rooms from the list of + all_rooms_hotel_block = rooms_hotel_block_arrays.flatten + return all_rooms_hotel_block + end #Create a hotel_block def create_hotel_block(date_range, rooms_array, discount_rate) - # all rooms of rooms_array must be available room during the given date range - all_reserved_rooms = reserved_rooms_list(start_date, end_date) - + # all rooms of rooms_array must be available (not in the reservations list) during the given date range + all_reserved_rooms = reserved_rooms_list(date_range.start_date, date_range.end_date) + + # Cannot create another hotel block that any existing block includes that specific room for that specific date + all_rooms_hotel_block = rooms_list_for_hotel_block(date_range.start_date, date_range.end_date) # an exception raised if I try to create a Hotel Block # and at least one of the rooms is unavailable for the given date range - - @rooms.each do |room| - if all_reserved_rooms.any?(room) - raise ArgumentError.nw "There is reservation conflict" + + rooms_array.each do |room| + if all_reserved_rooms.any?(room) || all_rooms_hotel_block.any?(room) + raise ArgumentError.new("There is reservation conflict") end end hotel_block = Hotel::HotelBlock.new(date_range, rooms_array, discount_rate) @@ -119,7 +140,7 @@ def create_hotel_block(date_range, rooms_array, discount_rate) return hotel_block end - # A block can contain a maximum of 5 rooms + end end \ No newline at end of file diff --git a/test/hotel_block_test.rb b/test/hotel_block_test.rb index e94f80733..679155047 100644 --- a/test/hotel_block_test.rb +++ b/test/hotel_block_test.rb @@ -2,3 +2,14 @@ require 'date' +describe Hotel::HotelBlock do + describe "initailize HotelBlcok" do + it "create an instance " do + + end + + it "raise ArgumentError when the length of rooms_array is greater than 5" do + + end + end +end \ No newline at end of file diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 4a7acb690..83d5333a8 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -87,7 +87,6 @@ describe "wave 2" do before do - @hotel_controller = Hotel::HotelController.new @start_date = Date.new(2020, 8, 10) @end_date = @start_date + 4 @date_range = Hotel::DateRange.new(@start_date,@end_date) @@ -138,6 +137,101 @@ end end end + describe "Wave 3" do + before do + @start_date = Date.new(2020, 8, 10) + @end_date = @start_date + 4 + @date_range = Hotel::DateRange.new(@start_date,@end_date) + @room1 = @hotel_controller.rooms[0] + @room2 = @hotel_controller.rooms[1] + @room3 = @hotel_controller.rooms[2] + @room4 = @hotel_controller.rooms[3] + @room5 = @hotel_controller.rooms[4] + @rooms_array = [@room1, @room2] + @rooms_array1 = [@room1, @room2, @room3, @room4] + @discount_rate = 0.1 + end + describe "#create a HotelBock with given date_range, rooms, and discount_rate" do + it "create a HotelBlock when all the rooms of rooms_array are avaible " do + new_hotel_block = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) + expect(new_hotel_block).must_be_kind_of Hotel::HotelBlock + expect(@hotel_controller.hotel_blocks).must_be_kind_of Array + expect(@hotel_controller.hotel_blocks.length).must_equal 1 + + end + + it "raise an ArgumentEorror if at least one of the rooms is unavailable for the given date range - by checking the reservations list " do + # Make a reservation so it will take the first room, so the first room is no longer available + reservation1 = @hotel_controller.reserve_room(@start_date, @end_date) + + # Now, when we try to create a block that has room_id = 1, it will raise ArgumentError + expect{(@hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate))}.must_raise ArgumentError + end + it "raise an ArgumentEorror if at least one of the rooms is unavailable for the given date range - by checking the existing hotel_blocks" do + + new_hotel_block1 = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) + + # Cannot create a hotel block that any existing block includes that specific room for that specific date + expect{(@hotel_controller.create_hotel_block(@date_range, @rooms_array1, @discount_rate))}.must_raise ArgumentError + end + end + describe "rooms_list_for_hotel_block" do + it "return a room_list_of_hotel_block for a given data range" do + start_date2 = Date.new(2020, 8, 16) + end_date2 = start_date2 + 5 + date_range2 = Hotel::DateRange.new(start_date2, end_date2) + new_hotel_block1 = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range2, @rooms_array1, @discount_rate) + + # serching the room_list_for_hotel_block for the whole month + # we have two hotel_blocks that over lap for the whole month in Aguest + test_start_date = Date.new(2020, 8, 01) + test_end_date = test_start_date + 29 + rooms_list_for_hotel_block = @hotel_controller.rooms_list_for_hotel_block(test_start_date, test_end_date) + + expect(@hotel_controller.hotel_blocks).must_be_kind_of Array + expect(@hotel_controller.hotel_blocks.length).must_equal 2 + expect(rooms_list_for_hotel_block).must_be_kind_of Array + expect(rooms_list_for_hotel_block.length).must_equal 6 + end + end + describe "reserve_from_hotel_block" do + + it "can reserve a room form a hotel block for a full duration of the block" do + end + + it "See a reservation made from a hotel block from the list of reservations for that date" do + + end + + it "remove the specific room from the rooms_array once it is reserverse" do + + + end + + it "create a new reservation based on the hotel_block and added to reservations list" do + + end + + it "cannot reserve a specific room the HotelBock where the date is not exact macth the full duration of the block " do + + end + + it "When a room is reserved from a block of rooms, the reservation dates will always match the date range of the block" do + + end + + + describe "can check whether a given block has any rooms available" do + + end + + + + + end + end + end From 5e285d835537e5eec3239be6618ff4deb0d2bcca Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sat, 7 Mar 2020 20:45:12 -0800 Subject: [PATCH 16/24] create available_rooms_of_block worte tests and passed --- lib/hotel_block.rb | 3 ++- lib/hotel_controller.rb | 10 ++++++++-- test/hotel_controller_test.rb | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb index 3b642a8ca..f97d5927e 100644 --- a/lib/hotel_block.rb +++ b/lib/hotel_block.rb @@ -4,7 +4,8 @@ class HotelBlock def initialize(date_range, rooms, discounted_rate) @date_range = date_range @rooms = rooms - raise ArgumentError.new "A block can contain a maximum of 5 rooms" if @rooms.length > 5 + raise ArgumentError.new("A block can contain a maximum of 5 rooms") if @rooms.length > 5 + raise ArgumentError.new("The hotel block cannot be made without having a room") if @rooms.empty? @discounted_rate = 0.1 end end diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 74338f999..adf0bee43 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -140,7 +140,13 @@ def create_hotel_block(date_range, rooms_array, discount_rate) return hotel_block end - - + # check whether a given block has any rooms available + def available_rooms_of_block(hotel_block) + if hotel_block.rooms.empty? + raise ArgumentError.new("The hotel block cannot be made without having a room") + else + return hotel_block.rooms + end + end end end \ No newline at end of file diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 83d5333a8..bcac307b0 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -149,6 +149,7 @@ @room5 = @hotel_controller.rooms[4] @rooms_array = [@room1, @room2] @rooms_array1 = [@room1, @room2, @room3, @room4] + @rooms_array_empty = [] @discount_rate = 0.1 end describe "#create a HotelBock with given date_range, rooms, and discount_rate" do @@ -195,6 +196,20 @@ expect(rooms_list_for_hotel_block.length).must_equal 6 end end + describe "available_rooms_of_block" do + it "check whether a given block has any rooms available" do + new_hotel_block = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) + available_rooms_of_block = @hotel_controller.available_rooms_of_block(new_hotel_block) + expect(@hotel_controller.rooms).must_be_kind_of Array + expect(new_hotel_block.rooms.length).must_equal 2 + expect(available_rooms_of_block).must_equal @rooms_array + end + + it "check whether a given block has any rooms available - if @rooms_array is empty print There is no room available" do + + expect{(@hotel_controller.create_hotel_block(@date_range, @rooms_array_empty, @discount_rate))}.must_raise ArgumentError + end + end describe "reserve_from_hotel_block" do it "can reserve a room form a hotel block for a full duration of the block" do From 7083f1bdfa9b866a154a79c70a6e36d4ea81cb58 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sun, 8 Mar 2020 00:36:00 -0800 Subject: [PATCH 17/24] finished Wave 3 before modifying the reserve_room method in Wave 2 --- lib/date_range.rb | 4 +- lib/hotel_controller.rb | 96 +++++++++++++++++++++++++++++++---- test/hotel_controller_test.rb | 26 +++++++++- 3 files changed, 113 insertions(+), 13 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index b23404c7b..fecd44c62 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -26,8 +26,8 @@ def include?(date) # date is a date start_date <= date && end_date > date end - # def include?(other) # other is an instance of date_range - # start_date <= other.start_date && end_date > other.end_date + # def include?(date_range) # other is an instance of date_range + # start_date <= date_range.start_date && end_date > date_range.end_date # end def count_nights diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index adf0bee43..a535428f2 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -69,13 +69,13 @@ def available_rooms(start_date, end_date) # get all the room that have been reserved for the given date range all_reserved_rooms = reserved_rooms_list(start_date, end_date) # get all rooms that are in the hotel blocks - rooms_list_for_hotel_block = rooms_list_for_hotel_block(start_date, end_date) + all_rooms_hotel_block = rooms_list_for_hotel_block(start_date, end_date) # get the aviable_rooms_list avialable_rooms_list = rooms.reject do |room| - all_reserved_rooms.any? do |reserved_room| - reserved_room.id == room.id - end + all_reserved_rooms.any? {|res_room| res_room.id == room.id} && all_rooms_hotel_block.any? {|block_room| block_room.id == room.id} + + end return avialable_rooms_list end @@ -102,18 +102,22 @@ def reserve_room(start_date, end_date) def add_hotel_block(hotel_block) @hotel_blocks << hotel_block end - - # Get the rooms_list_for_hotel_block - def rooms_list_for_hotel_block(start_date, end_date) + # Get the hotel_block_list for a given date + def hotel_block_list(start_date, end_date) given_date_range = Hotel::DateRange.new(start_date, end_date) # get the list of the hotel_block for the given date hotel_block_list = hotel_blocks.select do |hotel_block| hotel_block.date_range.overlap?(given_date_range) end + return hotel_block_list + end + # Get the rooms_list_for_hotel_block + def rooms_list_for_hotel_block(start_date, end_date) + hotel_block_list = hotel_block_list(start_date, end_date) # get all arrays of rooms from the hotel_block_list for the given date - rooms_hotel_block_arrays = hotel_block_list.map do |res| - res.rooms + rooms_hotel_block_arrays = hotel_block_list.map do |hotel_block| + hotel_block.rooms end # get all the rooms from the list of all_rooms_hotel_block = rooms_hotel_block_arrays.flatten @@ -131,7 +135,7 @@ def create_hotel_block(date_range, rooms_array, discount_rate) # and at least one of the rooms is unavailable for the given date range rooms_array.each do |room| - if all_reserved_rooms.any?(room) || all_rooms_hotel_block.any?(room) + if all_reserved_rooms.any? {|r|r == room} || all_rooms_hotel_block.any? {|r| r == room} raise ArgumentError.new("There is reservation conflict") end end @@ -140,6 +144,8 @@ def create_hotel_block(date_range, rooms_array, discount_rate) return hotel_block end + + #################################### # check whether a given block has any rooms available def available_rooms_of_block(hotel_block) if hotel_block.rooms.empty? @@ -148,5 +154,75 @@ def available_rooms_of_block(hotel_block) return hotel_block.rooms end end + + + # Get the list of the hotel_block for a specific full date range (exact match the full date range) + def hotel_blocks_for_specific_date_range(start_date, end_date) + specific_date_range = Hotel::DateRange.new(start_date, end_date) + hotel_blocks_for_specific_date_range = hotel_blocks.select do |hotel_block| + hotel_block.date_range == specific_date_range + end + return hotel_blocks_for_specific_date_range + end + + # Get available_rooms_of_hotel_blocks for a specific full date range (exact match the full date range) + def available_rooms_of_hotel_blocks(start_date, end_date) + hotel_blocks_for_specific_date_range = hotel_blocks_for_specific_date_range(start_date, end_date) + if hotel_blocks_for_specific_date_range.empty? + raise ArgumentError.new ("no hotel_block for the given date range.") + end + available_rooms_of_hotel_blocks = hotel_blocks_for_specific_date_range.map do |hotel_block| + hotel_block.rooms + end + all_available_rooms_of_hotel_blocks = available_rooms_of_hotel_blocks.flatten + end + + # get specific hotel_block with a given room, start_date, and end_date + def specific_hotel_block(room, start_date, end_date) + specific_date_range = Hotel::DateRange.new(start_date, end_date) + # Check to see which hotel_block the room lives in (one room can be assigned to only one hotel_block for a specific date range ) + specific_hotel_block = hotel_blocks.select do |hotel_block| + hotel_bock.date_range == specific_date_range && hotel_block.rooms.any?(room) + end + return specific_hotel_block + end + + # remove the room from the hotel_block for a specific date_range + def remove_room_from_hotel_block(room, start_date, end_date) + specific_hotel_block = specific_hotel_block(room, start_date, end_date) + specific_hotel_block.delete(room) + return specific_hotel_block + end + + # remove/delete the whole hotel block + def delete_hotel_block(hetel_block) + hotel_blocks.delete(hotel_block) + end + + + # Once know the which hotel_block, then remove the room from that hotel_block + + # I can reserve a specific room from a hotel block + # I can only reserve that room from a hotel block for the full duration of the block + # I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) + def reserve_room_from_hotel_block(room,start_date, end_date) + given_date_range = Hotel::DateRange.new(start_date, end_date) + all_available_rooms_of_hotel_blocks = available_rooms_of_hotel_blocks(start_date, end_date) + if all_available_rooms_of_hotel_blocks.empty? + raise NoRoomAvailableError.new("there is no available room.") + end + if all_available_rooms_of_hotel_blocks.any?(room) + id = reservations.length + 1 + reservation = Hotel::Reservation.new(id,given_date_range,room) + # Add the reservation to the reservation list + add_reservation(reservation) + # remove the room from the all_available_rooms_of_hotel_blocks + hotel_block_after_reservation = remove_room_from_hotel_block(room, start_date, end_date) + if hotel_block_after_reservation.rooms.empty? + delete_hotel_block(hotel_block_after_reservation) + end + end + return reservations + end end end \ No newline at end of file diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index bcac307b0..329185b43 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -176,6 +176,29 @@ expect{(@hotel_controller.create_hotel_block(@date_range, @rooms_array1, @discount_rate))}.must_raise ArgumentError end end + describe "hotel_block_list" do + it "return an empty array of hotel_block_list if there is no hotel_block created" do + test_start_date = Date.new(2020, 8, 01) + test_end_date = test_start_date + 29 + hotel_block_list = @hotel_controller.hotel_block_list(test_start_date, test_end_date) + + expect(hotel_block_list).must_equal [] + end + it "return a hotel_block_list for a given date range" do + start_date2 = Date.new(2020, 8, 16) + end_date2 = start_date2 + 5 + date_range2 = Hotel::DateRange.new(start_date2, end_date2) + new_hotel_block1 = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range2, @rooms_array1, @discount_rate) + + test_start_date = Date.new(2020, 8, 01) + test_end_date = test_start_date + 29 + hotel_block_list = @hotel_controller.hotel_block_list(test_start_date, test_end_date) + + expect(hotel_block_list).must_be_kind_of Array + expect(hotel_block_list.length).must_equal 2 + end + end describe "rooms_list_for_hotel_block" do it "return a room_list_of_hotel_block for a given data range" do start_date2 = Date.new(2020, 8, 16) @@ -183,7 +206,8 @@ date_range2 = Hotel::DateRange.new(start_date2, end_date2) new_hotel_block1 = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) new_hotel_block2 = @hotel_controller.create_hotel_block(date_range2, @rooms_array1, @discount_rate) - + + # serching the room_list_for_hotel_block for the whole month # we have two hotel_blocks that over lap for the whole month in Aguest test_start_date = Date.new(2020, 8, 01) From 4244f69b97237d57027fee01691f93f5c8c5350a Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sun, 8 Mar 2020 01:40:31 -0800 Subject: [PATCH 18/24] Modified reserve_room method and test and passed all tests. --- lib/hotel_controller.rb | 10 ++++------ test/hotel_controller_test.rb | 30 ++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index a535428f2..f0ea95fb8 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -72,12 +72,10 @@ def available_rooms(start_date, end_date) all_rooms_hotel_block = rooms_list_for_hotel_block(start_date, end_date) # get the aviable_rooms_list - avialable_rooms_list = rooms.reject do |room| - all_reserved_rooms.any? {|res_room| res_room.id == room.id} && all_rooms_hotel_block.any? {|block_room| block_room.id == room.id} - - + available_rooms_list = rooms.reject do |room| + all_reserved_rooms.any? {|res_room| res_room.id == room.id} || all_rooms_hotel_block.any? {|block_room| block_room.id == room.id} end - return avialable_rooms_list + return available_rooms_list end # I can make a reservation of a room for a given date range, @@ -222,7 +220,7 @@ def reserve_room_from_hotel_block(room,start_date, end_date) delete_hotel_block(hotel_block_after_reservation) end end - return reservations + return reservation end end end \ No newline at end of file diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 329185b43..34ea634ec 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -93,9 +93,17 @@ end describe "available_rooms" do + before do + @room1 = @hotel_controller.rooms[0] + @room2 = @hotel_controller.rooms[1] + @room3 = @hotel_controller.rooms[2] + @room4 = @hotel_controller.rooms[3] + @room5 = @hotel_controller.rooms[4] + @rooms_array = [@room2, @room3] + @discount_rate = 0.1 + end it "takes two dates and returns a list" do - room = @hotel_controller.rooms.first - reservation = Hotel::Reservation.new(1, @date_range,room) + reservation = Hotel::Reservation.new(1, @date_range,@room1) @hotel_controller.add_reservation(reservation) test_start_date = Date.new(2020, 8, 01) @@ -106,6 +114,24 @@ expect(room_list.length).must_equal 19 end + it "available_rooms should not already been reserved in reservations or in the hotel block for those specific date range" do + start_date = Date.new(2020, 8, 20) + end_date = start_date + 5 + block_date_range = Hotel::DateRange.new(start_date, end_date) + reservation = Hotel::Reservation.new(1, @date_range,@room1) + @hotel_controller.add_reservation(reservation) + new_hotel_block = @hotel_controller.create_hotel_block(block_date_range, @rooms_array, @discount_rate) + + test_start_date = Date.new(2020, 8, 01) + test_end_date = test_start_date + 29 + room_list = @hotel_controller.available_rooms(test_start_date, test_end_date) + + expect(room_list).must_be_kind_of Array + expect(room_list.length).must_equal 17 + + + end + describe "reserve_room" do it "takes two Date objects and returns a Reservation" do reservation = @hotel_controller.reserve_room(@start_date, @end_date) From 3455f4000d0133e23c725ccb734b82b59debd369 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sun, 8 Mar 2020 14:25:52 -0700 Subject: [PATCH 19/24] added more tests for wave 1 and wave 2 --- lib/hotel_controller.rb | 21 +++++--- test/hotel_controller_test.rb | 96 +++++++++++++++++++++++++++++++---- 2 files changed, 98 insertions(+), 19 deletions(-) diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index f0ea95fb8..59ddcbaa9 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -38,24 +38,29 @@ def reservations_list(date) return reservation_list end - # can get the total cost for a given reservation + # Can get the total cost for a given reservation def total_cost(reservation) total_cost = reservation.cost return total_cost end # Wave 2 - # Get reserved_rooms_list - - def reserved_rooms_list(start_date, end_date) #reserved_rooms from + # Get reservations_list for a given date range + def reservations_list_by_date_range(start_date, end_date) given_date_range = Hotel::DateRange.new(start_date, end_date) - # get the reservations_list for the given date range - reservations_list = reservations.select do |res| + # Get the reservations_list for the given date range + reservations_list_by_date_range = reservations.select do |res| res.date_range.overlap?(given_date_range) end + end - # get all the room that have been reserved for the given date range - all_reserved_rooms = reservations_list.map do |res| + def reserved_rooms_list(start_date, end_date) + given_date_range = Hotel::DateRange.new(start_date, end_date) + # Get reservations_list for a given date range + reservations_list_by_date_range = reservations_list_by_date_range(start_date, end_date) + + # Get all the room that have been reserved for the given date range + all_reserved_rooms = reservations_list_by_date_range.map do |res| res.room end return all_reserved_rooms diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 34ea634ec..af7d81fd8 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -62,9 +62,59 @@ res.must_be_kind_of Hotel::Reservation end - expect(reservations_list_of_given_room_date_range.length).must_equal 2 # + expect(reservations_list_of_given_room_date_range.length).must_equal 2 end end + describe "add_reservation" do + it "add a new reservation to the reservations list" do + room = @hotel_controller.rooms[0] + start_date1 = Date.new(2017, 01, 03) + end_date1 = start_date1 + 3 + date_range1 = Hotel::DateRange.new(start_date1,end_date1) + reservation1 = Hotel::Reservation.new(1, date_range1,room) + + expect(@hotel_controller.reservations).must_equal [] + @hotel_controller.add_reservation(reservation1) + expect(@hotel_controller.reservations.length).must_equal 1 + end + end + + # Access the list of reservations for a specific date (NOT a DATE RANGE), so that I can track reservations by date + describe "reservations_list" do + it "return a list of reservations for a specific date" do + room = Hotel::Room.new(1, 200) + start_date1 = Date.new(2017, 01, 03) + end_date1 = start_date1 + 3 + date_range1 = Hotel::DateRange.new(start_date1,end_date1) + reservation1 = Hotel::Reservation.new(1, date_range1,room) + @hotel_controller.add_reservation(reservation1) + + # reservation with data_range2 + + start_date2 = Date.new(2017, 01, 10) + end_date2 = start_date2 + 4 + date_range2 = Hotel::DateRange.new(start_date2,end_date2) + reservation2 = Hotel::Reservation.new(1, date_range2,room) + @hotel_controller.add_reservation(reservation2) + + test_date1 = Date.new(2017, 01, 01) + test_date2 = Date.new(2017, 01, 03) + reservation_list1 = @hotel_controller.reservations_list(test_date1) + reservation_list2 = @hotel_controller.reservations_list(test_date2) + + expect(reservation_list1).must_be_kind_of Array + reservation_list1.each do |res| + res.must_be_kind_of Hotel::Reservation + end + expect(reservation_list1.length).must_equal 0 + expect(reservation_list2).must_be_kind_of Array + reservation_list2.each do |res| + res.must_be_kind_of Hotel::Reservation + end + expect(reservation_list2.length).must_equal 1 + end + end + describe "total_cost" do it "return a total cost of a given reservation" do start_date = Date.today @@ -73,16 +123,37 @@ expect(reservation.cost).must_equal 800 end end - describe "reservations" do - it "takes a Date and returns a list of Reservations" do - reservation_list = @hotel_controller.reservations_list(@date) - expect(reservation_list).must_be_kind_of Array - reservation_list.each do |res| + # Get reserved_rooms_list for a given date range + describe "reservations_list_by_date_range" do + it "return a reservations_list_by_date_range for a given date range" do + room = Hotel::Room.new(1, 200) + start_date1 = Date.new(2017, 01, 03) + end_date1 = start_date1 + 3 + date_range1 = Hotel::DateRange.new(start_date1,end_date1) + reservation1 = Hotel::Reservation.new(1, date_range1,room) + @hotel_controller.add_reservation(reservation1) + + # reservation with data_range2 + + start_date2 = Date.new(2017, 01, 28) + end_date2 = start_date2 + 11 + date_range2 = Hotel::DateRange.new(start_date2,end_date2) + reservation2 = Hotel::Reservation.new(1, date_range2,room) + @hotel_controller.add_reservation(reservation2) + + test_start_date = Date.new(2017, 01, 01 ) + test_end_date = test_start_date + 30 + reservations_list_by_date_range = @hotel_controller.reservations_list_by_date_range(test_start_date, test_end_date) + + expect(reservations_list_by_date_range).must_be_kind_of Array + reservations_list_by_date_range.each do |res| res.must_be_kind_of Hotel::Reservation end + + expect(reservations_list_by_date_range.length).must_equal 2 end - end + end end describe "wave 2" do @@ -102,7 +173,7 @@ @rooms_array = [@room2, @room3] @discount_rate = 0.1 end - it "takes two dates and returns a list" do + it "takes two dates and returns a list of available_rooms" do reservation = Hotel::Reservation.new(1, @date_range,@room1) @hotel_controller.add_reservation(reservation) @@ -112,6 +183,8 @@ expect(room_list).must_be_kind_of Array expect(room_list.length).must_equal 19 + expect(@hotel_controller.hotel_blocks).must_equal [] + expect(@hotel_controller.hotel_blocks.length).must_equal 0 end it "available_rooms should not already been reserved in reservations or in the hotel block for those specific date range" do @@ -125,11 +198,10 @@ test_start_date = Date.new(2020, 8, 01) test_end_date = test_start_date + 29 room_list = @hotel_controller.available_rooms(test_start_date, test_end_date) - + expect(room_list).must_be_kind_of Array expect(room_list.length).must_equal 17 - end describe "reserve_room" do @@ -137,6 +209,7 @@ reservation = @hotel_controller.reserve_room(@start_date, @end_date) expect(reservation).must_be_kind_of Hotel::Reservation + expect(@hotel_controller.reservations.length).must_equal 1 end it "The ability to reserve room when there are reservations with the same start_date and end_date" do @@ -148,7 +221,7 @@ expect(@hotel_controller.reservations.length).must_equal 2 expect(reservation2.room.id).must_equal 2 end - + it "raise ArgumentError when there is no room available" do start_date = Date.today end_date = start_date + 4 @@ -163,6 +236,7 @@ end end end + describe "Wave 3" do before do @start_date = Date.new(2020, 8, 10) From 9ab4b6058c96562016d6893586c891bdebeb4e89 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sun, 8 Mar 2020 20:45:18 -0700 Subject: [PATCH 20/24] Finished Wave 3 and tests for wave 3 and all passed --- lib/date_range.rb | 7 ++ lib/hotel_controller.rb | 25 ++-- lib/room.rb | 3 + test/hotel_controller_test.rb | 223 +++++++++++++++++++++++++++++----- 4 files changed, 216 insertions(+), 42 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index fecd44c62..333a83895 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -16,8 +16,15 @@ def initialize(start_date, end_date) end @start_date = start_date @end_date = end_date + + end + + # define exactly what it means for two instances of its own class to be equal. + def ==(other) + self.start_date == other.start_date && self.end_date == other.end_date end + def overlap?(other) #other is another instance of date_range start_date < other.end_date && other.start_date < end_date end diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 59ddcbaa9..95560f13c 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -105,7 +105,7 @@ def reserve_room(start_date, end_date) def add_hotel_block(hotel_block) @hotel_blocks << hotel_block end - # Get the hotel_block_list for a given date + # Get the hotel_block_list for a given date (not exact match date range) def hotel_block_list(start_date, end_date) given_date_range = Hotel::DateRange.new(start_date, end_date) # get the list of the hotel_block for the given date @@ -157,8 +157,8 @@ def available_rooms_of_block(hotel_block) return hotel_block.rooms end end - - + + # Get the list of the hotel_block for a specific full date range (exact match the full date range) def hotel_blocks_for_specific_date_range(start_date, end_date) specific_date_range = Hotel::DateRange.new(start_date, end_date) @@ -180,33 +180,34 @@ def available_rooms_of_hotel_blocks(start_date, end_date) all_available_rooms_of_hotel_blocks = available_rooms_of_hotel_blocks.flatten end - # get specific hotel_block with a given room, start_date, and end_date + # Get specific hotel_block with a given room, start_date, and end_date def specific_hotel_block(room, start_date, end_date) specific_date_range = Hotel::DateRange.new(start_date, end_date) # Check to see which hotel_block the room lives in (one room can be assigned to only one hotel_block for a specific date range ) - specific_hotel_block = hotel_blocks.select do |hotel_block| - hotel_bock.date_range == specific_date_range && hotel_block.rooms.any?(room) + specific_hotel_block_list = hotel_blocks.select do |hotel_block| + hotel_block.date_range == specific_date_range && hotel_block.rooms.any? {|r| r.id == room.id} end + if specific_hotel_block_list.empty? + raise ArgumentError.new("there is no hotel_block for the given room or date range.") + end + specific_hotel_block = specific_hotel_block_list[0] return specific_hotel_block end # remove the room from the hotel_block for a specific date_range def remove_room_from_hotel_block(room, start_date, end_date) specific_hotel_block = specific_hotel_block(room, start_date, end_date) - specific_hotel_block.delete(room) + specific_hotel_block.rooms.delete(room) return specific_hotel_block end # remove/delete the whole hotel block - def delete_hotel_block(hetel_block) + def delete_hotel_block(hotel_block) hotel_blocks.delete(hotel_block) end - - - # Once know the which hotel_block, then remove the room from that hotel_block # I can reserve a specific room from a hotel block - # I can only reserve that room from a hotel block for the full duration of the block + # I can only reserve that room from a hotel block for the full duration of the block # I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) def reserve_room_from_hotel_block(room,start_date, end_date) given_date_range = Hotel::DateRange.new(start_date, end_date) diff --git a/lib/room.rb b/lib/room.rb index db7d5e396..3012140b8 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -11,5 +11,8 @@ def initialize(id, cost = 200) @id = id @cost = cost end + def ==(other) + self.id == other.id + end end end \ No newline at end of file diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index af7d81fd8..11e17f4a6 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -236,7 +236,7 @@ end end end - + describe "Wave 3" do before do @start_date = Date.new(2020, 8, 10) @@ -249,16 +249,20 @@ @room5 = @hotel_controller.rooms[4] @rooms_array = [@room1, @room2] @rooms_array1 = [@room1, @room2, @room3, @room4] + @rooms_array2 = [@room3, @room4] @rooms_array_empty = [] @discount_rate = 0.1 end - describe "#create a HotelBock with given date_range, rooms, and discount_rate" do + + + + + describe "create_hotel_block" do it "create a HotelBlock when all the rooms of rooms_array are avaible " do new_hotel_block = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) expect(new_hotel_block).must_be_kind_of Hotel::HotelBlock expect(@hotel_controller.hotel_blocks).must_be_kind_of Array - expect(@hotel_controller.hotel_blocks.length).must_equal 1 - + expect(@hotel_controller.hotel_blocks.length).must_equal 1 end it "raise an ArgumentEorror if at least one of the rooms is unavailable for the given date range - by checking the reservations list " do @@ -266,16 +270,30 @@ reservation1 = @hotel_controller.reserve_room(@start_date, @end_date) # Now, when we try to create a block that has room_id = 1, it will raise ArgumentError + # @room_array contains @room1 which was already reserved for the same date range expect{(@hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate))}.must_raise ArgumentError end it "raise an ArgumentEorror if at least one of the rooms is unavailable for the given date range - by checking the existing hotel_blocks" do new_hotel_block1 = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) - + # @rooms_array = [@room1, @room2] + # @rooms_array1 = [@room1, @room2, @room3, @room4] # Cannot create a hotel block that any existing block includes that specific room for that specific date expect{(@hotel_controller.create_hotel_block(@date_range, @rooms_array1, @discount_rate))}.must_raise ArgumentError end end + + describe "add_hotel_block" do + it "add a hotel_block to the hotel_blocks list" do + # before creating the hotel_block, hotel_blocks list is empty + expect(@hotel_controller.hotel_blocks).must_equal [] + + new_hotel_block = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) + expect(@hotel_controller.hotel_blocks.length).must_equal 1 + end + end + + # Get the hotel_block_list for a given date (not exact match date range) describe "hotel_block_list" do it "return an empty array of hotel_block_list if there is no hotel_block created" do test_start_date = Date.new(2020, 8, 01) @@ -299,6 +317,8 @@ expect(hotel_block_list.length).must_equal 2 end end + + # Get the hotel_block_list for a given date (not exact match date range) describe "rooms_list_for_hotel_block" do it "return a room_list_of_hotel_block for a given data range" do start_date2 = Date.new(2020, 8, 16) @@ -320,8 +340,9 @@ expect(rooms_list_for_hotel_block.length).must_equal 6 end end + describe "available_rooms_of_block" do - it "check whether a given block has any rooms available" do + it "check whether a given hotel block has any rooms available" do new_hotel_block = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) available_rooms_of_block = @hotel_controller.available_rooms_of_block(new_hotel_block) expect(@hotel_controller.rooms).must_be_kind_of Array @@ -334,50 +355,192 @@ expect{(@hotel_controller.create_hotel_block(@date_range, @rooms_array_empty, @discount_rate))}.must_raise ArgumentError end end - describe "reserve_from_hotel_block" do - - it "can reserve a room form a hotel block for a full duration of the block" do - end - it "See a reservation made from a hotel block from the list of reservations for that date" do + # Get the list of the hotel_block for a specific full date range (exact match the full date range) + describe "hotel_blocks_for_specific_date_range" do + it "return a list of hotel_blocks_for_specific_date_range for the exact match the full date range" do + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range, @rooms_array2, @discount_rate) + test_start_date = Date.new(2020, 8, 16) + test_end_date = test_start_date + 5 + hotel_blocks_for_specific_date_range = @hotel_controller.hotel_blocks_for_specific_date_range(test_start_date, test_end_date) + + expect(hotel_blocks_for_specific_date_range).must_be_kind_of Array + expect(hotel_blocks_for_specific_date_range.length).must_equal 2 end - it "remove the specific room from the rooms_array once it is reserverse" do - - - end - - it "create a new reservation based on the hotel_block and added to reservations list" do + it "return a empty array of list of hotel_blocks_for_specific_date_range for given date_range that doesn't exactly match the full date range of the hotel blocks" do + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range, @rooms_array2, @discount_rate) - end - - it "cannot reserve a specific room the HotelBock where the date is not exact macth the full duration of the block " do + test_start_date = Date.new(2020, 8, 16) + test_end_date = test_start_date + 4 + hotel_blocks_for_specific_date_range = @hotel_controller.hotel_blocks_for_specific_date_range(test_start_date, test_end_date) + expect(hotel_blocks_for_specific_date_range).must_be_kind_of Array + expect(hotel_blocks_for_specific_date_range.length).must_equal 0 end + end - it "When a room is reserved from a block of rooms, the reservation dates will always match the date range of the block" do + # Get available_rooms_of_hotel_blocks for a specific full date range (exact match the full date range) + describe "available_rooms_of_hotel_blocks" do + it "return a available_room_of_hotel_blocks for the exact match of given date range" do + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range, @rooms_array2, @discount_rate) + + test_start_date = Date.new(2020, 8, 16) + test_end_date = test_start_date + 5 + hotel_blocks_for_specific_date_range = @hotel_controller.available_rooms_of_hotel_blocks(test_start_date, test_end_date) + expect(hotel_blocks_for_specific_date_range).must_be_kind_of Array + expect(hotel_blocks_for_specific_date_range.length).must_equal 4 end - - describe "can check whether a given block has any rooms available" do + it "return a empty array of list of hotel_blocks_for_specific_date_range for given date_range that doesn't exactly match the full date range of the hotel blocks" do + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range, @rooms_array2, @discount_rate) + + test_start_date = Date.new(2020, 8, 16) + test_end_date = test_start_date + 4 + expect{(@hotel_controller.available_rooms_of_hotel_blocks(test_start_date, test_end_date))}.must_raise ArgumentError + end end - - - - end - end - - end + # Get specific hotel_block with a given room, start_date, and end_date + describe "specific_hotel_block" do + it "return specific_hotel_block when we know at least one room of the rooms_array and date_range" do + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + + # @rooms_array = [@room1, @room2] + # @rooms_array2 = [@room3, @room4] + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range, @rooms_array2, @discount_rate) + + specific_hotel_block = @hotel_controller.specific_hotel_block(@room1, start_date, end_date) + expect(specific_hotel_block).must_be_kind_of Hotel::HotelBlock + expect(specific_hotel_block.rooms).must_equal @rooms_array + end + it "raise ArgumentError when there is no hotel_block found for that given room or date_range" do + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + # @rooms_array = [@room1, @room2] + # @rooms_array2 = [@room3, @room4] + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range, @rooms_array2, @discount_rate) + test_start_date = Date.new(2020, 8, 16) + test_end_date = test_start_date + 6 + + expect{(@hotel_controller.specific_hotel_block(@room1, test_start_date, test_end_date))}.must_raise ArgumentError + end + end + describe "remove_room_from_hotel_block" do + it "the specific room is removed from the list of rooms of the specific hotel_block" do + # @rooms_array = [@room1, @room2] + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + + # @rooms_array1 = [@room1, @room2, @room3, @room4] + start_date2 = Date.new(2020, 8, 10) + end_date2 = start_date2 + 2 + date_range2 = Hotel::DateRange.new(start_date2, end_date2) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range2, @rooms_array1, @discount_rate) + # Before removing @room1 + expect(new_hotel_block1).must_be_kind_of Hotel::HotelBlock + expect(new_hotel_block1.rooms).must_equal @rooms_array + expect(new_hotel_block1.rooms.length).must_equal 2 + expect(p new_hotel_block1.rooms).must_equal [@room1, @room2] + + # After removing @room1 + @hotel_controller.remove_room_from_hotel_block(@room1, start_date, end_date) + expect(new_hotel_block1).must_be_kind_of Hotel::HotelBlock + expect(new_hotel_block1.rooms).must_equal @rooms_array + expect(new_hotel_block1.rooms.length).must_equal 1 + expect(p new_hotel_block1.rooms).must_equal [@room2] + + # the removing doesn't impact new_hotel_block2 + expect(new_hotel_block2).must_be_kind_of Hotel::HotelBlock + expect(new_hotel_block2.rooms).must_equal @rooms_array1 + expect(new_hotel_block2.rooms.length).must_equal 4 + expect(p new_hotel_block2.rooms).must_equal [@room1, @room2, @room3, @room4] + end + end + describe "delete_hotel_block" do + it "delete a hotel_block from hotel_blocks list for given hotel_block" do + # @rooms_array = [@room1, @room2] + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + + # @rooms_array1 = [@room1, @room2, @room3, @room4] + start_date2 = Date.new(2020, 8, 10) + end_date2 = start_date2 + 2 + date_range2 = Hotel::DateRange.new(start_date2, end_date2) + new_hotel_block2 = @hotel_controller.create_hotel_block(date_range2, @rooms_array1, @discount_rate) + # Before deleting a hotel_block + expect(@hotel_controller.hotel_blocks).must_be_kind_of Array + expect(@hotel_controller.hotel_blocks.length).must_equal 2 + # After deleting a hotel_block + @hotel_controller.delete_hotel_block(new_hotel_block2) + expect(@hotel_controller.hotel_blocks).must_be_kind_of Array + expect(@hotel_controller.hotel_blocks.length).must_equal 1 + end + end + describe "reserve_from_hotel_block" do + it "Can reserve a room form a hotel block for a full duration of the block" do + # @rooms_array = [@room1, @room2] + start_date = Date.new(2020, 8, 16) + end_date = start_date + 5 + date_range = Hotel::DateRange.new(start_date, end_date) + new_hotel_block1 = @hotel_controller.create_hotel_block(date_range, @rooms_array, @discount_rate) + + expect(@hotel_controller.reservations).must_equal [] + expect(@hotel_controller.reservations.length).must_equal 0 + expect(@hotel_controller.hotel_blocks[0]).must_be_kind_of Hotel::HotelBlock + expect(@hotel_controller.hotel_blocks.length).must_equal 1 + # reserve @room1 from new_hotel_block1 + @hotel_controller.reserve_room_from_hotel_block(@room1,start_date, end_date) + + # After reserve @room1 from new_hotel_block1 + expect(@hotel_controller.reservations.length).must_equal 1 + expect(@hotel_controller.reservations[0]).must_be_kind_of Hotel::Reservation + expect(@hotel_controller.hotel_blocks[0]).must_be_kind_of Hotel::HotelBlock + expect(@hotel_controller.hotel_blocks.length).must_equal 1 + expect(new_hotel_block1.rooms.length).must_equal 1 # @room 1 was removed from @rooms_array = [@room1, @room2] + # reserve @room2 from new_hotel_block1 + @hotel_controller.reserve_room_from_hotel_block(@room2,start_date, end_date) + expect(@hotel_controller.reservations.length).must_equal 2 + # since @room1 and @room2 were removed the new_hotel_block1 will be deleted beacuse it's rooms_array is an empty array + expect(@hotel_controller.hotel_blocks.length).must_equal 0 + end + end + end + end end From 5564fb43eeae7f9e74870e576b441481fcc6343d Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sun, 8 Mar 2020 21:51:13 -0700 Subject: [PATCH 21/24] finished writing test for hotel_block_test and all passed --- lib/hotel_block.rb | 12 ++---------- test/hotel_block_test.rb | 24 ++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/hotel_block.rb b/lib/hotel_block.rb index f97d5927e..7ec4178bf 100644 --- a/lib/hotel_block.rb +++ b/lib/hotel_block.rb @@ -3,20 +3,12 @@ class HotelBlock attr_reader :date_range , :rooms , :discounted_rate def initialize(date_range, rooms, discounted_rate) @date_range = date_range + raise ArgumentError.new("A block can contain a maximum of 5 rooms") if rooms.length > 5 + raise ArgumentError.new("The hotel block cannot be made without having a room") if rooms.empty? @rooms = rooms - raise ArgumentError.new("A block can contain a maximum of 5 rooms") if @rooms.length > 5 - raise ArgumentError.new("The hotel block cannot be made without having a room") if @rooms.empty? @discounted_rate = 0.1 end end end -# to create a hotel block - # 1- check to see if the the room is available or not with the given date range - #- check that within the reservations list - # if the room is overap with the given date range - # the room cannot be added to the hotel block - # else add the room to the hotel block with the given date range - - # 2 diff --git a/test/hotel_block_test.rb b/test/hotel_block_test.rb index 679155047..e09e8adcc 100644 --- a/test/hotel_block_test.rb +++ b/test/hotel_block_test.rb @@ -3,13 +3,33 @@ describe Hotel::HotelBlock do + before do + @room1 = Hotel::Room.new(1, 200) + @room2 = Hotel::Room.new(2, 200) + @room3 = Hotel::Room.new(3, 200) + @room4 = Hotel::Room.new(4, 200) + @room5 = Hotel::Room.new(5, 200) + @room6 = Hotel::Room.new(6, 200) + @room_array1 = [@room1, @room2] + @room_array2 = [@room1,@room2,@room3,@room4,@room5,@room6] + @room_array3 = [] + @start_date = Date.today + @end_date = @start_date + 3 + @date_range = Hotel::DateRange.new(@start_date,@end_date) + @discount_rate = 0.1 + end describe "initailize HotelBlcok" do it "create an instance " do - + hotel_block = Hotel::HotelBlock.new(@date_range,@room_array1,@discount_rate) + expect(hotel_block).must_be_kind_of Hotel::HotelBlock end it "raise ArgumentError when the length of rooms_array is greater than 5" do - + expect{Hotel::HotelBlock.new(@date_range,@room_array2,@discount_rate)}.must_raise ArgumentError + end + + it "raise ArgumentError when rooms is an empty array" do + expect{Hotel::HotelBlock.new(@date_range,@room_array3,@discount_rate)}.must_raise ArgumentError end end end \ No newline at end of file From ed6159adf9cf0664c38c3575ded0da434f762b8d Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sun, 8 Mar 2020 22:02:57 -0700 Subject: [PATCH 22/24] Cleaned up and completed. --- lib/date_range.rb | 1 - lib/hotel_controller.rb | 18 +++++++----------- lib/room.rb | 1 + test/hotel_controller_test.rb | 9 +++++---- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/lib/date_range.rb b/lib/date_range.rb index 333a83895..955ae2b4c 100644 --- a/lib/date_range.rb +++ b/lib/date_range.rb @@ -24,7 +24,6 @@ def ==(other) self.start_date == other.start_date && self.end_date == other.end_date end - def overlap?(other) #other is another instance of date_range start_date < other.end_date && other.start_date < end_date end diff --git a/lib/hotel_controller.rb b/lib/hotel_controller.rb index 95560f13c..ffd5d07f8 100644 --- a/lib/hotel_controller.rb +++ b/lib/hotel_controller.rb @@ -8,7 +8,7 @@ def initialize @hotel_blocks = [] #contain a number of rooms and a specific set of days end - # Wave 1 + ################# Wave 1 # Access the list of all of the rooms in the hotel def self.rooms @@ -28,7 +28,6 @@ def reservations_list_room_and_date(given_room, given_date_range) def add_reservation(reservation) @reservations << reservation end - # Access the list of reservations for a specific date, so that I can track reservations by date def reservations_list(date) @@ -44,7 +43,7 @@ def total_cost(reservation) return total_cost end - # Wave 2 + ##################### Wave 2 # Get reservations_list for a given date range def reservations_list_by_date_range(start_date, end_date) given_date_range = Hotel::DateRange.new(start_date, end_date) @@ -99,7 +98,7 @@ def reserve_room(start_date, end_date) return reservation end - # Wave 3 + ############## Wave 3 # Add hotel_block method def add_hotel_block(hotel_block) @@ -127,7 +126,7 @@ def rooms_list_for_hotel_block(start_date, end_date) return all_rooms_hotel_block end - #Create a hotel_block + # Create a hotel_block def create_hotel_block(date_range, rooms_array, discount_rate) # all rooms of rooms_array must be available (not in the reservations list) during the given date range all_reserved_rooms = reserved_rooms_list(date_range.start_date, date_range.end_date) @@ -147,8 +146,6 @@ def create_hotel_block(date_range, rooms_array, discount_rate) return hotel_block end - - #################################### # check whether a given block has any rooms available def available_rooms_of_block(hotel_block) if hotel_block.rooms.empty? @@ -158,7 +155,6 @@ def available_rooms_of_block(hotel_block) end end - # Get the list of the hotel_block for a specific full date range (exact match the full date range) def hotel_blocks_for_specific_date_range(start_date, end_date) specific_date_range = Hotel::DateRange.new(start_date, end_date) @@ -209,9 +205,9 @@ def delete_hotel_block(hotel_block) # I can reserve a specific room from a hotel block # I can only reserve that room from a hotel block for the full duration of the block # I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) - def reserve_room_from_hotel_block(room,start_date, end_date) - given_date_range = Hotel::DateRange.new(start_date, end_date) - all_available_rooms_of_hotel_blocks = available_rooms_of_hotel_blocks(start_date, end_date) + def reserve_room_from_hotel_block(room,start_date, end_date) + given_date_range = Hotel::DateRange.new(start_date, end_date) + all_available_rooms_of_hotel_blocks = available_rooms_of_hotel_blocks(start_date, end_date) if all_available_rooms_of_hotel_blocks.empty? raise NoRoomAvailableError.new("there is no available room.") end diff --git a/lib/room.rb b/lib/room.rb index 3012140b8..c386bf56f 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -11,6 +11,7 @@ def initialize(id, cost = 200) @id = id @cost = cost end + def ==(other) self.id == other.id end diff --git a/test/hotel_controller_test.rb b/test/hotel_controller_test.rb index 11e17f4a6..b0192f336 100644 --- a/test/hotel_controller_test.rb +++ b/test/hotel_controller_test.rb @@ -21,6 +21,7 @@ expect(rooms.length).must_equal 20 end end + describe "reservations_list_room_and_date" do it "when there is no reservation, retrun a empty reservation list for a specified room and a given date range" do room = Hotel::Room.new(1, 200) @@ -31,6 +32,7 @@ expect(reservations_list).must_equal [] end + it "return a reservation list for a specified room and a given date range" do # reservation with date_range1 room = Hotel::Room.new(1, 200) @@ -65,6 +67,7 @@ expect(reservations_list_of_given_room_date_range.length).must_equal 2 end end + describe "add_reservation" do it "add a new reservation to the reservations list" do room = @hotel_controller.rooms[0] @@ -254,9 +257,6 @@ @discount_rate = 0.1 end - - - describe "create_hotel_block" do it "create a HotelBlock when all the rooms of rooms_array are avaible " do new_hotel_block = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) @@ -327,7 +327,6 @@ new_hotel_block1 = @hotel_controller.create_hotel_block(@date_range, @rooms_array, @discount_rate) new_hotel_block2 = @hotel_controller.create_hotel_block(date_range2, @rooms_array1, @discount_rate) - # serching the room_list_for_hotel_block for the whole month # we have two hotel_blocks that over lap for the whole month in Aguest test_start_date = Date.new(2020, 8, 01) @@ -488,6 +487,7 @@ expect(p new_hotel_block2.rooms).must_equal [@room1, @room2, @room3, @room4] end end + describe "delete_hotel_block" do it "delete a hotel_block from hotel_blocks list for given hotel_block" do # @rooms_array = [@room1, @room2] @@ -512,6 +512,7 @@ expect(@hotel_controller.hotel_blocks.length).must_equal 1 end end + describe "reserve_from_hotel_block" do it "Can reserve a room form a hotel block for a full duration of the block" do # @rooms_array = [@room1, @room2] From 36075daa3af79304036b4ab70bb9fdfd589d2885 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sun, 8 Mar 2020 22:41:19 -0700 Subject: [PATCH 23/24] added a nominal test for reservation_id --- test/reservation_test.rb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/reservation_test.rb b/test/reservation_test.rb index f633a60a0..1d335ca22 100644 --- a/test/reservation_test.rb +++ b/test/reservation_test.rb @@ -4,11 +4,11 @@ describe Hotel::Reservation do before do - room = Hotel::Room.new(1, 200) - start_date = Date.today - end_date = start_date + 3 - date_range = Hotel::DateRange.new(start_date,end_date) - @reservation = Hotel::Reservation.new(1, date_range,room) + @room = Hotel::Room.new(1, 200) + @start_date = Date.today + @end_date = @start_date + 3 + @date_range = Hotel::DateRange.new(@start_date,@end_date) + @reservation = Hotel::Reservation.new(1, @date_range,@room) end describe "#initialize" do it 'Create an instance of reservation' do @@ -18,6 +18,10 @@ it 'Keep track of reservation_id' do expect(@reservation.id).must_equal 1 end + + it "raise ArgumentError when id is not a positive integer" do + expect{(Hotel::Reservation.new("kdjfkasdjfa",@date_range,@room))}.must_raise ArgumentError + end end describe "cost" do From 2b36987a02f2f1e27d06a308bf6bcbbe8119f4e6 Mon Sep 17 00:00:00 2001 From: Tithvorlak Mok Date: Sun, 8 Mar 2020 23:15:14 -0700 Subject: [PATCH 24/24] added refactor.txt --- pseudocode.txt | 52 ---------------------------------- refactors.txt | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 52 deletions(-) delete mode 100644 pseudocode.txt create mode 100644 refactors.txt diff --git a/pseudocode.txt b/pseudocode.txt deleted file mode 100644 index f2c52b6ee..000000000 --- a/pseudocode.txt +++ /dev/null @@ -1,52 +0,0 @@ -This system will be used by employees who manage bookings and booking data, -and will not be available to the general public. - -1. we should make a module full of business logic that tracks which rooms are reserved, -and at what dates. - -user stories: - - 1. As a user, I can look up rooms that are reserved with dates - 2. As a user, I can look up rooms that are available with dates - 3. As a user, I can look up rooms that are available based on types of rooms and dates - 4. As a user, I can - - - -Notes: - This should be organized into appropriate classes and methods. - - We should use tests to verify that this system works as intended. - - - Classes: - - Room - - id - - number - - name - - status - - smoke - - cost # total = cost + 10% of tax + $10 fees - Reservation - - id - - date_in - - date_out - - get mearch files from existing code. now we have 4 classes - - Wave 1: Tracking Reservation - - -User Stories - -As a user of the hotel system... -I can access the list of all of the rooms in the hotel -I access the list of reservations for a specified room and a given date range -I can access the list of reservations for a specific date, so that I can track reservations by date -I can get the total cost for a given reservation -I want exception raised when an invalid date range is provided, so that I can't make a reservation for an invalid date range - - - -what if there are no reservations? - - return array of all the rooms -do reservations that don't overlap that don't overlap diff --git a/refactors.txt b/refactors.txt new file mode 100644 index 000000000..93e63ebc0 --- /dev/null +++ b/refactors.txt @@ -0,0 +1,77 @@ +1. created Room class +2. created Reservation class +3. created DateRange class +4. created HotelController class where rooms and Reservations are the instance attributes of the HotelController + added the following methods in HotelController class: + + # Access the list of all of the rooms in the hotel + def self.rooms + + # Access the list of reservations for a specified room and a given date range + def reservations_list_room_and_date(given_room, given_date_range) + + + # Add reservation to the list of the reservations + def add_reservation(reservation) + + # Access the list of reservations for a specific date, so that I can track reservations by date + def reservations_list(date) + + # Can get the total cost for a given reservation + def total_cost(reservation) + + + ##################### Wave 2 + # Get reservations_list for a given date range + def reservations_list_by_date_range(start_date, end_date) + + def reserved_rooms_list(start_date, end_date) + + # I can view a list of rooms that are not reserved for a given date range, + # so that I can see all available rooms for that day + def available_rooms(start_date, end_date) + + # I can 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 + # done already in wave 1 + + def reserve_room(start_date, end_date) + + ############## Wave 3 + + # Add hotel_block method + def add_hotel_block(hotel_block) + + # Get the hotel_block_list for a given date (not exact match date range) + def hotel_block_list(start_date, end_date) + + + # Get the rooms_list_for_hotel_block + def rooms_list_for_hotel_block(start_date, end_date) + + # Create a hotel_block + def create_hotel_block(date_range, rooms_array, discount_rate) + + # check whether a given block has any rooms available + def available_rooms_of_block(hotel_block) + + # Get the list of the hotel_block for a specific full date range (exact match the full date range) + def hotel_blocks_for_specific_date_range(start_date, end_date) + + # Get available_rooms_of_hotel_blocks for a specific full date range (exact match the full date range) + def available_rooms_of_hotel_blocks(start_date, end_date) + + # Get specific hotel_block with a given room, start_date, and end_date + def specific_hotel_block(room, start_date, end_date) + + # remove the room from the hotel_block for a specific date_range + def remove_room_from_hotel_block(room, start_date, end_date) + + # remove/delete the whole hotel block + def delete_hotel_block(hotel_block) + + # I can reserve a specific room from a hotel block + # I can only reserve that room from a hotel block for the full duration of the block + # I can see a reservation made from a hotel block from the list of reservations for that date (see wave 1 requirements) + def reserve_room_from_hotel_block(room,start_date, end_date) + \ No newline at end of file