From 111c39329fbc4711fd9ba061e96043fc9aeb8950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Voj=C3=ADk?= Date: Sat, 9 Dec 2023 14:12:45 +0100 Subject: [PATCH] :sparkles: New multi-progression functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomáš Vojík --- build/coverage.serialized | Bin 5683528 -> 5755815 bytes build/coverage.xml | 1549 +++++++++-------- src/TournamentGenerator/BlankTeam.php | 6 +- src/TournamentGenerator/Group.php | 152 +- .../Interfaces/ProgressionInterface.php | 47 + src/TournamentGenerator/MultiProgression.php | 180 ++ src/TournamentGenerator/Progression.php | 161 +- .../Traits/ProgressionTrait.php | 135 ++ tests/MultiProgressionTest.php | 122 ++ tests/ProgressionTest.php | 3 +- 10 files changed, 1423 insertions(+), 932 deletions(-) create mode 100644 src/TournamentGenerator/Interfaces/ProgressionInterface.php create mode 100644 src/TournamentGenerator/MultiProgression.php create mode 100644 src/TournamentGenerator/Traits/ProgressionTrait.php create mode 100644 tests/MultiProgressionTest.php diff --git a/build/coverage.serialized b/build/coverage.serialized index ddbef8aaa070bb890c31b38641ae5cfec931694e..a7c19614aceb6eb2ad5e9ae660e6fea0b655ae1b 100644 GIT binary patch delta 187014 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%0DI)gL>E{DzY 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 diff --git a/build/coverage.xml b/build/coverage.xml index 319f03c..b5719d1 100644 --- a/build/coverage.xml +++ b/build/coverage.xml @@ -1,6 +1,6 @@ - - + + - - - - - - - + + + + + + + - - + + @@ -29,12 +29,12 @@ - - - + - + + @@ -81,9 +81,9 @@ - - - + + + @@ -92,15 +92,15 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -153,29 +153,29 @@ - - - - - - - - + + + + + + + + - - - - + + + + - - + + - - + + @@ -184,60 +184,60 @@ - - - + + + - - + + - - - - - + + + + + - - + + - - - - - - - - + count="195"/> + + + + + + + + - + count="195"/> + - - - - - + + + + + - + - - - - + + + + - - + + - - + + - + @@ -263,20 +263,20 @@ - - - - - - - - - - - + + + + + + + + + + + - - + + @@ -302,23 +302,23 @@ - - - - - - - + + + + + + + - + count="227"/> + - - - + count="205"/> + + + - + @@ -331,13 +331,13 @@ - - - + + + - - - + + + @@ -346,30 +346,30 @@ - - - - - + + + + + - - + + - + count="129"/> + - - - + + + - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + @@ -778,25 +778,25 @@ - - - - - - - + + + + + + + - - + + - - - - - + + + + + - - + + @@ -818,41 +818,41 @@ - - - - - + + + + + - - - - - - + count="106"/> + + + + + + - - - - - + + + + + - - - - - - - - + + + + + + + + @@ -902,15 +902,15 @@ - - + + - - + + - - + + @@ -921,164 +921,170 @@ - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - + + + + + + + + + - - - - + + + + - - - - + + + + - + - - + - - - - - + + + + - - - + + + - - - - - - - - + + + + + + + - - - - - - + + + + + + - - - - + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1288,8 +1294,8 @@ - - + + @@ -1297,13 +1303,13 @@ - - - - + + + + - - + + @@ -1311,57 +1317,57 @@ - - - - + + + + - - - - - - - - - + + + + + + + + + - - + + - - - - - - - - + count="51"/> + + + + + + + + - - - - - - - - - + count="51"/> + + + + + + + + + - - - + count="51"/> + + + @@ -1384,9 +1390,9 @@ - - + count="84"/> + + @@ -1460,27 +1466,27 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + - - - + + + - + @@ -1525,8 +1531,8 @@ - + @@ -1543,13 +1549,13 @@ - - - - - - - + + + + + + + - + @@ -1595,59 +1601,59 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - + + - - - - - - + count="69"/> + + + + + + @@ -1655,20 +1661,20 @@ - - + count="61"/> + + - - - - - + + + + + - - - + + + @@ -1685,16 +1691,16 @@ - - + + - - - - - - + count="183"/> + + + + + + + + + @@ -2075,6 +2085,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -2325,93 +2410,65 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - + + + + + + + @@ -2423,10 +2480,10 @@ - - - - + + + + @@ -2434,18 +2491,18 @@ - - - - - + + + + + - - - - - - + + + + + + @@ -2459,13 +2516,13 @@ - - - - - - - + + + + + + + @@ -2479,11 +2536,11 @@ - - + count="84"/> + + - + @@ -2492,9 +2549,9 @@ - - - + + + @@ -2509,23 +2566,23 @@ - - - - - - - - - - - - - - - - + count="257"/> + + + + + + + + + + + + + + + + @@ -2545,12 +2602,12 @@ - - - - - - + + + + + + @@ -2559,8 +2616,8 @@ - - + + - - - - - + + + + + @@ -2685,13 +2742,13 @@ - - + + - - - - + + + + @@ -2713,13 +2770,13 @@ - - + + - - - - + + + + @@ -2767,35 +2824,73 @@ - - + + - - - - - - + + + + + + - - - - - - - + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + count="183"/> + + + + - + count="192"/> + @@ -2850,8 +2945,8 @@ - - + + - - + count="170"/> + + - + count="193"/> + @@ -2881,14 +2976,14 @@ - - - - - - - - + + + + + + + + @@ -2907,11 +3002,11 @@ - - - - - + + + + + @@ -2920,24 +3015,24 @@ - - - - - - + + + + + + - - + + - - - - - - - - + + + + + + + + @@ -2953,23 +3048,23 @@ - - + + - - - - + + + + - - - - - - - + + + + + + + - + @@ -2978,22 +3073,22 @@ - - - + + + - - - - - + + + + + - + count="187"/> + - - + count="183"/> + + @@ -3005,8 +3100,8 @@ - + diff --git a/src/TournamentGenerator/BlankTeam.php b/src/TournamentGenerator/BlankTeam.php index c31fa1b..7479c1e 100644 --- a/src/TournamentGenerator/BlankTeam.php +++ b/src/TournamentGenerator/BlankTeam.php @@ -2,6 +2,8 @@ namespace TournamentGenerator; +use TournamentGenerator\Interfaces\ProgressionInterface; + /** * Blank / dummy team used for simulating the games * @@ -19,7 +21,7 @@ class BlankTeam extends Team /** @var Group A group that it was generated from during progression */ protected Group $from; /** @var Progression A progression object that generated this dummy team */ - protected Progression $progression; + protected ProgressionInterface $progression; /** * BlankTeam constructor. @@ -29,7 +31,7 @@ class BlankTeam extends Team * @param Group $from A group that the original team was playing in * @param Progression $progression A progression object that created this team */ - public function __construct(string $name, Team $original, Group $from, Progression $progression) { + public function __construct(string $name, Team $original, Group $from, ProgressionInterface $progression) { $this->groupResults = $original->groupResults; $this->from = $from; $this->progression = $progression; diff --git a/src/TournamentGenerator/Group.php b/src/TournamentGenerator/Group.php index c6f0f72..0e63ee4 100644 --- a/src/TournamentGenerator/Group.php +++ b/src/TournamentGenerator/Group.php @@ -6,6 +6,7 @@ use TournamentGenerator\Containers\GameContainer; use TournamentGenerator\Containers\HierarchyContainer; use TournamentGenerator\Containers\TeamContainer; +use TournamentGenerator\Interfaces\ProgressionInterface; use TournamentGenerator\Interfaces\WithGames; use TournamentGenerator\Interfaces\WithGeneratorSetters; use TournamentGenerator\Interfaces\WithSkipSetters; @@ -36,7 +37,7 @@ class Group extends HierarchyBase implements WithGeneratorSetters, WithSkipSette protected array $progressed = []; /** @var string Ordering parameter */ protected string $ordering = Constants::POINTS; - /** @var Progression[] List of progressions from this group */ + /** @var ProgressionInterface[] List of progressions from this group */ protected array $progressions = []; /** @var int Points acquired for winning */ protected int $winPoints = 3; @@ -58,20 +59,20 @@ class Group extends HierarchyBase implements WithGeneratorSetters, WithSkipSette /** - * Group constructor. - * - * @param string $name Group name - * @param int|string|null $id Group id - if omitted -> it is generated automatically as unique string - */ - public function __construct(string $name, int|string|null $id = null) { - $this->setName($name); - $this->generator = new Helpers\Generator($this); - /** @infection-ignore-all */ - $this->setId($id ?? uniqid('', false)); - $this->games = new GameContainer($this->id); - $this->teams = new TeamContainer($this->id); - $this->container = new HierarchyContainer($this->id); - } + * Group constructor. + * + * @param string $name Group name + * @param int|string|null $id Group id - if omitted -> it is generated automatically as unique string + */ + public function __construct(string $name, int|string|null $id = null) { + $this->setName($name); + $this->generator = new Helpers\Generator($this); + /** @infection-ignore-all */ + $this->setId($id ?? uniqid('', false)); + $this->games = new GameContainer($this->id); + $this->teams = new TeamContainer($this->id); + $this->container = new HierarchyContainer($this->id); + } /** * Add one or more teams into the object. @@ -81,7 +82,7 @@ public function __construct(string $name, int|string|null $id = null) { * @return $this * @throws Exception */ - public function addTeam(Team ...$teams) : Group { + public function addTeam(Team ...$teams): Group { foreach ($teams as $team) { $this->teams->insert($team); $team->addGroupResults($this); @@ -98,7 +99,7 @@ public function addTeam(Team ...$teams) : Group { * @return Team Newly created team * @throws Exception */ - public function team(string $name = '', $id = null) : Team { + public function team(string $name = '', $id = null): Team { $t = new Team($name, $id); $this->teams->insert($t); $t->addGroupResults($this); @@ -110,7 +111,7 @@ public function team(string $name = '', $id = null) : Team { * * @return $this */ - public function allowSkip() : Group { + public function allowSkip(): Group { $this->generator->allowSkip(); return $this; } @@ -120,7 +121,7 @@ public function allowSkip() : Group { * * @return $this */ - public function disallowSkip() : Group { + public function disallowSkip(): Group { $this->generator->disallowSkip(); return $this; } @@ -132,7 +133,7 @@ public function disallowSkip() : Group { * * @return $this */ - public function setSkip(bool $skip) : Group { + public function setSkip(bool $skip): Group { $this->generator->setSkip($skip); return $this; } @@ -142,7 +143,7 @@ public function setSkip(bool $skip) : Group { * * @return bool */ - public function getSkip() : bool { + public function getSkip(): bool { return $this->generator->getSkip(); } @@ -151,7 +152,7 @@ public function getSkip() : bool { * * @return int */ - public function getWinPoints() : int { + public function getWinPoints(): int { return $this->winPoints; } @@ -162,7 +163,7 @@ public function getWinPoints() : int { * * @return $this */ - public function setWinPoints(int $points) : Group { + public function setWinPoints(int $points): Group { $this->winPoints = $points; return $this; } @@ -172,7 +173,7 @@ public function setWinPoints(int $points) : Group { * * @return int */ - public function getDrawPoints() : int { + public function getDrawPoints(): int { return $this->drawPoints; } @@ -183,7 +184,7 @@ public function getDrawPoints() : int { * * @return $this */ - public function setDrawPoints(int $points) : Group { + public function setDrawPoints(int $points): Group { $this->drawPoints = $points; return $this; } @@ -193,7 +194,7 @@ public function setDrawPoints(int $points) : Group { * * @return int */ - public function getLostPoints() : int { + public function getLostPoints(): int { return $this->lostPoints; } @@ -204,7 +205,7 @@ public function getLostPoints() : int { * * @return $this */ - public function setLostPoints(int $points) : Group { + public function setLostPoints(int $points): Group { $this->lostPoints = $points; return $this; } @@ -214,7 +215,7 @@ public function setLostPoints(int $points) : Group { * * @return int */ - public function getSecondPoints() : int { + public function getSecondPoints(): int { return $this->secondPoints; } @@ -225,7 +226,7 @@ public function getSecondPoints() : int { * * @return $this */ - public function setSecondPoints(int $points) : Group { + public function setSecondPoints(int $points): Group { $this->secondPoints = $points; return $this; } @@ -235,7 +236,7 @@ public function setSecondPoints(int $points) : Group { * * @return int */ - public function getThirdPoints() : int { + public function getThirdPoints(): int { return $this->thirdPoints; } @@ -246,7 +247,7 @@ public function getThirdPoints() : int { * * @return $this */ - public function setThirdPoints(int $points) : Group { + public function setThirdPoints(int $points): Group { $this->thirdPoints = $points; return $this; } @@ -256,7 +257,7 @@ public function setThirdPoints(int $points) : Group { * * @return int */ - public function getProgressPoints() : int { + public function getProgressPoints(): int { return $this->progressPoints; } @@ -267,7 +268,7 @@ public function getProgressPoints() : int { * * @return Group */ - public function setProgressPoints(int $points) : Group { + public function setProgressPoints(int $points): Group { $this->progressPoints = $points; return $this; } @@ -283,7 +284,7 @@ public function setProgressPoints(int $points) : Group { * @return $this * @throws Exception */ - public function setMaxSize(int $size) : Group { + public function setMaxSize(int $size): Group { $this->generator->setMaxSize($size); return $this; } @@ -296,7 +297,7 @@ public function setMaxSize(int $size) : Group { * * @return int */ - public function getMaxSize() : int { + public function getMaxSize(): int { return $this->generator->getMaxSize(); } @@ -310,7 +311,7 @@ public function getMaxSize() : int { * @see Constants::GroupTypes * */ - public function setType(string $type = Constants::ROUND_ROBIN) : Group { + public function setType(string $type = Constants::ROUND_ROBIN): Group { $this->generator->setType($type); return $this; } @@ -322,7 +323,7 @@ public function setType(string $type = Constants::ROUND_ROBIN) : Group { * @see Constants::GroupTypes * */ - public function getType() : string { + public function getType(): string { return $this->generator->getType(); } @@ -331,7 +332,7 @@ public function getType() : string { * * @return int */ - public function getOrder() : int { + public function getOrder(): int { return $this->order; } @@ -342,7 +343,7 @@ public function getOrder() : int { * * @return $this */ - public function setOrder(int $order) : Group { + public function setOrder(int $order): Group { $this->order = $order; return $this; } @@ -352,7 +353,7 @@ public function setOrder(int $order) : Group { * * @return string */ - public function getOrdering() : string { + public function getOrdering(): string { return $this->ordering; } @@ -366,9 +367,9 @@ public function getOrdering() : string { * @see Constants::OrderingTypes * */ - public function setOrdering(string $ordering = Constants::POINTS) : Group { + public function setOrdering(string $ordering = Constants::POINTS): Group { if (!in_array($ordering, Constants::OrderingTypes, true)) { - throw new Exception('Unknown group ordering: '.$ordering); + throw new Exception('Unknown group ordering: ' . $ordering); } $this->ordering = $ordering; return $this; @@ -382,7 +383,7 @@ public function setOrdering(string $ordering = Constants::POINTS) : Group { * @return $this * @throws Exception */ - public function setInGame(int $inGame) : Group { + public function setInGame(int $inGame): Group { $this->generator->setInGame($inGame); return $this; } @@ -392,18 +393,18 @@ public function setInGame(int $inGame) : Group { * * @return int */ - public function getInGame() : int { + public function getInGame(): int { return $this->generator->getInGame(); } /** * Add a progression to this group * - * @param Progression $progression + * @param ProgressionInterface $progression * * @return $this */ - public function addProgression(Progression $progression) : Group { + public function addProgression(ProgressionInterface $progression): Group { $this->progressions[] = $progression; return $this; } @@ -421,12 +422,37 @@ public function addProgression(Progression $progression) : Group { * * @see https://www.php.net/manual/en/function.array-slice.php */ - public function progression(Group $to, int $offset = 0, int $len = null) : Progression { + public function progression(Group $to, int $offset = 0, int $len = null): Progression { $p = new Progression($this, $to, $offset, $len); $this->progressions[] = $p; return $p; } + /** + * Creates a new multi-progression INTO this group + * + * Progression uses a similar syntax to php's array_slice() function. + * + * @warning The logic is reversed from the Group::progression() method. This will create a progression INTO this group. + * + * @param Group[] $from + * @param int $offset First index + * @param int|null $len Maximum number of teams to progress + * @param int|null $totalCount + * @param int $totalStart + * + * @return MultiProgression + * + * @see https://www.php.net/manual/en/function.array-slice.php + */ + public function multiProgression(array $from, int $offset = 0, int $len = null, ?int $totalCount = null, int $totalStart = 0): MultiProgression { + $p = new MultiProgression($from, $this, $offset, $len, $totalCount, $totalStart); + foreach ($from as $group) { + $group->addProgression($p); + } + return $p; + } + /** * Progress all teams using already setup progression * @@ -438,7 +464,7 @@ public function progression(Group $to, int $offset = 0, int $len = null) : Progr * @return $this * @throws Exception */ - public function progress(bool $blank = false) : Group { + public function progress(bool $blank = false): Group { foreach ($this->progressions as $progression) { $progression->progress($blank); } @@ -452,8 +478,8 @@ public function progress(bool $blank = false) : Group { * * @return $this */ - public function addProgressed(Team ...$teams) : Group { - $this->progressed = array_merge($this->progressed, array_map(static function($a) { + public function addProgressed(Team ...$teams): Group { + $this->progressed = array_merge($this->progressed, array_map(static function ($a) { return $a->getId(); }, $teams)); return $this; @@ -466,7 +492,7 @@ public function addProgressed(Team ...$teams) : Group { * * @return bool */ - public function isProgressed(Team $team) : bool { + public function isProgressed(Team $team): bool { return in_array($team->getId(), $this->progressed, true); } @@ -476,7 +502,7 @@ public function isProgressed(Team $team) : bool { * @return array * @throws Exception */ - public function genGames() : array { + public function genGames(): array { return $this->generator->genGames(); } @@ -490,7 +516,7 @@ public function genGames() : array { * @return Game * @throws Exception */ - public function game(array $teams = []) : Game { + public function game(array $teams = []): Game { $g = new Game($teams, $this); $g->setId($this->games->getAutoIncrement()); $this->games->incrementId(); @@ -508,7 +534,7 @@ public function game(array $teams = []) : Game { * @return $this * @throws Exception */ - public function addGame(Game ...$games) : Group { + public function addGame(Game ...$games): Group { $this->games->insert(...$games); // Set the game id's foreach ($games as $game) { @@ -527,7 +553,7 @@ public function addGame(Game ...$games) : Group { * @return Game[] * @throws Exception */ - public function orderGames() : array { + public function orderGames(): array { if (count($this->games) < 5) { return $this->games->get(); } @@ -544,7 +570,7 @@ public function orderGames() : array { * @return Team[] * @throws Exception */ - public function simulate(array $filters = [], bool $reset = true) : array { + public function simulate(array $filters = [], bool $reset = true): array { return Helpers\Simulator::simulateGroup($this, $filters, $reset); } @@ -557,7 +583,7 @@ public function simulate(array $filters = [], bool $reset = true) : array { * @return $this * @throws Exception */ - public function resetGames() : Group { + public function resetGames(): Group { foreach ($this->getGames() as $game) { $game->resetResults(); } @@ -569,21 +595,21 @@ public function resetGames() : Group { * * @return bool */ - public function isPlayed() : bool { + public function isPlayed(): bool { if (count($this->games) === 0) { return false; } return count(array_filter($this->getGames(), static function ($a) { - return $a->isPlayed(); - })) === count($this->games); + return $a->isPlayed(); + })) === count($this->games); } /** * Get all progressions * - * @return Progression[] + * @return ProgressionInterface[] */ - public function getProgressions() : array { + public function getProgressions(): array { return $this->progressions; } @@ -592,7 +618,7 @@ public function getProgressions() : array { * @return array * @throws Exception */ - public function jsonSerialize() : array { + public function jsonSerialize(): array { return [ 'id' => $this->getId(), 'name' => $this->getName(), diff --git a/src/TournamentGenerator/Interfaces/ProgressionInterface.php b/src/TournamentGenerator/Interfaces/ProgressionInterface.php new file mode 100644 index 0000000..5729c28 --- /dev/null +++ b/src/TournamentGenerator/Interfaces/ProgressionInterface.php @@ -0,0 +1,47 @@ + + * @since 0.1 + */ +class MultiProgression implements ProgressionInterface +{ + use ProgressionTrait; + + /** @var Group[] What group to progress from */ + protected array $from; + protected ?int $totalCount = null; + private int $totalStart; + + /** + * Progression constructor. + * + * @param Group[] $from What groups to progress from + * @param Group $to What group to progress to + * @param int $start Offset to start picking teams + * @param int|null $len Maximum number of teams to progress from each $from groups + * @param int|null $totalCount Maximum total count to progress from the $from groups. + * If set, the final teams from each input group will be sorted only the first + * $totalCount will be progressed. + * @param int $totalStart Offset to start picking teams. The $totalCount must be set. + */ + public function __construct(array $from, Group $to, int $start = 0, ?int $len = null, ?int $totalCount = null, int $totalStart = 0) { + $this->from = $from; + $this->to = $to; + $this->start = $start; + $this->len = $len; + $this->totalCount = $totalCount; + $this->totalStart = $totalStart; + } + + /** + * Gets a description + * + * @return string + */ + public function __toString() { + return 'Team from ' . implode(', ', array_map(static fn(Group $group) => $group->getName(), $this->from)); + } + + + /** + * Progress the teams using set rules + * + * @param bool $blank If true -> do not move the real team objects, but create new dummy teams + * + * @return $this + * @throws Exception + */ + public function progress(bool $blank = false): static { + if ($this->progressed) { + return $this; + } + + $fromIds = []; + + /** @var Team[][] $teams */ + $teams = []; + foreach ($this->from as $key => $from) { + $fromIds[] = $from->getId(); + if ($blank) { + $teams[$key] = $from->isPlayed() ? + $from->sortTeams(null, $this->filters) : + $from->simulate($this->filters); + } + else { + $teams[$key] = $from->sortTeams(null, $this->filters); + } + } + + /** @var Team[][] $next */ + $next = []; + foreach ($teams as $key => $groupTeams) { + if ($this->start !== 0 || $this->len !== null) { + $next[$key] = array_splice($groupTeams, $this->start, ($this->len ?? count($groupTeams))); + } + else { + $next[$key] = $groupTeams; + } + } + + // Only $totalCount teams should progress from all groups + if ($this->totalCount !== null) { + $allTeams = array_merge(...$next); + usort($allTeams, static function (Team $a, Team $b) use ($fromIds) { + $aPoints = $a->sumPoints($fromIds); + $bPoints = $b->sumPoints($fromIds); + if ($aPoints === $bPoints) { + return $b->sumScore($fromIds) - $a->sumScore($fromIds); + } + return $bPoints - $aPoints; + }); + $allTeams = array_slice($allTeams, $this->totalStart, $this->totalCount); + foreach ($next as $key => $groupTeams) { + foreach ($groupTeams as $key2 => $team) { + if (!in_array($team, $allTeams, true)) { + unset($next[$key][$key2]); + } + } + } + } + + $i = 1; + foreach ($next as $key => $groupTeams) { + foreach ($groupTeams as $team) { + if ($blank) { + $this->to->addTeam(new BlankTeam($this . ' - ' . $i++, $team, $this->from[$key], $this)); + } + else { + $this->progressedTeams[] = $team; + $team->addPoints($this->points ?? $this->from[$key]->getProgressPoints()); + } + } + } + + foreach ($this->from as $key => $from) { + if (count($next[$key]) === 0) { + continue; + } + $from->addProgressed(...$next[$key]); + if (!$blank) { + $this->to->addTeam(...$next[$key]); + } + } + $this->progressed = true; + return $this; + } + + + /** + * @return Group[] + */ + public function getFrom(): array { + return $this->from; + } + + /** + * @return int|null + */ + public function getTotalCount(): ?int { + return $this->totalCount; + } + + /** + * @param int|null $totalCount + * + * @return $this + */ + public function setTotalCount(?int $totalCount): static { + $this->totalCount = $totalCount; + return $this; + } + + public function getTotalStart(): int { + return $this->totalStart; + } + + public function setTotalStart(int $totalStart): static { + $this->totalStart = $totalStart; + return $this; + } + +} diff --git a/src/TournamentGenerator/Progression.php b/src/TournamentGenerator/Progression.php index 57f1278..ab1e744 100644 --- a/src/TournamentGenerator/Progression.php +++ b/src/TournamentGenerator/Progression.php @@ -3,6 +3,8 @@ namespace TournamentGenerator; use Exception; +use TournamentGenerator\Interfaces\ProgressionInterface; +use TournamentGenerator\Traits\ProgressionTrait; /** * Progression is a class that takes care of moving teams between groups. @@ -14,40 +16,22 @@ * @author Tomáš Vojík * @since 0.1 */ -class Progression +class Progression implements ProgressionInterface { + use ProgressionTrait; /** @var Group What group to progress from */ protected Group $from; - /** @var Group What group to progress to */ - protected Group $to; - /** @var int Offset to start picking teams */ - protected int $start; - /** @var int|null Maximum number of teams to progress */ - protected ?int $len; - /** @var TeamFilter[] Filters to use */ - protected array $filters = []; - /** @var bool If the progression was already called */ - protected bool $progressed = false; - /** - * @var int|null Custom points for progression - * @package TournamentGenerator - */ - protected ?int $points = null; - - /** @var Team[] */ - protected array $progressedTeams = []; - - /** - * Progression constructor. - * - * @param Group $from What group to progress from - * @param Group $to What group to progress to - * @param int $start Offset to start picking teams - * @param int|null $len Maximum number of teams to progress - */ - public function __construct(Group $from, Group $to, int $start = 0, ?int $len = null) { + /** + * Progression constructor. + * + * @param Group $from What group to progress from + * @param Group $to What group to progress to + * @param int $start Offset to start picking teams + * @param int|null $len Maximum number of teams to progress + */ + public function __construct(Group $from, Group $to, int $start = 0, ?int $len = null) { $this->from = $from; $this->to = $to; $this->start = $start; @@ -60,21 +44,7 @@ public function __construct(Group $from, Group $to, int $start = 0, ?int $len = * @return string */ public function __toString() { - return 'Team from '.$this->from; - } - - /** - * Adds progression's filters - * - * @param TeamFilter[] $filters - * - * @return $this - */ - public function addFilter(TeamFilter ...$filters) : Progression { - foreach ($filters as $filter) { - $this->filters[] = $filter; - } - return $this; + return 'Team from ' . $this->from; } /** @@ -85,13 +55,15 @@ public function addFilter(TeamFilter ...$filters) : Progression { * @return $this * @throws Exception */ - public function progress(bool $blank = false) : Progression { + public function progress(bool $blank = false): static { if ($this->progressed) { return $this; } if ($blank) { - $teams = $this->from->isPlayed() ? $this->from->sortTeams(null, $this->filters) : $this->from->simulate($this->filters); + $teams = $this->from->isPlayed() ? $this->from->sortTeams(null, $this->filters) : $this->from->simulate( + $this->filters + ); } else { $teams = $this->from->sortTeams(null, $this->filters); @@ -108,11 +80,11 @@ public function progress(bool $blank = false) : Progression { foreach ($next as $team) { if ($blank) { - $this->to->addTeam(new BlankTeam($this.' - '.$i++, $team, $this->from, $this)); + $this->to->addTeam(new BlankTeam($this . ' - ' . $i++, $team, $this->from, $this)); } else { - $this->progressedTeams[] = $team; - $team->addPoints($this->points ?? $this->from->getProgressPoints()); + $this->progressedTeams[] = $team; + $team->addPoints($this->points ?? $this->from->getProgressPoints()); } } @@ -124,100 +96,11 @@ public function progress(bool $blank = false) : Progression { return $this; } - /** - * Reset progression - * - * @warning This does not remove the teams from the progressed groups! - * - * @return $this - */ - public function reset() : Progression { - $this->progressed = false; - return $this; - } - /** * @return Group */ - public function getFrom() : Group { + public function getFrom(): Group { return $this->from; } - /** - * @return Group - */ - public function getTo() : Group { - return $this->to; - } - - /** - * @return int - */ - public function getStart() : int { - return $this->start; - } - - /** - * @return int|null - */ - public function getLen() : ?int { - return $this->len; - } - - /** - * @return TeamFilter[] - */ - public function getFilters() : array { - return $this->filters; - } - - /** - * Sets progression's filters - * - * @param TeamFilter[] $filters - * - * @return $this - */ - public function setFilters(array $filters) : Progression { - $this->filters = $filters; - return $this; - } - - /** - * @return bool - */ - public function isProgressed(): bool { - return $this->progressed; - } - - /** - * @param bool $progressed - */ - public function setProgressed(bool $progressed): void { - $this->progressed = $progressed; - } - - /** - * @return int|null - */ - public function getPoints(): ?int { - return $this->points; - } - - /** - * @param int|null $points - * @return Progression - */ - public function setPoints(?int $points): Progression { - $this->points = $points; - return $this; - } - - /** - * @return array - */ - public function getProgressedTeams(): array { - return $this->progressedTeams; - } - } diff --git a/src/TournamentGenerator/Traits/ProgressionTrait.php b/src/TournamentGenerator/Traits/ProgressionTrait.php new file mode 100644 index 0000000..d65eb4f --- /dev/null +++ b/src/TournamentGenerator/Traits/ProgressionTrait.php @@ -0,0 +1,135 @@ +filters[] = $filter; + } + return $this; + } + + /** + * Reset progression + * + * @warning This does not remove the teams from the progressed groups! + * + * @return $this + */ + public function reset(): static { + $this->progressed = false; + return $this; + } + + /** + * @return Group + */ + public function getTo(): Group { + return $this->to; + } + + /** + * @return int + */ + public function getStart(): int { + return $this->start; + } + + /** + * @return int|null + */ + public function getLen(): ?int { + return $this->len; + } + + /** + * @return TeamFilter[] + */ + public function getFilters(): array { + return $this->filters; + } + + /** + * Sets progression's filters + * + * @param TeamFilter[] $filters + * + * @return $this + */ + public function setFilters(array $filters): static { + $this->filters = $filters; + return $this; + } + + /** + * @return bool + */ + public function isProgressed(): bool { + return $this->progressed; + } + + /** + * @param bool $progressed + */ + public function setProgressed(bool $progressed): void { + $this->progressed = $progressed; + } + + /** + * @return int|null + */ + public function getPoints(): ?int { + return $this->points; + } + + /** + * @param int|null $points + * + * @return $this + */ + public function setPoints(?int $points): static { + $this->points = $points; + return $this; + } + + /** + * @return array + */ + public function getProgressedTeams(): array { + return $this->progressedTeams; + } +} \ No newline at end of file diff --git a/tests/MultiProgressionTest.php b/tests/MultiProgressionTest.php new file mode 100644 index 0000000..5e5cb8b --- /dev/null +++ b/tests/MultiProgressionTest.php @@ -0,0 +1,122 @@ +isProgressed()); + $progression->setProgressed(true); + self::assertTrue($progression->isProgressed()); + } + + public function testProgressing(): void { + $tournament = new Tournament('Name of tournament 1'); + + for ($i = 1; $i <= 10; $i++) { + $tournament->team('Team ' . $i); + } + // Create a round and a final round + $round = $tournament->round("First's round's name"); + $final = $tournament->round("Final's round's name"); + + // Create 2 groups for the first round + $group1 = $round->group('Round 1')->setInGame(2); + $group2 = $round->group('Round 2')->setInGame(2); + + // Create a final group + $final_group = $final->group('Teams 1-4')->setInGame(2); + $second_group = $final->group('Teams 5-8')->setInGame(2); + + $tournament->splitTeams($round); + + $group1->progression($final_group, 0, 2); // PROGRESS 2 BEST WINNING TEAMS + $group2->progression($final_group, 0, 2); // PROGRESS 2 BEST WINNING TEAMS + $final_group->multiProgression([$group1, $group2], 2, 1, 1); // Progress the best of the third teams + $second_group->multiProgression([$group1, $group2], 2, 1, 1, 1); // Progress the worst of the third teams + $group1->progression($second_group, 3, 2); // Progress all other teams + $group2->progression($second_group, 3, 2); // Progress all other teams + + $round->genGames(); + $round->simulate(); + $round->progress(); + + self::assertCount(5, $final_group->getTeams()); + self::assertCount(5, $second_group->getTeams()); + + // Get third teams + $team1 = $group1->getTeams(true)[2]; + $team1Points = $team1->sumPoints([$group1->getId()]); + $team1Score = $team1->sumScore([$group1->getId()]); + $team2 = $group2->getTeams(true)[2]; + $team2Points = $team2->sumPoints([$group2->getId()]); + $team2Score = $team2->sumScore([$group2->getId()]); + + if ($team1Points > $team2Points) { + $betterTeam = $team1; + $worseTeam = $team2; + } + else { + if ($team1Points < $team2Points) { + $betterTeam = $team2; + $worseTeam = $team1; + } + else { + if ($team1Score > $team2Score) { + $betterTeam = $team1; + $worseTeam = $team2; + } + else { + $betterTeam = $team2; + $worseTeam = $team1; + } + } + } + + $this->assertContains($betterTeam->getId(), $final_group->getTeamContainer()->ids()->get()); + $this->assertContains($worseTeam->getId(), $second_group->getTeamContainer()->ids()->get()); + } + + public function testGetProgressedTeams(): void { + $tournament = new Tournament('Name of tournament 1'); + + // Create a round and a final round + $round = $tournament->round("First's round's name"); + $final = $tournament->round("Final's round's name"); + + // Create 1 group for the first round + $group1 = $round->group('Round 1')->setInGame(2); + $group2 = $round->group('Round 2')->setInGame(2); + + for ($i = 1; $i <= 6; $i++) { + $group1->team('Team ' . $i, $i); + } + + // Create a final group + $final_group = $final->group('Teams 1-2')->setInGame(2); + + $tournament->splitTeams($round); + + $progression = $final_group->multiProgression([$group1, $group2], 0, 2, 3); + + $round->genGames(); + $round->simulate(); + $round->progress(); + + self::assertCount(3, $final_group->getTeams()); + self::assertCount(3, $progression->getProgressedTeams()); + self::assertEquals($final_group->getTeams(), $progression->getProgressedTeams()); + } +} diff --git a/tests/ProgressionTest.php b/tests/ProgressionTest.php index c984965..46f1db8 100644 --- a/tests/ProgressionTest.php +++ b/tests/ProgressionTest.php @@ -49,6 +49,7 @@ public function check_progressing() : void { $group_1->progression($second_group, 2, 2); // PROGRESS 2 BEST WINNING TEAMS $group_2->progression($second_group, 2, 2); // PROGRESS 2 BEST WINNING TEAMS + $round->genGames(); $round->simulate(); $round->progress(); @@ -336,8 +337,8 @@ public function testGetProgressedTeams(): void { $progression = $group_1->progression($final_group, 0, 2); // PROGRESS 2 BEST WINNING TEAMS + $round->genGames(); $round->simulate(); - $round->progress(); self::assertCount(2, $final_group->getTeams());