Files
tez-utils-fn/tests/MemoizeTest.php
T
2026-07-26 17:27:01 +02:00

117 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Tez\Utils\Tests\Fn;
use PHPUnit\Framework\TestCase;
use Tez\Utils\Fn\Memoize;
final class MemoizeTest extends TestCase
{
public function testCallableIsExecutedOnFirstCall(): void
{
$calls = 0;
$memoized = Memoize::wrap(function (int $n) use (&$calls): int {
$calls++;
return $n * 2;
});
self::assertSame(84, $memoized(42));
self::assertSame(1, $calls);
}
public function testSameArgumentsReturnCachedValue(): void
{
$calls = 0;
$memoized = Memoize::wrap(function (int $n) use (&$calls): int {
$calls++;
return $n * 2;
});
$memoized(42);
$memoized(42);
$memoized(42);
self::assertSame(1, $calls);
}
public function testDifferentArgumentsAreComputedSeparately(): void
{
$calls = 0;
$memoized = Memoize::wrap(function (int $n) use (&$calls): int {
$calls++;
return $n * 2;
});
self::assertSame(84, $memoized(42));
self::assertSame(198, $memoized(99));
self::assertSame(2, $calls);
}
public function testNullReturnIsCachedCorrectly(): void
{
$calls = 0;
$memoized = Memoize::wrap(function () use (&$calls): ?string {
$calls++;
return null;
});
self::assertNull($memoized());
self::assertNull($memoized());
self::assertSame(1, $calls);
}
public function testFlushClearsCache(): void
{
$calls = 0;
$memoized = Memoize::wrap(function (int $n) use (&$calls): int {
$calls++;
return $n;
});
$memoized(1);
$memoized->flush();
$memoized(1);
self::assertSame(2, $calls);
}
public function testFlushDoesNotAffectSubsequentCaching(): void
{
$calls = 0;
$memoized = Memoize::wrap(function (int $n) use (&$calls): int {
$calls++;
return $n;
});
$memoized(5);
$memoized->flush();
$memoized(5);
$memoized(5);
self::assertSame(2, $calls);
}
public function testMultipleArgumentsFormUniqueKey(): void
{
$calls = 0;
$memoized = Memoize::wrap(function (int $a, int $b) use (&$calls): int {
$calls++;
return $a + $b;
});
self::assertSame(3, $memoized(1, 2));
self::assertSame(3, $memoized(1, 2));
self::assertSame(5, $memoized(2, 3));
self::assertSame(2, $calls);
}
}