@@ -6,13 +6,13 @@ import {createRequire} from 'node:module';
66import FakeTimers from '@sinonjs/fake-timers' ;
77import { stub } from 'sinon' ;
88import test from 'ava' ;
9- import React , { useEffect , useState } from 'react' ;
9+ import React , { type ReactNode , useEffect , useState } from 'react' ;
1010import ansiEscapes from 'ansi-escapes' ;
1111import stripAnsi from 'strip-ansi' ;
1212import boxen from 'boxen' ;
1313import delay from 'delay' ;
1414import { render , Box , Text , useInput } from '../src/index.js' ;
15- import { type RenderResult } from '../src/ink.js' ;
15+ import { type RenderMetrics } from '../src/ink.js' ;
1616import createStdout from './helpers/create-stdout.js' ;
1717
1818const require = createRequire ( import . meta. url ) ;
@@ -300,28 +300,18 @@ test.serial('throttle renders to maxFps', t => {
300300} ) ;
301301
302302test . serial ( 'outputs renderTime when onRender is passed' , async t => {
303- const clock = FakeTimers . install ( ) ; // Controls timers + Date.now()
304- let lastRenderTime = - 1 ;
305- let tickTime = 100 ;
303+ const renderTimes : number [ ] = [ ] ;
306304 const funcObj = {
307- onRender ( renderResult : RenderResult ) {
308- const { renderTime} = renderResult ;
309- lastRenderTime = renderTime ;
305+ onRender ( metrics : RenderMetrics ) {
306+ const { renderTime} = metrics ;
307+ renderTimes . push ( renderTime ) ;
310308 } ,
311309 } ;
312310
313311 const onRenderStub = stub ( funcObj , 'onRender' ) . callThrough ( ) ;
314312
315- function Nested ( { text} ) {
316- clock . tick ( tickTime ) ;
317- return < Text > { text } </ Text > ;
318- }
319-
320- function Test ( ) {
313+ function Test ( { children} : { readonly children ?: ReactNode } ) {
321314 const [ text , setText ] = useState ( 'Test' ) ;
322- useEffect ( ( ) => {
323- clock . tick ( tickTime ) ;
324- } ) ;
325315
326316 useInput ( input => {
327317 setText ( input ) ;
@@ -330,7 +320,7 @@ test.serial('outputs renderTime when onRender is passed', async t => {
330320 return (
331321 < Box borderStyle = "round" >
332322 < Text > { text } </ Text >
333- < Nested text = { text } />
323+ { children }
334324 </ Box >
335325 ) ;
336326 }
@@ -341,24 +331,32 @@ test.serial('outputs renderTime when onRender is passed', async t => {
341331 stdin,
342332 } ) ;
343333
344- t . is ( onRenderStub . callCount , 2 ) ;
334+ // Initial render
335+ t . is ( onRenderStub . callCount , 1 ) ;
336+ t . true ( renderTimes [ 0 ] >= 0 ) ;
345337
338+ // Manual rerender
346339 onRenderStub . resetHistory ( ) ;
347- tickTime = 200 ;
348- rerender ( < Test /> ) ;
349-
350- t . is ( onRenderStub . callCount , 2 ) ;
340+ rerender (
341+ < Test >
342+ < Text > Updated</ Text >
343+ </ Test > ,
344+ ) ;
345+ await delay ( 100 ) ;
346+ t . is ( onRenderStub . callCount , 1 ) ;
347+ t . true ( renderTimes [ 1 ] >= 0 ) ;
351348
349+ // Internal state update via useInput
352350 onRenderStub . resetHistory ( ) ;
353351 emitReadable ( stdin , 'a' ) ;
354352 await delay ( 100 ) ;
355-
356- t . is ( lastRenderTime , 0 ) ;
357353 t . is ( onRenderStub . callCount , 1 ) ;
354+ t . true ( renderTimes [ 2 ] >= 0 ) ;
358355
359- unmount ( ) ;
356+ // Verify all renders were tracked
357+ t . is ( renderTimes . length , 3 ) ;
360358
361- clock . uninstall ( ) ;
359+ unmount ( ) ;
362360} ) ;
363361
364362test . serial ( 'no throttled renders after unmount' , t => {
0 commit comments