@@ -370,6 +370,78 @@ loader.paths('f-json-pretty-%N.html').forEach((path) => {
370370 test ( `json pretty - ${ path } ` , ( ) => loader . execute ( path ) ) ;
371371} ) ;
372372
373+ test ( 'find-first' , ( ) => {
374+ // no args: return first element unconditionally
375+ let vars = variables ( [ 'a' , 'b' , 'c' ] ) ;
376+ Core [ 'find-first' ] . apply ( [ ] , vars , CTX ) ;
377+ expect ( vars [ 0 ] . get ( ) ) . toEqual ( 'a' ) ;
378+
379+ // empty array → missing
380+ vars = variables ( [ ] ) ;
381+ Core [ 'find-first' ] . apply ( [ ] , vars , CTX ) ;
382+ expect ( vars [ 0 ] . node . isMissing ( ) ) . toBe ( true ) ;
383+
384+ // non-array → missing
385+ vars = variables ( 'not-an-array' ) ;
386+ Core [ 'find-first' ] . apply ( [ ] , vars , CTX ) ;
387+ expect ( vars [ 0 ] . node . isMissing ( ) ) . toBe ( true ) ;
388+
389+ // no args: first object element
390+ vars = variables ( [ { x : 1 } , { x : 2 } ] ) ;
391+ Core [ 'find-first' ] . apply ( [ ] , vars , CTX ) ;
392+ expect ( vars [ 0 ] . get ( ) ) . toEqual ( { x : 1 } ) ;
393+
394+ // 1 arg: find first element where path is truthy
395+ vars = variables ( [ { id : 'a' , enabled : false } , { id : 'b' , enabled : true } , { id : 'c' , enabled : true } ] ) ;
396+ Core [ 'find-first' ] . apply ( [ 'enabled' ] , vars , CTX ) ;
397+ expect ( vars [ 0 ] . get ( ) ) . toEqual ( { id : 'b' , enabled : true } ) ;
398+
399+ // 1 arg: none match → missing
400+ vars = variables ( [ { id : 'a' , enabled : false } , { id : 'b' } ] ) ;
401+ Core [ 'find-first' ] . apply ( [ 'enabled' ] , vars , CTX ) ;
402+ expect ( vars [ 0 ] . node . isMissing ( ) ) . toBe ( true ) ;
403+ } ) ;
404+
405+ loader . paths ( 'f-find-first-%N.html' ) . forEach ( ( path ) => {
406+ test ( `find-first - ${ path } ` , ( ) => loader . execute ( path ) ) ;
407+ } ) ;
408+
409+ test ( 'find-last' , ( ) => {
410+ // no args: return last element unconditionally
411+ let vars = variables ( [ 'a' , 'b' , 'c' ] ) ;
412+ Core [ 'find-last' ] . apply ( [ ] , vars , CTX ) ;
413+ expect ( vars [ 0 ] . get ( ) ) . toEqual ( 'c' ) ;
414+
415+ // empty array → missing
416+ vars = variables ( [ ] ) ;
417+ Core [ 'find-last' ] . apply ( [ ] , vars , CTX ) ;
418+ expect ( vars [ 0 ] . node . isMissing ( ) ) . toBe ( true ) ;
419+
420+ // non-array → missing
421+ vars = variables ( 'not-an-array' ) ;
422+ Core [ 'find-last' ] . apply ( [ ] , vars , CTX ) ;
423+ expect ( vars [ 0 ] . node . isMissing ( ) ) . toBe ( true ) ;
424+
425+ // no args: last object element
426+ vars = variables ( [ { x : 1 } , { x : 2 } ] ) ;
427+ Core [ 'find-last' ] . apply ( [ ] , vars , CTX ) ;
428+ expect ( vars [ 0 ] . get ( ) ) . toEqual ( { x : 2 } ) ;
429+
430+ // 1 arg: find last element where path is truthy
431+ vars = variables ( [ { id : 'a' , enabled : true } , { id : 'b' , enabled : true } , { id : 'c' , enabled : false } ] ) ;
432+ Core [ 'find-last' ] . apply ( [ 'enabled' ] , vars , CTX ) ;
433+ expect ( vars [ 0 ] . get ( ) ) . toEqual ( { id : 'b' , enabled : true } ) ;
434+
435+ // 1 arg: none match → missing
436+ vars = variables ( [ { id : 'a' , enabled : false } , { id : 'b' } ] ) ;
437+ Core [ 'find-last' ] . apply ( [ 'enabled' ] , vars , CTX ) ;
438+ expect ( vars [ 0 ] . node . isMissing ( ) ) . toBe ( true ) ;
439+ } ) ;
440+
441+ loader . paths ( 'f-find-last-%N.html' ) . forEach ( ( path ) => {
442+ test ( `find-last - ${ path } ` , ( ) => loader . execute ( path ) ) ;
443+ } ) ;
444+
373445test ( 'key-by' , ( ) => {
374446 let vars = variables ( [ { id : 1 } ] ) ;
375447 Core [ 'key-by' ] . apply ( [ ] , vars , CTX ) ;
0 commit comments