p2 project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
3.5 KiB

2 months ago
<?php
declare(strict_types=1);
/**
* This file is part of the Carbon package.
*
* (c) Brian Nesbitt <brian@nesbot.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Tests\Factory;
use Carbon\Callback;
use Carbon\CarbonInterface;
use Carbon\CarbonInterval;
use Carbon\CarbonPeriod;
use Carbon\CarbonTimeZone;
use DateInterval;
use DatePeriod;
use DateTimeImmutable;
use DateTimeZone;
use Tests\AbstractTestCase;
class CallbackTest extends AbstractTestCase
{
public function testGetReflectionFunction(): void
{
$closure = static fn () => 4;
$callback = Callback::fromClosure($closure);
$function = $callback->getReflectionFunction();
$this->assertSame($function, $callback->getReflectionFunction());
$this->assertSame($closure, $function->getClosure());
}
public function testCall(): void
{
$closure = static function (CarbonInterface $date, CarbonInterval $interval, string $text, ?CarbonTimeZone $timezone, CarbonPeriod $period): string {
return implode(', ', [$text, $date->monthName, $interval->seconds, $timezone?->getName(), $period->getRecurrences()]);
};
$callback = Callback::fromClosure($closure);
$result = $callback->call(
new DateTimeImmutable('2024-01-18'),
new DateInterval('PT1M30S'),
'foo',
new DateTimeZone('CET'),
new DatePeriod(
new DateTimeImmutable('2012-07-01T00:00:00'),
new DateInterval('P1D'),
7,
),
);
$this->assertSame('foo, January, 30, CET, 7', $result);
$result = $callback->call(
interval: new DateInterval('PT1M21S'),
date: new DateTimeImmutable('2024-02-18'),
period: new DatePeriod(
new DateTimeImmutable('2012-07-01T00:00:00'),
new DateInterval('P1D'),
4,
),
timezone: null,
text: 'bar',
);
$this->assertSame('bar, February, 21, , 4', $result);
}
public function testParameter(): void
{
$closure = static function (CarbonInterface $date, CarbonInterval $interval, string $text, ?CarbonTimeZone $timezone, CarbonPeriod $period): string {
return implode(', ', [$text, $date->monthName, $interval->seconds, $timezone?->getName(), $period->getRecurrences()]);
};
$interval = new DateInterval('P1D');
$this->assertSame($interval, Callback::parameter($closure, $interval));
$this->assertSame($interval, Callback::parameter($closure, $interval, 0));
$this->assertSame($interval, Callback::parameter($closure, $interval, 5));
$this->assertSame($interval, Callback::parameter($closure, $interval, 'diff'));
$this->assertSame($interval, Callback::parameter($closure, $interval, 'date'));
$this->assertSame($interval, Callback::parameter($interval, $interval, 1));
$this->assertSame($interval, Callback::parameter(static fn (FooBar $foo) => 42, $interval));
$result = Callback::parameter($closure, $interval, 'interval');
$this->assertSame(CarbonInterval::class, $result::class);
$this->assertSame('1 day', $result->forHumans());
$result = Callback::parameter($closure, $interval, 1);
$this->assertSame(CarbonInterval::class, $result::class);
$this->assertSame('1 day', $result->forHumans());
}
}