/** * @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); }); }
/** * @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); }
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' => '']); } }
/** * @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); }
/** * @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'); }
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; }
/** * @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()); }
/** * @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(); }
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]; }
/** * @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); }