Skip to content

Commit

Permalink
fix(combinations): add func sameNrOfGames
Browse files Browse the repository at this point in the history
  • Loading branch information
thepercival committed Jan 9, 2023
1 parent f7d9065 commit edb31b2
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 45 deletions.
6 changes: 6 additions & 0 deletions domain/Sport/Variant/Against.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace SportsHelpers\Sport\Variant;

use SportsHelpers\Against\Side;
use SportsHelpers\GameMode;
use SportsHelpers\Sport\Variant;
use SportsHelpers\SportMath;
Expand Down Expand Up @@ -34,6 +35,11 @@ public function getNrOfAwayPlaces(): int
return $this->nrOfAwayPlaces;
}

public function getNrOfSidePlaces(Side $side): int
{
return $side === Side::Home ? $this->nrOfHomePlaces : $this->nrOfAwayPlaces;
}

public function getNrOfGamePlaces(): int
{
return $this->nrOfHomePlaces + $this->nrOfAwayPlaces;
Expand Down
17 changes: 8 additions & 9 deletions domain/Sport/Variant/Against/GamesPerPlace.php
Original file line number Diff line number Diff line change
Expand Up @@ -110,15 +110,14 @@ public function getNrOfAgainstCombinationsPerGame(Side|null $side = null): int {
}

public function getNrOfWithCombinationsPerGame(Side|null $side = null): int {
return $side !== null ? 1 : 2;
// $nrOfHomeWithCombinations = $this->getNrOfHomePlaces() > 1 ? 1 : 0;
// $nrOfAwayWithCombinations = $this->getNrOfAwayPlaces() > 1 ? 1 : 0;
// if( $side === Side::Home) {
// return $nrOfHomeWithCombinations;
// } else if( $side === Side::Away) {
// return $nrOfAwayWithCombinations;
// }
// return $nrOfHomeWithCombinations + $nrOfAwayWithCombinations;
$nrOfHomeWithCombinations = $this->getNrOfHomePlaces() > 1 ? 1 : 0;
$nrOfAwayWithCombinations = $this->getNrOfAwayPlaces() > 1 ? 1 : 0;
if( $side === Side::Home) {
return $nrOfHomeWithCombinations;
} else if( $side === Side::Away) {
return $nrOfAwayWithCombinations;
}
return $nrOfHomeWithCombinations + $nrOfAwayWithCombinations;
}

public function __toString(): string
Expand Down
22 changes: 19 additions & 3 deletions domain/Sport/Variant/WithPoule/Against/EquallyAssignCalculator.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

namespace SportsHelpers\Sport\Variant\WithPoule\Against;

use SportsHelpers\Against\Side;
use SportsHelpers\Sport\Variant\WithPoule\Against\GamesPerPlace as AgainstGppWithPoule;
use SportsHelpers\Sport\Variant\Against\GamesPerPlace as AgainstGpp;
use SportsHelpers\SportMath;


class EquallyAssignCalculator
Expand Down Expand Up @@ -78,7 +76,25 @@ public function assignEqually(
): bool
{
$nrOfCombinations = $nrOfCombinationsPerGame * $totalNrOfGames;
return ($nrOfCombinations % $nrOfPossibleCombinations) === 0;
return $this->getNrOfDeficit($nrOfCombinations, $nrOfPossibleCombinations) === 0;
}

public function getNrOfDeficit(
int $nrOfCombinations,
int $nrOfPossibleCombinations ): int
{
if( $nrOfPossibleCombinations === 0) {
return 0;
}
$rest = $nrOfCombinations % $nrOfPossibleCombinations;
return $rest === 0 ? 0 : $nrOfPossibleCombinations - $rest;
}

public function getMaxAmount(
int $nrOfCombinations,
int $nrOfPossibleCombinations ): int
{
return (int)ceil( $nrOfCombinations / $nrOfPossibleCombinations );;
}

/**
Expand Down
65 changes: 49 additions & 16 deletions domain/Sport/Variant/WithPoule/Against/GamesPerPlace.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,34 @@ public function getDeficit(): int
return $totalNrOfGamePlaces % $this->sportVariant->getNrOfGamePlaces();
}

public function getNrOfAgainstDeficit(): int
{
$nrOfCombinations = $this->sportVariant->getNrOfAgainstCombinationsPerGame() * $this->getTotalNrOfGames();
return (new EquallyAssignCalculator())->getNrOfDeficit(
$nrOfCombinations,
$this->getNrOfPossibleAgainstCombinations(),
);
}

public function getNrOfWithDeficit(): int
{
$nrOfCombinations = $this->sportVariant->getNrOfWithCombinationsPerGame() * $this->getTotalNrOfGames();
return (new EquallyAssignCalculator())->getNrOfDeficit(
$nrOfCombinations,
$this->getNrOfPossibleWithCombinations()
);
}

public function getTotalNrOfGamePlaces(): int
{
return $this->getTotalNrOfGames() * $this->sportVariant->getNrOfGamePlaces();
}

public function getTotalNrOfSidePlaces(Side $side): int
{
return $this->getTotalNrOfGames() * $this->sportVariant->getNrOfSidePlaces($side);
}

// public function getTotalNrOfGamesPerPlace(): int
// {
// return $this->sportVariant->getNrOfGamesPerPlace();
Expand All @@ -53,25 +76,42 @@ public function allPlacesSameNrOfGamesAssignable(): bool
return ($this->getTotalNrOfGamePlaces() % $this->nrOfPlaces) === 0;
}

public function getNrOfPossibleAgainstCombinations(): int
public function allPlacesSameNrOfOfSidePlacesAssignable(Side $side): bool
{
return ($this->getTotalNrOfSidePlaces($side) % $this->nrOfPlaces) === 0;
}

public function getNrOfPossibleAgainstCombinations(int|null $nrOfPlaces = null): int
{
return (new SportMath())->above($this->nrOfPlaces, 2);
if( $nrOfPlaces === null ) {
$nrOfPlaces = $this->nrOfPlaces;
}
return (new SportMath())->above($nrOfPlaces, 2);
}

public function getNrOfPossibleWithCombinations(Side|null $side = null): int
{
$combinations = 0;
if( $side === null || $side === Side::Home) {
$combinations += (new SportMath())->above($this->nrOfPlaces, $this->sportVariant->getNrOfHomePlaces());
if( $this->sportVariant->getNrOfHomePlaces() > 1 ) {
if( $side === null || $side === Side::Home) {
$combinations += (new SportMath())->above($this->nrOfPlaces, $this->sportVariant->getNrOfHomePlaces());
}
}
if( $side === null && $this->sportVariant->getNrOfAwayPlaces() !== $this->sportVariant->getNrOfHomePlaces() ) {
$combinations += (new SportMath())->above($this->nrOfPlaces, $this->sportVariant->getNrOfAwayPlaces());
} else if( $side === Side::Away ) {
$combinations += (new SportMath())->above($this->nrOfPlaces, $this->sportVariant->getNrOfAwayPlaces());

if( $this->sportVariant->getNrOfAwayPlaces() > 1 ) {
if( $side === Side::Away || ($side === null && $combinations === 0)) {
$combinations += (new SportMath())->above($this->nrOfPlaces, $this->sportVariant->getNrOfAwayPlaces());
}
}

return $combinations;
}

public function allAgainstSameNrOfGamesAssignable(): bool
{
return $this->getNrOfAgainstDeficit() === 0;
}

public function allWithSameNrOfGamesAssignable(Side|null $side = null): bool
{
return (new EquallyAssignCalculator())->assignEqually(
Expand All @@ -81,14 +121,7 @@ public function allWithSameNrOfGamesAssignable(Side|null $side = null): bool
);
}

public function allAgainstSameNrOfGamesAssignable(): bool
{
return (new EquallyAssignCalculator())->assignEqually(
$this->getTotalNrOfGames(),
$this->getNrOfPossibleAgainstCombinations(),
$this->sportVariant->getNrOfAgainstCombinationsPerGame()
);
}


public function getMinNrOfGamesPerPlace(): int {
return $this->sportVariant->getNrOfGamesPerPlace() - ($this->getDeficit() ? 1 : 0);
Expand Down
41 changes: 24 additions & 17 deletions tests/cases/Sport/Variant/WithPoule/Against/GamesPerPlaceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -105,59 +105,66 @@ public function testAllPlacesSameNrOfAgainstAssignable(): void
}
}

public function testGetNrOfPossibleWithCombinations(): void
{
$sportVariant = new AgainstSportGppVariant(1, 2, 9);
$variantWithPoule = new AgainstGppWithPoule(3, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable());
}

public function testAllWithSameNrOfGamesAssignable(): void
{
$sportVariant = new AgainstSportGppVariant(1, 2, 2);
$variantWithPoule = new AgainstGppWithPoule(3, $sportVariant);
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(4, $sportVariant);
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(5, $sportVariant);
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());

$sportVariant = new AgainstSportGppVariant(1, 2, 3);
$variantWithPoule = new AgainstGppWithPoule(3, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(4, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(5, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(6, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(7, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());

$sportVariant = new AgainstSportGppVariant(1, 2, 9);
$variantWithPoule = new AgainstGppWithPoule(3, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(4, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(5, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());

{
$sportVariant = new AgainstSportGppVariant(2, 2, 2);
$variantWithPoule = new AgainstGppWithPoule(4, $sportVariant);
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());

$sportVariant = new AgainstSportGppVariant(2, 2, 3);
$variantWithPoule = new AgainstGppWithPoule(4, $sportVariant);
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable());

$sportVariant = new AgainstSportGppVariant(2, 2, 6);
$variantWithPoule = new AgainstGppWithPoule(4, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable());
}

$sportVariant = new AgainstSportGppVariant(2, 2, 12);
$variantWithPoule = new AgainstGppWithPoule(4, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable());

$sportVariant = new AgainstSportGppVariant(2, 2, 24);
$variantWithPoule = new AgainstGppWithPoule(5, $sportVariant);
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertTrue($variantWithPoule->allWithSameNrOfGamesAssignable());
$variantWithPoule = new AgainstGppWithPoule(6, $sportVariant);
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable(Side::Home));
self::assertFalse($variantWithPoule->allWithSameNrOfGamesAssignable());
}

public function testAllPlacesPlaySimultaneously(): void
Expand Down

0 comments on commit edb31b2

Please sign in to comment.