assertEquals(10, $result); } /** * Filter 훅이 여러 개일 때 체이닝이 올바르게 동작하는지 테스트합니다. */ public function test_filter_hook_chains_multiple_filters(): void { // 첫 번째 필터 (우선순위 10) HookManager::addFilter('test.chain', function ($value) { return $value + 10; }, 10); // 두 번째 필터 (우선순위 20) HookManager::addFilter('test.chain', function ($value) { return $value * 2; }, 20); // Filter 적용: (5 + 10) * 2 = 30 $result = HookManager::applyFilters('test.chain', 5); $this->assertEquals(30, $result); } /** * Action 타입 훅이 반환값을 무시하는지 테스트합니다. */ public function test_action_hook_ignores_return_value(): void { $executed = false; // Action 훅 등록 HookManager::addAction('test.action', function () use (&$executed) { $executed = true; return 'should be ignored'; }); // Action 실행 HookManager::doAction('test.action'); $this->assertTrue($executed); } /** * getSubscribedHooks()에서 type 필드가 생략되면 기본값 'action'이 적용되는지 테스트합니다. */ public function test_default_type_is_action(): void { $executed = false; // 기본 타입(action)으로 훅 등록 HookManager::addAction('test.default', function () use (&$executed) { $executed = true; }); // 훅 실행 HookManager::doAction('test.default'); // 등록된 훅이 실행되었는지 확인 $this->assertTrue($executed); } /** * Filter 훅이 추가 인수를 올바르게 전달하는지 테스트합니다. */ public function test_filter_hook_passes_additional_arguments(): void { HookManager::addFilter('test.args', function ($value, $multiplier, $addition) { return ($value * $multiplier) + $addition; }); // (10 * 3) + 5 = 35 $result = HookManager::applyFilters('test.args', 10, 3, 5); $this->assertEquals(35, $result); } }