* * Full license available in separate LICENSE file */ use Kadet\Functional as f; class MemoizedFunctionTest extends \PHPUnit\Framework\TestCase { /** @var \PHPUnit\Framework\MockObject\MockObject */ private $mock; protected function setUp(): void { $this->mock = $this->createMock(MemoizedTarget::class); } public function testCalledOnlyOnce() { $memoized = f\memoize([$this->mock, 'memoized']); $this->mock->expects($this->once())->method('memoized')->with(); for ($i = 0; $i < 10; $i++) { $memoized(); } } public function testCalledOnlyOncePerArgs() { $memoized = f\memoize([$this->mock, 'memoized']); $calls = []; $this->mock->expects($this->exactly(2))->method('memoized')->willReturnCallback( function (...$args) use (&$calls) { $calls[] = $args; } ); for ($i = 0; $i < 10; $i++) { $memoized('a'); $memoized([]); } $this->assertSame([['a'], [[]]], $calls); } } class MemoizedTarget { public function memoized() {} }