public function buildGame(GameInitiationRequest $request) : Game
 {
     $game = new Game();
     $this->attachAIBattlefields($game, $request->getOpponents(), $request->getSize());
     $player = $this->playerModel->createOnRequestHumanControlled($request->getPlayerName());
     $battlefield = BattlefieldModel::generate($request->getSize(), $request->getCoordinates());
     $battlefield->setPlayer($player);
     $game->addBattlefield($battlefield);
     /** for test purposes only - mark player cells as damaged */
     $battlefield->getCellByCoordinate('A2')->setFlags(CellModel::FLAG_DEAD_SHIP);
     $battlefield->getCellByCoordinate('A1')->setFlags(CellModel::FLAG_DEAD_SHIP);
     return $game;
 }
 public function addBattlefield(Battlefield $battlefield) : self
 {
     $this->battlefields[] = $battlefield;
     if (PlayerModel::isAIControlled($battlefield->getPlayer())) {
         foreach ($battlefield->getCells() as $cell) {
             $cell->setFlags(CellModel::FLAG_NONE);
         }
     }
     return $this;
 }
 /**
  * @see GameInitiationResponse::addBattlefield()
  * @test
  */
 public function addBattlefield()
 {
     $game = MockFactory::getGameMock();
     $game->getBattlefields()[0]->setPlayer(MockFactory::getAIPlayerMock(''))->getCellByCoordinate('A1')->setFlags(CellModel::FLAG_SHIP);
     $request = new GameInitiationResponse($game->getBattlefields());
     foreach ($request->getBattlefields() as $battlefield) {
         foreach ($battlefield->getCells() as $cell) {
             if (PlayerModel::isAIControlled($battlefield->getPlayer())) {
                 $this->assertEquals(CellModel::FLAG_NONE, $cell->getFlags());
             }
         }
     }
 }
 /**
  * should:
  *      generate X battlefields of Y size
  *      assign AI controlled player to the generated battlefield
  *      initiate ship cells for the generated battlefield
  *      attach generated battlefield to the Game
  *
  * @see GameBuilder::attachAIBattlefields
  * @test
  */
 public function attachAIBattlefields()
 {
     $game = MockFactory::getGameMock(0, 0);
     $this->invokeMethod(static::$gameBuilder, 'attachAIBattlefields', [$game, 2, 7]);
     $this->assertCount(2, $game->getBattlefields());
     foreach ($game->getBattlefields() as $battlefield) {
         $this->assertCount(49, $battlefield->getCells());
         $this->assertTrue(PlayerModel::isAIControlled($battlefield->getPlayer()));
         $this->assertTrue(BattlefieldModel::hasUnfinishedShips($battlefield));
         foreach ($battlefield->getCells() as $coordinate => $cell) {
             /** all battlefields associated with AI players currently have hardcoded ship into B2 cell */
             $expectedFlag = 'B2' === $coordinate ? CellModel::FLAG_SHIP : CellModel::FLAG_NONE;
             $this->assertEquals($expectedFlag, $cell->getFlags());
         }
     }
 }
 /**
  * @param Battlefield $battlefield
  * @param Cell        $cell - this cell will be attacked if attacker is human
  *
  * @return Cell
  */
 protected function processPlayerTurn(Battlefield $battlefield, Cell $cell) : Cell
 {
     return PlayerModel::isAIControlled($battlefield->getPlayer()) ? CellModel::switchPhase($cell) : $this->ai->processCPUTurn($battlefield);
 }
 /**
  * should throw exception, because existed Player is not controlled By AI
  *
  * @see      PlayerModel::createOnRequestHumanControlled
  * @test
  *
  * @expectedException \EM\GameBundle\Exception\PlayerException
  *
  * @depends  isAIControlledOnFlagNone
  * @requires isAIControlledOnFlagAIControlled
  */
 public function createOnRequestHumanControlledOnNonExistingAIPlayer()
 {
     static::$playerModel->createOnRequestHumanControlled(LoadPlayerData::TEST_AI_CONTROLLED_PLAYER_EMAIL);
 }