Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      0.00%  | 
      0 / 1  | 
              | 
      0.00%  | 
      0 / 2  | 
      CRAP |         | 
      86.54%  | 
      45 / 52  | 
     
| AbstractDatePartsSolarSplitter |         | 
      0.00%  | 
      0 / 1  | 
              | 
      33.33%  | 
      1 / 3  | 
      16.62 |         | 
      86.54%  | 
      45 / 52  | 
     
| fromUnixTime |         | 
      0.00%  | 
      0 / 1  | 
      6.02 |         | 
      91.67%  | 
      22 / 24  | 
     |||
| toUnixTime |         | 
      0.00%  | 
      0 / 1  | 
      9.46 |         | 
      82.14%  | 
      23 / 28  | 
     |||
| getAllFragmentSizes |         | 
      100.00%  | 
      1 / 1  | 
      1 | n/a  | 
      0 / 0  | 
     ||||
| <?php | |
| namespace Popy\Calendar\Converter\UnixTimeConverter; | |
| use OutOfBoundsException; | |
| use Popy\Calendar\Converter\Conversion; | |
| use Popy\Calendar\Converter\UnixTimeConverterInterface; | |
| use Popy\Calendar\ValueObject\DateSolarRepresentationInterface; | |
| use Popy\Calendar\ValueObject\DateFragmentedRepresentationInterface; | |
| abstract class AbstractDatePartsSolarSplitter implements UnixTimeConverterInterface | |
| { | |
| /** | |
| * @inheritDoc | |
| */ | |
| public function fromUnixTime(Conversion $conversion) | |
| { | |
| $input = $conversion->getTo(); | |
| if ( | |
| !$input instanceof DateFragmentedRepresentationInterface | |
| || !$input instanceof DateSolarRepresentationInterface | |
| ) { | |
| return; | |
| } | |
| $dayIndex = $input->getDayIndex(); | |
| $fragments = $resultSizes = []; | |
| foreach ($this->getAllFragmentSizes($input) as $sizes) { | |
| foreach ($sizes as $k => $size) { | |
| if ($dayIndex < $size) { | |
| $fragments[] = $k; | |
| $resultSizes[] = $size; | |
| continue 2; | |
| } | |
| $dayIndex -= $size; | |
| } | |
| throw new OutOfBoundsException( | |
| 'Input dayIndex too big for given fragment sizes' | |
| ); | |
| } | |
| $fragments[] = $dayIndex; | |
| $dateParts = $input->getDateParts() | |
| ->withFragments($fragments) | |
| ->withSizes($resultSizes) | |
| ; | |
| $conversion->setTo($input->withDateParts($dateParts)); | |
| } | |
| /** | |
| * @inheritDoc | |
| */ | |
| public function toUnixTime(Conversion $conversion) | |
| { | |
| $input = $conversion->getTo(); | |
| if ( | |
| !$input instanceof DateFragmentedRepresentationInterface | |
| || !$input instanceof DateSolarRepresentationInterface | |
| ) { | |
| return; | |
| } | |
| if (null !== $input->getDayIndex()) { | |
| return ; | |
| } | |
| $dayIndex = 0; | |
| $dateParts = $input->getDateParts(); | |
| $fragmentSizes = $this->getAllFragmentSizes($input); | |
| foreach ($dateParts->all() as $index => $value) { | |
| $value = (int)$value; | |
| if (!isset($fragmentSizes[$index])) { | |
| // No available size means we reached the final fragment | |
| $dayIndex += $value; | |
| break; | |
| } | |
| if ($value && !isset($fragmentSizes[$index][$value - 1])) { | |
| throw new OutOfBoundsException(sprintf( | |
| '%s is an index too big for fragment #%s', | |
| $value, | |
| $index | |
| )); | |
| } | |
| for ($i=0; $i < $value; $i++) { | |
| $dayIndex += $fragmentSizes[$index][$i]; | |
| } | |
| } | |
| $conversion->setTo($input->withDayIndex( | |
| $dayIndex, | |
| $input->getEraDayIndex() | |
| )); | |
| } | |
| /** | |
| * Returns an array containing, for each fragment, all its possible sizes in | |
| * days. | |
| * | |
| * For instance, for the standard gregorian calendar, should return | |
| * [ [31,28,31, ...] ] | |
| * | |
| * @param DateFragmentedRepresentationInterface $input | |
| * | |
| * @return array<array<integer>> | |
| */ | |
| abstract protected function getAllFragmentSizes(DateFragmentedRepresentationInterface $input); | |
| } |