| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | <?phpnamespace JMS\Serializer\Tests\Handler;use JMS\Serializer\Handler\DateHandler;use JMS\Serializer\JsonDeserializationVisitor;use JMS\Serializer\SerializationContext;use JMS\Serializer\VisitorInterface;class DateHandlerTest extends \PHPUnit_Framework_TestCase{    /**     * @var DateHandler     */    private $handler;    /**     * @var \DateTimeZone     */    private $timezone;    public function setUp()    {        $this->handler = new DateHandler();        $this->timezone = new \DateTimeZone('UTC');    }    public function getParams()    {        return [            [['Y-m-d']],            [['Y-m-d', '', 'Y-m-d|']],            [['Y-m-d', '', 'Y']],        ];    }    /**     * @dataProvider getParams     * @param array $params     */    public function testSerializeDate(array $params)    {        $context = $this->getMockBuilder(SerializationContext::class)->getMock();        $visitor = $this->getMockBuilder(VisitorInterface::class)->getMock();        $visitor->method('visitString')->with('2017-06-18');        $datetime = new \DateTime('2017-06-18 14:30:59', $this->timezone);        $type = ['name' => 'DateTime', 'params' => $params];        $this->handler->serializeDateTime($visitor, $datetime, $type, $context);    }    public function testTimePartGetsRemoved()    {        $visitor = $this->getMockBuilder(JsonDeserializationVisitor::class)            ->disableOriginalConstructor()            ->getMock();        $type = ['name' => 'DateTime', 'params' => ['Y-m-d', '', 'Y-m-d|']];        $this->assertEquals(            \DateTime::createFromFormat('Y-m-d|', '2017-06-18', $this->timezone),            $this->handler->deserializeDateTimeFromJson($visitor, '2017-06-18', $type)        );    }    public function testTimePartGetsPreserved()    {        $visitor = $this->getMockBuilder(JsonDeserializationVisitor::class)            ->disableOriginalConstructor()            ->getMock();        $expectedDateTime = \DateTime::createFromFormat('Y-m-d', '2017-06-18', $this->timezone);        // if the test is executed exactly at midnight, it might not detect a possible failure since the time component will be "00:00:00        // I know, this is a bit paranoid        if ($expectedDateTime->format("H:i:s") === "00:00:00") {            sleep(1);            $expectedDateTime = \DateTime::createFromFormat('Y-m-d', '2017-06-18', $this->timezone);        }        // no custom deserialization format specified        $type = ['name' => 'DateTime', 'params' => ['Y-m-d']];        $this->assertEquals(            $expectedDateTime,            $this->handler->deserializeDateTimeFromJson($visitor, '2017-06-18', $type)        );        // custom deserialization format specified        $type = ['name' => 'DateTime', 'params' => ['Y-m-d', '', 'Y-m-d']];        $this->assertEquals(            $expectedDateTime,            $this->handler->deserializeDateTimeFromJson($visitor, '2017-06-18', $type)        );    }    public function testTimeZoneGetsPreservedWithUnixTimestamp()    {        $visitor = $this->getMockBuilder(JsonDeserializationVisitor::class)            ->disableOriginalConstructor()            ->getMock();        $timestamp = time();        $timezone = 'Europe/Brussels';        $type = ['name' => 'DateTime', 'params' => ['U', $timezone]];        $expectedDateTime = \DateTime::createFromFormat('U', $timestamp);        $expectedDateTime->setTimezone(new \DateTimeZone($timezone));        $actualDateTime = $this->handler->deserializeDateTimeFromJson($visitor, $timestamp, $type);        $this->assertEquals(            $expectedDateTime->format(\DateTime::RFC3339),            $actualDateTime->format(\DateTime::RFC3339)        );    }    public function testImmutableTimeZoneGetsPreservedWithUnixTimestamp()    {        $visitor = $this->getMockBuilder(JsonDeserializationVisitor::class)            ->disableOriginalConstructor()            ->getMock();        $timestamp = time();        $timezone = 'Europe/Brussels';        $type = ['name' => 'DateTimeImmutable', 'params' => ['U', $timezone]];        $expectedDateTime = \DateTime::createFromFormat('U', $timestamp);        $expectedDateTime->setTimezone(new \DateTimeZone($timezone));        $actualDateTime = $this->handler->deserializeDateTimeImmutableFromJson($visitor, $timestamp, $type);        $this->assertEquals(            $expectedDateTime->format(\DateTime::RFC3339),            $actualDateTime->format(\DateTime::RFC3339)        );    }}
 |