From 44689840543752e8fc82a3b012c8b18802de81bf Mon Sep 17 00:00:00 2001 From: Mariana Date: Thu, 7 Sep 2017 10:04:04 -0700 Subject: [PATCH 01/16] Commit of the first wave without list of reservations per day --- .DS_Store | Bin 0 -> 6148 bytes Rakefile | 9 ++++++++ lib/admin.rb | 22 +++++++++++++++++++ lib/daterange.rb | 25 ++++++++++++++++++++++ lib/reservation.rb | 14 +++++++++++++ specs/admin_spec.rb | 36 +++++++++++++++++++++++++++++++ specs/daterange_spec.rb | 43 ++++++++++++++++++++++++++++++++++++++ specs/reservation_spec.rb | 28 +++++++++++++++++++++++++ specs/spec_helper.rb | 11 ++++++++++ 9 files changed, 188 insertions(+) create mode 100644 .DS_Store create mode 100644 Rakefile create mode 100644 lib/admin.rb create mode 100644 lib/daterange.rb create mode 100644 lib/reservation.rb create mode 100644 specs/admin_spec.rb create mode 100644 specs/daterange_spec.rb create mode 100644 specs/reservation_spec.rb create mode 100644 specs/spec_helper.rb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..189eb029e8ad99f719d3668f9c9274f881a67c60 GIT binary patch literal 6148 zcmeHKOG-mQ5Ue&40&cQ&IalxoLx?BH1%e+$2vH1X{Z^jKqow+T@O%;6xRGk;shOUx z8KxGmUjwk!`@;>e1hAkx;=_lj`M&$aE-K<^e#YB=_p*P=)g=3Tz_~N*@Ql0TX2ie5 z0k3$(Jr3V?&Yz^H6p#W^Knh3!DexNwShL+0SBV;>fE17dUkdp5q0t?C;gA@g4i3=* z5a$esaUQ({v3Y>l3x`BTXqHrBQmtAHOFHAN@_ONrm~>d&%ya5ys}9BDcE($z!+N4d zDIf*L3e0l3^!k5G|DpdMleCfoQs7@HVDt56z2cLqwoV@BwYJf>bkF&uyKx>A4pEMY jQI5Ira(o?0nb&;I{a!dE2A%Ps6ZJFTy2zx!Un_6|Dt#C- literal 0 HcmV?d00001 diff --git a/Rakefile b/Rakefile new file mode 100644 index 000000000..deb52f2cd --- /dev/null +++ b/Rakefile @@ -0,0 +1,9 @@ +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.libs = ["lib"] + t.warning = true + t.test_files = FileList['specs/*_spec.rb'] +end + +task default: :test diff --git a/lib/admin.rb b/lib/admin.rb new file mode 100644 index 000000000..210473adf --- /dev/null +++ b/lib/admin.rb @@ -0,0 +1,22 @@ +module Hotel + class Admin + attr_reader :list_reservations + + def initialize + @list_rooms = [] + 20.times do |i| + @list_rooms << i + end + @list_reservations = [] + end + + def add_reservation(checkin, checkout) + newreservation = Hotel::Reservation.new(checkin, checkout) + @list_reservations << newreservation + end + + + + end #class + +end #module diff --git a/lib/daterange.rb b/lib/daterange.rb new file mode 100644 index 000000000..97959a400 --- /dev/null +++ b/lib/daterange.rb @@ -0,0 +1,25 @@ + +module Hotel + class DateRange + attr_reader :checkin, :checkout + + def initialize(day1, day2) + @checkin = day1 + @checkout = day2 + valid_date? + end + + def valid_date? + if @checkin < @checkout + true + else + raise ArgumentError.new("No valid input") + end + end + + def stay_length + (@checkout - @checkin).to_i + end + + end +end #module diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..6843a53a0 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,14 @@ +module Hotel + class Reservation + def initialize(checkin, checkout) + @price_per_night = 200 + @days_range = Hotel::DateRange.new(checkin, checkout) + end + + def totalcost + @price_per_night * @days_range.stay_length + end + + + end #class Reservation +end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb new file mode 100644 index 000000000..9ac8bc962 --- /dev/null +++ b/specs/admin_spec.rb @@ -0,0 +1,36 @@ +require_relative 'spec_helper.rb' + +describe 'Admin class' do + before do + @administrator = Hotel::Admin.new + end + + describe 'Initialize' do + it "Can be create" do + @administrator.must_be_instance_of Hotel::Admin + end + + it "Create list of Reservation" do + @administrator.list_reservations.must_equal [] + end + end + + describe "Creates a new reservation" do + before do + @day1 = Date.new(2017, 8, 29) + @day2 = Date.new(2017, 9, 3) + end + + it "Creates an array of reservation" do + @administrator.add_reservation(@day1,@day2).must_be_instance_of Array + end + + it "Each element in the array is a Reservation" do + @administrator.add_reservation(@day1,@day2)[0].must_be_instance_of Hotel::Reservation + end + end + + describe "reservations_per_day" do + + end +end#describe class diff --git a/specs/daterange_spec.rb b/specs/daterange_spec.rb new file mode 100644 index 000000000..35a9f2e70 --- /dev/null +++ b/specs/daterange_spec.rb @@ -0,0 +1,43 @@ +require_relative 'spec_helper.rb' + +describe 'DateRange class' do + describe 'initialize' do + before do + @day1 = Date.new(2017,8,3) + @day2 = Date.new(2017,8,6) + end + + it "Responds to checkin checkout" do + newdate = Hotel::DateRange.new(@day1 ,@day2) + newdate.checkin.must_equal @day1 + newdate.checkout.must_equal @day2 + end + + it "Can be initialize if the dates are right" do + Hotel::DateRange.new( @day1, @day2).must_be_instance_of Hotel::DateRange + end + + it "Raises error if checkout is before checkin" do + proc {Hotel::DateRange.new(@day2, @day1)}.must_raise ArgumentError + end + + it "Raises an error if checkin and checkout are equal" do + proc{Hotel::DateRange.new(@day1, @day1)}.must_raise ArgumentError + end + + end#describe initialize + + + describe "stay_length" do + before do + @day1 = Date.new(2017,8,3) + @day2 = Date.new(2017,8,4) + end + it "Should give the right amount of days" do + newdate = Hotel::DateRange.new(@day1, @day2) + newdate.stay_length.must_equal 1 + end + end + + +end#big descrbe diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb new file mode 100644 index 000000000..8b76f3b05 --- /dev/null +++ b/specs/reservation_spec.rb @@ -0,0 +1,28 @@ +require_relative 'spec_helper.rb' + +describe 'Registration class' do + describe 'initialize'do + it 'Can be initialize' do + checkin = Date.new(2017,9,10) + checkout = Date.new(2017,9,13) + Hotel::Reservation.new(checkin, checkout).must_be_instance_of Hotel::Reservation + end + + it "doesn't initialize wrong dates" do + checkin = Date.new(2017,9,10) + checkout = Date.new(2017,9,13) + proc{Hotel::Reservation.new(checkin, checkin)}.must_raise ArgumentError + end + end + + describe 'total price' do + it 'calcualate the total price' do + checkin = Date.new(2017,9,10) + checkout = Date.new(2017,9,13) + newreservation = Hotel::Reservation.new(checkin, checkout) + newreservation.totalcost.must_equal 600 + end + + + end +end#describe Registratioin class diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb new file mode 100644 index 000000000..0116db920 --- /dev/null +++ b/specs/spec_helper.rb @@ -0,0 +1,11 @@ +require 'simplecov' +SimpleCov.start +require 'minitest/autorun' +require 'minitest/reporters' +require 'date' +require_relative '../lib/daterange.rb' +require_relative '../lib/reservation.rb' +require_relative '../lib/admin.rb' + + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new From a6583a8966cad3637ba0074aff16c35f5c0bc39e Mon Sep 17 00:00:00 2001 From: Mariana Date: Thu, 7 Sep 2017 16:15:04 -0700 Subject: [PATCH 02/16] Wave 1 finish --- lib/admin.rb | 11 +++++++++++ lib/daterange.rb | 8 ++++++++ lib/reservation.rb | 3 +++ specs/admin_spec.rb | 33 ++++++++++++++++++++++++++++++++- specs/daterange_spec.rb | 26 ++++++++++++++++++++++++++ specs/reservation_spec.rb | 2 -- 6 files changed, 80 insertions(+), 3 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 210473adf..e8827fad2 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -1,3 +1,4 @@ + module Hotel class Admin attr_reader :list_reservations @@ -15,6 +16,16 @@ def add_reservation(checkin, checkout) @list_reservations << newreservation end + def reservations_per_day(date)#hacer esto + list_per_day = [] + @list_reservations.each do |reservation| + if reservation.days_range.include?(date) + list_per_day << reservation + end #if + end #each + return list_per_day + end #method + end #class diff --git a/lib/daterange.rb b/lib/daterange.rb index 97959a400..23af10e88 100644 --- a/lib/daterange.rb +++ b/lib/daterange.rb @@ -21,5 +21,13 @@ def stay_length (@checkout - @checkin).to_i end + def include?(date) + if @checkin <= date && @checkout > date + return true + else + return false + end + end + end end #module diff --git a/lib/reservation.rb b/lib/reservation.rb index 6843a53a0..c4afba8d0 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,5 +1,6 @@ module Hotel class Reservation + attr_reader :checkin, :checkout, :days_range def initialize(checkin, checkout) @price_per_night = 200 @days_range = Hotel::DateRange.new(checkin, checkout) @@ -10,5 +11,7 @@ def totalcost end + + end #class Reservation end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 9ac8bc962..7b19a4e6d 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -1,4 +1,5 @@ require_relative 'spec_helper.rb' +require 'pry' describe 'Admin class' do before do @@ -31,6 +32,36 @@ end describe "reservations_per_day" do - + before do + @date1 = Date.new(2018,01,25) + @date2 = Date.new(2018,02,22) + @date3 = Date.new(2018,01,31) + @date4 = Date.new(2018,02,05) + @date5 = Date.new(2018,01,29) + @administrator = Hotel::Admin.new + @administrator.add_reservation(@date1, @date3) + @administrator.add_reservation(@date1, @date4) + + #terminar de hacer las reservaciones para los test + + end + + it 'Returns an array ' do + @administrator.reservations_per_day(@date1).must_be_instance_of Array + end + + it 'Returns an array of reservations instances' do + @administrator.reservations_per_day(@date1)[0].must_be_instance_of Hotel::Reservation + end + + it 'Returns all the reservations per day, when is not empty' do + @administrator.reservations_per_day(@date1).length.must_equal 2 + end + + it 'Returns empty array if that day there is no reservations' do + @administrator.reservations_per_day(@date2).must_equal [] + end + + end end#describe class diff --git a/specs/daterange_spec.rb b/specs/daterange_spec.rb index 35a9f2e70..19909f2c1 100644 --- a/specs/daterange_spec.rb +++ b/specs/daterange_spec.rb @@ -39,5 +39,31 @@ end end + describe 'include?' do + before do + @checkin = Date.new(2017,9,10) + @checkout = Date.new(2017,9,13) + @newdaterange = Hotel::DateRange.new(@checkin, @checkout) + end + + it 'returns true, if the date is include' do + date = Date.new(2017,9,11) + @newdaterange.include?(date).must_equal true + end + + it 'returns true if the date is the checkin date' do + @newdaterange.include?(@checkin).must_equal true + end + + it 'returns false for the checkout date' do + @newdaterange.include?(@checkout).must_equal false + end + + it 'returns false for a date out of range' do + date = Date.new(2017,9,15) + @newdaterange.include?(date).must_equal false + end + + end end#big descrbe diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 8b76f3b05..39ced1a98 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -22,7 +22,5 @@ newreservation = Hotel::Reservation.new(checkin, checkout) newreservation.totalcost.must_equal 600 end - - end end#describe Registratioin class From b264077fa53f83918a24dcb1b65910099ef3a1e7 Mon Sep 17 00:00:00 2001 From: Mariana Date: Fri, 8 Sep 2017 11:02:20 -0700 Subject: [PATCH 03/16] overlap? method in DateRange class --- lib/daterange.rb | 12 ++++++++++++ lib/reservation.rb | 10 +++++++++- specs/daterange_spec.rb | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/lib/daterange.rb b/lib/daterange.rb index 23af10e88..a47f2ee00 100644 --- a/lib/daterange.rb +++ b/lib/daterange.rb @@ -29,5 +29,17 @@ def include?(date) end end + def overlap?(other) + if other.checkin <= self.checkin && other.checkout > self.checkin + return true + elsif other.checkin >= self.checkin && other.checkin < self.checkout + return true + else + return false + end + end + + + end end #module diff --git a/lib/reservation.rb b/lib/reservation.rb index c4afba8d0..60a2f8a30 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,15 +1,23 @@ module Hotel class Reservation attr_reader :checkin, :checkout, :days_range - def initialize(checkin, checkout) + def initialize(checkin, checkout)#, room_number) @price_per_night = 200 @days_range = Hotel::DateRange.new(checkin, checkout) + # @rooms = {} + # 20.times do |i| + # @rooms["#{i + 1}"] => [] + # end end def totalcost @price_per_night * @days_range.stay_length end + # def room_avaliables(@days_range) + # + # end + diff --git a/specs/daterange_spec.rb b/specs/daterange_spec.rb index 19909f2c1..7fa98a52f 100644 --- a/specs/daterange_spec.rb +++ b/specs/daterange_spec.rb @@ -66,4 +66,35 @@ end -end#big descrbe + describe 'overlap?' do + before do + @day1 = Date.new(2017,12, 13) + @day2 = Date.new(2017,12, 19) + @dr1 = Hotel::DateRange.new(@day1, @day2) + @day3 = Date.new(2017,12,7) + @day4 = Date.new(2017,12,12) + @day5 = Date.new(2017,12,24) + @day6 = Date.new(2017,12,14) + @day7 = Date.new(2017,12,16) + @dr2 = Hotel::DateRange.new(@day3,@day4) + @dr3 = Hotel::DateRange.new(@day2,@day5) + @dr4 = Hotel::DateRange.new(@day6,@day7) + @dr5 = Hotel::DateRange.new(@day6,@day5) + @dr6 = Hotel::DateRange.new(@day3,@day5) + @dr7 = Hotel::DateRange.new(@day3,@day6) + end + + it "returns false if the intervals are disconect" do + @dr1.overlap?(@dr2).must_equal false + @dr1.overlap?(@dr3).must_equal false + end + + it "returns true if the dates ranges overlap" do + @dr1.overlap?(@dr4).must_equal true + @dr1.overlap?(@dr5).must_equal true + @dr1.overlap?(@dr6).must_equal true + @dr1.overlap?(@dr7).must_equal true + end + end#overlap + +end#big describe From 1996c667c4401fb4b1584ac3721cfbb8113378fd Mon Sep 17 00:00:00 2001 From: Mariana Date: Fri, 8 Sep 2017 11:18:34 -0700 Subject: [PATCH 04/16] Add room number to reservation parameters --- lib/admin.rb | 11 ++++++----- lib/reservation.rb | 3 ++- specs/reservation_spec.rb | 9 ++++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index e8827fad2..37875333c 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -4,15 +4,16 @@ class Admin attr_reader :list_reservations def initialize - @list_rooms = [] - 20.times do |i| - @list_rooms << i - end + # @list_rooms = [] + # 20.times do |i| + # @list_rooms << i + # end @list_reservations = [] end def add_reservation(checkin, checkout) - newreservation = Hotel::Reservation.new(checkin, checkout) + room_number = 1 + newreservation = Hotel::Reservation.new(checkin, checkout, room_number) @list_reservations << newreservation end diff --git a/lib/reservation.rb b/lib/reservation.rb index 60a2f8a30..24cebaa8e 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,9 +1,10 @@ module Hotel class Reservation attr_reader :checkin, :checkout, :days_range - def initialize(checkin, checkout)#, room_number) + def initialize(checkin, checkout, room_number) @price_per_night = 200 @days_range = Hotel::DateRange.new(checkin, checkout) + @room_number = room_number # @rooms = {} # 20.times do |i| # @rooms["#{i + 1}"] => [] diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 39ced1a98..2b38d0dfd 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -5,13 +5,15 @@ it 'Can be initialize' do checkin = Date.new(2017,9,10) checkout = Date.new(2017,9,13) - Hotel::Reservation.new(checkin, checkout).must_be_instance_of Hotel::Reservation + room_number = 1 + Hotel::Reservation.new(checkin, checkout, room_number).must_be_instance_of Hotel::Reservation end it "doesn't initialize wrong dates" do checkin = Date.new(2017,9,10) checkout = Date.new(2017,9,13) - proc{Hotel::Reservation.new(checkin, checkin)}.must_raise ArgumentError + room_number = 1 + proc{Hotel::Reservation.new(checkin, checkin, room_number)}.must_raise ArgumentError end end @@ -19,7 +21,8 @@ it 'calcualate the total price' do checkin = Date.new(2017,9,10) checkout = Date.new(2017,9,13) - newreservation = Hotel::Reservation.new(checkin, checkout) + room_number = 1 + newreservation = Hotel::Reservation.new(checkin, checkout, room_number) newreservation.totalcost.must_equal 600 end end From fd80b35e45340dafc429737db1a35140977597d9 Mon Sep 17 00:00:00 2001 From: Mariana Date: Fri, 8 Sep 2017 11:27:17 -0700 Subject: [PATCH 05/16] Creates hash of rooms --- lib/admin.rb | 14 +++++++++----- lib/reservation.rb | 4 ---- specs/admin_spec.rb | 11 +++++++++-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 37875333c..713742601 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -1,14 +1,12 @@ module Hotel class Admin - attr_reader :list_reservations + attr_reader :list_reservations, :rooms def initialize - # @list_rooms = [] - # 20.times do |i| - # @list_rooms << i - # end + @rooms = {} @list_reservations = [] + create_rooms end def add_reservation(checkin, checkout) @@ -27,6 +25,12 @@ def reservations_per_day(date)#hacer esto return list_per_day end #method + def create_rooms + 20.times do |i| + @rooms["#{i + 1}"] = [] + end + end + end #class diff --git a/lib/reservation.rb b/lib/reservation.rb index 24cebaa8e..164538c2e 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -5,10 +5,6 @@ def initialize(checkin, checkout, room_number) @price_per_night = 200 @days_range = Hotel::DateRange.new(checkin, checkout) @room_number = room_number - # @rooms = {} - # 20.times do |i| - # @rooms["#{i + 1}"] => [] - # end end def totalcost diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 7b19a4e6d..2ab6ac9ed 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -14,6 +14,14 @@ it "Create list of Reservation" do @administrator.list_reservations.must_equal [] end + + it "Create a hash of rooms" do + @administrator.rooms.must_be_instance_of Hash + end + + it "Length of rooms is 20" do + @administrator.rooms.length.must_equal 20 + end end describe "Creates a new reservation" do @@ -61,7 +69,6 @@ it 'Returns empty array if that day there is no reservations' do @administrator.reservations_per_day(@date2).must_equal [] end - - end + end#describe class From ae44024376f92805d32497c54fd443e7917d5b02 Mon Sep 17 00:00:00 2001 From: Mariana Date: Fri, 8 Sep 2017 15:14:57 -0700 Subject: [PATCH 06/16] Second wave --- lib/admin.rb | 36 +++++++++++++++++++-- lib/daterange.rb | 2 +- specs/admin_spec.rb | 68 ++++++++++++++++++++++++++++++++++++--- specs/reservation_spec.rb | 1 - 4 files changed, 97 insertions(+), 10 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 713742601..406066128 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -10,9 +10,16 @@ def initialize end def add_reservation(checkin, checkout) - room_number = 1 - newreservation = Hotel::Reservation.new(checkin, checkout, room_number) - @list_reservations << newreservation + dates_to_reserve = Hotel::DateRange.new(checkin, checkout) + @rooms.each do |room_number, dates| + if is_room_avaliable?(room_number, dates_to_reserve) + @rooms[room_number] << dates_to_reserve + make_reservation = Hotel::Reservation.new(checkin, checkout, room_number) + @list_reservations << make_reservation + return make_reservation + end #if + end #each + return "There is not avaliable rooms for that date range" end def reservations_per_day(date)#hacer esto @@ -31,6 +38,29 @@ def create_rooms end end + def is_room_avaliable?(room_number, dates_to_reserve) + avaliable = true + + @rooms[room_number].each do |busy_dates| + if dates_to_reserve.overlap?(busy_dates) + avaliable = false + end#if + end + return avaliable + end + + def avaliable_rooms_daterange(checkin, checkout) + avaliable_rooms = [] + date_range = Hotel::DateRange.new(checkin,checkout) + @rooms.each do |room_number, dates| + if is_room_avaliable?(room_number, date_range) + avaliable_rooms << room_number + end + end + return avaliable_rooms + end + + end #class diff --git a/lib/daterange.rb b/lib/daterange.rb index a47f2ee00..7647f7d9c 100644 --- a/lib/daterange.rb +++ b/lib/daterange.rb @@ -36,7 +36,7 @@ def overlap?(other) return true else return false - end + end end diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 2ab6ac9ed..35e5ea2e5 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -30,13 +30,42 @@ @day2 = Date.new(2017, 9, 3) end - it "Creates an array of reservation" do - @administrator.add_reservation(@day1,@day2).must_be_instance_of Array + it "Creates areservation when it is possible" do + @administrator.add_reservation(@day1,@day2).must_be_instance_of Hotel::Reservation end - it "Each element in the array is a Reservation" do - @administrator.add_reservation(@day1,@day2)[0].must_be_instance_of Hotel::Reservation + it "Stores the new reservations in the list_reservations" do + day3 = Date.new(2017,12,7) + day4 = Date.new(2017,12,12) + day5 = Date.new(2017,12,24) + @administrator.add_reservation(@day1,@day2) + @administrator.add_reservation(day3,day4) + @administrator.add_reservation(day4,day5) + @administrator.list_reservations.length.must_equal 3 end + + it "Modify the rooms hash" do + day3 = Date.new(2017,12,7) + day4 = Date.new(2017,12,12) + day5 = Date.new(2017,12,24) + @administrator.add_reservation(@day1,@day2) + @administrator.add_reservation(day3,day4) + @administrator.add_reservation(day4,day5) + @administrator.rooms["1"].length.must_equal 3 + @administrator.add_reservation(day4,day5) + @administrator.rooms["2"].length.must_equal 1 + @administrator.rooms["3"].length.must_equal 0 + end + + it "doesn't create a new reservation if there is not rooms" do + 20.times do + @administrator.add_reservation(@day1,@day2) + end + @administrator.add_reservation(@day1,@day2).must_equal "There is not avaliable rooms for that date range" + end + + + end describe "reservations_per_day" do @@ -46,7 +75,7 @@ @date3 = Date.new(2018,01,31) @date4 = Date.new(2018,02,05) @date5 = Date.new(2018,01,29) - @administrator = Hotel::Admin.new + #@administrator = Hotel::Admin.new @administrator.add_reservation(@date1, @date3) @administrator.add_reservation(@date1, @date4) @@ -71,4 +100,33 @@ end end + describe "avaliable_rooms_daterange" do + before do + @day1 = Date.new(2017,12, 13) + @day2 = Date.new(2017,12, 19) + @day3 = Date.new(2017,12,7) + @day4 = Date.new(2017,12,12) + @day5 = Date.new(2017,12,24) + @day6 = Date.new(2017,12,14) + @day7 = Date.new(2017,12,16) + @all_rooms = [] + 20.times do |i| + @all_rooms << "#{i+1}" + end + end + + it "returns all the rooms if there is 0 reservations for that date range" do + @administrator.avaliable_rooms_daterange(@day1, @day2).must_equal @all_rooms + end + + it "returns the rigth number of rooms avaliables" do + 3.times do + @administrator.add_reservation(@day1, @day2) + end + @administrator.add_reservation(@day3,@day4) + @administrator.add_reservation(@day1,@day5) + @administrator.avaliable_rooms_daterange(@day6,@day7).must_equal @all_rooms[4..19] + end + end + end#describe class diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 2b38d0dfd..2a8372048 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -11,7 +11,6 @@ it "doesn't initialize wrong dates" do checkin = Date.new(2017,9,10) - checkout = Date.new(2017,9,13) room_number = 1 proc{Hotel::Reservation.new(checkin, checkin, room_number)}.must_raise ArgumentError end From 11d44cbd5d2998bf2648dabff64b4e976e4fc866 Mon Sep 17 00:00:00 2001 From: Mariana Date: Fri, 8 Sep 2017 15:22:40 -0700 Subject: [PATCH 07/16] Add argument error if there is no rooms avaliables --- lib/admin.rb | 2 +- specs/admin_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index 406066128..a685b822d 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -19,7 +19,7 @@ def add_reservation(checkin, checkout) return make_reservation end #if end #each - return "There is not avaliable rooms for that date range" + raise ArgumentError.new( "There are not avaliable rooms for that date range") end def reservations_per_day(date)#hacer esto diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 35e5ea2e5..5b74bff69 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -61,7 +61,7 @@ 20.times do @administrator.add_reservation(@day1,@day2) end - @administrator.add_reservation(@day1,@day2).must_equal "There is not avaliable rooms for that date range" + proc{@administrator.add_reservation(@day1,@day2)}.must_raise ArgumentError end From 7e8edb43aaf3d80c619ca3890be514c87c8784df Mon Sep 17 00:00:00 2001 From: Mariana Date: Sun, 10 Sep 2017 15:16:05 -0700 Subject: [PATCH 08/16] initialize block --- lib/admin.rb | 2 +- lib/block.rb | 22 ++++++++++++++++++++++ specs/block_spec.rb | 15 +++++++++++++++ specs/spec_helper.rb | 1 + 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 lib/block.rb create mode 100644 specs/block_spec.rb diff --git a/lib/admin.rb b/lib/admin.rb index a685b822d..7a424325e 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -22,7 +22,7 @@ def add_reservation(checkin, checkout) raise ArgumentError.new( "There are not avaliable rooms for that date range") end - def reservations_per_day(date)#hacer esto + def reservations_per_day(date) list_per_day = [] @list_reservations.each do |reservation| if reservation.days_range.include?(date) diff --git a/lib/block.rb b/lib/block.rb new file mode 100644 index 000000000..b7f2e092f --- /dev/null +++ b/lib/block.rb @@ -0,0 +1,22 @@ +module Hotel + class Block + + def initialize(checkin, checkout, rooms_set, price) + @price_per_night = price + @days_range = Hotel::DateRange.new(checkin, checkout) + @rooms_set = rooms_set + end + + def totalcost + @price_per_night * @days_range.stay_length + end + + def reserve + if @rooms_set.length > 0 + @rooms_set.delete_at(0) + end + return @rooms_set + end + + end #class +end #module diff --git a/specs/block_spec.rb b/specs/block_spec.rb new file mode 100644 index 000000000..06de5e741 --- /dev/null +++ b/specs/block_spec.rb @@ -0,0 +1,15 @@ +require_relative 'spec_helper' + + +describe 'Block class' do + describe 'initialize' do + it 'can be initialize' do + checkin = Date.new(2018,03,05) + checkout = Date.new(2018,03,10) + rooms_set = [17, 18, 19, 10] + price = 150 + blocknew = Hotel::Block.new(checkin, checkout, rooms_set, price) + blocknew.must_be_instance_of Hotel::Block + end + end +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index 0116db920..f9d1e253e 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -6,6 +6,7 @@ require_relative '../lib/daterange.rb' require_relative '../lib/reservation.rb' require_relative '../lib/admin.rb' +require_relative '../lib/block.rb' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new From 5f10e0833c841ac45ed3451651c7805fa94dc589 Mon Sep 17 00:00:00 2001 From: Mariana Date: Sun, 10 Sep 2017 15:43:26 -0700 Subject: [PATCH 09/16] Block class with total cost ans reserve --- lib/block.rb | 7 +++++-- specs/block_spec.rb | 35 +++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index b7f2e092f..d59c63616 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -7,16 +7,19 @@ def initialize(checkin, checkout, rooms_set, price) @rooms_set = rooms_set end - def totalcost + def totalcost_oneroom @price_per_night * @days_range.stay_length end def reserve if @rooms_set.length > 0 @rooms_set.delete_at(0) + return @rooms_set + else + raise ArgumentError.new("There is not more rooms avaliables in the given block") end - return @rooms_set end + end #class end #module diff --git a/specs/block_spec.rb b/specs/block_spec.rb index 06de5e741..036bdd9e2 100644 --- a/specs/block_spec.rb +++ b/specs/block_spec.rb @@ -2,14 +2,37 @@ describe 'Block class' do + before do + @checkin = Date.new(2018,03,05) + @checkout = Date.new(2018,03,10) + @rooms_set = [17, 18, 19, 10] + @price = 150 + @blocknew = Hotel::Block.new(@checkin, @checkout, @rooms_set, @price) + end + describe 'initialize' do it 'can be initialize' do - checkin = Date.new(2018,03,05) - checkout = Date.new(2018,03,10) - rooms_set = [17, 18, 19, 10] - price = 150 - blocknew = Hotel::Block.new(checkin, checkout, rooms_set, price) - blocknew.must_be_instance_of Hotel::Block + @blocknew.must_be_instance_of Hotel::Block + end + end#initialize + + describe 'totalcost' do + it 'get the right price for the date range' do + @blocknew.totalcost_oneroom.must_equal 750 + end + end + + describe 'reserve' do + it 'change the rooms_set when you make a reservation' do + @blocknew.reserve.must_equal [18, 19, 10] + @blocknew.reserve.must_equal [19, 10] + end + + it 'raises argument error if there is not more rooms in block' do + 4.times do + @blocknew.reserve + end + proc{@blocknew.reserve}.must_raise ArgumentError end end end From fe8a85082876990ef8de777af067dc69300e634d Mon Sep 17 00:00:00 2001 From: Mariana Date: Sun, 10 Sep 2017 16:09:07 -0700 Subject: [PATCH 10/16] Rooms avaliables in block --- lib/block.rb | 9 +++++++-- specs/block_spec.rb | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/block.rb b/lib/block.rb index d59c63616..e2f440c8a 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -12,14 +12,19 @@ def totalcost_oneroom end def reserve - if @rooms_set.length > 0 + if room_avaliable_block? @rooms_set.delete_at(0) return @rooms_set else raise ArgumentError.new("There is not more rooms avaliables in the given block") end end - + + def room_avaliable_block? + @rooms_set.length > 0 ? true : false + end + + end #class end #module diff --git a/specs/block_spec.rb b/specs/block_spec.rb index 036bdd9e2..a4c17bf58 100644 --- a/specs/block_spec.rb +++ b/specs/block_spec.rb @@ -35,4 +35,16 @@ proc{@blocknew.reserve}.must_raise ArgumentError end end + + describe 'room_avaliable_block' do + it 'returns true if there is rooms avaliables' do + @blocknew.room_avaliable_block?.must_equal true + end + it 'returns false if there is not rooms avaliables' do + 4.times do + @blocknew.reserve + end + @blocknew.room_avaliable_block?.must_equal false + end + end end From e43e8c3f7b34d66b288b7b1e1e360ff148ce8573 Mon Sep 17 00:00:00 2001 From: Mariana Date: Mon, 11 Sep 2017 00:09:09 -0700 Subject: [PATCH 11/16] Look if it is possible to create a block --- lib/admin.rb | 12 ++++++++++++ lib/block-admin.rb | 25 +++++++++++++++++++++++++ specs/admin_spec.rb | 21 +++++++++++++++++++++ specs/block-admin_spec.rb | 27 +++++++++++++++++++++++++++ specs/spec_helper.rb | 1 + 5 files changed, 86 insertions(+) create mode 100644 lib/block-admin.rb create mode 100644 specs/block-admin_spec.rb diff --git a/lib/admin.rb b/lib/admin.rb index 7a424325e..9d44cd33d 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -60,6 +60,18 @@ def avaliable_rooms_daterange(checkin, checkout) return avaliable_rooms end + def can_create_block?(checkin, checkout, number_of_rooms) + if number_of_rooms > 5 + raise ArgumentError.new("There is no possible to create a block qith more of 5 rooms") + else + if avaliable_rooms_daterange(checkin, checkout).length >= number_of_rooms + return true + else + return false + end + end + end + diff --git a/lib/block-admin.rb b/lib/block-admin.rb new file mode 100644 index 000000000..ba300542c --- /dev/null +++ b/lib/block-admin.rb @@ -0,0 +1,25 @@ +# require_relative '../lib/admin.rb' +# module Hotel +# class BlockAdmin +# #def initialize +# #@rooms = Hotel::Admin.rooms +# #@list_reservations = Hotel::Admin.list_reservations +# #end +# +# #def can_create_block? +# #end +# def can_create_block?(checkin, checkout, number_of_rooms) +# if number_of_rooms > 5 +# raise ArgumentError.new("There is no possible to create a block qith more of 5 rooms") +# else +# if avaliable_rooms_daterange(checkin, checkout).length >= number_of_rooms +# return true +# else +# return false +# end +# end +# end +# +# +# end#class +# end #module diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 5b74bff69..12771d136 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -129,4 +129,25 @@ end end + describe 'can create block?' do + before do + @checkin = Date.new(2017,11,5) + @checkout = Date.new(2017,11,9) + end + it 'raises an error if there is the number of rooms to reserve is bigger than 5' do + proc{@administrator.can_create_block?(@checkin, @checkout, 7)}.must_raise ArgumentError + end + + it 'returns true if it is possible to create the block' do + @administrator.can_create_block?(@checkin, @checkout, 4).must_equal true + end + + it 'returns fakse if it is not possible to create block' do + 17.times do + @administrator.add_reservation(@checkin, @checkout) + end + @administrator.can_create_block?(@checkin, @checkout,4).must_equal false + end + end + end#describe class diff --git a/specs/block-admin_spec.rb b/specs/block-admin_spec.rb new file mode 100644 index 000000000..467609465 --- /dev/null +++ b/specs/block-admin_spec.rb @@ -0,0 +1,27 @@ +# require_relative 'spec_helper.rb' +# +# describe 'BlockAdmin' do +# before do +# @adminblock = Hotel::BlockAdmin.new +# @admin = Hotel::Admin.new +# end +# # describe 'initialize' do +# # it 'can be initialize' do +# # Hotel::BlockAdmin.new.must_be_instance_of Hotel::BlockAdmin +# # end +# # end +# +# describe 'can create block?' do +# before do +# @checkin = Date.new(2017,11,5) +# @checkout = Date.new(2017,11,9) +# end +# it 'raises an error if there is the number of rooms to reserve is bigger than 5' do +# proc{@adminblock.can_create_block?(@checkin, @checkout, 7)}.must_raise ArgumentError +# end +# +# it 'returns true if it is possible to create the block' do +# @adminblock.can_create_block?(@checkin, @checkout, 4).must_equal true +# end +# end +# end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index f9d1e253e..cb3cb1402 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -7,6 +7,7 @@ require_relative '../lib/reservation.rb' require_relative '../lib/admin.rb' require_relative '../lib/block.rb' +require_relative '../lib/block-admin.rb' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new From 490632d8c4c94eec7171155b7d65b48875192319 Mon Sep 17 00:00:00 2001 From: Mariana Date: Mon, 11 Sep 2017 00:49:57 -0700 Subject: [PATCH 12/16] create block --- lib/admin.rb | 13 +++++++++++++ lib/block.rb | 4 ++++ lib/reservation.rb | 2 +- specs/admin_spec.rb | 16 ++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/admin.rb b/lib/admin.rb index 9d44cd33d..318af088e 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -72,6 +72,19 @@ def can_create_block?(checkin, checkout, number_of_rooms) end end + def create_block (checkin, checkout, number_of_rooms, price) + rooms_in_block = [] + if can_create_block?(checkin, checkout, number_of_rooms) + number_of_rooms.times do + reserve = add_reservation(checkin, checkout) + rooms_in_block << reserve.room_number + end + end + + Hotel::Block.new(checkin, checkout, rooms_in_block, price) + + end + diff --git a/lib/block.rb b/lib/block.rb index e2f440c8a..e3f3418b4 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -26,5 +26,9 @@ def room_avaliable_block? + + + + end #class end #module diff --git a/lib/reservation.rb b/lib/reservation.rb index 164538c2e..8fdf96e79 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,6 +1,6 @@ module Hotel class Reservation - attr_reader :checkin, :checkout, :days_range + attr_reader :checkin, :checkout, :days_range, :room_number def initialize(checkin, checkout, room_number) @price_per_night = 200 @days_range = Hotel::DateRange.new(checkin, checkout) diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 12771d136..6edac020d 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -150,4 +150,20 @@ end end + describe "create_block" do + before do + @checkin = Date.new(2017,11,5) + @checkout = Date.new(2017,11,9) + end + it "if it is rooms avalibles creates the block" do + @administrator.create_block(@checkin, @checkout, 4, 150).must_be_instance_of Hotel::Block + end + + it "change the rooms" do + @administrator.create_block(@checkin, @checkout, 4, 150) + @administrator.list_reservations.length.must_equal 4 + end + + end + end#describe class From be3ff6aa699c6ef33d4f2dd247da90cfaeea20bf Mon Sep 17 00:00:00 2001 From: Mariana Date: Sun, 1 Oct 2017 14:39:45 -0700 Subject: [PATCH 13/16] Add design activity --- design-activity.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..7d7e438db --- /dev/null +++ b/design-activity.md @@ -0,0 +1,62 @@ +Q: What classes does each implementation include? Are the lists the same? + +A: Both implementation have the same classes names, but classes itself are different. Those classes are: + * CartEntry + * ShoppingCArt + * Order + +Q: Write down a sentence to describe each class. + +A: + * Implementation A - CartEntry: It initializes one product that have two instances variables quantity and unit_price. + + * Implementation B - CartEntry: It initialize a product with two instances variables, unit_price and quantity. It calculates the total price of the product. + + * Implementation A - ShoppingCart: It creates an empty array to place all the products. + + * B - ShoppingCart: It initializes an empty array to place all the products and calculate the total price for all products without taxes. + + * A - Order: It creates a new instance of ShoppingCart. It calculates the total price per product and it sums the total price for all products including taxes. + + * B - Order: Creates a new instance of ShoppingCart and add the taxes to the total price. + +Q: How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. + +A: Implementation A: The Order class uses CartEntry and ShoppingCart classes. It creates a new instance of ShoppingCart that is call cart. For each element in cart calculate the total price, using the instance variables of the CartEntry class. Sum all this result and add the taxes. + +Implementation B: CartEntry calculates the price per entry, the ShoppingCart uses this prices to calculate the total price of all products without taxes. Finally Order class creates an instance of ShoppingCart, it adds the taxes to the total price (calculates in ShoppingCart). This way ShoppingCart is relate to CartEntry and Order is relate to ShoppingCart. + +Q: What data does each class store? How (if at all) does this differ between the two implementations. + +A: CartEntry stores unit_price and quantity, ShoppingCart stores entries, Order stores cart that is an instance of ShoppingCart and sales tax. The classes in both implementations store the same data. + +Q: What methods does each class have? How (if at all) does this differ between the two implementations? + +A: +* CartEntry has the same initialize method in both implementations. In implementation B, there is also a price method that multiplies unit_price by quantity returning the total price per product. + +* ShoppingCart has the same initialize method in both implementations. In implementation B there is a price method that returns the sum of the total value for each element in the entries array. + +* Order class has the same initialize method in both implementations. The implementation A has a total_price method that calculates the total price per product in cart and add all this values. Later it adds the sales taxes to get the total price. In the implementation B total_price calls the price method from the ShoppingCart class to calculate the total value without taxes, then returns the total value of the order with taxes. + +Q: Consider the Order#total_price method. In each implementation: + +Is logic to compute the price delegated to "lower level" classes like ShoppingCart and CartEntry, or is it retained in Order? + +A: It is better to have price in lower level classes because otherwise all the logic is going to be store at the Order Class and this is not following the single responsibility principle. + +Does total_price directly manipulate the instance variables of other classes? + +A: In implementation A it manipulates unit_price and quantity from CartEntry class. It also iterates over the entries arrays from ShoppingCart class. + +Implementation B doesn't manipulate directly the instance variables of other classes. + +Q: If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + +We need to have some code that checks if for a given quantity of a product we can apply the discount, this should be inside the CartEntry class. + +It is easier to change the implementation B because we just need to change the CartEntry class, at the other hand with the implementation A we need to change CartEntry class and the method total_price inside Order class. + +Q: Which implementation better adheres to the single responsibility principle? + +A: The implementation B, because CartEntry takes care just for single products, ShoppingCart takes care of products inside entries and Order takes care of the order in general. While in implementation A, Order takes care of the single products, items in entries and the order in general. From 57fb73330d70065773c0146b278dbd345ab34907 Mon Sep 17 00:00:00 2001 From: Mariana Date: Sun, 1 Oct 2017 20:50:14 -0700 Subject: [PATCH 14/16] Try to create class room --- lib/admin.rb | 119 +++++++++++++++++++++++---------------------- lib/block.rb | 15 +++--- lib/daterange.rb | 9 ++-- lib/reservation.rb | 4 +- lib/rooms.rb | 19 ++++++++ 5 files changed, 93 insertions(+), 73 deletions(-) create mode 100644 lib/rooms.rb diff --git a/lib/admin.rb b/lib/admin.rb index 318af088e..df1c53c1b 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -4,86 +4,87 @@ class Admin attr_reader :list_reservations, :rooms def initialize - @rooms = {} + # @rooms = {} + @rooms = Hotel::Rooms.new @list_reservations = [] - create_rooms + # create_rooms end def add_reservation(checkin, checkout) dates_to_reserve = Hotel::DateRange.new(checkin, checkout) - @rooms.each do |room_number, dates| + rooms.rooms.each do |room_number, dates| if is_room_avaliable?(room_number, dates_to_reserve) - @rooms[room_number] << dates_to_reserve + @rooms.rooms[room_number] << dates_to_reserve make_reservation = Hotel::Reservation.new(checkin, checkout, room_number) - @list_reservations << make_reservation + list_reservations << make_reservation return make_reservation end #if end #each raise ArgumentError.new( "There are not avaliable rooms for that date range") end - - def reservations_per_day(date) - list_per_day = [] - @list_reservations.each do |reservation| - if reservation.days_range.include?(date) - list_per_day << reservation - end #if - end #each - return list_per_day - end #method - - def create_rooms - 20.times do |i| - @rooms["#{i + 1}"] = [] - end - end - + # + # def reservations_per_day(date) + # list_per_day = [] + # list_reservations.each do |reservation| + # if reservation.days_range.include?(date) + # list_per_day << reservation + # end #if + # end #each + # return list_per_day + # end #method + # + # # def create_rooms + # # 20.times do |i| + # # rooms["#{i + 1}"] = [] + # # end + # # end + # def is_room_avaliable?(room_number, dates_to_reserve) avaliable = true - @rooms[room_number].each do |busy_dates| + rooms.rooms[room_number].each do |busy_dates| if dates_to_reserve.overlap?(busy_dates) avaliable = false end#if end return avaliable end - - def avaliable_rooms_daterange(checkin, checkout) - avaliable_rooms = [] - date_range = Hotel::DateRange.new(checkin,checkout) - @rooms.each do |room_number, dates| - if is_room_avaliable?(room_number, date_range) - avaliable_rooms << room_number - end - end - return avaliable_rooms - end - - def can_create_block?(checkin, checkout, number_of_rooms) - if number_of_rooms > 5 - raise ArgumentError.new("There is no possible to create a block qith more of 5 rooms") - else - if avaliable_rooms_daterange(checkin, checkout).length >= number_of_rooms - return true - else - return false - end - end - end - - def create_block (checkin, checkout, number_of_rooms, price) - rooms_in_block = [] - if can_create_block?(checkin, checkout, number_of_rooms) - number_of_rooms.times do - reserve = add_reservation(checkin, checkout) - rooms_in_block << reserve.room_number - end - end - - Hotel::Block.new(checkin, checkout, rooms_in_block, price) - - end + # + # def avaliable_rooms_daterange(checkin, checkout) + # avaliable_rooms = [] + # date_range = Hotel::DateRange.new(checkin,checkout) + # @rooms.each do |room_number, dates| + # if is_room_avaliable?(room_number, date_range) + # avaliable_rooms << room_number + # end + # end + # return avaliable_rooms + # end + # + # def can_create_block?(checkin, checkout, number_of_rooms) + # if number_of_rooms > 5 + # raise ArgumentError.new("There is no possible to create a block qith more of 5 rooms") + # else + # if avaliable_rooms_daterange(checkin, checkout).length >= number_of_rooms + # return true + # else + # return false + # end + # end + # end + # + # def create_block (checkin, checkout, number_of_rooms, price) + # rooms_in_block = [] + # if can_create_block?(checkin, checkout, number_of_rooms) + # number_of_rooms.times do + # reserve = add_reservation(checkin, checkout) + # rooms_in_block << reserve.room_number + # end + # end + # + # Hotel::Block.new(checkin, checkout, rooms_in_block, price) + # + # end diff --git a/lib/block.rb b/lib/block.rb index e3f3418b4..bed443bd7 100644 --- a/lib/block.rb +++ b/lib/block.rb @@ -1,5 +1,6 @@ module Hotel class Block + attr_reader :price_per_night, :days_range, :rooms_set def initialize(checkin, checkout, rooms_set, price) @price_per_night = price @@ -8,21 +9,23 @@ def initialize(checkin, checkout, rooms_set, price) end def totalcost_oneroom - @price_per_night * @days_range.stay_length + price_per_night * days_range.stay_length end + def room_avaliable_block? + rooms_set.length > 0 ? true : false + end + def reserve if room_avaliable_block? - @rooms_set.delete_at(0) - return @rooms_set + rooms_set.delete_at(0) + return rooms_set else raise ArgumentError.new("There is not more rooms avaliables in the given block") end end - def room_avaliable_block? - @rooms_set.length > 0 ? true : false - end + diff --git a/lib/daterange.rb b/lib/daterange.rb index 7647f7d9c..85f1f7150 100644 --- a/lib/daterange.rb +++ b/lib/daterange.rb @@ -10,7 +10,7 @@ def initialize(day1, day2) end def valid_date? - if @checkin < @checkout + if checkin < checkout true else raise ArgumentError.new("No valid input") @@ -18,11 +18,11 @@ def valid_date? end def stay_length - (@checkout - @checkin).to_i + (checkout - checkin).to_i end def include?(date) - if @checkin <= date && @checkout > date + if checkin <= date && checkout > date return true else return false @@ -38,8 +38,5 @@ def overlap?(other) return false end end - - - end end #module diff --git a/lib/reservation.rb b/lib/reservation.rb index 8fdf96e79..72a1a6913 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,6 +1,6 @@ module Hotel class Reservation - attr_reader :checkin, :checkout, :days_range, :room_number + attr_reader :checkin, :checkout, :days_range, :room_number, :price_per_night def initialize(checkin, checkout, room_number) @price_per_night = 200 @days_range = Hotel::DateRange.new(checkin, checkout) @@ -8,7 +8,7 @@ def initialize(checkin, checkout, room_number) end def totalcost - @price_per_night * @days_range.stay_length + price_per_night * days_range.stay_length end # def room_avaliables(@days_range) diff --git a/lib/rooms.rb b/lib/rooms.rb new file mode 100644 index 000000000..820503978 --- /dev/null +++ b/lib/rooms.rb @@ -0,0 +1,19 @@ +module Hotel + class Rooms + + attr_accessor :rooms + + def initialize + @rooms = {} + create_rooms + end + + def create_rooms + 20.times do |i| + @rooms["#{i + 1}"] = [] + end + end + + end #class + +end #module From 76f6ea377545c519b2ac98d4367be008c7d9b20a Mon Sep 17 00:00:00 2001 From: Mariana Date: Sun, 1 Oct 2017 21:28:54 -0700 Subject: [PATCH 15/16] Revisiting Hotel --- lib/admin.rb | 117 +++++++++++++++++++++++++-------------------------- lib/rooms.rb | 38 ++++++++--------- 2 files changed, 77 insertions(+), 78 deletions(-) diff --git a/lib/admin.rb b/lib/admin.rb index df1c53c1b..a20a3bb2c 100644 --- a/lib/admin.rb +++ b/lib/admin.rb @@ -4,17 +4,16 @@ class Admin attr_reader :list_reservations, :rooms def initialize - # @rooms = {} - @rooms = Hotel::Rooms.new + @rooms = {} @list_reservations = [] - # create_rooms + create_rooms end def add_reservation(checkin, checkout) dates_to_reserve = Hotel::DateRange.new(checkin, checkout) - rooms.rooms.each do |room_number, dates| + rooms.each do |room_number, dates| if is_room_avaliable?(room_number, dates_to_reserve) - @rooms.rooms[room_number] << dates_to_reserve + rooms[room_number] << dates_to_reserve make_reservation = Hotel::Reservation.new(checkin, checkout, room_number) list_reservations << make_reservation return make_reservation @@ -22,69 +21,69 @@ def add_reservation(checkin, checkout) end #each raise ArgumentError.new( "There are not avaliable rooms for that date range") end - # - # def reservations_per_day(date) - # list_per_day = [] - # list_reservations.each do |reservation| - # if reservation.days_range.include?(date) - # list_per_day << reservation - # end #if - # end #each - # return list_per_day - # end #method - # - # # def create_rooms - # # 20.times do |i| - # # rooms["#{i + 1}"] = [] - # # end - # # end - # + + def reservations_per_day(date) + list_per_day = [] + list_reservations.each do |reservation| + if reservation.days_range.include?(date) + list_per_day << reservation + end #if + end #each + return list_per_day + end #method + + def create_rooms + 20.times do |i| + rooms["#{i + 1}"] = [] + end + end + def is_room_avaliable?(room_number, dates_to_reserve) avaliable = true - rooms.rooms[room_number].each do |busy_dates| + rooms[room_number].each do |busy_dates| if dates_to_reserve.overlap?(busy_dates) avaliable = false end#if end return avaliable end - # - # def avaliable_rooms_daterange(checkin, checkout) - # avaliable_rooms = [] - # date_range = Hotel::DateRange.new(checkin,checkout) - # @rooms.each do |room_number, dates| - # if is_room_avaliable?(room_number, date_range) - # avaliable_rooms << room_number - # end - # end - # return avaliable_rooms - # end - # - # def can_create_block?(checkin, checkout, number_of_rooms) - # if number_of_rooms > 5 - # raise ArgumentError.new("There is no possible to create a block qith more of 5 rooms") - # else - # if avaliable_rooms_daterange(checkin, checkout).length >= number_of_rooms - # return true - # else - # return false - # end - # end - # end - # - # def create_block (checkin, checkout, number_of_rooms, price) - # rooms_in_block = [] - # if can_create_block?(checkin, checkout, number_of_rooms) - # number_of_rooms.times do - # reserve = add_reservation(checkin, checkout) - # rooms_in_block << reserve.room_number - # end - # end - # - # Hotel::Block.new(checkin, checkout, rooms_in_block, price) - # - # end + + def avaliable_rooms_daterange(checkin, checkout) + avaliable_rooms = [] + date_range = Hotel::DateRange.new(checkin,checkout) + @rooms.each do |room_number, dates| + if is_room_avaliable?(room_number, date_range) + avaliable_rooms << room_number + end + end + return avaliable_rooms + end + + def can_create_block?(checkin, checkout, number_of_rooms) + if number_of_rooms > 5 + raise ArgumentError.new("There is no possible to create a block qith more of 5 rooms") + else + if avaliable_rooms_daterange(checkin, checkout).length >= number_of_rooms + return true + else + return false + end + end + end + + def create_block (checkin, checkout, number_of_rooms, price) + rooms_in_block = [] + if can_create_block?(checkin, checkout, number_of_rooms) + number_of_rooms.times do + reserve = add_reservation(checkin, checkout) + rooms_in_block << reserve.room_number + end + end + + Hotel::Block.new(checkin, checkout, rooms_in_block, price) + + end diff --git a/lib/rooms.rb b/lib/rooms.rb index 820503978..a86aad648 100644 --- a/lib/rooms.rb +++ b/lib/rooms.rb @@ -1,19 +1,19 @@ -module Hotel - class Rooms - - attr_accessor :rooms - - def initialize - @rooms = {} - create_rooms - end - - def create_rooms - 20.times do |i| - @rooms["#{i + 1}"] = [] - end - end - - end #class - -end #module +# module Hotel +# class Rooms +# +# attr_accessor :rooms +# +# def initialize +# @rooms = {} +# create_rooms +# end +# +# def create_rooms +# 20.times do |i| +# @rooms["#{i + 1}"] = [] +# end +# end +# +# end #class +# +# end #module From b3f46483bc33436f95405f7ce99b1226a1654788 Mon Sep 17 00:00:00 2001 From: Mariana Date: Sun, 1 Oct 2017 21:38:54 -0700 Subject: [PATCH 16/16] Revisiting Hotel --- design-activity.md | 10 +++++++++- specs/admin_spec.rb | 2 +- specs/rooms_spec.rb | 24 ++++++++++++++++++++++++ specs/spec_helper.rb | 3 ++- 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 specs/rooms_spec.rb diff --git a/design-activity.md b/design-activity.md index 7d7e438db..6391a6d83 100644 --- a/design-activity.md +++ b/design-activity.md @@ -59,4 +59,12 @@ It is easier to change the implementation B because we just need to change the C Q: Which implementation better adheres to the single responsibility principle? -A: The implementation B, because CartEntry takes care just for single products, ShoppingCart takes care of products inside entries and Order takes care of the order in general. While in implementation A, Order takes care of the single products, items in entries and the order in general. +A: The implementation B, because CartEntry takes care just for single products, ShoppingCart takes care of products inside entries and Order takes care of the order in general. While in implementation A, Order takes care of the single products, items in entries and the order in general. + +Revisiting Hotel + +When I did hotel the first time I paid special attention to the single responsibility of a class. Now that I'm looking again this project, I think that the DateRange, Block and Reservation classes satisfies the requirements of a good design. + +The Admin class is a big class that manages the reservations and store the information about the rooms. I wanted to crate a new class call Rooms. This class would create the hash with rooms using the create_rooms method. But when I was making the changes, I noticed that if I do this, then Admin class would modify the instance variables of Rooms class, so I decided not to modify Admin class. + +The change that I did was to put attr_reader or attr_accessor to instance variables, how Metiz books recommends. diff --git a/specs/admin_spec.rb b/specs/admin_spec.rb index 6edac020d..b076bf2a5 100644 --- a/specs/admin_spec.rb +++ b/specs/admin_spec.rb @@ -19,7 +19,7 @@ @administrator.rooms.must_be_instance_of Hash end - it "Length of rooms is 20" do + it "Length of rooms hash is 20" do @administrator.rooms.length.must_equal 20 end end diff --git a/specs/rooms_spec.rb b/specs/rooms_spec.rb new file mode 100644 index 000000000..9cbd7c0c3 --- /dev/null +++ b/specs/rooms_spec.rb @@ -0,0 +1,24 @@ +# require_relative 'spec_helper.rb' +# +# describe "Rooms class" do +# +# describe "Initialize" do +# +# before do +# @rooms = Hotel::Rooms.new +# end +# +# it 'Can be created' do +# Hotel::Rooms.new.must_be_instance_of Hotel::Rooms +# end +# +# it "Create a hash of rooms" do +# @rooms.rooms.must_be_instance_of Hash +# end +# +# it "Length of rooms hash is 20" do +# @rooms.rooms.length.must_equal 20 +# end +# +# end +# end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index cb3cb1402..671e12742 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -7,7 +7,8 @@ require_relative '../lib/reservation.rb' require_relative '../lib/admin.rb' require_relative '../lib/block.rb' -require_relative '../lib/block-admin.rb' +# require_relative '../lib/block-admin.rb' +# require_relative '../lib/rooms.rb' Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new