Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Oscar P. submission for week6 IC #15

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
43 changes: 43 additions & 0 deletions lib/bike_club.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,46 @@
class BikeClub
attr_reader :name, :bikers

def initialize(name)
@name = name
@bikers = []
end

def add_biker(biker)
@bikers << biker
@bikers
end

def most_rides
@bikers.max_by do |biker| #finds biker with most logged rides

biker.rides.keys.size
#returns the amount of keys the biggewst biker has(different rides)
end
end

def best_time(ride)
personalrecords = {}
@bikers.each do |biker|
if biker.rides.include?(ride)
personalrecords[biker] = biker.personal_record(ride)

end
best = personalrecords.min_by { |biker, time| time }[0]

return best
end #biker personal record for given ride put it in as their name as the key,
#the record as the value and then find the highest value and return
end

def bikers_eligible(ride)
eligiblebikers = []
@bikers.each do |biker|
if biker.acceptable_terrain.include?(ride.terrain)
eligiblebikers << biker
end
end
eligiblebikers
end

end
29 changes: 29 additions & 0 deletions lib/biker.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,32 @@
class Biker
attr_reader :name, :max_distance

attr_accessor :acceptable_terrain, :rides

def initialize(name, max_distance)
@name = name
@max_distance = max_distance
@acceptable_terrain = []
@rides = {}
end

def log_ride (ride, time)
if @acceptable_terrain.include?(ride.terrain) && ride.distance <= @max_distance
rides[ride] ||= [] #makes an array for the ride
rides[ride] << time #put in time to the array for that specific ridw
end
end

def learn_terrain(terrain)
@acceptable_terrain << terrain
end

def personal_record(ride)

if @rides.key?(ride)
@rides[ride].min #smallest time
else
false
end
end
end
26 changes: 26 additions & 0 deletions lib/ride.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,29 @@
class Ride
attr_reader :name,
:distance,
:loop,
:terrain

def initialize (info)
@name = info[:name]
@distance = info[:distance]
@loop = info[:loop]
@terrain = info[:terrain]
end

def loop?
if @loop == true
true
else
false
end
end

def total_distance
if loop? == true
total_distance = @distance
else
total_distance = (@distance * 2)
end
end
end
58 changes: 58 additions & 0 deletions spec/bike_club_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
require './lib/ride'
require './lib/biker'
require './lib/bike_club'

RSpec.describe BikeClub do
before(:each) do
@bike_club = BikeClub.new('flying bike club')
@biker = Biker.new("Kenny", 30)
@biker2 = Biker.new("Athena", 15)
@ride1 = Ride.new({name: "Walnut Creek Trail", distance: 10.7, loop: false, terrain: :hills})
@ride2 = Ride.new({name: "Town Lake", distance: 14.9, loop: true, terrain: :gravel})

@biker.learn_terrain(:hills)
@biker.learn_terrain(:gravel)
@biker.log_ride(@ride1, 95.3)
@biker.log_ride(@ride2, 60.7)

@biker2.learn_terrain(:gravel)
@biker2.log_ride(@ride2, 65.4)
end

it 'exists' do
expect(@bike_club).to be_an_instance_of(BikeClub)
expect(@bike_club.name).to eq("flying bike club")
end

it 'can hav and add bikers' do
expect(@bike_club.bikers).to eq([])

@bike_club.add_biker(@biker)
@bike_club.add_biker(@biker2)

expect(@bike_club.bikers).to eq([@biker, @biker2])
end

it 'can return the biker with the most rides' do
@bike_club.add_biker(@biker)
@bike_club.add_biker(@biker2)

expect(@bike_club.most_rides).to eq(@biker)
end

it 'can return biker with the best time for a ride' do
@bike_club.add_biker(@biker)
@bike_club.add_biker(@biker2)

expect(@bike_club.best_time(@ride2)).to eq(@biker)
end

it 'can tell which bikers are eligible for a ride' do
@bike_club.add_biker(@biker)
@bike_club.add_biker(@biker2)

expect(@bike_club.bikers_eligible(@ride1)).to eq([@biker])
expect(@bike_club.bikers_eligible(@ride2)).to eq([@biker, @biker2])
end

end
46 changes: 46 additions & 0 deletions spec/biker_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
require './lib/ride'
require './lib/biker'

RSpec.describe Biker do
before(:each) do
@biker = Biker.new("Kenny", 30)
@biker2 = Biker.new("Athena", 15)
@ride1 = Ride.new({name: "Walnut Creek Trail", distance: 10.7, loop: false, terrain: :hills})
@ride2 = Ride.new({name: "Town Lake", distance: 14.9, loop: true, terrain: :gravel})
end

it 'exists' do
expect(@biker).to be_an_instance_of(Biker)
expect(@biker2).to be_an_instance_of(Biker)
expect(@biker.name).to eq('Kenny')
expect(@biker2.max_distance).to eq(15)
end

it 'can learn terrain' do
@biker2.learn_terrain(:gravel)
@biker2.learn_terrain(:hills)

expect(@biker2.acceptable_terrain).to eq([:gravel, :hills])
expect(@biker.acceptable_terrain).to eq([])
end

it 'can log rides' do
@biker.learn_terrain(:gravel)
@biker.learn_terrain(:hills)
@biker.log_ride(@ride1, 92.5)
@biker.log_ride(@ride2, 61.6)
@biker2.log_ride(@ride1, 97.9)

expect(@biker.rides).to eq({@ride1 => [92.5], @ride2 => [61.6]})
expect(@biker2.rides).to eq({})
end

it 'can have personal records' do
@biker.learn_terrain(:hills)
@biker.log_ride(@ride1, 92.5)
@biker.log_ride(@ride1, 88.0)

expect(@biker.personal_record(@ride1)).to eq(88.0)
expect(@biker.personal_record(@ride2)).to eq false
end
end
28 changes: 28 additions & 0 deletions spec/ride_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# require 'pry'
# binding.pry
require './lib/ride'

RSpec.describe Ride do
before(:each) do

@ride1 = Ride.new({name: "Walnut Creek Trail", distance: 10.7, loop: false, terrain: :hills})
@ride2 = Ride.new({name: "Town Lake", distance: 14.9, loop: true, terrain: :gravel})
end

it 'exists' do
expect(@ride1).to be_an_instance_of(Ride)
expect(@ride2).to be_an_instance_of(Ride)
end

it 'has info' do
expect(@ride1.distance).to eq(10.7)
expect(@ride1.terrain).to eq(:hills)
expect(@ride1.loop?).to be(false)
expect(@ride1.total_distance).to eq(21.4)

expect(@ride2.loop?).to be(true)
expect(@ride2.distance).to eq(14.9)
end


end