@@ -202,6 +202,40 @@ public function __invoke(ServerRequestInterface $request)
202202 $ this ->assertEquals ('{"name":"Alice"} ' , (string ) $ response ->getBody ());
203203 }
204204
205+ public function testCallableReturnsCallableForClassNameWithSubclassMappedFromFactoryWithClassDependency ()
206+ {
207+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
208+
209+ $ controller = new class (new Response ()) {
210+ private $ response ;
211+
212+ public function __construct (ResponseInterface $ response )
213+ {
214+ $ this ->response = $ response ;
215+ }
216+
217+ public function __invoke ()
218+ {
219+ return $ this ->response ;
220+ }
221+ };
222+
223+ $ container = new Container ([
224+ ResponseInterface::class => function (\stdClass $ dto ) {
225+ return new Response (200 , [], json_encode ($ dto ));
226+ },
227+ \stdClass::class => function () { return (object )['name ' => 'Alice ' ]; }
228+ ]);
229+
230+ $ callable = $ container ->callable (get_class ($ controller ));
231+ $ this ->assertInstanceOf (\Closure::class, $ callable );
232+
233+ $ response = $ callable ($ request );
234+ $ this ->assertInstanceOf (ResponseInterface::class, $ response );
235+ $ this ->assertEquals (200 , $ response ->getStatusCode ());
236+ $ this ->assertEquals ('{"name":"Alice"} ' , (string ) $ response ->getBody ());
237+ }
238+
205239 public function testCtorThrowsWhenMapContainsInvalidInteger ()
206240 {
207241 $ this ->expectException (\BadMethodCallException::class);
@@ -242,6 +276,51 @@ public function testCallableReturnsCallableThatThrowsWhenFactoryReturnsInvalidIn
242276 $ callable ($ request );
243277 }
244278
279+ public function testCallableReturnsCallableThatThrowsWhenFactoryRequiresInvalidClassName ()
280+ {
281+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
282+
283+ $ container = new Container ([
284+ \stdClass::class => function (self $ instance ) { return $ instance ; }
285+ ]);
286+
287+ $ callable = $ container ->callable (\stdClass::class);
288+
289+ $ this ->expectException (\BadMethodCallException::class);
290+ $ this ->expectExceptionMessage ('Class self not found ' );
291+ $ callable ($ request );
292+ }
293+
294+ public function testCallableReturnsCallableThatThrowsWhenFactoryRequiresUntypedArgument ()
295+ {
296+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
297+
298+ $ container = new Container ([
299+ \stdClass::class => function ($ data ) { return $ data ; }
300+ ]);
301+
302+ $ callable = $ container ->callable (\stdClass::class);
303+
304+ $ this ->expectException (\BadMethodCallException::class);
305+ $ this ->expectExceptionMessage ('Argument 1 ($data) of {closure}() has no type ' );
306+ $ callable ($ request );
307+ }
308+
309+ public function testCallableReturnsCallableThatThrowsWhenFactoryRequiresRecursiveClass ()
310+ {
311+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
312+
313+ $ container = new Container ([
314+ \stdClass::class => function (\stdClass $ data ) { return $ data ; }
315+ ]);
316+
317+ $ callable = $ container ->callable (\stdClass::class);
318+
319+ $ this ->expectException (\BadMethodCallException::class);
320+ $ this ->expectExceptionMessage ('Argument 1 ($data) of {closure}() is recursive ' );
321+ $ callable ($ request );
322+ }
323+
245324 public function testCallableReturnsCallableThatThrowsWhenFactoryIsRecursive ()
246325 {
247326 $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
0 commit comments