From 99c27eb48aa1cc521ec736d13e78645a60fcf7c0 Mon Sep 17 00:00:00 2001 From: Jeroen De Meerleer Date: Sat, 21 Jan 2023 16:46:41 +0100 Subject: [PATCH] WIP: TRF16Reader --- src/IOFactory.php | 9 +- src/Readers/Trf16.php | 191 ++++++++++++++++++++++++++++++++++++ tests/Readers/Trf16Test.php | 109 ++++++++++++++++++++ 3 files changed, 305 insertions(+), 4 deletions(-) create mode 100644 src/Readers/Trf16.php create mode 100644 tests/Readers/Trf16Test.php diff --git a/src/IOFactory.php b/src/IOFactory.php index c074dc8..b1ef589 100644 --- a/src/IOFactory.php +++ b/src/IOFactory.php @@ -34,10 +34,11 @@ abstract class IOFactory * @var array */ private static $Readers = [ - 'Swar-4' => Blackbirdchess\Service\Import\Readers\Swar4::class, - 'Swar-5' => Blackbirdchess\Service\Import\Readers\Swar5::class, - 'Pairtwo-6' => Blackbirdchess\Service\Import\Readers\Pairtwo6::class, - 'Pairtwo-5' => Blackbirdchess\Service\Import\Readers\Pairtwo6::class // File structure identical + 'Swar-4' => Readers\Swar4::class, + 'Swar-5' => Readers\Swar5::class, + 'Pairtwo-6' => Readers\Pairtwo6::class, + 'Pairtwo-5' => Readers\Pairtwo6::class, // File structure identical + 'TRF-16' => Readers\Trf16::class, ]; /** diff --git a/src/Readers/Trf16.php b/src/Readers/Trf16.php new file mode 100644 index 0000000..0f5eda9 --- /dev/null +++ b/src/Readers/Trf16.php @@ -0,0 +1,191 @@ +Tournament = new Tournament(); + $this->playerIndexes['0000'] = NULL; + $this->playerIndexes[' '] = NULL; + foreach ($file as $line) { + $datatype = substr($line, 0, 3); + + switch($datatype) { + case '012': + $this->Tournament->Name = substr($line, 4); + break; + case '022': + $this->Tournament->OrganiserPlace = substr($line, 4); + break; + case '032': + $this->Tournament->OrganiserCountry = substr($line, 4); + break; + case '042': + $this->Tournament->StartDate = \DateTime::createFromFormat("Y/m/d", substr($line, 4)); + break; + case '052': + $this->Tournament->EndDate = \DateTime::createFromFormat("Y/m/d", substr($line, 4)); + break; + case '102': + case '112': + $this->Tournament->addArbiter(substr($line, 4)); + break; + case '001': + $this->readPlayerData($line); + break; + } + } + + $this->setOpponentIndexToPlayerObj(); + $this->Tournament->pairingsToRounds(); + } + + private function readPlayerData(string $line): void + { + $player = new Player(); + $player->InitialRank = substr($line, 4, 4); + switch (substr($line, 9, 1)) + { + case 'm': + $player->Gender = Gender::MALE; + break; + case 'w': + $player->Gender = Gender::FEMALE; + break; + default: + $player->Gender = NULL; + break; + } + + switch (trim(substr($line, 10, 3))) + { + case 'GM': + $player->Title = Title::GM; + break; + case 'IM': + $player->Title = Title::IM; + break; + case 'WGM': + $player->Title = Title::WGM; + break; + case 'FM': + $player->Title = Title::FM; + break; + case 'WIM': + $player->Title = Title::WIM; + break; + case 'CM': + $player->Title = Title::CM; + break; + case 'WFM': + $player->Title = Title::WFM; + break; + case 'WCM': + $player->Title = Title::WCM; + break; + default: + $player->Title = NULL; + break; + } + + $player->Name = trim(substr($line, 14, 32)); + $player->setElo('Fide', (int)trim(substr($line, 48, 4))); + $player->Nation = trim(substr($line, 53, 3)); + $player->setId('Fide', (int)trim(substr($line, 57, 10))); + $player->DateOfBirth = \DateTime::createFromFormat("Y/m/d", substr($line, 69, 10)); + $player->Points = (float)trim(substr($line, 80, 4)); + $player->Rank = (float)trim(substr($line, 85, 3)); + + $pairingData = substr($line, 91); + + //read pairing round 1 + $pairing = new Pairing(); + $round = new Round(); + $round->RoundNo = 1; + $round->Date = \DateTime::createFromFormat("y/m/d", '23/01/14'); + $this->Tournament->addRound($round); + $pairing->Round = 1; + $pairing->Player = $player; + $pairing->OpponentIndex = substr($line, 91, 4); + + switch (trim(substr($line, 96, 1))) + { + case 'w': + $pairing->Color = Color::WHITE; + break; + case 'b': + $pairing->Color = Color::BLACK; + break; + case '-': + default: + $pairing->Color = Color::NONE; + break; + } + + switch (strtoupper(trim(substr($line, 98, 1)))) + { + case '-': + case 'Z': + $pairing->Result = Result::ABSENT; + break; + case '+': + $pairing->Result = Result::WON_FORFAIT; + break; + case 'W': + case '1': + $pairing->Result = Result::WON; + break; + case 'D': + case '=': + $pairing->Result = Result::DRAW; + break; + case 'L': + case '0': + $pairing->Result = Result::LOST; + break; + case 'H': + case 'F': + case 'U': + $pairing->Result = Result::WON_BYE; + break; + default: + $pairing->Color = Result::NONE; + break; + } + $this->Tournament->addPairing($pairing); + $this->playerIndexes[$player->InitialRank] = $player; + $this->Tournament->addPlayer($player); + } + + private function setOpponentIndexToPlayerObj() + { + foreach($this->Tournament->Pairings as &$pairing) { + $pairing->Opponent = $this->playerIndexes[$pairing->OpponentIndex]; + } + } +} diff --git a/tests/Readers/Trf16Test.php b/tests/Readers/Trf16Test.php new file mode 100644 index 0000000..cae367c --- /dev/null +++ b/tests/Readers/Trf16Test.php @@ -0,0 +1,109 @@ +testfile = $root . $this->testfile; + $this->testobject = new Trf16(); + $this->testobject->read($this->testfile); + } + + public function testReadTournamentName(): void + { + $this->assertEquals('Blackbird Chess Unit Test Tournament', $this->testobject->Tournament->Name); + } + + public function testReadTournamentLocation(): void + { + $this->assertEquals('Waregem', $this->testobject->Tournament->OrganiserPlace); + } + + public function testReadTournamentFederation(): void + { + $this->assertEquals('BEL', $this->testobject->Tournament->OrganiserCountry); + } + public function testReadTournamentStartDate(): void + { + $expected = DateTime::createFromFormat("Y/m/d", "2023/01/14"); + $this->assertEquals($expected, $this->testobject->Tournament->StartDate); + } + public function testReadTournamentEndDate(): void + { + $expected = DateTime::createFromFormat("Y/m/d", "2023/01/14"); + $this->assertEquals($expected, $this->testobject->Tournament->EndDate); + } + public function testReadTournamentArbiter(): void + { + $this->assertEquals("Jeroen De Meerleer", $this->testobject->Tournament->Arbiters[0]); + } + public function testReadTournamentDeputyArbiter(): void + { + $this->assertEquals("Jerry The Blackbird", $this->testobject->Tournament->Arbiters[1]); + } + + public function testReadPlayerInitialRank(): void + { + $this->assertEquals(1, $this->testobject->Tournament->Players[0]->InitialRank); + } + public function testReadPlayerSex(): void + { + $this->assertEquals(Gender::MALE, $this->testobject->Tournament->Players[0]->Gender); + } + public function testReadPlayerTitle(): void + { + $this->assertEquals(Title::WIM, $this->testobject->Tournament->Players[1]->Title); + } + public function testReadPlayerName(): void + { + $this->assertEquals('Player 3', $this->testobject->Tournament->Players[0]->Name); + } + public function testReadPlayerRating(): void + { + $this->assertEquals(1850, $this->testobject->Tournament->Players[0]->getElo('Fide')); + } + public function testReadPlayerFederation(): void + { + $this->assertEquals('BEL', $this->testobject->Tournament->Players[0]->Nation); + } + public function testReadPlayerID(): void + { + $this->assertEquals('0', $this->testobject->Tournament->Players[0]->GetId('Fide')); + } + public function testReadPlayerBirthday(): void + { + $expected = DateTime::createFromFormat("Y/m/d", "1900/01/01"); + $this->assertEquals($expected, $this->testobject->Tournament->Players[0]->DateOfBirth); + } + public function testReadPlayerPoints(): void + { + $this->assertEquals(7, $this->testobject->Tournament->Players[0]->Points); + } + public function testReadPlayerRank(): void + { + $this->assertEquals(3, $this->testobject->Tournament->Players[0]->Rank); + } + public function testReadPlayerPairing1Opponent(): void + { + $this->assertEquals($this->testobject->Tournament->Players[7], $this->testobject->Tournament->Players[0]->Pairings[0]->Opponent); + } +}