Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 2
CRAP
86.54% covered (warning)
86.54%
45 / 52
AbstractDatePartsSolarSplitter
0.00% covered (danger)
0.00%
0 / 1
33.33% covered (danger)
33.33%
1 / 3
16.62
86.54% covered (warning)
86.54%
45 / 52
 fromUnixTime
0.00% covered (danger)
0.00%
0 / 1
6.02
91.67% covered (success)
91.67%
22 / 24
 toUnixTime
0.00% covered (danger)
0.00%
0 / 1
9.46
82.14% covered (warning)
82.14%
23 / 28
 getAllFragmentSizes
100.00% covered (success)
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);
}