<?php

namespace GuzzleHttp\Tests\Command\Guzzle;

use GuzzleHttp\Command\Guzzle\SchemaFormatter;
use PHPUnit\Framework\TestCase;

/**
 * @covers \GuzzleHttp\Command\Guzzle\SchemaFormatter
 */
class SchemaFormatterTest extends TestCase
{
    public function dateTimeProvider()
    {
        $dateUtc = 'October 13, 2012 16:15:46 UTC';
        $dateOffset = 'October 13, 2012 10:15:46 -06:00';
        $expectedDateTime = '2012-10-13T16:15:46Z';

        return [
            ['foo', 'does-not-exist', 'foo'],
            [$dateUtc, 'date-time', $expectedDateTime],
            [$dateUtc, 'date-time-http', 'Sat, 13 Oct 2012 16:15:46 GMT'],
            [$dateUtc, 'date', '2012-10-13'],
            [$dateUtc, 'timestamp', strtotime($dateUtc)],
            [new \DateTime($dateUtc), 'timestamp', strtotime($dateUtc)],
            [$dateUtc, 'time', '16:15:46'],
            [strtotime($dateUtc), 'time', '16:15:46'],
            [strtotime($dateUtc), 'timestamp', strtotime($dateUtc)],
            ['true', 'boolean-string', 'true'],
            [true, 'boolean-string', 'true'],
            ['false', 'boolean-string', 'false'],
            [false, 'boolean-string', 'false'],
            ['1350144946', 'date-time', $expectedDateTime],
            [1350144946, 'date-time', $expectedDateTime],
            [$dateOffset, 'date-time', $expectedDateTime],
        ];
    }

    /**
     * @dataProvider dateTimeProvider
     */
    public function testFilters($value, $format, $result)
    {
        $this->assertEquals($result, (new SchemaFormatter())->format($format, $value));
    }

    public function testValidatesDateTimeInput()
    {
        $this->expectException(\InvalidArgumentException::class);
        (new SchemaFormatter())->format('date-time', false);
    }

    public function testEnsuresTimestampsAreIntegers()
    {
        $t = time();
        $result = (new SchemaFormatter())->format('timestamp', $t);
        $this->assertSame($t, $result);
        $this->assertIsInt($result);
    }
}
