From 96d143b6578cfb00981aa95f833bff39206b0622 Mon Sep 17 00:00:00 2001 From: mulhoo Date: Mon, 24 Feb 2020 15:18:29 -0800 Subject: [PATCH 01/21] Updated Ruby version --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 63ffa5acd..769f5f038 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'http://rubygems.org' -ruby '2.5.5' +ruby '2.6.5' gem 'rake' From ed81420a2fa01e783c9ec46d4174b663476cccb7 Mon Sep 17 00:00:00 2001 From: mulhoo Date: Tue, 25 Feb 2020 17:48:02 -0800 Subject: [PATCH 02/21] Wave 1 Part 1 tests --- lib/csv_record.rb | 4 ++++ lib/passenger.rb | 4 +++- lib/trip.rb | 40 +++++++++++++++++++++++++++++++++++----- test/trip_test.rb | 39 +++++++++++++++++++++++++++++++++++---- 4 files changed, 77 insertions(+), 10 deletions(-) diff --git a/lib/csv_record.rb b/lib/csv_record.rb index 96319ab87..31fffa2e6 100644 --- a/lib/csv_record.rb +++ b/lib/csv_record.rb @@ -1,3 +1,4 @@ +require 'time' require 'csv' module RideShare @@ -12,6 +13,7 @@ def initialize(id) # Takes either full_path or directory and optional file_name # Default file name matches class name def self.load_all(full_path: nil, directory: nil, file_name: nil) + #if full_path exists use it, if not build_path full_path ||= build_path(directory, file_name) return CSV.read( @@ -39,6 +41,8 @@ def self.build_path(directory, file_name) raise ArgumentError, "Either full_path or directory is required" end + + ###WHERE IT GETS CSV NAME FOR BABY CLASSES unless file_name class_name = self.to_s.split('::').last file_name = "#{class_name.downcase}s.csv" diff --git a/lib/passenger.rb b/lib/passenger.rb index afd13d73b..6ebc6d489 100644 --- a/lib/passenger.rb +++ b/lib/passenger.rb @@ -1,3 +1,5 @@ +require 'time' + require_relative 'csv_record' module RideShare @@ -9,7 +11,7 @@ def initialize(id:, name:, phone_number:, trips: nil) @name = name @phone_number = phone_number - @trips = trips || [] + @trips = trips || [] end def add_trip(trip) diff --git a/lib/trip.rb b/lib/trip.rb index 87ce496e9..e452bb7e6 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -1,10 +1,11 @@ require 'csv' +require 'time' require_relative 'csv_record' module RideShare class Trip < CsvRecord - attr_reader :id, :passenger, :passenger_id, :start_time, :end_time, :cost, :rating + attr_reader :id, :passenger, :passenger_id, :start_time, :end_time, :cost, :rating, :trip_time def initialize( id:, @@ -13,7 +14,8 @@ def initialize( start_time:, end_time:, cost: nil, - rating: + rating:, + trip_time: nil ) super(id) @@ -32,12 +34,29 @@ def initialize( @end_time = end_time @cost = cost @rating = rating + @trip_time = time_difference(@start_time, @end_time) if @rating > 5 || @rating < 1 raise ArgumentError.new("Invalid rating #{@rating}") end + + if @end_time < @start_time + raise ArgumentError.new('End time cannot be before start time.') + end end + + def time_difference(time_a, time_b) + difference = time_b - time_a + + if difference > 0 + return difference + else + return 24 * 3600 + difference + end + end + + def inspect # Prevent infinite loop when puts-ing a Trip # trip contains a passenger contains a trip contains a passenger... @@ -54,14 +73,25 @@ def connect(passenger) private def self.from_csv(record) - return self.new( + return new( id: record[:id], passenger_id: record[:passenger_id], - start_time: record[:start_time], - end_time: record[:end_time], + start_time: Time.parse(record[:start_time]), + end_time: Time.parse(record[:end_time]), cost: record[:cost], rating: record[:rating] ) end end end + +def time_difference(time_a, time_b) + difference = time_b - time_a + + + if difference > 0 + return difference + else + return 24 * 3600 + difference + end +end \ No newline at end of file diff --git a/test/trip_test.rb b/test/trip_test.rb index 2063e28a7..86a8a386c 100644 --- a/test/trip_test.rb +++ b/test/trip_test.rb @@ -20,6 +20,39 @@ @trip = RideShare::Trip.new(@trip_data) end + it "accurately finds time length of ride" do + time_a = "2018-12-27 02:39:05 -0800" + time_b = "2018-12-27 03:38:08 -0800" + + difference = Time.parse(time_b) - Time.parse(time_a) + + if difference > 0 + return difference + else + return 24 * 3600 + difference + end + + expect(difference).must_equal(3543.0) + end + + it "raises error when end_time is less than start_time" do + test_trip = { + id: 8, + passenger: RideShare::Passenger.new( + id: 1, + name: "Ada", + phone_number: "412-432-7640" + ), + start_time: "2018-12-27 03:38:08 -0800", + end_time: "2018-12-27 02:39:05 -0800", + cost: 23.45, + rating: 3, + trip_time: 3543.0 + } + + expect {RideShare::Trip.new(test_trip)}.must_raise ArgumentError + end + it "is an instance of Trip" do expect(@trip).must_be_kind_of RideShare::Trip end @@ -36,10 +69,8 @@ it "raises an error for an invalid rating" do [-3, 0, 6].each do |rating| @trip_data[:rating] = rating - expect do - RideShare::Trip.new(@trip_data) - end.must_raise ArgumentError + expect {RideShare::Trip.new(@trip_data)}.must_raise ArgumentError end end end -end +end \ No newline at end of file From e4c6a89aff7d9e66bd13d182f038ffbda6f47834 Mon Sep 17 00:00:00 2001 From: mulhoo Date: Tue, 25 Feb 2020 17:48:46 -0800 Subject: [PATCH 03/21] Updated ruby version --- Gemfile.lock | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..1e34c6def --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,34 @@ +GEM + remote: http://rubygems.org/ + specs: + ansi (1.5.0) + awesome_print (1.8.0) + builder (3.2.4) + csv (3.1.2) + minitest (5.14.0) + minitest-reporters (1.4.2) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + minitest-skip (0.0.1) + minitest (~> 5.0) + rake (13.0.1) + ruby-progressbar (1.10.1) + +PLATFORMS + ruby + +DEPENDENCIES + awesome_print + csv + minitest + minitest-reporters + minitest-skip + rake + +RUBY VERSION + ruby 2.6.5p114 + +BUNDLED WITH + 1.17.2 From df3ae92397b352a8271529a7dbb870a046d35969 Mon Sep 17 00:00:00 2001 From: mulhoo Date: Tue, 25 Feb 2020 17:49:26 -0800 Subject: [PATCH 04/21] first commit for time math --- time_math.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 time_math.rb diff --git a/time_math.rb b/time_math.rb new file mode 100644 index 000000000..a85809866 --- /dev/null +++ b/time_math.rb @@ -0,0 +1,16 @@ +require 'time' + +def time_difference(time_a, time_b) + difference = Time.parse(time_b) - Time.parse(time_a) + + if difference > 0 + return difference + else + return 24 * 3600 + difference + end +end + +end_time = "2018-12-27 03:38:08 -0800" +start_time = "2018-12-27 02:39:05 -0800" + +puts time_difference(start_time, end_time) \ No newline at end of file From 8bff55e4bc2c868472fa551ce6ca1f05cea88a6b Mon Sep 17 00:00:00 2001 From: mulhoo Date: Tue, 25 Feb 2020 19:05:21 -0800 Subject: [PATCH 05/21] fixed broken test --- lib/trip.rb | 15 ++++----------- test/trip_test.rb | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/lib/trip.rb b/lib/trip.rb index e452bb7e6..be1f126c4 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -30,6 +30,10 @@ def initialize( raise ArgumentError, 'Passenger or passenger_id is required' end + if start_time.class != Time || start_time.class != Time + raise ArgumentError.new("Value is not a Time object.") + end + @start_time = start_time @end_time = end_time @cost = cost @@ -83,15 +87,4 @@ def self.from_csv(record) ) end end -end - -def time_difference(time_a, time_b) - difference = time_b - time_a - - - if difference > 0 - return difference - else - return 24 * 3600 + difference - end end \ No newline at end of file diff --git a/test/trip_test.rb b/test/trip_test.rb index 86a8a386c..c65eb5edf 100644 --- a/test/trip_test.rb +++ b/test/trip_test.rb @@ -35,7 +35,7 @@ expect(difference).must_equal(3543.0) end - it "raises error when end_time is less than start_time" do + it "raises error when end_time or start_time is not Time object" do test_trip = { id: 8, passenger: RideShare::Passenger.new( @@ -53,6 +53,24 @@ expect {RideShare::Trip.new(test_trip)}.must_raise ArgumentError end + it "raises error when end_time is less than start_time" do + test_trip = { + id: 8, + passenger: RideShare::Passenger.new( + id: 1, + name: "Ada", + phone_number: "412-432-7640" + ), + start_time: Time.parse("2018-12-27 03:38:08 -0800"), + end_time: Time.parse("2018-12-27 02:39:05 -0800"), + cost: 23.45, + rating: 3, + trip_time: 3543.0 + } + + expect {RideShare::Trip.new(test_trip)}.must_raise ArgumentError + end + it "is an instance of Trip" do expect(@trip).must_be_kind_of RideShare::Trip end From 6712e4b791f7a8ee08a38210d38d81e4d5120017 Mon Sep 17 00:00:00 2001 From: Antonia Date: Wed, 26 Feb 2020 15:31:27 -0800 Subject: [PATCH 06/21] finished wave 1, fixed a couple of methods and tests --- lib/driver.rb | 21 +++++++++++++++++++++ lib/passenger.rb | 34 ++++++++++++++++++++++++++++++++++ lib/trip.rb | 24 +++++++++++++----------- test/passenger_test.rb | 35 ++++++++++++++++++++++++++++------- test/test_helper.rb | 2 +- test/trip_test.rb | 22 ++++++++++++---------- 6 files changed, 109 insertions(+), 29 deletions(-) create mode 100644 lib/driver.rb diff --git a/lib/driver.rb b/lib/driver.rb new file mode 100644 index 000000000..ef658cb5e --- /dev/null +++ b/lib/driver.rb @@ -0,0 +1,21 @@ +require_relative 'csv_record' + +module RideShare + class Driver << CsvRecord + attr_reader :id, :name, :vin, :trips + attr_accessor :status + + def initialize(id:, name:, vin:, status:, trips:) + super(id) + + if vin.length != 17 + raise ArgumentError 'vin length has to be 17' + end + + @name = name + @vin = vin + @status = status + @trips = [] + end + + \ No newline at end of file diff --git a/lib/passenger.rb b/lib/passenger.rb index 6ebc6d489..db035934b 100644 --- a/lib/passenger.rb +++ b/lib/passenger.rb @@ -18,6 +18,40 @@ def add_trip(trip) @trips << trip end + def net_expenditures + total_money = 0 + @trips.each do |trip| + if trip == nil + next + else + total_money += trip.cost + end + end + return total_money + end +####working on this + # def total_time_spent + # total_time = 0 + # @trips.each do |trip| + # if trip == nil + # next + # total_time += trip.time_difference + # end + # end + # return total_time + # end + def total_time_spent + if @trips.empty? == true + return 0 + else + time_duration = (@trips).map do |trip| + trip.time_difference + # Time.parse(trip.end_time) - Time.parse(trip.start_time) + end + return time_duration.sum + end + end + private def self.from_csv(record) diff --git a/lib/trip.rb b/lib/trip.rb index be1f126c4..61279de64 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -5,7 +5,7 @@ module RideShare class Trip < CsvRecord - attr_reader :id, :passenger, :passenger_id, :start_time, :end_time, :cost, :rating, :trip_time + attr_reader :id, :passenger, :passenger_id, :start_time, :end_time, :cost, :rating #, :trip_time def initialize( id:, @@ -14,8 +14,8 @@ def initialize( start_time:, end_time:, cost: nil, - rating:, - trip_time: nil + rating: + #trip_time: nil ) super(id) @@ -38,7 +38,7 @@ def initialize( @end_time = end_time @cost = cost @rating = rating - @trip_time = time_difference(@start_time, @end_time) + #@trip_time = time_difference(@start_time, @end_time) if @rating > 5 || @rating < 1 raise ArgumentError.new("Invalid rating #{@rating}") @@ -50,15 +50,17 @@ def initialize( end - def time_difference(time_a, time_b) - difference = time_b - time_a + def time_difference #(time_a, time_b) + return @end_time - @start_time - if difference > 0 - return difference - else - return 24 * 3600 + difference - end + # if difference > 0 + # return difference + # else + # return 24 * 3600 + difference + # end end + # return difference = @end_time - @start_time + # end def inspect diff --git a/test/passenger_test.rb b/test/passenger_test.rb index eb3a631df..ddd9de749 100644 --- a/test/passenger_test.rb +++ b/test/passenger_test.rb @@ -44,15 +44,27 @@ phone_number: "1-602-620-2330 x3723", trips: [] ) - trip = RideShare::Trip.new( + trip1 = RideShare::Trip.new( id: 8, passenger: @passenger, - start_time: Time.new(2016, 8, 8), - end_time: Time.new(2016, 8, 9), - rating: 5 + start_time: Time.new(2016, 8, 8, 13, 39 , 0), + end_time: Time.new(2016, 8, 8, 13, 50, 0), + rating: 5, + cost: 5 ) - @passenger.add_trip(trip) + @passenger.add_trip(trip1) + + trip2 = RideShare::Trip.new( + id: 8, + passenger: @passenger, + start_time: Time.new(2016, 8, 8, 16, 30, 0), + end_time: Time.new(2016, 8, 8, 16, 40, 0), + rating: 5, + cost: 10 + ) + + @passenger.add_trip(trip2) end it "each item in array is a Trip instance" do @@ -66,9 +78,18 @@ expect(trip.passenger.id).must_equal 9 end end + + it "calculates total costs" do + @passenger.trips.each do |trip| + expect(@passenger.net_expenditures).must_equal 15 + end end - describe "net_expenditures" do - # You add tests for the net_expenditures method + it "calculates time spent" do + @passenger.trips.each do |trip| + expect(@passenger.total_time_spent).must_equal 1260 + end end + end +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index bdb9bf352..082369790 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -12,4 +12,4 @@ require_relative '../lib/passenger' require_relative '../lib/trip' require_relative '../lib/trip_dispatcher' -# require_relative '../lib/driver' +require_relative '../lib/driver' diff --git a/test/trip_test.rb b/test/trip_test.rb index c65eb5edf..bff1fd592 100644 --- a/test/trip_test.rb +++ b/test/trip_test.rb @@ -21,16 +21,18 @@ end it "accurately finds time length of ride" do - time_a = "2018-12-27 02:39:05 -0800" - time_b = "2018-12-27 03:38:08 -0800" + start_time = "2018-12-27 02:39:05 -0800" + end_time = "2018-12-27 03:38:08 -0800" + # time_a = "2018-12-27 02:39:05 -0800" + # time_b = "2018-12-27 03:38:08 -0800" - difference = Time.parse(time_b) - Time.parse(time_a) + difference = Time.parse(end_time) - Time.parse(start_time) - if difference > 0 - return difference - else - return 24 * 3600 + difference - end + # if difference > 0 + # return difference + # else + # return 24 * 3600 + difference + # end expect(difference).must_equal(3543.0) end @@ -47,7 +49,7 @@ end_time: "2018-12-27 02:39:05 -0800", cost: 23.45, rating: 3, - trip_time: 3543.0 + #trip_time: 3543.0 } expect {RideShare::Trip.new(test_trip)}.must_raise ArgumentError @@ -65,7 +67,7 @@ end_time: Time.parse("2018-12-27 02:39:05 -0800"), cost: 23.45, rating: 3, - trip_time: 3543.0 + #trip_time: 3543.0 } expect {RideShare::Trip.new(test_trip)}.must_raise ArgumentError From 3ab21836411bc8f1a6564dde24ce1ade510bf345 Mon Sep 17 00:00:00 2001 From: Antonia Date: Wed, 26 Feb 2020 19:33:04 -0800 Subject: [PATCH 07/21] Started Wave 2, created Driver class, updated Trips, and fixed corresponding tests --- lib/driver.rb | 24 ++++++++++++++++++------ lib/passenger.rb | 10 +++++----- lib/trip.rb | 24 ++++++++++++++++++------ test/passenger_test.rb | 16 ++++++++++++++-- test/trip_test.rb | 23 ++++++++++++++++++++++- 5 files changed, 77 insertions(+), 20 deletions(-) diff --git a/lib/driver.rb b/lib/driver.rb index ef658cb5e..ba7b68539 100644 --- a/lib/driver.rb +++ b/lib/driver.rb @@ -1,21 +1,33 @@ require_relative 'csv_record' module RideShare - class Driver << CsvRecord - attr_reader :id, :name, :vin, :trips + class Driver < CsvRecord + attr_reader :name, :vin, :trips attr_accessor :status - def initialize(id:, name:, vin:, status:, trips:) + def initialize(id:, name:, vin:, status: :AVAILABLE, trips:) super(id) - if vin.length != 17 + unless vin.length == 17 raise ArgumentError 'vin length has to be 17' end @name = name @vin = vin @status = status - @trips = [] + @trips = trips || [] end - \ No newline at end of file + private + + def self.from_csv(record) + return new( + id: record[:id], + name: record[:name], + vin: record[:vin], + status: record[:status].to_sym, + trips: record[:trips] + ) + end + end +end \ No newline at end of file diff --git a/lib/passenger.rb b/lib/passenger.rb index db035934b..fa12a3380 100644 --- a/lib/passenger.rb +++ b/lib/passenger.rb @@ -19,16 +19,16 @@ def add_trip(trip) end def net_expenditures - total_money = 0 - @trips.each do |trip| + total_money = 0 + @trips.each do |trip| if trip == nil next else - total_money += trip.cost + total_money += trip.cost end end - return total_money - end + return total_money + end ####working on this # def total_time_spent # total_time = 0 diff --git a/lib/trip.rb b/lib/trip.rb index 61279de64..377f9c4a6 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -5,7 +5,7 @@ module RideShare class Trip < CsvRecord - attr_reader :id, :passenger, :passenger_id, :start_time, :end_time, :cost, :rating #, :trip_time + attr_reader :id, :passenger, :passenger_id, :start_time, :end_time, :cost, :rating, :driver_id, :driver def initialize( id:, @@ -14,8 +14,9 @@ def initialize( start_time:, end_time:, cost: nil, - rating: - #trip_time: nil + rating:, + driver_id: nil, + driver: nil ) super(id) @@ -30,7 +31,18 @@ def initialize( raise ArgumentError, 'Passenger or passenger_id is required' end - if start_time.class != Time || start_time.class != Time + if driver + @driver = driver + @driver_id = driver.id + + elsif driver_id + @driver_id = driver_id + + else + raise ArgumentError, 'Driver or driver_id is required' + end + + if start_time.class != Time || end_time.class != Time raise ArgumentError.new("Value is not a Time object.") end @@ -38,7 +50,6 @@ def initialize( @end_time = end_time @cost = cost @rating = rating - #@trip_time = time_difference(@start_time, @end_time) if @rating > 5 || @rating < 1 raise ArgumentError.new("Invalid rating #{@rating}") @@ -85,7 +96,8 @@ def self.from_csv(record) start_time: Time.parse(record[:start_time]), end_time: Time.parse(record[:end_time]), cost: record[:cost], - rating: record[:rating] + rating: record[:rating], + driver_id: record[:driver_id] ) end end diff --git a/test/passenger_test.rb b/test/passenger_test.rb index ddd9de749..252714098 100644 --- a/test/passenger_test.rb +++ b/test/passenger_test.rb @@ -44,16 +44,26 @@ phone_number: "1-602-620-2330 x3723", trips: [] ) + @driver = RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ", + status: :AVAILABLE, + trips: [1] + ) trip1 = RideShare::Trip.new( id: 8, passenger: @passenger, start_time: Time.new(2016, 8, 8, 13, 39 , 0), end_time: Time.new(2016, 8, 8, 13, 50, 0), rating: 5, - cost: 5 + cost: 5, + driver_id: @driver.id, + driver: nil ) @passenger.add_trip(trip1) + #maybe add driver later trip2 = RideShare::Trip.new( id: 8, @@ -61,7 +71,9 @@ start_time: Time.new(2016, 8, 8, 16, 30, 0), end_time: Time.new(2016, 8, 8, 16, 40, 0), rating: 5, - cost: 10 + cost: 10, + driver_id: @driver.id, + driver: nil ) @passenger.add_trip(trip2) diff --git a/test/trip_test.rb b/test/trip_test.rb index bff1fd592..805e1e461 100644 --- a/test/trip_test.rb +++ b/test/trip_test.rb @@ -15,7 +15,14 @@ start_time: start_time, end_time: end_time, cost: 23.45, - rating: 3 + rating: 3, + driver: RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ", + status: :AVAILABLE, + trips: nil + ) } @trip = RideShare::Trip.new(@trip_data) end @@ -49,6 +56,13 @@ end_time: "2018-12-27 02:39:05 -0800", cost: 23.45, rating: 3, + driver: RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ", + status: :AVAILABLE, + trips: [1, 2, 3] + ) #trip_time: 3543.0 } @@ -67,6 +81,13 @@ end_time: Time.parse("2018-12-27 02:39:05 -0800"), cost: 23.45, rating: 3, + driver: RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ", + status: :AVAILABLE, + trips: [1] + ) #trip_time: 3543.0 } From a4caa38661457b9f5695f9e8eb017f9d4c9bea7c Mon Sep 17 00:00:00 2001 From: Antonia Date: Wed, 26 Feb 2020 20:38:32 -0800 Subject: [PATCH 08/21] Updated TripDispatcher class for Wave 2 --- lib/trip_dispatcher.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/trip_dispatcher.rb b/lib/trip_dispatcher.rb index 5130849f8..24a1f08d1 100644 --- a/lib/trip_dispatcher.rb +++ b/lib/trip_dispatcher.rb @@ -9,6 +9,7 @@ class TripDispatcher attr_reader :drivers, :passengers, :trips def initialize(directory: './support') + @drivers = Driver.load_all(directory: directory) @passengers = Passenger.load_all(directory: directory) @trips = Trip.load_all(directory: directory) connect_trips @@ -19,6 +20,11 @@ def find_passenger(id) return @passengers.find { |passenger| passenger.id == id } end + def find_driver(id) + Driver.validate_id(id) + return @drivers.find { |driver| driver.id == id} + end + def inspect # Make puts output more useful return "#<#{self.class.name}:0x#{object_id.to_s(16)} \ @@ -33,6 +39,7 @@ def connect_trips @trips.each do |trip| passenger = find_passenger(trip.passenger_id) trip.connect(passenger) + driver = find_driver(trip.driver_id) end return trips From 0c8868dc83f8ffaf11823a1a7c2b025cfd799d9b Mon Sep 17 00:00:00 2001 From: mulhoo Date: Thu, 27 Feb 2020 10:16:08 -0800 Subject: [PATCH 09/21] Partial Wave 3 completion, need tests --- lib/csv_record.rb | 2 -- lib/driver.rb | 66 ++++++++++++++++++++++++++++++++++++-- lib/trip.rb | 24 +++++++------- lib/trip_dispatcher.rb | 41 +++++++++++++++++++++-- test/driver_test.rb | 9 ++++-- test/trip_dispatch_test.rb | 2 +- test/trip_test.rb | 7 ---- 7 files changed, 123 insertions(+), 28 deletions(-) diff --git a/lib/csv_record.rb b/lib/csv_record.rb index 31fffa2e6..bb83b0f5a 100644 --- a/lib/csv_record.rb +++ b/lib/csv_record.rb @@ -41,8 +41,6 @@ def self.build_path(directory, file_name) raise ArgumentError, "Either full_path or directory is required" end - - ###WHERE IT GETS CSV NAME FOR BABY CLASSES unless file_name class_name = self.to_s.split('::').last file_name = "#{class_name.downcase}s.csv" diff --git a/lib/driver.rb b/lib/driver.rb index ba7b68539..048c8b59a 100644 --- a/lib/driver.rb +++ b/lib/driver.rb @@ -5,19 +5,79 @@ class Driver < CsvRecord attr_reader :name, :vin, :trips attr_accessor :status - def initialize(id:, name:, vin:, status: :AVAILABLE, trips:) + def initialize(id:, name:, vin:, status: :AVAILABLE, trips: nil) super(id) - unless vin.length == 17 - raise ArgumentError 'vin length has to be 17' + if vin.length != 17 + raise ArgumentError.new("VIN length has to be 17") end + driver_status = [:AVAILABLE, :UNAVAILABLE] + if !driver_status.include?(status) + raise ArgumentError.new("Driver status invalid.") + end + @name = name @vin = vin @status = status @trips = trips || [] end + def add_trip(trip) + @trips << trip + end + + def ongoing_trips + ongoing_trip = [] + self.trips.each do |trip| + if trip.end_time == nil + ongoing_trip << trip + end + end + + return ongoing_trip + end + + def average_rating + rating = 0 + trips.each do |trip| + if trip.rating == nil + rating += 0 + else + rating += trip.rating + end + end + + if trips.length == 0 + return 0 + end + + return rating.to_f/trips.length + end + + def total_earnings + earnings = 0.0 + + trips.each do |trip| + if trip.cost == nil + earnings += 0 + else + earnings += cost + end + end + + return earnings + end + + def status_to_unavailable + self.status = :UNAVAILABLE + end + + def get_new_trip(trip) + self.add_trip(trip) + self.status_to_unavailable + end + private def self.from_csv(record) diff --git a/lib/trip.rb b/lib/trip.rb index 377f9c4a6..f5f0af317 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -51,7 +51,9 @@ def initialize( @cost = cost @rating = rating - if @rating > 5 || @rating < 1 + if @rating == nil + @rating = rating + elsif @rating > 5 || @rating < 1 raise ArgumentError.new("Invalid rating #{@rating}") end @@ -60,18 +62,13 @@ def initialize( end end + def time_difference + if @end_time == nil || @start_time == nil + raise ArgumentError.new("Start time or end time cannot be nil.") + end - def time_difference #(time_a, time_b) return @end_time - @start_time - - # if difference > 0 - # return difference - # else - # return 24 * 3600 + difference - # end end - # return difference = @end_time - @start_time - # end def inspect @@ -82,11 +79,16 @@ def inspect "PassengerID=#{passenger&.id.inspect}>" end - def connect(passenger) + def connect_passenger(passenger) @passenger = passenger passenger.add_trip(self) end + def connect_driver(driver) + @driver = driver + driver.add_trip(self) + end + private def self.from_csv(record) diff --git a/lib/trip_dispatcher.rb b/lib/trip_dispatcher.rb index 24a1f08d1..63f6fa9d7 100644 --- a/lib/trip_dispatcher.rb +++ b/lib/trip_dispatcher.rb @@ -3,6 +3,7 @@ require_relative 'passenger' require_relative 'trip' +require_relative 'driver' module RideShare class TripDispatcher @@ -25,6 +26,7 @@ def find_driver(id) return @drivers.find { |driver| driver.id == id} end + def inspect # Make puts output more useful return "#<#{self.class.name}:0x#{object_id.to_s(16)} \ @@ -33,13 +35,48 @@ def inspect #{passengers.count} passengers>" end + def find_available_driver + all_available_drivers = [] + drivers.each do |driver| + if driver.status = :AVAILABLE && driver.ongoing_trip.length == 0 + all_available_drivers << driver + end + end + + if all_available_drivers.empty? + raise ArgumentError.new "There are no available drivers at this time" + end + + return all_available_drivers.shuffle[0] + end + + def start_trip(driver:, passenger:) + current_time = Time.new + new_id = (trips.last.id + 1) + return Trip.new(id: new_id, passenger: passenger, driver: driver, start_time: current_time) + end + + def request_trip(passenger_id) + available_driver = self.find_available_driver + passenger = self.find_passenger(passenger_id) + + new_trip = self.start_trip(driver: available_driver, passenger: passenger) + + available_driver.assign_new_trip(new_trip) + passenger.add_trip(new_trip) + trips << new_trip + + return new_trip + end + + private def connect_trips @trips.each do |trip| passenger = find_passenger(trip.passenger_id) - trip.connect(passenger) - driver = find_driver(trip.driver_id) + trip.connect_passenger(passenger) + trip.connect_driver(find_driver(trip.driver_id)) end return trips diff --git a/test/driver_test.rb b/test/driver_test.rb index 4e6076ec2..2008e61d7 100644 --- a/test/driver_test.rb +++ b/test/driver_test.rb @@ -1,6 +1,6 @@ require_relative 'test_helper' -xdescribe "Driver class" do +describe "Driver class" do describe "Driver instantiation" do before do @driver = RideShare::Driver.new( @@ -76,6 +76,12 @@ expect(@driver.trips).must_include @trip expect(@driver.trips.length).must_equal previous + 1 end + + it "gives accurate trip information" do + @driver.add_trip(@trip) + + expect (@driver.trips[@driver.trips.length - 1]).must_be_instance_of RideShare::Trip + end end describe "average_rating method" do @@ -129,7 +135,6 @@ expect(@driver.average_rating).must_be_close_to (5.0 + 1.0) / 2.0, 0.01 end end - describe "total_revenue" do # You add tests for the total_revenue method end diff --git a/test/trip_dispatch_test.rb b/test/trip_dispatch_test.rb index 21f4457b7..f152b77fa 100644 --- a/test/trip_dispatch_test.rb +++ b/test/trip_dispatch_test.rb @@ -79,7 +79,7 @@ def build_test_dispatcher end # TODO: un-skip for Wave 2 - xdescribe "drivers" do + describe "drivers" do describe "find_driver method" do before do @dispatcher = build_test_dispatcher diff --git a/test/trip_test.rb b/test/trip_test.rb index 805e1e461..3b4c42cd3 100644 --- a/test/trip_test.rb +++ b/test/trip_test.rb @@ -30,16 +30,9 @@ it "accurately finds time length of ride" do start_time = "2018-12-27 02:39:05 -0800" end_time = "2018-12-27 03:38:08 -0800" - # time_a = "2018-12-27 02:39:05 -0800" - # time_b = "2018-12-27 03:38:08 -0800" difference = Time.parse(end_time) - Time.parse(start_time) - # if difference > 0 - # return difference - # else - # return 24 * 3600 + difference - # end expect(difference).must_equal(3543.0) end From 1e1afdfba69875a69700e92458f7face3d06aacc Mon Sep 17 00:00:00 2001 From: mulhoo Date: Thu, 27 Feb 2020 10:29:54 -0800 Subject: [PATCH 10/21] updated variable name --- lib/trip_dispatcher.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/trip_dispatcher.rb b/lib/trip_dispatcher.rb index 63f6fa9d7..a918105c3 100644 --- a/lib/trip_dispatcher.rb +++ b/lib/trip_dispatcher.rb @@ -36,18 +36,18 @@ def inspect end def find_available_driver - all_available_drivers = [] + available_drivers = [] drivers.each do |driver| if driver.status = :AVAILABLE && driver.ongoing_trip.length == 0 - all_available_drivers << driver + available_drivers << driver end end - if all_available_drivers.empty? + if available_drivers.empty? raise ArgumentError.new "There are no available drivers at this time" end - return all_available_drivers.shuffle[0] + return available_drivers.shuffle[0] end def start_trip(driver:, passenger:) From d6867e1e540d1413f1a35996afc62a522efa827a Mon Sep 17 00:00:00 2001 From: mulhoo Date: Thu, 27 Feb 2020 13:55:22 -0800 Subject: [PATCH 11/21] Cosmetic updates all lib --- lib/csv_record.rb | 5 +---- lib/driver.rb | 8 ++++---- lib/passenger.rb | 31 +++++++++++-------------------- lib/trip.rb | 15 ++++----------- lib/trip_dispatcher.rb | 1 - test/trip_dispatch_test.rb | 1 - test/trip_test.rb | 2 -- 7 files changed, 20 insertions(+), 43 deletions(-) diff --git a/lib/csv_record.rb b/lib/csv_record.rb index bb83b0f5a..40a47f8e1 100644 --- a/lib/csv_record.rb +++ b/lib/csv_record.rb @@ -9,11 +9,8 @@ def initialize(id) self.class.validate_id(id) @id = id end - - # Takes either full_path or directory and optional file_name - # Default file name matches class name + def self.load_all(full_path: nil, directory: nil, file_name: nil) - #if full_path exists use it, if not build_path full_path ||= build_path(directory, file_name) return CSV.read( diff --git a/lib/driver.rb b/lib/driver.rb index 048c8b59a..b1fce0708 100644 --- a/lib/driver.rb +++ b/lib/driver.rb @@ -7,6 +7,10 @@ class Driver < CsvRecord def initialize(id:, name:, vin:, status: :AVAILABLE, trips: nil) super(id) + @name = name + @vin = vin + @status = status + @trips = trips || [] if vin.length != 17 raise ArgumentError.new("VIN length has to be 17") @@ -17,10 +21,6 @@ def initialize(id:, name:, vin:, status: :AVAILABLE, trips: nil) raise ArgumentError.new("Driver status invalid.") end - @name = name - @vin = vin - @status = status - @trips = trips || [] end def add_trip(trip) diff --git a/lib/passenger.rb b/lib/passenger.rb index fa12a3380..33707cbda 100644 --- a/lib/passenger.rb +++ b/lib/passenger.rb @@ -29,28 +29,19 @@ def net_expenditures end return total_money end -####working on this - # def total_time_spent - # total_time = 0 - # @trips.each do |trip| - # if trip == nil - # next - # total_time += trip.time_difference - # end - # end - # return total_time - # end - def total_time_spent - if @trips.empty? == true - return 0 - else - time_duration = (@trips).map do |trip| - trip.time_difference - # Time.parse(trip.end_time) - Time.parse(trip.start_time) + + + def total_time_spent + if @trips.empty? == true + return 0 + else + time_duration = (@trips).map do |trip| + trip.time_difference + end + + return time_duration.sum end - return time_duration.sum end - end private diff --git a/lib/trip.rb b/lib/trip.rb index f5f0af317..6c2faec2b 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -19,14 +19,16 @@ def initialize( driver: nil ) super(id) + @start_time = start_time + @end_time = end_time + @cost = cost + @rating = rating if passenger @passenger = passenger @passenger_id = passenger.id - elsif passenger_id @passenger_id = passenger_id - else raise ArgumentError, 'Passenger or passenger_id is required' end @@ -34,10 +36,8 @@ def initialize( if driver @driver = driver @driver_id = driver.id - elsif driver_id @driver_id = driver_id - else raise ArgumentError, 'Driver or driver_id is required' end @@ -46,11 +46,6 @@ def initialize( raise ArgumentError.new("Value is not a Time object.") end - @start_time = start_time - @end_time = end_time - @cost = cost - @rating = rating - if @rating == nil @rating = rating elsif @rating > 5 || @rating < 1 @@ -72,8 +67,6 @@ def time_difference def inspect - # Prevent infinite loop when puts-ing a Trip - # trip contains a passenger contains a trip contains a passenger... "#<#{self.class.name}:0x#{self.object_id.to_s(16)} " + "ID=#{id.inspect} " + "PassengerID=#{passenger&.id.inspect}>" diff --git a/lib/trip_dispatcher.rb b/lib/trip_dispatcher.rb index a918105c3..4efe72744 100644 --- a/lib/trip_dispatcher.rb +++ b/lib/trip_dispatcher.rb @@ -28,7 +28,6 @@ def find_driver(id) def inspect - # Make puts output more useful return "#<#{self.class.name}:0x#{object_id.to_s(16)} \ #{trips.count} trips, \ #{drivers.count} drivers, \ diff --git a/test/trip_dispatch_test.rb b/test/trip_dispatch_test.rb index f152b77fa..d6618bbee 100644 --- a/test/trip_dispatch_test.rb +++ b/test/trip_dispatch_test.rb @@ -78,7 +78,6 @@ def build_test_dispatcher end end - # TODO: un-skip for Wave 2 describe "drivers" do describe "find_driver method" do before do diff --git a/test/trip_test.rb b/test/trip_test.rb index 3b4c42cd3..57493c1bb 100644 --- a/test/trip_test.rb +++ b/test/trip_test.rb @@ -81,7 +81,6 @@ status: :AVAILABLE, trips: [1] ) - #trip_time: 3543.0 } expect {RideShare::Trip.new(test_trip)}.must_raise ArgumentError @@ -96,7 +95,6 @@ end it "stores an instance of driver" do - skip # Unskip after wave 2 expect(@trip.driver).must_be_kind_of RideShare::Driver end From 3251243c4ccde7195581a12bbb46c93bff6b9f91 Mon Sep 17 00:00:00 2001 From: Antonia Date: Thu, 27 Feb 2020 14:19:33 -0800 Subject: [PATCH 12/21] working on tests and methods --- lib/driver.rb | 4 ++-- test/driver_test.rb | 34 +++++++++++++++++++++++++++++++--- test/trip_test.rb | 1 - 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/lib/driver.rb b/lib/driver.rb index 048c8b59a..863974518 100644 --- a/lib/driver.rb +++ b/lib/driver.rb @@ -55,14 +55,14 @@ def average_rating return rating.to_f/trips.length end - def total_earnings + def total_revenue earnings = 0.0 trips.each do |trip| if trip.cost == nil earnings += 0 else - earnings += cost + earnings += trip.cost end end diff --git a/test/driver_test.rb b/test/driver_test.rb index 2008e61d7..805f88b20 100644 --- a/test/driver_test.rb +++ b/test/driver_test.rb @@ -135,7 +135,35 @@ expect(@driver.average_rating).must_be_close_to (5.0 + 1.0) / 2.0, 0.01 end end - describe "total_revenue" do - # You add tests for the total_revenue method + + it "calculates total revenue" do + @driver = RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ" + ) + trip1 = RideShare::Trip.new( + id: 8, + driver: @driver, + passenger_id: 3, + start_time: Time.new(2016, 8, 8), + end_time: Time.new(2016, 8, 9), + rating: 1, + cost: 0 + ) + @driver.add_trip(trip1) + + trip2 = RideShare::Trip.new( + id: 8, + driver: @driver, + passenger_id: 3, + start_time: Time.new(2016, 8, 8), + end_time: Time.new(2016, 8, 9), + rating: 1, + cost: 12 + ) + @driver.add_trip(trip2) + + expect(@driver.total_revenue).must_equal 14.93 end -end +end \ No newline at end of file diff --git a/test/trip_test.rb b/test/trip_test.rb index 3b4c42cd3..e3bcf5ef6 100644 --- a/test/trip_test.rb +++ b/test/trip_test.rb @@ -96,7 +96,6 @@ end it "stores an instance of driver" do - skip # Unskip after wave 2 expect(@trip.driver).must_be_kind_of RideShare::Driver end From 52131e6fcbcc9ae25e6f6030f91c0ba3e967affd Mon Sep 17 00:00:00 2001 From: Antonia Date: Thu, 27 Feb 2020 14:29:11 -0800 Subject: [PATCH 13/21] we fixed revenue method and corresponding test --- lib/driver.rb | 7 ++++--- test/driver_test.rb | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/driver.rb b/lib/driver.rb index 863974518..a648d4927 100644 --- a/lib/driver.rb +++ b/lib/driver.rb @@ -57,16 +57,17 @@ def average_rating def total_revenue earnings = 0.0 - + total_earnings = 0 trips.each do |trip| - if trip.cost == nil + if trip.cost <= 1.65 earnings += 0 else earnings += trip.cost + total_earnings += (earnings * 0.80) end end - return earnings + return total_earnings.to_f.round(2) end def status_to_unavailable diff --git a/test/driver_test.rb b/test/driver_test.rb index 805f88b20..d5debb946 100644 --- a/test/driver_test.rb +++ b/test/driver_test.rb @@ -164,6 +164,6 @@ ) @driver.add_trip(trip2) - expect(@driver.total_revenue).must_equal 14.93 + expect(@driver.total_revenue).must_equal 9.6 end end \ No newline at end of file From a9b4f1a2ca2e04b52228edf5e7195229e6309abc Mon Sep 17 00:00:00 2001 From: mulhoo Date: Thu, 27 Feb 2020 15:21:15 -0800 Subject: [PATCH 14/21] Updated revenue calculations --- lib/driver.rb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/driver.rb b/lib/driver.rb index e33f56801..183986949 100644 --- a/lib/driver.rb +++ b/lib/driver.rb @@ -57,17 +57,16 @@ def average_rating def total_revenue earnings = 0.0 - total_earnings = 0 + trips.each do |trip| if trip.cost <= 1.65 earnings += 0 else - earnings += trip.cost - total_earnings += (earnings * 0.80) + earnings += (trip.cost * 0.80) end end - return total_earnings.to_f.round(2) + return earnings.to_f.round(2) end def status_to_unavailable From ee8f996a6dfd9d84797e1dbbcb80a92249e1d785 Mon Sep 17 00:00:00 2001 From: Antonia Date: Thu, 27 Feb 2020 15:26:13 -0800 Subject: [PATCH 15/21] git practice --- test/driver_test.rb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/driver_test.rb b/test/driver_test.rb index d5debb946..bbc669fa2 100644 --- a/test/driver_test.rb +++ b/test/driver_test.rb @@ -166,4 +166,16 @@ expect(@driver.total_revenue).must_equal 9.6 end +end + +it "returns zero if no driven trips" do + driver = RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ" + ) + @driver.add_trip(trip1) + + expect(driver.total_revenue).must_equal 0 +end end \ No newline at end of file From 52126f7564aa044032a691a7ecd9fac602863312 Mon Sep 17 00:00:00 2001 From: mulhoo Date: Thu, 27 Feb 2020 15:31:45 -0800 Subject: [PATCH 16/21] Fix total revenue no trips test --- test/driver_test.rb | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/test/driver_test.rb b/test/driver_test.rb index bbc669fa2..a78edbd25 100644 --- a/test/driver_test.rb +++ b/test/driver_test.rb @@ -166,16 +166,15 @@ expect(@driver.total_revenue).must_equal 9.6 end -end - -it "returns zero if no driven trips" do - driver = RideShare::Driver.new( - id: 54, - name: "Rogers Bartell IV", - vin: "1C9EVBRM0YBC564DZ" - ) - @driver.add_trip(trip1) - expect(driver.total_revenue).must_equal 0 + it "returns zero if no driven trips" do + driver = RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ" + ) + + expect(driver.total_revenue).must_equal 0 + end end -end \ No newline at end of file + From b51bbf454bcaad6e100a4142ed668b3d0a6ee19f Mon Sep 17 00:00:00 2001 From: mulhoo Date: Thu, 27 Feb 2020 16:00:38 -0800 Subject: [PATCH 17/21] Wave 3 most updated, working on tests --- lib/trip_dispatcher.rb | 2 +- test/driver_test.rb | 72 ++++++++++++++++++++------------------ test/trip_dispatch_test.rb | 7 ++-- 3 files changed, 43 insertions(+), 38 deletions(-) diff --git a/lib/trip_dispatcher.rb b/lib/trip_dispatcher.rb index 4efe72744..80b0f4e42 100644 --- a/lib/trip_dispatcher.rb +++ b/lib/trip_dispatcher.rb @@ -61,7 +61,7 @@ def request_trip(passenger_id) new_trip = self.start_trip(driver: available_driver, passenger: passenger) - available_driver.assign_new_trip(new_trip) + available_driver.get_new_trip(new_trip) passenger.add_trip(new_trip) trips << new_trip diff --git a/test/driver_test.rb b/test/driver_test.rb index a78edbd25..48b5541c8 100644 --- a/test/driver_test.rb +++ b/test/driver_test.rb @@ -136,45 +136,47 @@ end end - it "calculates total revenue" do - @driver = RideShare::Driver.new( + describe "total_revenue method" do + it "calculates total revenue" do + @driver = RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ" + ) + trip1 = RideShare::Trip.new( + id: 8, + driver: @driver, + passenger_id: 3, + start_time: Time.new(2016, 8, 8), + end_time: Time.new(2016, 8, 9), + rating: 1, + cost: 0 + ) + @driver.add_trip(trip1) + + trip2 = RideShare::Trip.new( + id: 8, + driver: @driver, + passenger_id: 3, + start_time: Time.new(2016, 8, 8), + end_time: Time.new(2016, 8, 9), + rating: 1, + cost: 12 + ) + @driver.add_trip(trip2) + + expect(@driver.total_revenue).must_equal 9.6 + end + + it "returns zero if no driven trips" do + driver = RideShare::Driver.new( id: 54, name: "Rogers Bartell IV", vin: "1C9EVBRM0YBC564DZ" ) - trip1 = RideShare::Trip.new( - id: 8, - driver: @driver, - passenger_id: 3, - start_time: Time.new(2016, 8, 8), - end_time: Time.new(2016, 8, 9), - rating: 1, - cost: 0 - ) - @driver.add_trip(trip1) - - trip2 = RideShare::Trip.new( - id: 8, - driver: @driver, - passenger_id: 3, - start_time: Time.new(2016, 8, 8), - end_time: Time.new(2016, 8, 9), - rating: 1, - cost: 12 - ) - @driver.add_trip(trip2) - - expect(@driver.total_revenue).must_equal 9.6 - end - - it "returns zero if no driven trips" do - driver = RideShare::Driver.new( - id: 54, - name: "Rogers Bartell IV", - vin: "1C9EVBRM0YBC564DZ" - ) - - expect(driver.total_revenue).must_equal 0 + + expect(driver.total_revenue).must_equal 0 + end end end diff --git a/test/trip_dispatch_test.rb b/test/trip_dispatch_test.rb index d6618bbee..9b2df9bf9 100644 --- a/test/trip_dispatch_test.rb +++ b/test/trip_dispatch_test.rb @@ -23,11 +23,9 @@ def build_test_dispatcher expect(dispatcher.trips).must_be_kind_of Array expect(dispatcher.passengers).must_be_kind_of Array - # expect(dispatcher.drivers).must_be_kind_of Array end it "loads the development data by default" do - # Count lines in the file, subtract 1 for headers trip_count = %x{wc -l 'support/trips.csv'}.split(' ').first.to_i - 1 dispatcher = RideShare::TripDispatcher.new @@ -92,6 +90,8 @@ def build_test_dispatcher driver = @dispatcher.find_driver(2) expect(driver).must_be_kind_of RideShare::Driver end + + end describe "Driver & Trip loader methods" do @@ -119,6 +119,9 @@ def build_test_dispatcher expect(trip.driver.trips).must_include trip end end + + end end + end From 42070a2fcb3532f44789b9acf42622f713c9c62f Mon Sep 17 00:00:00 2001 From: Antonia Date: Thu, 27 Feb 2020 17:36:31 -0800 Subject: [PATCH 18/21] added more testS to TripDispatcher --- lib/trip.rb | 14 ++++++------ lib/trip_dispatcher.rb | 44 +++++++++++++++++++------------------- test/trip_dispatch_test.rb | 43 +++++++++++++++++++++++++++++++++++-- 3 files changed, 71 insertions(+), 30 deletions(-) diff --git a/lib/trip.rb b/lib/trip.rb index 6c2faec2b..46b6e0ca5 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -11,10 +11,10 @@ def initialize( id:, passenger: nil, passenger_id: nil, - start_time:, - end_time:, + start_time: Time.now, + end_time: nil, cost: nil, - rating:, + rating: nil, driver_id: nil, driver: nil ) @@ -42,7 +42,7 @@ def initialize( raise ArgumentError, 'Driver or driver_id is required' end - if start_time.class != Time || end_time.class != Time + if start_time.class != Time raise ArgumentError.new("Value is not a Time object.") end @@ -52,8 +52,10 @@ def initialize( raise ArgumentError.new("Invalid rating #{@rating}") end - if @end_time < @start_time - raise ArgumentError.new('End time cannot be before start time.') + unless @end_time == nil + if @end_time < @start_time + raise ArgumentError.new('End time cannot be before start time.') + end end end diff --git a/lib/trip_dispatcher.rb b/lib/trip_dispatcher.rb index 80b0f4e42..034488bb4 100644 --- a/lib/trip_dispatcher.rb +++ b/lib/trip_dispatcher.rb @@ -8,76 +8,76 @@ module RideShare class TripDispatcher attr_reader :drivers, :passengers, :trips - + def initialize(directory: './support') @drivers = Driver.load_all(directory: directory) @passengers = Passenger.load_all(directory: directory) @trips = Trip.load_all(directory: directory) connect_trips end - + def find_passenger(id) Passenger.validate_id(id) return @passengers.find { |passenger| passenger.id == id } end - + def find_driver(id) Driver.validate_id(id) return @drivers.find { |driver| driver.id == id} end - - + + def inspect return "#<#{self.class.name}:0x#{object_id.to_s(16)} \ - #{trips.count} trips, \ - #{drivers.count} drivers, \ - #{passengers.count} passengers>" + #{trips.count} trips, \ + #{drivers.count} drivers, \ + #{passengers.count} passengers>" end - + def find_available_driver available_drivers = [] drivers.each do |driver| - if driver.status = :AVAILABLE && driver.ongoing_trip.length == 0 + if driver.status = :AVAILABLE && driver.ongoing_trips.length == 0 available_drivers << driver end end - + if available_drivers.empty? raise ArgumentError.new "There are no available drivers at this time" end - + return available_drivers.shuffle[0] end - + def start_trip(driver:, passenger:) current_time = Time.new new_id = (trips.last.id + 1) return Trip.new(id: new_id, passenger: passenger, driver: driver, start_time: current_time) end - + def request_trip(passenger_id) available_driver = self.find_available_driver passenger = self.find_passenger(passenger_id) - + new_trip = self.start_trip(driver: available_driver, passenger: passenger) - + available_driver.get_new_trip(new_trip) passenger.add_trip(new_trip) - trips << new_trip - + trips << new_trip + return new_trip end - - + + private - + def connect_trips @trips.each do |trip| passenger = find_passenger(trip.passenger_id) trip.connect_passenger(passenger) trip.connect_driver(find_driver(trip.driver_id)) end - + return trips end end diff --git a/test/trip_dispatch_test.rb b/test/trip_dispatch_test.rb index 9b2df9bf9..dcba90ae7 100644 --- a/test/trip_dispatch_test.rb +++ b/test/trip_dispatch_test.rb @@ -65,6 +65,36 @@ def build_test_dispatcher expect(last_passenger.id).must_equal 8 end + it "adds the trip to the passenger's list of trips" do + @passenger = RideShare::Passenger.new( + id: 9, + name: "Merl Glover III", + phone_number: "1-602-620-2330 x3723", + trips: [] + ) + @driver = RideShare::Driver.new( + id: 54, + name: "Rogers Bartell IV", + vin: "1C9EVBRM0YBC564DZ", + status: :AVAILABLE, + trips: [1] + ) + trip1 = RideShare::Trip.new( + id: 8, + passenger: @passenger, + start_time: Time.new(2016, 8, 8, 13, 39 , 0), + end_time: Time.new(2016, 8, 8, 13, 50, 0), + rating: 5, + cost: 5, + driver_id: @driver.id, + driver: nil + ) + + @passenger.add_trip(trip1) + + expect(@passenger.trips).must_include(trip1) + end + it "connects trips and passengers" do dispatcher = build_test_dispatcher dispatcher.trips.each do |trip| @@ -90,8 +120,10 @@ def build_test_dispatcher driver = @dispatcher.find_driver(2) expect(driver).must_be_kind_of RideShare::Driver end - - + it "find available driver" do + driver = @dispatcher.find_driver(3) + expect(driver.status).must_equal :AVAILABLE + end end describe "Driver & Trip loader methods" do @@ -120,6 +152,13 @@ def build_test_dispatcher end end + it "adds new trip to collection of all Trips" do + dispatcher = build_test_dispatcher + + trip1 = dispatcher.request_trip(1) + + expect(dispatcher.trips).must_include(trip1) + end end end From 46a4293721b1179836409e97127a744d7a6b9d11 Mon Sep 17 00:00:00 2001 From: mulhoo Date: Thu, 27 Feb 2020 18:17:42 -0800 Subject: [PATCH 19/21] Finish Wave 3 tests, all passing --- test/trip_dispatch_test.rb | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/test/trip_dispatch_test.rb b/test/trip_dispatch_test.rb index dcba90ae7..edc4d1048 100644 --- a/test/trip_dispatch_test.rb +++ b/test/trip_dispatch_test.rb @@ -120,10 +120,19 @@ def build_test_dispatcher driver = @dispatcher.find_driver(2) expect(driver).must_be_kind_of RideShare::Driver end - it "find available driver" do + + it "finds available driver" do driver = @dispatcher.find_driver(3) expect(driver.status).must_equal :AVAILABLE end + + it "changes driver status to UNAVAILABLE when new trip added" do + dispatcher = build_test_dispatcher + + trip1 = dispatcher.request_trip(1) + expect(trip1.driver.status).must_equal :UNAVAILABLE + end + end describe "Driver & Trip loader methods" do @@ -152,15 +161,19 @@ def build_test_dispatcher end end - it "adds new trip to collection of all Trips" do - dispatcher = build_test_dispatcher - - trip1 = dispatcher.request_trip(1) - - expect(dispatcher.trips).must_include(trip1) - end + it "adds new trip to collection of all Trips" do + dispatcher = build_test_dispatcher + trip1 = dispatcher.request_trip(1) + + expect(dispatcher.trips).must_include(trip1) + end + it "returns new_trip" do + dispatcher = build_test_dispatcher + trip1 = dispatcher.request_trip(1) + + expect(trip1).must_be_kind_of RideShare::Trip + end end end - end From f6e70a4b4bbb27712ffddf726ca58b1f7ac05642 Mon Sep 17 00:00:00 2001 From: mulhoo Date: Fri, 28 Feb 2020 11:54:18 -0800 Subject: [PATCH 20/21] Updated Tests and format wave 3 --- lib/trip.rb | 4 ++-- test/passenger_test.rb | 19 +++++++++---------- test/trip_test.rb | 1 - 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/lib/trip.rb b/lib/trip.rb index 46b6e0ca5..4ef6939fc 100644 --- a/lib/trip.rb +++ b/lib/trip.rb @@ -60,8 +60,8 @@ def initialize( end def time_difference - if @end_time == nil || @start_time == nil - raise ArgumentError.new("Start time or end time cannot be nil.") + if @start_time == nil + raise ArgumentError.new("Start time cannot be nil.") end return @end_time - @start_time diff --git a/test/passenger_test.rb b/test/passenger_test.rb index 252714098..e4be79767 100644 --- a/test/passenger_test.rb +++ b/test/passenger_test.rb @@ -37,7 +37,6 @@ describe "trips property" do before do - # TODO: you'll need to add a driver at some point here. @passenger = RideShare::Passenger.new( id: 9, name: "Merl Glover III", @@ -63,7 +62,6 @@ ) @passenger.add_trip(trip1) - #maybe add driver later trip2 = RideShare::Trip.new( id: 8, @@ -92,16 +90,17 @@ end it "calculates total costs" do - @passenger.trips.each do |trip| - expect(@passenger.net_expenditures).must_equal 15 - end + @passenger.trips.each do |trip| + expect(@passenger.net_expenditures).must_equal 15 + end + + end - it "calculates time spent" do - @passenger.trips.each do |trip| - expect(@passenger.total_time_spent).must_equal 1260 + it "calculates time spent" do + @passenger.trips.each do |trip| + expect(@passenger.total_time_spent).must_equal 1260 + end end end - -end end \ No newline at end of file diff --git a/test/trip_test.rb b/test/trip_test.rb index 57493c1bb..0f226dcd5 100644 --- a/test/trip_test.rb +++ b/test/trip_test.rb @@ -56,7 +56,6 @@ status: :AVAILABLE, trips: [1, 2, 3] ) - #trip_time: 3543.0 } expect {RideShare::Trip.new(test_trip)}.must_raise ArgumentError From 4d541343540e80977da9b2dcbd136c7e4ae6c0fe Mon Sep 17 00:00:00 2001 From: Antonia Date: Fri, 28 Feb 2020 13:26:44 -0800 Subject: [PATCH 21/21] added some edge tests for passenger_test and modified passenger.rb --- lib/passenger.rb | 2 +- test/passenger_test.rb | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/passenger.rb b/lib/passenger.rb index 33707cbda..bae8027f9 100644 --- a/lib/passenger.rb +++ b/lib/passenger.rb @@ -22,7 +22,7 @@ def net_expenditures total_money = 0 @trips.each do |trip| if trip == nil - next + return 0 else total_money += trip.cost end diff --git a/test/passenger_test.rb b/test/passenger_test.rb index e4be79767..c9b4957a3 100644 --- a/test/passenger_test.rb +++ b/test/passenger_test.rb @@ -92,15 +92,25 @@ it "calculates total costs" do @passenger.trips.each do |trip| expect(@passenger.net_expenditures).must_equal 15 - end - - - end + end + end it "calculates time spent" do @passenger.trips.each do |trip| expect(@passenger.total_time_spent).must_equal 1260 end end + + it "handles no trips for expenditures and time spent" do + @passenger = RideShare::Passenger.new( + id: 9, + name: "Merl Glover III", + phone_number: "1-602-620-2330 x3723", + trips: [] + ) + expect(@passenger.net_expenditures).must_equal 0 + expect(@passenger.total_time_spent).must_equal 0 + end + end end \ No newline at end of file