/** * Set participants and session type on a session instance * * @param Session $session * @param array $data */ protected function setParticipantsAndSessionType(Session $session, array $data) { // Init participants array $participants = array(); // Collect drivers in array $driver_data_array = array(); // No grid position by default $set_grid_position = false; foreach ($data as $key => $driver_data) { // Not a driver driver_data if (!preg_match('/slot([0-9]+)/i', $key, $matches)) { continue; } // No qualtime if (!array_key_exists('qualtime', $driver_data)) { // Create qualtime, we need it for easier closure usage $driver_data['qualtime'] = null; } else { $set_grid_position = true; } $driver_data_array[] = $driver_data; } // Set grid positions if ($set_grid_position) { // Sort drivers by qualify time to figure out grid positions usort($driver_data_array, function ($a, $b) { // Same time if ($a['qualtime'] === $b['qualtime']) { return 0; } // a has no time if (!$a['qualtime']) { // $b is faster return 1; } // b has no time if (!$b['qualtime']) { // $a is faster return -1; } return $a['qualtime'] < $b['qualtime'] ? -1 : 1; }); // Set grid positions foreach ($driver_data_array as $driver_key => &$driver_data_array_item) { $driver_data_array_item['grid_position'] = $driver_key + 1; } unset($driver_data_array_item); } // All participants are dnf by default $all_dnf = true; // Loop each driver foreach ($driver_data_array as $driver_data) { // Create driver $driver = new Driver(); $driver->setName($driver_data['driver']); // Create participant and add driver $participant = Participant::createInstance(); $participant->setDrivers(array($driver))->setTeam(Helper::arrayGet($driver_data, 'team')); // Finish position will be set later using an special // sort // We have laps and must set grid positions if (Helper::arrayGet($driver_data, 'laps_collection') and $set_grid_position) { $participant->setGridPosition($driver_data['grid_position']); } // Create vehicle and add to participant $vehicle = new Vehicle(); $vehicle->setName(Helper::arrayGet($driver_data, 'vehicle')); $participant->setVehicle($vehicle); // Has race time information if ($race_time = Helper::arrayGet($driver_data, 'racetime')) { // Not dnf by default if it's not 0:00:00.000 or dnf $set_dnf = ($race_time === '0:00:00.000' or $race_time === 'DNF'); // Try setting seconds if not dnf if (!$set_dnf) { try { // Get seconds $seconds = Helper::secondsFromFormattedTime($race_time); // Set total time $participant->setTotalTime($seconds); // Is finished $participant->setFinishStatus(Participant::FINISH_NORMAL); $all_dnf = false; } catch (\InvalidArgumentException $ex) { $set_dnf = true; } } // Should set this participant dnf if ($set_dnf) { $participant->setFinishStatus(Participant::FINISH_DNF); // Has reason if (null !== ($reason = Helper::arrayGet($driver_data, 'reason'))) { $participant->setFinishComment("DNF (reason {$reason})"); } } } // Laps count not found if (null === ($laps_count = Helper::arrayGet($driver_data, 'laps'))) { // Try racelaps key $laps_count = Helper::arrayGet($driver_data, 'racelaps'); } // Has run laps if ($laps_count !== null and $laps_count > 0) { // Get laps collection $laps_collection = Helper::arrayGet($driver_data, 'laps_collection'); // Loop laps by lap count due to missing laps in results // so we can fill up the gaps for ($lap_i = 1; $lap_i <= $laps_count; $lap_i++) { // Init new lap $lap = new Lap(); // Set participant $lap->setParticipant($participant); // Set first driver of participant as lap driver. Race07 does // not support swapping $lap->setDriver($participant->getDriver()); // Set lap number $lap->setNumber($lap_i); // Is first lap if ($lap->getNumber() === 1) { // Set grid position as lap position $lap->setPosition(Helper::arrayGet($driver_data, 'grid_position')); } // Lap data exists if (isset($laps_collection[$lap_i])) { // Get lap data $lap_data = $laps_collection[$lap_i]; // Set lap times $lap->setTime($lap_data['time'])->setElapsedSeconds($lap_data['elapsed_time']); $all_laps_missing = false; } // Add lap to participant $participant->addLap($lap); } // All laps missing but has best lap if (sizeof($laps_collection) === 0 and ($racebestlap = Helper::arrayGet($driver_data, 'racebestlap') or $racebestlap = Helper::arrayGet($driver_data, 'bestlap'))) { // Get first lap and change time $participant->getLap(1)->setTime(Helper::secondsFromFormattedTime($racebestlap)); } } // Add participant to collection $participants[] = $participant; } // All participants are dnf if ($all_dnf) { // Assume we're dealing with qualify session $session->setType(Session::TYPE_QUALIFY); $session->setName('Qualify or practice session'); } else { // Race session $session->setType(Session::TYPE_RACE); } // Sort participants $this->sortParticipantsAndFixPositions($participants, $session); // Set participants on session $session->setParticipants($participants); }
public function testGettingVehicleWhenVehicleNotSetOnLap() { // Init participant $participant = Participant::createInstance(); // Set vehicle $participant->setVehicle($vehicle = new Vehicle()); // Normal lap without vehicle on lap itself $lap = new Lap(); $lap->setParticipant($participant); // Validate vehicle $this->assertSame($vehicle, $lap->getVehicle()); }