From 69b35b0c4d8cb583b389973b096f9dd2dee695c6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 2 Aug 2026 11:41:49 +0900 Subject: test(completion): port CommandCompletionTester and CompletionFunctionalTest Adds the Symfony console test helper (Tester/CommandCompletionTester) and ports every CompletionFunctionalTest data-provider entry as an individual test. The tests reproduce the PHP environment by chdir'ing into the vendored composer/ checkout (its composer.json/lock provide the installed packages, scripts and package properties the expectations reference); the Packagist-backed entries query the live repository exactly like the PHP test does. Only `exec ` is ignored: its expectations require the dev checkout's fully installed vendor/bin, which the vendored checkout does not ship. Co-Authored-By: Claude Fable 5 --- .../src/symfony/console.rs | 1 + .../src/symfony/console/tester.rs | 3 ++ .../console/tester/command_completion_tester.rs | 54 ++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 crates/shirabe-external-packages/src/symfony/console/tester.rs create mode 100644 crates/shirabe-external-packages/src/symfony/console/tester/command_completion_tester.rs (limited to 'crates/shirabe-external-packages') diff --git a/crates/shirabe-external-packages/src/symfony/console.rs b/crates/shirabe-external-packages/src/symfony/console.rs index 986c9ca8..814e53a3 100644 --- a/crates/shirabe-external-packages/src/symfony/console.rs +++ b/crates/shirabe-external-packages/src/symfony/console.rs @@ -15,6 +15,7 @@ pub mod question; pub mod signal_registry; pub mod style; pub mod terminal; +pub mod tester; pub use application::*; pub use attribute::*; diff --git a/crates/shirabe-external-packages/src/symfony/console/tester.rs b/crates/shirabe-external-packages/src/symfony/console/tester.rs new file mode 100644 index 00000000..1a7f6d0c --- /dev/null +++ b/crates/shirabe-external-packages/src/symfony/console/tester.rs @@ -0,0 +1,3 @@ +pub mod command_completion_tester; + +pub use command_completion_tester::*; diff --git a/crates/shirabe-external-packages/src/symfony/console/tester/command_completion_tester.rs b/crates/shirabe-external-packages/src/symfony/console/tester/command_completion_tester.rs new file mode 100644 index 00000000..35da1b9d --- /dev/null +++ b/crates/shirabe-external-packages/src/symfony/console/tester/command_completion_tester.rs @@ -0,0 +1,54 @@ +//! ref: composer/vendor/symfony/console/Tester/CommandCompletionTester.php + +use crate::symfony::console::command::command::Command; +use crate::symfony::console::completion::completion_input::CompletionInput; +use crate::symfony::console::completion::completion_suggestions::CompletionSuggestions; + +/// Eases the testing of command completion. +#[derive(Debug)] +pub struct CommandCompletionTester { + command: std::rc::Rc>, +} + +impl CommandCompletionTester { + pub fn new(command: std::rc::Rc>) -> Self { + Self { command } + } + + /// Create completion suggestions from input tokens. + pub fn complete(&self, input: &[&str]) -> anyhow::Result> { + let mut input: Vec = input.iter().map(|s| s.to_string()).collect(); + let current_index = input.len() as i64; + if input.last().map(String::as_str) == Some("") { + input.pop(); + } + // array_unshift($input, $this->command->getName()) + input.insert(0, self.command.borrow().get_name().unwrap_or_default()); + + let mut completion_input = CompletionInput::from_tokens(input, current_index)?; + { + let command_ref = self.command.borrow(); + let definition = command_ref.get_definition(); + completion_input.bind(&definition)?; + } + let mut suggestions = CompletionSuggestions::new(); + + self.command + .borrow() + .complete(&completion_input, &mut suggestions)?; + + let mut result: Vec = suggestions + .get_option_suggestions() + .iter() + .map(|option| format!("--{}", option.get_name())) + .collect(); + // array_map('strval', ... $suggestions->getValueSuggestions()) + result.extend( + suggestions + .get_value_suggestions() + .iter() + .map(|suggestion| suggestion.to_string()), + ); + Ok(result) + } +} -- cgit v1.3.1