From 27941e41c0359572958b5bcdea5fd7905d4fd85c Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:22:49 -0500 Subject: [PATCH 01/13] test: Add initial test for Ride --- spec/ride_spec.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 spec/ride_spec.rb diff --git a/spec/ride_spec.rb b/spec/ride_spec.rb new file mode 100644 index 0000000..e1cb0e6 --- /dev/null +++ b/spec/ride_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require_relative 'spec_helper' + +RSpec.describe Ride do + subject(:first_ride) do + described_class.new({ name: 'Carousel', min_height: 24, admission_fee: 1, excitement: :gentle }) + end + + describe '#initialize' do + it { is_expected.to be_instance_of described_class } + end +end From 9c6c7ca732f8bac2365ede38d4c7294573f14342 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:23:21 -0500 Subject: [PATCH 02/13] feat: Add Ride with initialize method --- lib/ride.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/ride.rb b/lib/ride.rb index e69de29..a3d79ac 100644 --- a/lib/ride.rb +++ b/lib/ride.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +# Create a ride for the carnival +class Ride + def initialize(ride_params) + end +end From 8bdda576e9cc2a12deb0cd88dd0d3fe8fb6c6067 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:25:23 -0500 Subject: [PATCH 03/13] test: Add tests for initialize method --- spec/ride_spec.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/spec/ride_spec.rb b/spec/ride_spec.rb index e1cb0e6..1885a29 100644 --- a/spec/ride_spec.rb +++ b/spec/ride_spec.rb @@ -9,5 +9,25 @@ describe '#initialize' do it { is_expected.to be_instance_of described_class } + + it 'has a name' do + expect(first_ride.name).to eq('Carousel') + end + + it 'has a minimum height' do + expect(first_ride.min_height).to eq(24) + end + + it 'has an admission fee' do + expect(first_ride.admission_fee).to eq(1) + end + + it 'has an excitement level' do + expect(first_ride.excitement).to eq(:gentle) + end + + it 'has no revenue' do + expect(first_ride.total_revenue).to eq(0) + end end end From fb747be80ce691dcb04f4c5848c84e3f149817c1 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:26:45 -0500 Subject: [PATCH 04/13] feat: Add attributes for name, min_height, admission_fee, excitement, and total_revenue --- lib/ride.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/ride.rb b/lib/ride.rb index a3d79ac..128c579 100644 --- a/lib/ride.rb +++ b/lib/ride.rb @@ -2,6 +2,13 @@ # Create a ride for the carnival class Ride + attr_reader :name, :min_height, :admission_fee, :excitement, :total_revenue + def initialize(ride_params) + @name = ride_params[:name] + @min_height = ride_params[:min_height] + @admission_fee = ride_params[:admission_fee] + @excitement = ride_params[:excitement] + @total_revenue = 0 end end From a5e0061ca6004338d006f71d23a2c2476b57bc32 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:36:02 -0500 Subject: [PATCH 05/13] test: Add test for spend_money --- spec/visitor_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/visitor_spec.rb b/spec/visitor_spec.rb index 468c183..c007880 100644 --- a/spec/visitor_spec.rb +++ b/spec/visitor_spec.rb @@ -47,4 +47,10 @@ it { is_expected.to be true } end end + + describe '#spend_money' do + it 'can spend money' do + expect(visitor.spend_money(2)).to eq(8) + end + end end From bf0b03069c283316e9298f18bd4128e892c0fda6 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:36:14 -0500 Subject: [PATCH 06/13] feat: Add spend_money method --- lib/visitor.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/visitor.rb b/lib/visitor.rb index 9c4a4a6..a8f9c9a 100644 --- a/lib/visitor.rb +++ b/lib/visitor.rb @@ -18,4 +18,8 @@ def add_preference(pref) def tall_enough?(minimum_height) @height > minimum_height end + + def spend_money(amount) + @spending_money -= amount + end end From 0e79f9ebca8209b84c226cd6568b87180f22c34a Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:39:27 -0500 Subject: [PATCH 07/13] test: Fix test for spend_money --- spec/visitor_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/visitor_spec.rb b/spec/visitor_spec.rb index c007880..a6b1f58 100644 --- a/spec/visitor_spec.rb +++ b/spec/visitor_spec.rb @@ -50,7 +50,7 @@ describe '#spend_money' do it 'can spend money' do - expect(visitor.spend_money(2)).to eq(8) + expect(first_visitor.spend_money(2)).to eq(8) end end end From c72a4c87b36f3935eda98d9399b129815412a454 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:39:45 -0500 Subject: [PATCH 08/13] test: Add test for empty rider log --- spec/ride_spec.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/spec/ride_spec.rb b/spec/ride_spec.rb index 1885a29..4a3bdec 100644 --- a/spec/ride_spec.rb +++ b/spec/ride_spec.rb @@ -7,6 +7,17 @@ described_class.new({ name: 'Carousel', min_height: 24, admission_fee: 1, excitement: :gentle }) end + let(:second_ride) do + described_class.new({ name: 'Ferris Wheel', min_height: 36, admission_fee: 5, excitement: :gentle }) + end + let(:third_ride) do + described_class.new({ name: 'Roller Coaster', min_height: 54, admission_fee: 2, excitement: :thrilling }) + end + + let(:first_visitor) { Visitor.new('Bruce', 54, '$10') } + let(:second_visitor) { Visitor.new('Tucker', 36, '$5') } + let(:third_visitor) { Visitor.new('Penny', 64, '$15') } + describe '#initialize' do it { is_expected.to be_instance_of described_class } @@ -29,5 +40,9 @@ it 'has no revenue' do expect(first_ride.total_revenue).to eq(0) end + + it 'has empty rider log' do + expect(first_ride.rider_log).to eq({}) + end end end From 8f8642ea0ff507692375c7560195a245592f0154 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:40:02 -0500 Subject: [PATCH 09/13] feat: Add attribute for rider_log --- lib/ride.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ride.rb b/lib/ride.rb index 128c579..1f51172 100644 --- a/lib/ride.rb +++ b/lib/ride.rb @@ -2,7 +2,7 @@ # Create a ride for the carnival class Ride - attr_reader :name, :min_height, :admission_fee, :excitement, :total_revenue + attr_reader :name, :min_height, :admission_fee, :excitement, :total_revenue, :rider_log def initialize(ride_params) @name = ride_params[:name] @@ -10,5 +10,6 @@ def initialize(ride_params) @admission_fee = ride_params[:admission_fee] @excitement = ride_params[:excitement] @total_revenue = 0 + @rider_log = {} end end From 91d65b347158b6265db8fe66d97572af2e07d2e0 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:43:05 -0500 Subject: [PATCH 10/13] test: Add test for rider_log --- spec/ride_spec.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/spec/ride_spec.rb b/spec/ride_spec.rb index 4a3bdec..f9cae00 100644 --- a/spec/ride_spec.rb +++ b/spec/ride_spec.rb @@ -45,4 +45,18 @@ expect(first_ride.rider_log).to eq({}) end end + + describe '#rider_log' do + before do + first_visitor.add_preference(:gentle) + second_visitor.add_preference(:gentle) + first_ride.board_rider(first_visitor) + first_ride.board_rider(second_visitor) + first_ride.board_rider(first_visitor) + end + + it 'returns hash of riders with amount of times ridden' do + expect(first_ride.rider_log).to eq({ first_visitor => 2, second_visitor => 1 }) + end + end end From 80b4ab6f527c388b2ad5022a01cdc9c7f705bc8f Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:54:11 -0500 Subject: [PATCH 11/13] test: Add tests for board_rider --- spec/ride_spec.rb | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/spec/ride_spec.rb b/spec/ride_spec.rb index f9cae00..9d6e7de 100644 --- a/spec/ride_spec.rb +++ b/spec/ride_spec.rb @@ -46,6 +46,37 @@ end end + describe '#board_rider' do + context 'when rider is not eligible to ride' do + it 'rejects rider who is not tall enough' do + second_visitor.add_preference(:thrilling) + + expect(third_ride.board_rider(second_visitor)).to be_nil + end + + it 'rejects rider who cannot afford ride' do + first_visitor.add_preference(:gentle) + first_visitor.spend_money(10) + + expect(first_ride.board_rider(first_visitor)).to be_nil + end + + it 'rejects rider who does not have matching preference' do + first_visitor.add_preference(:thrilling) + + expect(first_ride.board_rider(first_visitor)).to be_nil + end + end + + context 'when rider is eligible to ride' do + it 'can board rider' do + first_visitor.add_preference(:gentle) + + expect(first_ride.board_rider(first_visitor)).not_to be_nil + end + end + end + describe '#rider_log' do before do first_visitor.add_preference(:gentle) From a42191ffa7022b8ee27406a3d17b3bd5ed5891a1 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:54:25 -0500 Subject: [PATCH 12/13] feat: Add board_rider method --- lib/ride.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/ride.rb b/lib/ride.rb index 1f51172..e7e5aca 100644 --- a/lib/ride.rb +++ b/lib/ride.rb @@ -12,4 +12,18 @@ def initialize(ride_params) @total_revenue = 0 @rider_log = {} end + + def board_rider(visitor) + return unless visitor.tall_enough?(@min_height) && + visitor.spending_money >= @admission_fee && + visitor.preferences.include?(@excitement) + + if @rider_log[visitor] + @rider_log[visitor] += 1 + else + @rider_log[visitor] = 1 + end + @total_revenue += 1 + visitor.spend_money(@admission_fee) + end end From ee368fba582040322d4d4b9a20452e4af994d5e2 Mon Sep 17 00:00:00 2001 From: Jaren Garman Date: Tue, 21 Jan 2025 11:59:10 -0500 Subject: [PATCH 13/13] fix: Add admission_fee to total_revenue instead if 1 --- lib/ride.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ride.rb b/lib/ride.rb index e7e5aca..2b1463c 100644 --- a/lib/ride.rb +++ b/lib/ride.rb @@ -23,7 +23,7 @@ def board_rider(visitor) else @rider_log[visitor] = 1 end - @total_revenue += 1 + @total_revenue += @admission_fee visitor.spend_money(@admission_fee) end end