writeLine("Message: {$message}"); return 0; } // ConsoleInput and ConsoleOutput public function bothConsoleParams(ConsoleInput $input, ConsoleOutput $output): int { $output->writeLine("Args: " . json_encode($input->getArguments())); return 0; } // Mixed: Output, user param, user param with default public function mixed(ConsoleOutput $output, string $name, int $count = 3): int { $output->writeLine("Name: {$name}, Count: {$count}"); return 0; } // All types mixed public function allMixed( ConsoleInput $input, string $operation, ConsoleOutput $output, int $iterations = 1 ): int { $output->writeLine("Operation: {$operation}, Iterations: {$iterations}"); return 0; } } echo "Testing optional ConsoleInput/ConsoleOutput parameters\n"; echo "=====================================================\n\n"; $resolver = new CommandParameterResolver(new MethodSignatureAnalyzer()); $command = new TestCommand(); $output = new ConsoleOutput(); // Test 1: No parameters echo "Test 1: No parameters\n"; $method = new ReflectionMethod(TestCommand::class, 'noParams'); $params = $resolver->resolveParameters($method, [], null, $output); echo "Resolved params count: " . count($params) . "\n"; $result = $method->invokeArgs($command, $params); echo "Result: {$result}\n\n"; // Test 2: Only user parameters echo "Test 2: Only user parameters (name: 'John')\n"; $method = new ReflectionMethod(TestCommand::class, 'userParamsOnly'); $params = $resolver->resolveParameters($method, ['John'], null, $output); echo "Resolved params count: " . count($params) . "\n"; $result = $method->invokeArgs($command, $params); echo "Result: {$result}\n\n"; // Test 3: ConsoleOutput + user param echo "Test 3: ConsoleOutput + user param (message: 'Custom')\n"; $method = new ReflectionMethod(TestCommand::class, 'outputOnly'); $params = $resolver->resolveParameters($method, ['Custom'], null, $output); echo "Resolved params count: " . count($params) . "\n"; $result = $method->invokeArgs($command, $params); echo "Result: {$result}\n\n"; // Test 4: Both ConsoleInput and ConsoleOutput echo "Test 4: Both ConsoleInput and ConsoleOutput\n"; $input = new ConsoleInput(['arg1', 'arg2'], $output); $method = new ReflectionMethod(TestCommand::class, 'bothConsoleParams'); $params = $resolver->resolveParameters($method, [], $input, $output); echo "Resolved params count: " . count($params) . "\n"; $result = $method->invokeArgs($command, $params); echo "Result: {$result}\n\n"; // Test 5: Mixed parameters echo "Test 5: Mixed parameters (name: 'Alice', count: 5)\n"; $method = new ReflectionMethod(TestCommand::class, 'mixed'); $params = $resolver->resolveParameters($method, ['Alice', '5'], null, $output); echo "Resolved params count: " . count($params) . "\n"; $result = $method->invokeArgs($command, $params); echo "Result: {$result}\n\n"; // Test 6: All types mixed echo "Test 6: All types mixed (operation: 'process', iterations: 10)\n"; $input = new ConsoleInput(['process', '10'], $output); $method = new ReflectionMethod(TestCommand::class, 'allMixed'); $params = $resolver->resolveParameters($method, ['process', '10'], $input, $output); echo "Resolved params count: " . count($params) . "\n"; $result = $method->invokeArgs($command, $params); echo "Result: {$result}\n\n"; echo "✅ All tests completed successfully!\n";