Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
60.00% covered (warning)
60.00%
3 / 5
CRAP
93.75% covered (success)
93.75%
30 / 32
StandardDateFragmented
0.00% covered (danger)
0.00%
0 / 1
60.00% covered (warning)
60.00%
3 / 5
14.05
93.75% covered (success)
93.75%
30 / 32
 map
0.00% covered (danger)
0.00%
0 / 1
3.00
92.86% covered (success)
92.86%
13 / 14
 determineMonth
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
5 / 5
 determineDay
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 determineDayOfWeek
0.00% covered (danger)
0.00%
0 / 1
4.05
85.71% covered (warning)
85.71%
6 / 7
 determineWeekIndex
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
<?php
namespace Popy\Calendar\Parser\ResultMapper;
use Popy\Calendar\ValueObject\DateParts;
use Popy\Calendar\Parser\DateLexerResult;
use Popy\Calendar\Parser\ResultMapperInterface;
use Popy\Calendar\ValueObject\DateRepresentationInterface;
use Popy\Calendar\ValueObject\DateFragmentedRepresentationInterface;
/**
 * Maps standard format month/day/week symbols to
 * DateFragmentedRepresentationInterface fields.
 */
class StandardDateFragmented implements ResultMapperInterface
{
    /**
     * @inheritDoc
     */
    public function map(DateLexerResult $parts, DateRepresentationInterface $date)
    {
        if (!$date instanceof DateFragmentedRepresentationInterface) {
            return;
        }
        $dateParts = $date
            ->getDateParts()
            ->withFragments([
                $this->determineMonth($parts),
                $this->determineDay($parts),
            ])
            ->withTransversals([
                $parts->get('o') === null ? null : (int)$parts->get('o'),
                $this->determineWeekIndex($parts),
                $this->determineDayOfWeek($parts),
            ])
        ;
        return $date->withDateParts($dateParts);
    }
    /**
     * Determine month (0 indexed).
     *
     * @param DateLexerResult $parts
     *
     * @return integer
     */
    protected function determineMonth(DateLexerResult $parts)
    {
        // m   Numeric representation of a month, with leading zeros   01 through 12
        // n   Numeric representation of a month, without leading zeros
        if (null !== $m = $parts->getFirst('m', 'n')) {
            return (int)$m - 1;
        }
        // F   A full textual representation of a month, such as January or March
        // M   A short textual representation of a month, three letters
        if (null !== $m = $parts->getFirst('F', 'M')) {
            return (int)$m;
        }
    }
    /**
     * Determine day (0 indexed).
     *
     * @param DateLexerResult $parts
     *
     * @return integer|null
     */
    protected function determineDay(DateLexerResult $parts)
    {
        // d   Day of the month, 2 digits with leading zeros   01 to 31
        // j   Day of the month without leading zeros  1 to 31
        if (null !== $d = $parts->getFirst('j', 'd')) {
            return (int)$d - 1;
        }
    }
    /**
     * Determine day of week (0 indexed, starts by monday)
     *
     * @param DateLexerResult $parts
     *
     * @return integer|null
     */
    protected function determineDayOfWeek(DateLexerResult $parts)
    {
        // D   A textual representation of a day, three letters
        // l (lowercase 'L')   A full textual representation of the day of the week
        if (null !== $w = $parts->getFirst('D', 'l')) {
            return (int)$w;
        }
        // N   ISO-8601 numeric representation of the day of the week (added in PHP 5.1.0) 1 (for Monday) through 7 (for Sunday)
        if (null !== $w = $parts->get('N')) {
            return (int)$w - 1;
        }
        // w   Numeric representation of the day of the week   0 (for Sunday) through 6 (for Saturday)
        if (null !== $w = $parts->get('w')) {
            return ((int)$w + 6) % 7;
        }
    }
    /**
     * Determine ISO week index from iso week number.
     *
     * @param DateLexerResult $parts
     *
     * @return integer|null
     */
    protected function determineWeekIndex(DateLexerResult $parts)
    {
        if (null === $w = $parts->get('W')) {
            return;
        }
        return intval($w) - 1;
    }
}