From 9fadd8ecf3384c467ace8e855f3f538e42b5c46d Mon Sep 17 00:00:00 2001 From: Dikla Aharoni Rikovitch Date: Tue, 6 Mar 2018 15:42:48 -0800 Subject: [PATCH 1/7] created a Rakefile, spec helper, specs and classes --- Rakefile | 9 +++++++++ lib/management.rb | 14 ++++++++++++++ lib/period.rb | 26 ++++++++++++++++++++++++++ lib/reservation.rb | 14 ++++++++++++++ lib/room.rb | 13 +++++++++++++ specs/management_spec.rb | 0 specs/period_spec.rb | 0 specs/reservation_spec.rb | 0 specs/room_spec.rb | 0 specs/spec_helper.rb | 16 ++++++++++++++++ 10 files changed, 92 insertions(+) create mode 100644 Rakefile create mode 100644 lib/management.rb create mode 100644 lib/period.rb create mode 100644 lib/reservation.rb create mode 100644 lib/room.rb create mode 100644 specs/management_spec.rb create mode 100644 specs/period_spec.rb create mode 100644 specs/reservation_spec.rb create mode 100644 specs/room_spec.rb create mode 100644 specs/spec_helper.rb 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/management.rb b/lib/management.rb new file mode 100644 index 000000000..c974a5bc6 --- /dev/null +++ b/lib/management.rb @@ -0,0 +1,14 @@ +module Hotel + class Management + + def initialize + @rooms = [] + (0..20).each do |room| + @rooms << Room.new(num) + @reservation = [] + end + + + + end # end of class +end # end of module diff --git a/lib/period.rb b/lib/period.rb new file mode 100644 index 000000000..b24d401cf --- /dev/null +++ b/lib/period.rb @@ -0,0 +1,26 @@ +module Hotel + class Period + + attr_reader :num_of_night, :start_date, :end_date + + def initialize(check_in, check_out) + @start_date = check_in + @end_date = check_out + end + + if @end_date != nil + if @start_date > @end_date + raise ArgumentError.new("Invalid date") + end + end + + def num_of_night + + end + + def include? + + end + + end +end diff --git a/lib/reservation.rb b/lib/reservation.rb new file mode 100644 index 000000000..871fc7e54 --- /dev/null +++ b/lib/reservation.rb @@ -0,0 +1,14 @@ +module Hotel + class Reservation + + PRICE_PER_NIGHT = 200 + + def initialize(room, check_in check_out, total_cost) + @room = room + @total_cost = (@check_out - @check_in) * PRICE_PER_NIGHT + @dates = Hotle::Period(check_in, check_out) + end + + + end +end diff --git a/lib/room.rb b/lib/room.rb new file mode 100644 index 000000000..7c01178b8 --- /dev/null +++ b/lib/room.rb @@ -0,0 +1,13 @@ +module Hotel + class Room + + attr_reader + + def initialize(num) + @room_num = num + end + + + + end +end diff --git a/specs/management_spec.rb b/specs/management_spec.rb new file mode 100644 index 000000000..e69de29bb diff --git a/specs/period_spec.rb b/specs/period_spec.rb new file mode 100644 index 000000000..e69de29bb diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb new file mode 100644 index 000000000..e69de29bb diff --git a/specs/room_spec.rb b/specs/room_spec.rb new file mode 100644 index 000000000..e69de29bb diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb new file mode 100644 index 000000000..94ca7e696 --- /dev/null +++ b/specs/spec_helper.rb @@ -0,0 +1,16 @@ +require 'simplecov' +SimpleCov.start + +require 'minitest' +require 'minitest/autorun' +require 'minitest/reporters' +require 'awesome_print' +require 'date' +# Add simplecov + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + +require_relative '../lib/room' +require_relative '../lib/reservation' +require_relative '../lib/period' +require_relative '../lib/front_desk' From 752fda9b1846540d8d2a7299facdff415d804762 Mon Sep 17 00:00:00 2001 From: Dikla Aharoni Rikovitch Date: Thu, 8 Mar 2018 19:06:52 -0800 Subject: [PATCH 2/7] i wrote the tests for room class and i pass --- lib/management.rb | 29 +++++++++++++++-- lib/period.rb | 25 +++++++------- lib/reservation.rb | 13 +++++--- lib/room.rb | 27 +++++++++++++++- specs/management_spec.rb | 26 +++++++++++++++ specs/period_spec.rb | 63 ++++++++++++++++++++++++++++++++++++ specs/reservation_spec.rb | 10 ++++++ specs/room_spec.rb | 68 +++++++++++++++++++++++++++++++++++++++ specs/spec_helper.rb | 6 ++-- 9 files changed, 245 insertions(+), 22 deletions(-) diff --git a/lib/management.rb b/lib/management.rb index c974a5bc6..2e08da74e 100644 --- a/lib/management.rb +++ b/lib/management.rb @@ -1,13 +1,36 @@ module Hotel class Management + # PRICE_PER_NIGHT = 200 + attr_reader :rooms, :price_per_night + def initialize @rooms = [] - (0..20).each do |room| - @rooms << Room.new(num) - @reservation = [] + (1..20).each do |num| + @rooms << Hotel::Room.new(num) + end + @reservations = [] + + end + + def reserve_room(check_in, check_out) + reservation = Hotel::Reservation.new(room, check_in, check_out) + @reservations << reservation + return reservation end + def get_reservations_for_date(date) + reservations_for_date = [] + @reservations.each do |reservation| + if reservation.dates.include?(date) #check_in == date + reservations_for_date << reservation + end + end + return reservations_for_date + end + + + end # end of class diff --git a/lib/period.rb b/lib/period.rb index b24d401cf..a83b4ae44 100644 --- a/lib/period.rb +++ b/lib/period.rb @@ -1,25 +1,28 @@ +require 'pry' module Hotel class Period - attr_reader :num_of_night, :start_date, :end_date + attr_reader :check_in, :check_out def initialize(check_in, check_out) - @start_date = check_in - @end_date = check_out + @check_in = check_in + @check_out = check_out end - if @end_date != nil - if @start_date > @end_date - raise ArgumentError.new("Invalid date") + def is_valid? + if @check_out != nil + if @check_out < @check_in || @check_out == @check_in + raise ArgumentError.new("Invalid date") + end end - end - - def num_of_night + end + def num_of_nights + return check_out - check_in end - def include? - + def include?(date) + return date >= check_in && date < check_out end end diff --git a/lib/reservation.rb b/lib/reservation.rb index 871fc7e54..871998dc9 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -1,12 +1,15 @@ module Hotel class Reservation - PRICE_PER_NIGHT = 200 - - def initialize(room, check_in check_out, total_cost) + attr_reader :room, :dates, :total_cost + def initialize(room, check_in, check_out) @room = room - @total_cost = (@check_out - @check_in) * PRICE_PER_NIGHT - @dates = Hotle::Period(check_in, check_out) + @dates = Hotel::Period.new(check_in, check_out) + if !@room.is_available(@dates) + raise ArgumentError "This dates are not available" + end + @room.mark_dates_as_reserved(@dates) + @total_cost = @dates.num_of_nights * @room.price_per_night end diff --git a/lib/room.rb b/lib/room.rb index 7c01178b8..df13397a4 100644 --- a/lib/room.rb +++ b/lib/room.rb @@ -1,13 +1,38 @@ module Hotel class Room - attr_reader + PRICE_PER_NIGHT = 200 + attr_reader :room_num, :price_per_night def initialize(num) @room_num = num + @price_per_night = PRICE_PER_NIGHT + @reserved_dates = [] end + def mark_dates_as_reserved(reservation_period) + (reservation_period.check_in...reservation_period.check_out).each do |date| + @reserved_dates << date + end + end + + def is_reserved_for_date(date) + if date != nil + @reserved_dates.include?(date) + else + raise ArgumentError.new("Invalid date") + end + end + + def is_available(query_period) + (query_period.check_in...query_period.check_out).each do |date| + if is_reserved_for_date(date) + return false + end + end + return true + end end end diff --git a/specs/management_spec.rb b/specs/management_spec.rb index e69de29bb..ea99484a9 100644 --- a/specs/management_spec.rb +++ b/specs/management_spec.rb @@ -0,0 +1,26 @@ +require_relative 'spec_helper' + +describe 'Management class' do + describe 'initialize' do + it "can access the list of all of the rooms in the hotel" do + hotel = Hotel::Management.new + hotel.rooms.length.must_equal 20 + end + + it "there should be 20 total rooms" do + hotel = Hotel::Management.new + hotel.rooms.count.must_equal 20 + end + end + describe 'reserve_room' do + it 'return array of all reservations' do + + end + end + + describe 'get_reservations_for_date' do + it '' do + + end + end +end diff --git a/specs/period_spec.rb b/specs/period_spec.rb index e69de29bb..c6a1e9210 100644 --- a/specs/period_spec.rb +++ b/specs/period_spec.rb @@ -0,0 +1,63 @@ +require_relative 'spec_helper' + +describe 'Period class' do + + describe 'initialize' do + it 'Can initialize check in and check out' do + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2017, 03, 03) + period = Hotel::Period.new(check_in, check_out) + period.check_in.must_equal check_in + period.check_out.must_equal check_out + period.must_be_instance_of Hotel::Period + end + + it "is an instance of Date" do + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2017, 03, 03) + check_in.must_be_kind_of Date + check_out.must_be_kind_of Date + end + end + + describe 'num_of_nights' do + it "accurately calculates the number of night" do + check_in = Date.new(2018, 03, 16) + check_out = Date.new(2018, 03, 19) + period = Hotel::Period.new(check_in, check_out) + period.num_of_nights.must_equal 3 + end + end + + describe "is_valid?" do + it 'cannot have negative number of days' do + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2018, 02, 25) + proc {Hotel::Period.new(check_in, check_out).is_valid?}.must_raise ArgumentError + end + + it 'cannot have 0 days' do + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2018, 03, 01) + proc {Hotel::Period.new(check_in, check_out).is_valid?}.must_raise ArgumentError + end + end + + describe 'include?' do + it "returns true if the date is between check_in and check_out" do + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2018, 03, 04) + period = Hotel::Period.new(check_in, check_out) + date = Date.new(2018, 03, 03) + period.include?(date).must_equal true + end + + it "returns false if the date is not between check_in and check_out" do + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2018, 03, 04) + period = Hotel::Period.new(check_in, check_out) + date = Date.new(2018, 03, 05) + period.include?(date).must_equal false + end + end +end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index e69de29bb..f43ce007c 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -0,0 +1,10 @@ +require_relative 'spec_helper' + +describe 'Reservation class' do + + describe 'initialize' do + it '' do + + end + end +end diff --git a/specs/room_spec.rb b/specs/room_spec.rb index e69de29bb..679afe6a6 100644 --- a/specs/room_spec.rb +++ b/specs/room_spec.rb @@ -0,0 +1,68 @@ +require_relative 'spec_helper' +require 'pry' + +describe 'Room class' do + describe 'initialize' do + it 'can create an instance of a room' do + room = Hotel::Room.new(1) + room.must_be_instance_of Hotel::Room + room.room_num.must_equal 1 + end + end + + describe 'mark_dates_as_reserved' do + it 'should not mark the date as reserved' do + room = Hotel::Room.new(1) + period = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(period) + period2 = Hotel::Period.new(Date.new(2018,03,02), Date.new(2018,03,04)) + room.is_available(period2).must_equal false + end + it 'it should mark the date as reserved' do + room = Hotel::Room.new(1) + period = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(period) + period2 = Hotel::Period.new(Date.new(2018,03,03), Date.new(2018,03,05)) + room.is_available(period2).must_equal true + end + end + + describe 'is_reserved_for_date' do + it 'raise an error if the date is nil' do + room = Hotel::Room.new(1) + date = nil + proc {room.is_reserved_for_date(date)}.must_raise ArgumentError + end + it 'should return false if the date is include in the array' do + room = Hotel::Room.new(1) + period = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(period) + date = Date.new(2018,02,02) + room.is_reserved_for_date(date).must_equal false + end + it 'should return true if the date is include in the array' do + room = Hotel::Room.new(1) + period = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(period) + date = Date.new(2018,03,02) + room.is_reserved_for_date(date).must_equal true + end + end + + describe 'is_available' do + it 'return true if the range of dates are available' do + room = Hotel::Room.new(1) + period = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(period) + period2 = Hotel::Period.new(Date.new(2018,03,03), Date.new(2018,03,05)) + room.is_available(period2).must_equal true + end + it 'return false if the range of dates are not available' do + room = Hotel::Room.new(1) + period = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(period) + period2 = Hotel::Period.new(Date.new(2018,03,02), Date.new(2018,03,05)) + room.is_available(period2).must_equal false + end + end +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb index 94ca7e696..0a20f5a8c 100644 --- a/specs/spec_helper.rb +++ b/specs/spec_helper.rb @@ -1,5 +1,7 @@ require 'simplecov' -SimpleCov.start +SimpleCov.start do + add_filter "/specs/" +end require 'minitest' require 'minitest/autorun' @@ -13,4 +15,4 @@ require_relative '../lib/room' require_relative '../lib/reservation' require_relative '../lib/period' -require_relative '../lib/front_desk' +require_relative '../lib/management' From e9dd28968e3c944fd5e3cd95f70890d1cc21cfab Mon Sep 17 00:00:00 2001 From: Dikla Aharoni Rikovitch Date: Fri, 9 Mar 2018 13:23:00 -0800 Subject: [PATCH 3/7] I wrote the tests for reservation and I pass --- lib/reservation.rb | 2 +- specs/management_spec.rb | 7 +++++++ specs/reservation_spec.rb | 26 +++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/lib/reservation.rb b/lib/reservation.rb index 871998dc9..3d49441f7 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -6,7 +6,7 @@ def initialize(room, check_in, check_out) @room = room @dates = Hotel::Period.new(check_in, check_out) if !@room.is_available(@dates) - raise ArgumentError "This dates are not available" + raise ArgumentError.new("This dates are not availabe") end @room.mark_dates_as_reserved(@dates) @total_cost = @dates.num_of_nights * @room.price_per_night diff --git a/specs/management_spec.rb b/specs/management_spec.rb index ea99484a9..c9d8c10f9 100644 --- a/specs/management_spec.rb +++ b/specs/management_spec.rb @@ -2,6 +2,13 @@ describe 'Management class' do describe 'initialize' do + it "can be created" do + hotel_management = Hotel::Management.new + hotel_management.must_be_instance_of Hotel::Management + hotel_management.rooms.must_be_kind_of Array + reservations = Hotel::Management.new + reservations.must_be_instance_of Hotel::Management + end it "can access the list of all of the rooms in the hotel" do hotel = Hotel::Management.new hotel.rooms.length.must_equal 20 diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index f43ce007c..64f4c3c31 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -3,8 +3,32 @@ describe 'Reservation class' do describe 'initialize' do - it '' do + it 'can be created' do + room = Hotel::Room.new(1) + check_in = Date.new(2018,03,01) + check_out = Date.new(2018,03,03) + dates = Hotel::Period.new(check_in, check_out) + reservation = Hotel::Reservation.new(room, check_in, check_out) + room.must_be_instance_of Hotel::Room + dates.must_be_instance_of Hotel::Period + end + it 'can calculate the total cost' do + reservation = Hotel::Reservation.new(Hotel::Room.new(1), Date.new(2018,03,01), Date.new(2018,03,03)) + room = Hotel::Room.new(1) + dates = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(dates) + price_per_night = room.price_per_night + total_cost = dates.num_of_nights * price_per_night + reservation.total_cost.must_equal 400 + end + it 'raise an error if the date range is not availabe' do + room = Hotel::Room.new(1) + dates = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,03)) + reservation = Hotel::Reservation.new(room, Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(dates) + proc{ Hotel::Reservation.new(room, Date.new(2018,03,01), Date.new(2018,03,02))}.must_raise ArgumentError + # new_dates = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,02)) end end end From 39c7da75008015b0f9aadd42822cadc2401bc8c8 Mon Sep 17 00:00:00 2001 From: Dikla Aharoni Rikovitch Date: Fri, 9 Mar 2018 14:15:10 -0800 Subject: [PATCH 4/7] I wrote the tests for get reservation for date and I pass --- lib/management.rb | 2 +- specs/management_spec.rb | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/management.rb b/lib/management.rb index 2e08da74e..88b93276e 100644 --- a/lib/management.rb +++ b/lib/management.rb @@ -13,7 +13,7 @@ def initialize end - def reserve_room(check_in, check_out) + def reserve_room(room, check_in, check_out) reservation = Hotel::Reservation.new(room, check_in, check_out) @reservations << reservation return reservation diff --git a/specs/management_spec.rb b/specs/management_spec.rb index c9d8c10f9..4de8e5096 100644 --- a/specs/management_spec.rb +++ b/specs/management_spec.rb @@ -20,14 +20,26 @@ end end describe 'reserve_room' do - it 'return array of all reservations' do - + it 'return reservation' do + room = Hotel::Room.new(1) + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2018, 03, 03) + reservation = Hotel::Management.new.reserve_room(room, check_in, check_out) + reservation.dates.check_in.must_equal check_in + reservation.dates.check_out.must_equal check_out end end describe 'get_reservations_for_date' do - it '' do - + it 'return an array of reservations for date' do + management = Hotel::Management.new + room = Hotel::Room.new(1) + date = Date.new(2018, 03, 02) + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2018, 03, 03) + management.reserve_room(room, check_in, check_out) + management.get_reservations_for_date(date).must_be_kind_of Array + management.get_reservations_for_date(date).length.must_equal 1 end end end From d850d6b73ed1d9e31803939b8bf504ef6aa8dab3 Mon Sep 17 00:00:00 2001 From: Dikla Aharoni Rikovitch Date: Mon, 12 Mar 2018 01:57:25 -0700 Subject: [PATCH 5/7] I add a test for reserve_room in reservation class to raise and error in case that the room is already reserved --- specs/management_spec.rb | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/specs/management_spec.rb b/specs/management_spec.rb index 4de8e5096..b5c3cb754 100644 --- a/specs/management_spec.rb +++ b/specs/management_spec.rb @@ -18,6 +18,7 @@ hotel = Hotel::Management.new hotel.rooms.count.must_equal 20 end + end describe 'reserve_room' do it 'return reservation' do @@ -28,6 +29,14 @@ reservation.dates.check_in.must_equal check_in reservation.dates.check_out.must_equal check_out end + + it 'raise an error if room is already reserved' do + room = Hotel::Room.new(1) + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2018, 03, 03) + reservation = Hotel::Management.new.reserve_room(room, check_in, check_out) + proc{ Hotel::Management.new.reserve_room(room, check_in, check_out)}.must_raise ArgumentError + end end describe 'get_reservations_for_date' do From 18c7ed43247581a2ffac430d2167fd0264a59459 Mon Sep 17 00:00:00 2001 From: Dikla Aharoni Rikovitch Date: Sat, 24 Mar 2018 12:40:22 -0700 Subject: [PATCH 6/7] I changed the is_valid? method to return true or false and I also made change in reservatine class to call the is_valid? method --- lib/period.rb | 6 +----- lib/reservation.rb | 2 +- specs/period_spec.rb | 10 ++++++++-- specs/reservation_spec.rb | 8 ++++++++ 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/period.rb b/lib/period.rb index a83b4ae44..c109d4801 100644 --- a/lib/period.rb +++ b/lib/period.rb @@ -10,11 +10,7 @@ def initialize(check_in, check_out) end def is_valid? - if @check_out != nil - if @check_out < @check_in || @check_out == @check_in - raise ArgumentError.new("Invalid date") - end - end + (@check_out != nil && @check_in != nil) && !(@check_out <= @check_in) end def num_of_nights diff --git a/lib/reservation.rb b/lib/reservation.rb index 3d49441f7..c0d694f06 100644 --- a/lib/reservation.rb +++ b/lib/reservation.rb @@ -5,7 +5,7 @@ class Reservation def initialize(room, check_in, check_out) @room = room @dates = Hotel::Period.new(check_in, check_out) - if !@room.is_available(@dates) + if !@dates.is_valid? || !@room.is_available(@dates) raise ArgumentError.new("This dates are not availabe") end @room.mark_dates_as_reserved(@dates) diff --git a/specs/period_spec.rb b/specs/period_spec.rb index c6a1e9210..955a82ccd 100644 --- a/specs/period_spec.rb +++ b/specs/period_spec.rb @@ -33,13 +33,19 @@ it 'cannot have negative number of days' do check_in = Date.new(2018, 03, 01) check_out = Date.new(2018, 02, 25) - proc {Hotel::Period.new(check_in, check_out).is_valid?}.must_raise ArgumentError + Hotel::Period.new(check_in, check_out).is_valid?.must_equal false end it 'cannot have 0 days' do check_in = Date.new(2018, 03, 01) check_out = Date.new(2018, 03, 01) - proc {Hotel::Period.new(check_in, check_out).is_valid?}.must_raise ArgumentError + Hotel::Period.new(check_in, check_out).is_valid?.must_equal false + end + + it 'valid dates' do + check_in = Date.new(2018, 03, 01) + check_out = Date.new(2018, 03, 03) + Hotel::Period.new(check_in, check_out).is_valid?.must_equal true end end diff --git a/specs/reservation_spec.rb b/specs/reservation_spec.rb index 64f4c3c31..32150120c 100644 --- a/specs/reservation_spec.rb +++ b/specs/reservation_spec.rb @@ -30,5 +30,13 @@ # new_dates = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,02)) end + + it 'raise an error if the date is in_valid' do + room = Hotel::Room.new(1) + dates = Hotel::Period.new(Date.new(2018,03,01), Date.new(2018,03,01)) + reservation = Hotel::Reservation.new(room, Date.new(2018,03,01), Date.new(2018,03,03)) + room.mark_dates_as_reserved(dates) + proc{ Hotel::Reservation.new(room, Date.new(2018,03,01), Date.new(2018,03,02))}.must_raise ArgumentError + end end end From 1f93b8bceefde35c2b0200fc00475d4baab4cf9a Mon Sep 17 00:00:00 2001 From: Dikla Date: Sun, 1 Apr 2018 22:07:36 -0700 Subject: [PATCH 7/7] added design-activity.md file --- design-activity.md | 51 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 design-activity.md diff --git a/design-activity.md b/design-activity.md new file mode 100644 index 000000000..2c9fa900e --- /dev/null +++ b/design-activity.md @@ -0,0 +1,51 @@ +1. What classes does each implementation include? Are the lists the same? + answer: Each implementation include three classes: CartEntry, ShoppingCart, Order. + in implementation A the total price is calculated only in order class and in implementation B the total price is calculated for each class in separate + +2. Write down a sentence to describe each class. + answer: + Implementation A: + class CartEntry: Store the unit price and quantity + class ShoppingCart: Store an array of entries + class Order: Store an instant of ShoppingCart and calculate order (price * quantity) after adding Tax + Implementation B: + class CartEntry: Store the unit price and quantity and calculate (price * quantity) + class ShoppingCart: Store an array of entries and calculate prices for all the entries + class Order: Adding Tax for what was already calculate in ShoppingCart class + +3. How do the classes relate to each other? It might be helpful to draw a diagram on a whiteboard or piece of paper. +answer: class CartEntry store the unit price and quantity, class ShoppingCart store array of entries and class Order store ShoppingCart object and add Tax + +4. What data does each class store? How (if at all) does this differ between the two implementations? +answer: +Implementation A: +class CartEntry: Store the unit price and quantity +class ShoppingCart: Store an array of entries +class Order: Store an instant of ShoppingCart and calculate order (price * quantity) after adding Tax +Implementation B: +class CartEntry: Store the unit price and quantity and calculate (price * quantity) +class ShoppingCart: Store an array of entries and calculate prices for all the entries +class Order: Adding Tax for what was already calculate in ShoppingCart class + +5. What methods does each class have? How (if at all) does this differ between the two implementations? + answer: + Implementation A: + class CartEntry: initialize + class ShoppingCart: initialize + class Order: initialize, total_price + Implementation B: + class CartEntry: initialize, price + class ShoppingCart: initialize, price + class Order: initialize, total_price + +6. 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? + - Does total_price directly manipulate the instance variables of other classes? + +7. If we decide items are cheaper if bought in bulk, how would this change the code? Which implementation is easier to modify? + answer: We will need to use an if statement and it will be easier to modify implementation A + +8. Which implementation better adheres to the single responsibility principle? + answer: Implementation B is better + +9. Bonus question once you've read Metz ch. 3: Which implementation is more loosely coupled?