strtoupper($v)); self::assertSame('hello', $result); } public function testCallableSideEffectIsExecuted(): void { $called = false; Tap::value('anything', function () use (&$called): void { $called = true; }); self::assertTrue($called); } public function testCallableReceivesTheValue(): void { $received = null; Tap::value(42, function (int $v) use (&$received): void { $received = $v; }); self::assertSame(42, $received); } public function testReturnValueOfCallableIsDiscarded(): void { $result = Tap::value('original', fn() => 'ignored'); self::assertSame('original', $result); } public function testWorksWithObjects(): void { $obj = new \stdClass(); $result = Tap::value($obj, fn($v) => null); self::assertSame($obj, $result); } public function testWorksWithNull(): void { $result = Tap::value(null, fn($v) => 'ignored'); self::assertNull($result); } }