instance = new ModifyingClass(); ModifyingAspect::reset(); } public function testAfterReturningOriginalValueDoesNotModifyResult(): void { ModifyingAspect::$modifier = fn($result) => $result; $result = $this->instance->getValue(); $this->assertEquals(42, $result); } public function testAfterCanModifyIntegerResult(): void { ModifyingAspect::$modifier = fn($result) => $result * 2; $result = $this->instance->getValue(); $this->assertEquals(84, $result); } public function testAfterCanModifyStringResult(): void { ModifyingAspect::$modifier = fn($result) => strtoupper($result); $result = $this->instance->getString(); $this->assertEquals('ORIGINAL', $result); } public function testAfterCanIncrementIntegerResult(): void { ModifyingAspect::$modifier = fn($result) => $result + 100; $result = $this->instance->getValue(); $this->assertEquals(142, $result); } public function testAfterCanModifyArrayResult(): void { ModifyingAspect::$modifier = fn($result) => array_merge($result, ['added' => 'new']); $result = $this->instance->getArray(); $this->assertEquals(['key' => 'value', 'added' => 'new'], $result); } public function testAfterCanFilterArrayResult(): void { ModifyingAspect::$modifier = fn($result) => array_filter($result, fn($v) => $v !== 'value'); $result = $this->instance->getArray(); $this->assertEquals([], $result); } public function testMultipleCallsWithDifferentModifiers(): void { ModifyingAspect::$modifier = fn($result) => $result * 2; $result1 = $this->instance->getValue(); ModifyingAspect::$modifier = fn($result) => $result + 10; $result2 = $this->instance->getValue(); $this->assertEquals(84, $result1); $this->assertEquals(52, $result2); } public function testNoModifierReturnsOriginalValue(): void { // ModifyingAspect::$modifier is null, so after() returns original value $result = $this->instance->getValue(); $this->assertEquals(42, $result); } }