@@ -193,4 +193,144 @@ function (ServerRequestInterface $request, $next) use (&$receivedRequests) {
193193 $ receivedRequests
194194 );
195195 }
196+
197+ public function provideUncommonMiddlewareArrayFormats ()
198+ {
199+ return array (
200+ array (
201+ function () {
202+ $ sequence = '' ;
203+
204+ // Numeric index gap
205+ return array (
206+ 0 => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
207+ $ sequence .= 'A ' ;
208+
209+ return $ next ($ request );
210+ },
211+ 2 => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
212+ $ sequence .= 'B ' ;
213+
214+ return $ next ($ request );
215+ },
216+ 3 => function () use (&$ sequence ) {
217+ return new Response (200 , array (), $ sequence . 'C ' );
218+ },
219+ );
220+ },
221+ 'ABC ' ,
222+ ),
223+ array (
224+ function () {
225+ $ sequence = '' ;
226+
227+ // Reversed numeric indexes
228+ return array (
229+ 2 => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
230+ $ sequence .= 'A ' ;
231+
232+ return $ next ($ request );
233+ },
234+ 1 => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
235+ $ sequence .= 'B ' ;
236+
237+ return $ next ($ request );
238+ },
239+ 0 => function () use (&$ sequence ) {
240+ return new Response (200 , array (), $ sequence . 'C ' );
241+ },
242+ );
243+ },
244+ 'ABC ' ,
245+ ),
246+ array (
247+ function () {
248+ $ sequence = '' ;
249+
250+ // Associative array
251+ return array (
252+ 'middleware1 ' => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
253+ $ sequence .= 'A ' ;
254+
255+ return $ next ($ request );
256+ },
257+ 'middleware2 ' => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
258+ $ sequence .= 'B ' ;
259+
260+ return $ next ($ request );
261+ },
262+ 'middleware3 ' => function () use (&$ sequence ) {
263+ return new Response (200 , array (), $ sequence . 'C ' );
264+ },
265+ );
266+ },
267+ 'ABC ' ,
268+ ),
269+ array (
270+ function () {
271+ $ sequence = '' ;
272+
273+ // Associative array with empty or trimmable string keys
274+ return array (
275+ '' => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
276+ $ sequence .= 'A ' ;
277+
278+ return $ next ($ request );
279+ },
280+ ' ' => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
281+ $ sequence .= 'B ' ;
282+
283+ return $ next ($ request );
284+ },
285+ ' ' => function () use (&$ sequence ) {
286+ return new Response (200 , array (), $ sequence . 'C ' );
287+ },
288+ );
289+ },
290+ 'ABC ' ,
291+ ),
292+ array (
293+ function () {
294+ $ sequence = '' ;
295+
296+ // Mixed array keys
297+ return array (
298+ '' => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
299+ $ sequence .= 'A ' ;
300+
301+ return $ next ($ request );
302+ },
303+ 0 => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
304+ $ sequence .= 'B ' ;
305+
306+ return $ next ($ request );
307+ },
308+ 'foo ' => function (ServerRequestInterface $ request , $ next ) use (&$ sequence ) {
309+ $ sequence .= 'C ' ;
310+
311+ return $ next ($ request );
312+ },
313+ 2 => function () use (&$ sequence ) {
314+ return new Response (200 , array (), $ sequence . 'D ' );
315+ },
316+ );
317+ },
318+ 'ABCD ' ,
319+ ),
320+ );
321+ }
322+
323+ /**
324+ * @dataProvider provideUncommonMiddlewareArrayFormats
325+ */
326+ public function testUncommonMiddlewareArrayFormats ($ middlewareFactory , $ expectedSequence )
327+ {
328+ $ request = new ServerRequest ('GET ' , 'https://example.com/ ' );
329+ $ middlewareStack = new MiddlewareRunner ($ middlewareFactory ());
330+
331+ /** @var ResponseInterface $response */
332+ $ response = Block \await ($ middlewareStack ($ request ), Factory::create ());
333+
334+ $ this ->assertSame ($ expectedSequence , (string ) $ response ->getBody ());
335+ }
196336}
0 commit comments