@@ -11,10 +11,11 @@ import {
1111 parseCommandHeaders ,
1212 parseInternedStrings ,
1313} from "../../__tests__/drawlistDecode.js" ;
14- import { type VNode , createDrawlistBuilder } from "../../index.js" ;
14+ import { type VNode , createDrawlistBuilder , ui } from "../../index.js" ;
1515import { layout } from "../../layout/layout.js" ;
1616import { commitVNodeTree } from "../../runtime/commit.js" ;
1717import { createInstanceIdAllocator } from "../../runtime/instance.js" ;
18+ import { createTestRenderer } from "../../testing/renderer.js" ;
1819import { renderToDrawlist } from "../renderToDrawlist.js" ;
1920
2021const decoder = new TextDecoder ( ) ;
@@ -296,6 +297,47 @@ function expectBlob(frame: ParsedFrame, blobIndex: number): TextRunBlob {
296297 return blob ;
297298}
298299
300+ describe ( "renderer text - wrap newline handling" , ( ) => {
301+ test ( "wrap=true renders explicit newline lines on separate rows" , ( ) => {
302+ const renderer = createTestRenderer ( { viewport : { cols : 20 , rows : 4 } } ) ;
303+ const frame = renderer . render (
304+ ui . text ( "First line\nSecond line" , {
305+ id : "wrapped" ,
306+ wrap : true ,
307+ } ) ,
308+ ) ;
309+ const lines = frame . toText ( ) . split ( "\n" ) ;
310+
311+ assert . equal ( lines [ 0 ] ?. includes ( "First line" ) , true ) ;
312+ assert . equal ( lines [ 1 ] ?. includes ( "Second line" ) , true ) ;
313+
314+ const wrapped = frame . findById ( "wrapped" ) ;
315+ assert . notEqual ( wrapped , null ) ;
316+ assert . equal ( wrapped ?. rect . y , 0 ) ;
317+ assert . ok ( ( wrapped ?. rect . h ?? 0 ) >= 2 ) ;
318+ } ) ;
319+
320+ test ( "wrap=true preserves blank lines from double newlines" , ( ) => {
321+ const renderer = createTestRenderer ( { viewport : { cols : 20 , rows : 6 } } ) ;
322+ const frame = renderer . render (
323+ ui . text ( "Alpha\n\nOmega" , {
324+ id : "wrapped-blank" ,
325+ wrap : true ,
326+ } ) ,
327+ ) ;
328+ const lines = frame . toText ( ) . split ( "\n" ) ;
329+
330+ assert . equal ( lines [ 0 ] ?. includes ( "Alpha" ) , true ) ;
331+ assert . equal ( ( lines [ 1 ] ?? "" ) . trim ( ) , "" ) ;
332+ assert . equal ( lines [ 2 ] ?. includes ( "Omega" ) , true ) ;
333+
334+ const wrapped = frame . findById ( "wrapped-blank" ) ;
335+ assert . notEqual ( wrapped , null ) ;
336+ assert . equal ( wrapped ?. rect . y , 0 ) ;
337+ assert . ok ( ( wrapped ?. rect . h ?? 0 ) >= 3 ) ;
338+ } ) ;
339+ } ) ;
340+
299341describe ( "renderer text - transform ANSI styling" , ( ) => {
300342 const gradientTransform = ( ) : string => "\u001b[31mA\u001b[32mB\u001b[0m" ;
301343
0 commit comments