112 lines
3.7 KiB
PHP
112 lines
3.7 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\String\Tests;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\ErrorHandler\ErrorHandler;
|
|
use Symfony\Component\String\LazyString;
|
|
|
|
class LazyStringTest extends TestCase
|
|
{
|
|
public function testLazyString()
|
|
{
|
|
$count = 0;
|
|
$s = LazyString::fromCallable(function () use (&$count) {
|
|
return ++$count;
|
|
});
|
|
|
|
$this->assertSame(0, $count);
|
|
$this->assertSame('1', (string) $s);
|
|
$this->assertSame(1, $count);
|
|
}
|
|
|
|
/**
|
|
* @runInSeparateProcess
|
|
*/
|
|
public function testReturnTypeError()
|
|
{
|
|
ErrorHandler::register();
|
|
|
|
$s = LazyString::fromCallable(fn () => []);
|
|
|
|
$this->expectException(\TypeError::class);
|
|
$this->expectExceptionMessageMatches('{^Return value of .*\{closure.*\}\(\) passed to '.preg_quote(LazyString::class).'::fromCallable\(\) must be of the type string, array returned\.$}');
|
|
|
|
(string) $s;
|
|
}
|
|
|
|
public function testLazyCallable()
|
|
{
|
|
$count = 0;
|
|
$s = LazyString::fromCallable([function () use (&$count) {
|
|
return new class($count) {
|
|
private int $count;
|
|
|
|
public function __construct(int &$count)
|
|
{
|
|
$this->count = &$count;
|
|
}
|
|
|
|
public function __invoke()
|
|
{
|
|
return ++$this->count;
|
|
}
|
|
};
|
|
}]);
|
|
|
|
$this->assertSame(0, $count);
|
|
$this->assertSame('1', (string) $s);
|
|
$this->assertSame(1, $count);
|
|
$this->assertSame('1', (string) $s); // ensure the value is memoized
|
|
$this->assertSame(1, $count);
|
|
}
|
|
|
|
public function testFromStringable()
|
|
{
|
|
$this->assertInstanceOf(LazyString::class, LazyString::fromStringable('abc'));
|
|
$this->assertSame('abc', (string) LazyString::fromStringable('abc'));
|
|
$this->assertSame('1', (string) LazyString::fromStringable(true));
|
|
$this->assertSame('', (string) LazyString::fromStringable(false));
|
|
$this->assertSame('123', (string) LazyString::fromStringable(123));
|
|
$this->assertSame('123.456', (string) LazyString::fromStringable(123.456));
|
|
$this->assertStringContainsString('hello', (string) LazyString::fromStringable(new \Exception('hello')));
|
|
}
|
|
|
|
public function testResolve()
|
|
{
|
|
$this->assertSame('abc', LazyString::resolve('abc'));
|
|
$this->assertSame('1', LazyString::resolve(true));
|
|
$this->assertSame('', LazyString::resolve(false));
|
|
$this->assertSame('123', LazyString::resolve(123));
|
|
$this->assertSame('123.456', LazyString::resolve(123.456));
|
|
$this->assertStringContainsString('hello', LazyString::resolve(new \Exception('hello')));
|
|
}
|
|
|
|
public function testIsStringable()
|
|
{
|
|
$this->assertTrue(LazyString::isStringable('abc'));
|
|
$this->assertTrue(LazyString::isStringable(true));
|
|
$this->assertTrue(LazyString::isStringable(false));
|
|
$this->assertTrue(LazyString::isStringable(123));
|
|
$this->assertTrue(LazyString::isStringable(123.456));
|
|
$this->assertTrue(LazyString::isStringable(new \Exception('hello')));
|
|
}
|
|
|
|
public function testIsNotStringable()
|
|
{
|
|
$this->assertFalse(LazyString::isStringable(null));
|
|
$this->assertFalse(LazyString::isStringable([]));
|
|
$this->assertFalse(LazyString::isStringable(\STDIN));
|
|
$this->assertFalse(LazyString::isStringable(new \stdClass()));
|
|
}
|
|
}
|