diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-25 15:24:55 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-26 00:20:05 +0900 |
| commit | d4cdccb8de8758bd46a12283f8df90e020327b99 (patch) | |
| tree | cd7c928cff2615a0bd599cf1f9e09c9852c399d7 /crates/shirabe/src/event_dispatcher | |
| parent | 8117e5450693d19726da877bce8aacf5c7aa53af (diff) | |
| download | php-shirabe-d4cdccb8de8758bd46a12283f8df90e020327b99.tar.gz php-shirabe-d4cdccb8de8758bd46a12283f8df90e020327b99.tar.zst php-shirabe-d4cdccb8de8758bd46a12283f8df90e020327b99.zip | |
test: port 70 perforce/repository/downloader/installer/dispatcher tests
Port perforce (36), locker (10), composer_repository (7), installation_manager
(6), file_downloader (5), and event_dispatcher (6) tests via the mock infra.
Fix production porting bugs surfaced en route: BufferIO::get_output look-behind
regex, ComposerRepository list-form package iteration and initialize dispatch,
gethostname and spl_autoload_functions shims; add EventDispatcher get_listeners
test seam.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/event_dispatcher')
| -rw-r--r-- | crates/shirabe/src/event_dispatcher/event_dispatcher.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs index 3ef27f8..2441be6 100644 --- a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs +++ b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs @@ -70,6 +70,19 @@ pub struct EventDispatcher { skip_scripts: Vec<String>, previous_hash: Option<String>, previous_listeners: IndexMap<String, bool>, + /// For testing only. Mirrors PHPUnit's `getMockBuilder(EventDispatcher)->onlyMethods(['getListeners'])`: + /// when set, `get_listeners` returns this closure's result verbatim instead of resolving + /// registered listeners and package scripts. + get_listeners_override: Option<GetListenersOverride>, +} + +/// For testing only. Holds a closure standing in for an overridden `getListeners` method. +pub struct GetListenersOverride(pub Box<dyn Fn(&dyn EventInterface) -> Vec<Callable>>); + +impl std::fmt::Debug for GetListenersOverride { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("GetListenersOverride(..)") + } } impl EventDispatcher { @@ -101,9 +114,20 @@ impl EventDispatcher { skip_scripts, previous_hash: None, previous_listeners: IndexMap::new(), + get_listeners_override: None, } } + /// For testing only. Installs a closure that overrides `get_listeners`, mirroring + /// PHPUnit's `onlyMethods(['getListeners'])->will($this->returnValue(...))` / + /// `->will($this->returnCallback(...))`. + pub fn __set_get_listeners_override( + &mut self, + callback: Box<dyn Fn(&dyn EventInterface) -> Vec<Callable>>, + ) { + self.get_listeners_override = Some(GetListenersOverride(callback)); + } + /// Set whether script handlers are active or not pub fn set_run_scripts(&mut self, run_scripts: bool) -> &mut Self { self.run_scripts = run_scripts; @@ -923,6 +947,12 @@ impl EventDispatcher { /// Retrieves all listeners for a given event fn get_listeners(&mut self, event: &dyn EventInterface) -> Vec<Callable> { + // For testing only: a test may override this method, mirroring PHPUnit's + // `onlyMethods(['getListeners'])`. + if let Some(override_cb) = &self.get_listeners_override { + return override_cb.0(event); + } + let script_listeners: Vec<Callable> = if self.run_scripts { self.get_script_listeners(event) } else { |
