/**
  * Test for postAnswer
  */
 public function testPostAnswer()
 {
     $user1 = factory(App\Models\User::class)->create();
     $user2 = factory(App\Models\User::class)->create();
     // create two battles
     $br = new BattleRequest();
     $br->challenger_id = $user1->id;
     $br->challenged_id = $user2->id;
     $br->save();
     // execute postAnswer()
     $this->actingAs($user1)->post('/request/' . $br->id, ['accepted' == TRUE]);
     $oP = OpenBattle::find($br->challenger_id);
     //checking the output
     $this->assertNotNull($oP);
     $this->assertEquals($user1->id, $oP->rapper1_id);
     $this->assertEquals($user2->id, $oP->rapper2_id);
 }
 /**
  * Insertion test
  *
  * @return void
  */
 public function testInsert()
 {
     $user1 = factory(App\Models\User::class)->create();
     $user2 = factory(App\Models\User::class)->create();
     $battleRequest = new BattleRequest();
     $battleRequest->challenger_id = $user1->id;
     $battleRequest->challenged_id = $user2->id;
     $battleRequest->save();
     // is request in database?
     $this->seeInDatabase('battle_requests', ['challenger_id' => $user1->id, 'challenged_id' => $user2->id]);
     // can challenger and challenged user be retrieved?
     $this->assertNotNull($battleRequest->challenger()->get()->values()->keyBy('id')->get($user1->id));
     $this->assertNotNull($battleRequest->challenged()->get()->values()->keyBy('id')->get($user2->id));
     // can users retrieve their open battles?
     $this->assertNotNull($user1->BattleRequestsChallenger()->get()->values()->keyBy('id')->get($battleRequest->id));
     $this->assertNotNull($user2->BattleRequestsChallenged()->get()->values()->keyBy('id')->get($battleRequest->id));
 }
Example #3
0
 /**
  * Test for battleRequests()
  *
  * @return void
  */
 public function testBattleRequests()
 {
     $user1 = factory(App\Models\User::class)->create();
     $user2 = factory(App\Models\User::class)->create();
     $user3 = factory(App\Models\User::class)->create();
     $user4 = factory(App\Models\User::class)->create();
     $battleRequest1 = new BattleRequest();
     $battleRequest1->challenger_id = $user1->id;
     $battleRequest1->challenged_id = $user2->id;
     $battleRequest1->save();
     $battleRequest2 = new BattleRequest();
     $battleRequest2->challenger_id = $user2->id;
     $battleRequest2->challenged_id = $user3->id;
     $battleRequest2->save();
     $battleRequest3 = new BattleRequest();
     $battleRequest3->challenger_id = $user3->id;
     $battleRequest3->challenged_id = $user1->id;
     $battleRequest3->save();
     // get battle requests of user2
     $battleRequests = $user2->battleRequests()->lists('id')->toArray();
     $this->assertCount(2, $battleRequests);
     $this->assertContains($battleRequest1->id, $battleRequests);
     $this->assertContains($battleRequest2->id, $battleRequests);
     $this->assertNotContains($battleRequest3->id, $battleRequests);
     // get battle requests, where user2 is challenger
     $battleRequestsChallenger = $user2->battleRequestsChallenger()->lists('id')->toArray();
     $this->assertCount(1, $battleRequestsChallenger);
     $this->assertContains($battleRequest2->id, $battleRequestsChallenger);
     // get battle requests, where user2 is challenged
     $battleRequestsChallenged = $user2->battleRequestsChallenged()->lists('id')->toArray();
     $this->assertCount(1, $battleRequestsChallenged);
     $this->assertContains($battleRequest1->id, $battleRequestsChallenged);
     // get battle requests of user 4 (should be none)
     $this->assertCount(0, $user4->battleRequests()->lists('id')->toArray());
     // tests for hasBattleRequestAgainst()
     $this->assertTrue($user1->hasBattleRequestAgainst($user2));
     $this->assertTrue($user1->hasBattleRequestAgainst($user3));
     $this->assertTrue($user2->hasBattleRequestAgainst($user1));
     $this->assertTrue($user2->hasBattleRequestAgainst($user3));
     $this->assertFalse($user1->hasBattleRequestAgainst($user4));
     $this->assertFalse($user4->hasBattleRequestAgainst($user3));
     // tests for scopeNoBattleRequestsAgainst()
     $nbra1 = $user1->noBattleRequestsAgainst($user4)->lists('id')->toArray();
     $this->assertContains($user4->id, $nbra1);
     $nbra4 = $user4->noBattleRequestsAgainst($user4)->lists('id')->toArray();
     $this->assertContains($user1->id, $nbra4);
     $this->assertContains($user2->id, $nbra4);
     $this->assertContains($user3->id, $nbra4);
 }
 /**
  * Find a random opponent for the authenticated user based on rating.
  *
  * @return \Illuminate\Http\JsonResponse
  */
 public function getRandomOpponent()
 {
     $user = Auth::user();
     if (is_null($user)) {
         return response('Unauthorized', 401);
     }
     // Number of possible opponents = Number of rappers - 1 (Authenticated user)
     //     - Number of open battles of authenticated user
     //     - Number of battle requests of authenticated user
     $possibleOpponentCount = User::rapper()->count() - 1 - $user->openBattles()->count() - $user->battleRequests()->count();
     $opponent = null;
     // This is faster because there are no unecessary iterations.
     if ($possibleOpponentCount == 1) {
         // There is only one possible opponent.
         $opponent = User::validOpponentFor($user)->first();
     } elseif ($possibleOpponentCount > 1) {
         // Increase the search range exponentially to make sure an opponent is found.
         $exponentialBase = 2;
         $rating = $user->rating;
         $validOpponents = User::validOpponentFor($user);
         $validOpponentsCnt = $validOpponents->count();
         if (!$validOpponents->get()->isEmpty()) {
             for ($i = 0; is_null($opponent); $i++) {
                 $range = pow($exponentialBase, $i);
                 $minRating = $rating - $range;
                 $maxRating = $rating + $range;
                 $possibleOpponents = $validOpponents->ratedBetween($minRating, $maxRating)->get();
                 if (!$possibleOpponents->isEmpty()) {
                     $opponent = $possibleOpponents->random();
                     // Log for later optimizing
                     Log::info('Random opponent found.', ['possible opponents' => $possibleOpponentCount, 'exponential base' => $exponentialBase, 'iterations' => $i]);
                 }
             }
         }
     }
     if (!is_null($opponent)) {
         $battleRequest = new BattleRequest();
         $battleRequest->challenger()->associate($user);
         $battleRequest->challenged()->associate($opponent);
         $battleRequest->save();
         $opponent = $opponent->profilePreview();
     }
     return response()->json(['opponent' => $opponent]);
 }
 /**
  * Run the database seeds.
  *
  * @return void
  */
 public function run()
 {
     Model::unguard();
     // config
     $usercnt = 20;
     $userRappercnt = 20;
     $battlecnt = 20;
     $battleRequestcnt = rand($userRappercnt / 4, $userRappercnt / 2);
     // max $userRappercnt / 2
     $openBattlecnt = rand($userRappercnt / 4, $userRappercnt / 2);
     // max $userRappercnt / 2
     // create users
     $users = factory(App\Models\User::class, $usercnt)->create();
     // rapper and non-rapper
     $usersRapper = factory(App\Models\User::class, 'rapper', $userRappercnt)->create();
     // rapper only
     //----------------------------------------------
     // create battles
     for ($i = 0; $i < $battlecnt; $i++) {
         $battle = new Battle();
         // get first rapper
         $battle->rapper1_id = $usersRapper->random()->id;
         // get second rapper != first rapper
         do {
             $battle->rapper2_id = $usersRapper->random()->id;
         } while ($battle->rapper1_id == $battle->rapper2_id);
         $battle->save();
         //-----------------------------------------
         // create votes
         // create list of all created users
         $usersAll = $users->keyBy('id')->merge($usersRapper->keyBy('id'));
         $usersAll->shuffle();
         $userVotescnt = rand(0, $usersAll->count());
         for ($j = 0; $j < $userVotescnt; $j++) {
             $vote = new Vote();
             $vote->user_id = $usersAll->get($j)->id;
             $vote->battle_id = $battle->id;
             $vote->rapper_number = rand(0, 1);
             $vote->save();
             // update vote counter
             if ($vote->rapper_number == 0) {
                 $battle->votes_rapper1++;
             } else {
                 $battle->votes_rapper2++;
             }
         }
         // save vote count in battle
         $battle->save();
         $battle->rapper1->updateRating();
         $battle->rapper2->updateRating();
     }
     //----------------------------------------------
     // create battle_requests
     for ($i = 0; $i < $battleRequestcnt * 2; $i += 2) {
         $battleRequest = new BattleRequest();
         $battleRequest->challenger_id = $usersRapper->get($i)->id;
         $battleRequest->challenged_id = $usersRapper->get($i + 1)->id;
         $battleRequest->save();
     }
     //----------------------------------------------
     // create open battles
     $usersRapper->shuffle();
     for ($i = 0; $i < $openBattlecnt * 2; $i += 2) {
         $openBattle = new OpenBattle();
         $openBattle->rapper1_id = $usersRapper->get($i)->id;
         $openBattle->rapper2_id = $usersRapper->get($i + 1)->id;
         $openBattle->phase = rand(1, 2);
         // TODO: how many phases?
         $openBattle->beat1_id = rand(0, 2);
         $openBattle->beat2_id = rand(0, 2);
         $openBattle->save();
     }
     Model::reguard();
 }
Example #6
0
 /**
  * Checks whether a user has a battle request agains $user
  */
 public function hasBattleRequestAgainst(User $user)
 {
     // possibly naive solution, other one had really ugly bugs
     $cnt1 = BattleRequest::where('challenger_id', $this->id)->where('challenged_id', $user->id)->count();
     $cnt2 = BattleRequest::where('challenged_id', $this->id)->where('challenger_id', $user->id)->count();
     return $cnt1 > 0 || $cnt2 > 0;
 }