/**
  * @test
  * @dataProvider provideOriginalActivityTime
  * @param Time $originalActivityTime
  * @param int $hoursPerDay
  * @param Time $expectedAdjusted
  */
 public function I_can_use_it(Time $originalActivityTime, $hoursPerDay, Time $expectedAdjusted)
 {
     $bonusAdjustmentByTimeTable = new BonusAdjustmentByTimeTable(new TimeTable());
     $originalActivityTimeBonusValue = $originalActivityTime->getBonus()->getValue();
     $adjustedTime = $bonusAdjustmentByTimeTable->adjustBy($originalActivityTime, $hoursPerDay, true);
     self::assertSame($originalActivityTimeBonusValue, $originalActivityTime->getBonus()->getValue(), 'Original activity should remains untouched');
     self::assertSame($expectedAdjusted->getIn($adjustedTime->getUnit())->getValue(), $adjustedTime->getValue(), 'Was checking ' . $originalActivityTime->getValue() . ' ' . $originalActivityTime->getUnit() . '(s)' . ' adjusted by ' . $hoursPerDay . ' hour(s) per day');
 }
 /**
  * Warning! Only activity with unlimited maximal time can get bonus by slowing down, other activities can get only malus by speeding up.
  * @param Time $originalActivityTime
  * @param int $hoursPerDay
  * @param bool $activityIsNotLimitedByTime = false
  * @return Time
  * @throws \DrdPlus\Tables\Measurements\Time\Exceptions\CanNotProlongActivityPerDayWithLimitedTime
  * @throws \DrdPlus\Tables\Measurements\Time\Exceptions\NotApplicableOnShorterThanDay
  * @throws \DrdPlus\Tables\Measurements\Time\Exceptions\UnexpectedHoursPerDayForTimeBonusAdjustment
  * @throws \DrdPlus\Tables\Partials\Exceptions\RequiredColumnNotFound
  * @throws \Granam\Integer\Tools\Exceptions\WrongParameterType
  * @throws \Granam\Integer\Tools\Exceptions\ValueLostOnCast
  */
 public function adjustBy(Time $originalActivityTime, $hoursPerDay, $activityIsNotLimitedByTime = false)
 {
     $inDays = $originalActivityTime->findDays();
     if ($inDays !== null && $inDays->getValue() < 1 || $inDays === null && $originalActivityTime->findMonths() === null && $originalActivityTime->findYears() === null) {
         throw new Exceptions\NotApplicableOnShorterThanDay('Only at least one day of activity can be adjusted by change of hours of such activity, got ' . $originalActivityTime->getValue() . ' ' . $originalActivityTime->getUnit() . '(s)');
     }
     if (!$activityIsNotLimitedByTime && $hoursPerDay > Time::HOURS_PER_DAY) {
         throw new Exceptions\CanNotProlongActivityPerDayWithLimitedTime('Got request to prolong activity by ' . $hoursPerDay . ' hours per day with original activity time ' . $originalActivityTime->getValue() . ' ' . $originalActivityTime->getUnit() . '(s)');
     }
     $bonusAdjustment = $this->getBonusAdjustmentForHoursPerDay($hoursPerDay);
     $finalBonusValue = $originalActivityTime->getBonus()->getValue() + $bonusAdjustment;
     $finalBonus = new TimeBonus($finalBonusValue, $this->timeTable);
     $finalTime = $finalBonus->findTime($originalActivityTime->getUnit());
     if ($finalTime !== null) {
         return $finalTime;
     }
     return $finalBonus->getTime();
 }
 /**
  * @test
  * @dataProvider provideUnsupportedUnitToYearsConversion
  * @expectedException \DrdPlus\Tables\Measurements\Time\Exceptions\CanNotConvertTimeToUnit
  * @param $value
  * @param $unit
  */
 public function I_got_null_on_find_and_exception_on_get_of_unsupported_to_years_conversion($value, $unit)
 {
     $timeTable = new TimeTable();
     $time = new Time($value, $unit, $timeTable);
     try {
         self::assertNull($time->findYears());
     } catch (\Exception $exception) {
         self::fail('No exception expected so far, got ' . $exception->getTraceAsString());
     }
     $time->getYears();
 }