@@ -3,7 +3,12 @@ import {
33 parseDrawTextCommands as parseDecodedDrawTextCommands ,
44 parseInternedStrings ,
55} from "../../__tests__/drawlistDecode.js" ;
6- import { type DrawlistBuilder , type VNode , createDrawlistBuilder } from "../../index.js" ;
6+ import {
7+ type DrawlistBuilder ,
8+ type VNode ,
9+ createDrawlistBuilder ,
10+ truncateWithEllipsis ,
11+ } from "../../index.js" ;
712import { layout } from "../../layout/layout.js" ;
813import { renderToDrawlist } from "../../renderer/renderToDrawlist.js" ;
914import { commitVNodeTree } from "../../runtime/commit.js" ;
@@ -242,6 +247,33 @@ describe("basic widgets render to drawlist", () => {
242247 assert . equal ( fallback . includes ( "No focus" ) , true ) ;
243248 } ) ;
244249
250+ test ( "focusAnnouncer renders nothing when both announcement and fallback are empty" , ( ) => {
251+ const commands = parseDrawTextCommands (
252+ renderBytes ( ui . focusAnnouncer ( ) , { cols : 40 , rows : 4 } , { } ) ,
253+ ) ;
254+ assert . equal ( commands . length , 0 ) ;
255+ } ) ;
256+
257+ test ( "focusAnnouncer clips long text to the available width" , ( ) => {
258+ const announcement = "Email input ready" ;
259+ const clippedAnnouncement = parseDrawTextCommands (
260+ renderBytes ( ui . focusAnnouncer ( ) , { cols : 8 , rows : 2 } , { focusAnnouncement : announcement } ) ,
261+ ) ;
262+ assert . deepEqual (
263+ clippedAnnouncement . map ( ( command ) => command . text ) ,
264+ [ truncateWithEllipsis ( announcement , 8 ) ] ,
265+ ) ;
266+
267+ const fallback = "No focus selected" ;
268+ const clippedFallback = parseDrawTextCommands (
269+ renderBytes ( ui . focusAnnouncer ( { emptyText : fallback } ) , { cols : 7 , rows : 2 } , { } ) ,
270+ ) ;
271+ assert . deepEqual (
272+ clippedFallback . map ( ( command ) => command . text ) ,
273+ [ truncateWithEllipsis ( fallback , 7 ) ] ,
274+ ) ;
275+ } ) ;
276+
245277 test ( "input renders placeholder text when value is empty" , ( ) => {
246278 const strings = parseInternedStrings (
247279 renderBytes (
0 commit comments