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.
93 lines
2.7 KiB
93 lines
2.7 KiB
<?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\CommonTraits;
|
|
|
|
use Carbon\Carbon;
|
|
use Carbon\CarbonImmutable;
|
|
use Carbon\CarbonInterval;
|
|
use Carbon\CarbonPeriod;
|
|
use Generator;
|
|
use PHPUnit\Framework\Attributes\DataProvider;
|
|
use Tests\AbstractTestCaseWithOldNow;
|
|
|
|
class MacroContextNestingTest extends AbstractTestCaseWithOldNow
|
|
{
|
|
public static function dataForMacroableClasses(): Generator
|
|
{
|
|
yield [Carbon::class, Carbon::parse('2010-05-23'), null];
|
|
yield [CarbonImmutable::class, CarbonImmutable::parse('2010-05-23'), null];
|
|
yield [CarbonInterval::class, CarbonInterval::make('P1M6D'), (string) (CarbonInterval::seconds(0))];
|
|
yield [CarbonPeriod::class, CarbonPeriod::create('2010-08-23', '2010-10-02'), null];
|
|
}
|
|
|
|
#[DataProvider('dataForMacroableClasses')]
|
|
public function testMacroContextNesting(string $class, mixed $sample, ?string $reference): void
|
|
{
|
|
$macro1 = 'macro'.(mt_rand(100, 999999) * 2);
|
|
$class::macro($macro1, static function () {
|
|
return self::this()->__toString();
|
|
});
|
|
|
|
$macro2 = 'macro'.(mt_rand(100, 999999) * 2 + 1);
|
|
$class::macro($macro2, static function () use ($macro1, $sample) {
|
|
$dates = [self::this()->$macro1()];
|
|
|
|
$dates[] = $sample->$macro1();
|
|
$dates[] = self::this()->$macro1();
|
|
|
|
return $dates;
|
|
});
|
|
|
|
$dates = $class::$macro2();
|
|
|
|
$this->assertSame([
|
|
$reference ?: (string) (new $class()),
|
|
(string) $sample,
|
|
$reference ?: (string) (new $class()),
|
|
], $dates);
|
|
}
|
|
|
|
/**
|
|
* @param class-string $class
|
|
*/
|
|
#[DataProvider('dataForMacroableClasses')]
|
|
public function testMacroContextDetectionNesting(string $class, mixed $sample)
|
|
{
|
|
$macro1 = 'macro'.(mt_rand(100, 999999) * 2);
|
|
$class::macro($macro1, static function () {
|
|
$context = self::context();
|
|
|
|
return $context ? \get_class($context) : 'null';
|
|
});
|
|
|
|
$macro2 = 'macro'.(mt_rand(100, 999999) * 2 + 1);
|
|
$class::macro($macro2, static function () use ($macro1, $sample) {
|
|
$dump = [self::$macro1(), self::this()->$macro1()];
|
|
|
|
$dump[] = $sample->$macro1();
|
|
$dump[] = self::$macro1();
|
|
|
|
return $dump;
|
|
});
|
|
|
|
$dump = $class::$macro2();
|
|
|
|
$this->assertSame([
|
|
'null',
|
|
$class,
|
|
$class,
|
|
'null',
|
|
], $dump);
|
|
}
|
|
}
|
|
|