def the_real_tester(self, vehicle, ride, bonus): # data before calculation takes place vehicle.print() ride.print() print("Bonus: {0}".format(bonus)) vehicle_position_before_ride = vehicle.position vehicle_step_time_before_ride = vehicle.step_time score = Solver.calculate_points(vehicle, ride, bonus) self.assertEqual(vehicle.position, ride.end, "The position of the vehicle is not at the end of the ride") self.assertEqual(ride.was_processed, True, "The ride should have been processed") step_time_total = vehicle_step_time_before_ride distance_to_car = Location.distance_calculator(vehicle_position_before_ride, ride.start) distance_to_car = ride.earliest_start if distance_to_car < ride.earliest_start else distance_to_car if distance_to_car < ride.earliest_start: step_time_total += ride.earliest_start else: step_time_total += distance_to_car distance_to_destination = Location.distance_calculator(ride.start, ride.end) step_time_total += distance_to_destination self.assertEqual(vehicle.step_time, step_time_total, "The step time is not the same as the calculated distance") if vehicle.step_time >= ride.latest_finish: self.assertEqual(score, 0, "Score should be 0 if the car was not taken to finish in time") else: # checking bonus expected_score = distance_to_destination if vehicle_step_time_before_ride + distance_to_car <= ride.earliest_start: expected_score += bonus self.assertEqual(expected_score, score, "The scores are not calculated properly!")
def calculate_points(vehicle, ride, bonus): # if the ride was already processed, the output is not good if ride.was_processed: raise Exception("Output error: Attempting to take a ride already processed. Ride") # vehicle.print() # ride.print() ride_score = 0 ride.was_processed = True # getting distance until the ride distance_to_ride = Location.distance_calculator(vehicle.position, ride.start) vehicle.step_time += distance_to_ride print("Distance until ride: {0}".format(distance_to_ride)) # updating step time if we have to wait for earliest start, or give bonus if we arrive on time if vehicle.step_time < ride.earliest_start: print("Earliest start {0} < step time {1} , waiting for {2} duration".format( vehicle.step_time, ride.earliest_start, ride.earliest_start - vehicle.step_time)) vehicle.step_time = ride.earliest_start # if we arrived on time or if we waited for client for earliest start: still giving bonus if vehicle.step_time == ride.earliest_start: ride_score += bonus ride.json_result = 1000 print("Bonus received for this ride! + {0}".format(bonus)) else: ride.json_result = 1 # getting ride distance (from start to end) ride_distance = Location.distance_calculator(ride.start, ride.end) vehicle.step_time += ride_distance print("Moving {0} distance".format(ride_distance)) # no money / bonus if we go over the finish time if vehicle.step_time >= int(ride.latest_finish): ride_score = 0 ride.json_result = 0 print("Ride score set to 0, time {0} > finish {1}".format(vehicle.step_time, ride.latest_finish)) else: ride_score += ride_distance print("Received money ! {0}".format(ride_score)) # updating vehicle location to be in the finish position vehicle.position = ride.end return ride_score
def get_distance_to_finish(self): return Location.distance_calculator(self.start, self.end)