/**
  * Leveling sequentially from very first level up to highest possible until all experiences are spent.
  * @param Experiences $experiences
  * @return Level
  */
 public function toTotalLevel(Experiences $experiences)
 {
     $currentExperiences = 0;
     $usedExperiences = 0;
     $maxLevelValue = 0;
     while ($usedExperiences + $currentExperiences <= $experiences->getValue()) {
         $level = $this->toLevel(new Experiences($currentExperiences, $this));
         if ($maxLevelValue < $level->getValue()) {
             $usedExperiences += $currentExperiences;
             $maxLevelValue = $level->getValue();
         }
         $currentExperiences++;
     }
     return new Level($maxLevelValue, $this);
 }
 /**
  * @test
  */
 public function I_can_get_experiences()
 {
     $experiences = new Experiences($value = 456, $this->getExperiencesTable(), Experiences::EXPERIENCES);
     self::assertSame($value, $experiences->getValue());
 }
 /**
  * @test
  */
 public function I_can_create_first_level_from_max_experiences_for_it_but_get_zero_back()
 {
     $experiencesTable = new ExperiencesTable(new WoundsTable());
     $experiencesForFirstLevel = new Experiences($experiencesValue = 21, $experiencesTable);
     $levelOfMainProfession = $experiencesTable->toTotalLevel($experiencesForFirstLevel);
     self::assertSame(1, $levelOfMainProfession->getValue());
     self::assertSame(0, $levelOfMainProfession->getExperiences()->getValue());
     self::assertSame(0, $levelOfMainProfession->getTotalExperiences()->getValue());
     $minimalExperiencesForSecondLevel = new Experiences($experiencesValue + 2, $experiencesTable);
     $shouldBeSecondLevel = $minimalExperiencesForSecondLevel->getLevel();
     self::assertSame(2, $shouldBeSecondLevel->getValue());
     self::assertSame($experiencesValue + 1, $shouldBeSecondLevel->getExperiences()->getValue());
     self::assertSame($experiencesValue + 1, $shouldBeSecondLevel->getTotalExperiences()->getValue());
 }