Example #1
0
 /**
  * @return bool
  */
 public function isShittyRound()
 {
     $hitsInRound = Hit::where(['game_user_id' => $this->game->current_game_user_id, 'round' => $this->game->round])->fetchAll();
     return Arrays::all($hitsInRound, function ($hit) {
         return !$this->isScored($hit->field, $hit->multiplier);
     });
 }
Example #2
0
 /**
  * @test
  */
 public function shouldSetScoreWhenIsExactly101()
 {
     //given
     $this->gameUser->updateAttributes(['score' => 99]);
     $hit = Hit::createFor('2s', $this->gameUser);
     //when
     $isScored = $hit->handleScore();
     //then
     $this->gameUser->reload();
     $this->assertTrue($isScored);
     $this->assertEquals(101, $this->gameUser->score);
 }
 /**
  * @test
  */
 public function shouldCreateHit()
 {
     //given
     $field = '25d';
     //when
     $this->post('/hit', ['field' => $field]);
     //then
     /** @var Hit $hit */
     $hit = Arrays::first(Hit::all());
     $this->assertEquals($this->gameUser->getId(), $hit->game_user_id);
     $this->assertEquals(25, $hit->field);
     $this->assertEquals(2, $hit->multiplier);
 }
Example #4
0
 public function index()
 {
     $field = $this->params['field'];
     $game = Game::currentGame();
     $currentGameUser = $game->current_game_user;
     $leftShoots = $currentGameUser->getLeftShoots();
     if ($leftShoots) {
         $hit = Hit::createFor($field, $currentGameUser);
         $params = Json::encode(['game' => $game->type, 'field' => $hit->field, 'multiplier' => $hit->multiplier, 'scored' => $hit->handleScore(), 'winner' => $currentGameUser->isWinner(), 'shots_left' => $leftShoots - 1, 'shitty_round' => $currentGameUser->isShittyRound()]);
         Event::create(['name' => 'hit', 'params' => $params]);
     } else {
         Event::create(['name' => 'next_player', 'params' => '']);
     }
 }
Example #5
0
 /**
  * @test
  */
 public function shouldCalculateIsNotShittyRound()
 {
     //given
     $user = User::create(['login' => 'A']);
     $game = Game::create(['type' => 'cricket']);
     $gameUser = GameUser::create(['game_id' => $game->id, 'user_id' => $user->getId()]);
     $game->updateAttributes(['current_game_user_id' => $gameUser->getId()]);
     Hit::createFor('15t', $gameUser);
     Hit::createFor('16t', $gameUser);
     Hit::createFor('17t', $gameUser);
     //when
     $isShittyRound = $gameUser->isShittyRound();
     //then
     $this->assertFalse($isShittyRound);
 }
Example #6
0
 /**
  * @test
  */
 public function shouldGetHitsOnlyForPlayersInCurrentGame()
 {
     //given
     $user = User::create(['login' => 'test', 'password' => 'a']);
     $game1 = Game::create();
     $game1->addPlayer($user->getId());
     /** @var GameUser $gameUser1 */
     $gameUser1 = Arrays::first($game1->game_users);
     $game2 = Game::create();
     $game2->addPlayer($user->getId());
     /** @var GameUser $gameUser2 */
     $gameUser2 = Arrays::first($game2->game_users);
     Hit::createFor('4d', $gameUser1);
     Hit::createFor('15t', $gameUser2);
     //when
     $hits = Hit::findForGame($game1);
     //then
     Assert::thatArray($hits)->onProperty('field')->containsExactly('4');
 }
Example #7
0
 public function getClosedByRoundForCricket()
 {
     $hits = Hit::join('game_user->user')->where(['game_user_id' => $this->id])->order('hits.id asc')->fetchAll();
     $byRound = Arrays::groupBy($hits, Functions::extract()->round);
     $closedInRound = [];
     $closed = [15 => 0, 16 => 0, 17 => 0, 18 => 0, 19 => 0, 20 => 0, 25 => 0];
     foreach ($byRound as $round => $hits) {
         $closedInCurrentRound = 0;
         foreach ($hits as $hit) {
             if (isset($closed[$hit->field])) {
                 $closedField = min($hit->multiplier, 3 - $closed[$hit->field]);
                 $closedInCurrentRound += $closedField;
                 $closed[$hit->field] += $closedField;
             }
         }
         $closedInRound[$round] = $closedInCurrentRound;
     }
     return $closedInRound;
 }
Example #8
0
 /**
  * @test
  * @dataProvider hits
  */
 public function shouldReturnIsScoredIfFieldIsInRange($hit, $isScored)
 {
     //given
     $user = User::create(['login' => 'A']);
     $game = Game::create(['type' => 'cricket']);
     $gameUser = GameUser::create(['game_id' => $game->id, 'user_id' => $user->getId()]);
     $game->updateAttributes(['current_game_user_id' => $gameUser->getId()]);
     //when
     $hit = Hit::createFor($hit, $gameUser);
     //then
     $this->assertEquals($isScored, $hit->isScored());
 }
Example #9
0
 /**
  * @param Game $game
  * @return Hit[]
  */
 public static function findForGame(Game $game)
 {
     $gameUserIds = Arrays::map($game->game_users, Functions::extractId());
     return Hit::where(['game_user_id' => $gameUserIds])->with('game_user->user')->order('id desc')->limit(9)->fetchAll();
 }
Example #10
0
 public function mostFrequentlyHitField()
 {
     return Hit::join('game_user')->where(['user_id' => $this->id])->select(['field', 'count(*)'])->groupBy('field')->order('count(*) DESC')->limit(1)->fetch()[0];
 }
Example #11
0
 /**
  * @test
  */
 public function shouldReturnMostFrequentlyHitField()
 {
     //given
     $user = User::create(['login' => 'A']);
     $game = Game::create(['type' => 'cricket']);
     $gameUser = $game->addPlayer($user->getId());
     Hit::createFor('15t', $gameUser);
     Hit::createFor('16s', $gameUser);
     Hit::createFor('16s', $gameUser);
     //when
     $field = $user->mostFrequentlyHitField();
     //then
     $this->assertEquals('16', $field);
 }