@@ -282,18 +282,18 @@ const setupTest = (testFn: (page: PromptInputTokenModePage) => Promise<void>) =>
282282 await page . keys ( [ 'Home' ] ) ;
283283 await page . pause ( 100 ) ;
284284
285- // Select forward: "hi " then the reference then " bye"
285+ // Select "hi " (3 characters)
286286 for ( let i = 0 ; i < 3 ; i ++ ) {
287287 await page . keys ( [ 'Shift' , 'ArrowRight' , 'Shift' ] ) ;
288288 }
289289 expect ( await page . getSelectedText ( ) ) . toBe ( 'hi ' ) ;
290290
291- // One more should jump over the reference
291+ // One more jumps over the atomic reference
292292 await page . keys ( [ 'Shift' , 'ArrowRight' , 'Shift' ] ) ;
293293 await page . pause ( 100 ) ;
294294 const selected = await page . getSelectedText ( ) ;
295295 expect ( selected ) . toContain ( 'hi ' ) ;
296- expect ( selected ) . toContain ( 'John Smith' ) ;
296+ expect ( selected ) . toContain ( 'Jane Smith' ) ;
297297 } )
298298 ) ;
299299
@@ -309,24 +309,24 @@ const setupTest = (testFn: (page: PromptInputTokenModePage) => Promise<void>) =>
309309 await page . keys ( [ ' ' , 'b' , 'y' , 'e' ] ) ;
310310 await page . pause ( 200 ) ;
311311
312- // Cursor is at end. Select backward : "bye " then reference then " hi"
312+ // Select backward from end: " bye" (4 chars)
313313 for ( let i = 0 ; i < 4 ; i ++ ) {
314314 await page . keys ( [ 'Shift' , 'ArrowLeft' , 'Shift' ] ) ;
315315 }
316316 const afterText = await page . getSelectedText ( ) ;
317317 expect ( afterText ) . toBe ( ' bye' ) ;
318318
319- // One more should jump over the reference
319+ // One more jumps over the atomic reference
320320 await page . keys ( [ 'Shift' , 'ArrowLeft' , 'Shift' ] ) ;
321321 await page . pause ( 100 ) ;
322322 const selected = await page . getSelectedText ( ) ;
323- expect ( selected ) . toContain ( 'John Smith' ) ;
323+ expect ( selected ) . toContain ( 'Jane Smith' ) ;
324324 expect ( selected ) . toContain ( ' bye' ) ;
325325 } )
326326 ) ;
327327
328328 test (
329- 'shift+left then shift+right reversal deselects reference without flipping selection ' ,
329+ 'shift+left then shift+right reversal deselects correctly around reference ' ,
330330 setupTest ( async page => {
331331 await page . focusInput ( ) ;
332332 await page . keys ( [ 'h' , 'e' , 'l' , 'l' , 'o' , ' ' ] ) ;
@@ -337,27 +337,121 @@ const setupTest = (testFn: (page: PromptInputTokenModePage) => Promise<void>) =>
337337 await page . keys ( [ ' ' , 'w' , 'o' , 'r' , 'l' , 'd' ] ) ;
338338 await page . pause ( 200 ) ;
339339
340- // Place cursor in middle of "world" (3 chars from end)
340+ // Place cursor in middle of "world"
341341 await page . keys ( [ 'ArrowLeft' , 'ArrowLeft' , 'ArrowLeft' ] ) ;
342342 await page . pause ( 100 ) ;
343343
344- // Select backward past " wo", over reference, into "hello"
345- for ( let i = 0 ; i < 7 ; i ++ ) {
344+ // Select backward: " wo" (3) + reference (1) + "hello " (6) = 10 presses
345+ for ( let i = 0 ; i < 10 ; i ++ ) {
346346 await page . keys ( [ 'Shift' , 'ArrowLeft' , 'Shift' ] ) ;
347347 }
348348 await page . pause ( 100 ) ;
349349 const backwardSel = await page . getSelectedText ( ) ;
350- expect ( backwardSel ) . toContain ( 'John Smith' ) ;
350+ expect ( backwardSel ) . toContain ( 'hello' ) ;
351+ expect ( backwardSel ) . toContain ( 'Jane Smith' ) ;
351352
352- // Now reverse with shift+right — deselect back through "hello " and the reference
353- for ( let i = 0 ; i < 7 ; i ++ ) {
353+ // Reverse with shift+right — deselect everything
354+ for ( let i = 0 ; i < 10 ; i ++ ) {
354355 await page . keys ( [ 'Shift' , 'ArrowRight' , 'Shift' ] ) ;
355356 }
356357 await page . pause ( 100 ) ;
357358
358- // Selection should be collapsed or very small — not extending the wrong end
359359 const afterReverse = await page . getSelectedText ( ) ;
360- expect ( afterReverse . length ) . toBeLessThanOrEqual ( 1 ) ;
360+ expect ( afterReverse ) . toBe ( '' ) ;
361+ } )
362+ ) ;
363+ } ) ;
364+
365+ ( isReact18 ? describe : describe . skip ) ( 'PromptInput token mode - delete key with references' , ( ) => {
366+ test (
367+ 'delete key removes reference token ahead of cursor' ,
368+ setupTest ( async page => {
369+ await page . focusInput ( ) ;
370+ await page . keys ( [ '@' ] ) ;
371+ await page . pause ( 200 ) ;
372+ await page . keys ( [ 'ArrowDown' , 'Enter' ] ) ;
373+ await page . pause ( 200 ) ;
374+ await page . keys ( [ ' ' , 'h' , 'i' ] ) ;
375+ await page . pause ( 100 ) ;
376+
377+ // Move cursor to start (before the reference)
378+ await page . keys ( [ 'Home' ] ) ;
379+ await page . pause ( 100 ) ;
380+
381+ // Delete should remove the reference
382+ await page . keys ( [ 'Delete' ] ) ;
383+ await page . pause ( 200 ) ;
384+
385+ const text = await page . getEditorText ( ) ;
386+ expect ( text . trim ( ) ) . toBe ( 'hi' ) ;
387+ expect ( text ) . not . toContain ( 'Jane Smith' ) ;
388+ } )
389+ ) ;
390+
391+ test (
392+ 'backspace removes reference token behind cursor' ,
393+ setupTest ( async page => {
394+ await page . focusInput ( ) ;
395+ await page . keys ( [ 'h' , 'i' , ' ' ] ) ;
396+ await page . keys ( [ '@' ] ) ;
397+ await page . pause ( 200 ) ;
398+ await page . keys ( [ 'ArrowDown' , 'Enter' ] ) ;
399+ await page . pause ( 200 ) ;
400+
401+ // Cursor is right after the reference — backspace removes it
402+ await page . keys ( [ 'Backspace' ] ) ;
403+ await page . pause ( 200 ) ;
404+
405+ const text = await page . getEditorText ( ) ;
406+ expect ( text . trim ( ) ) . toBe ( 'hi' ) ;
407+ expect ( text ) . not . toContain ( 'Jane Smith' ) ;
408+ expect ( await page . getCaretOffset ( ) ) . toBe ( 3 ) ;
409+ } )
410+ ) ;
411+ } ) ;
412+
413+ ( isReact18 ? describe : describe . skip ) ( 'PromptInput token mode - trigger dismissal' , ( ) => {
414+ test (
415+ 'space on empty trigger dismisses it' ,
416+ setupTest ( async page => {
417+ await page . focusInput ( ) ;
418+ await page . keys ( [ 'h' , 'i' , ' ' , '@' ] ) ;
419+ await page . pause ( 200 ) ;
420+ await expect ( page . isMenuOpen ( ) ) . resolves . toBe ( true ) ;
421+
422+ await page . keys ( [ ' ' ] ) ;
423+ await page . pause ( 300 ) ;
424+
425+ await expect ( page . isMenuOpen ( ) ) . resolves . toBe ( false ) ;
426+ const text = await page . getEditorText ( ) ;
427+ expect ( text ) . toContain ( 'hi' ) ;
428+ expect ( text ) . toContain ( '@' ) ;
429+ } )
430+ ) ;
431+ } ) ;
432+
433+ ( isReact18 ? describe : describe . skip ) ( 'PromptInput token mode - multiple references' , ( ) => {
434+ test (
435+ 'insert two references with text between them' ,
436+ setupTest ( async page => {
437+ await page . focusInput ( ) ;
438+ await page . keys ( [ '@' ] ) ;
439+ await page . pause ( 200 ) ;
440+ await page . keys ( [ 'ArrowDown' , 'Enter' ] ) ;
441+ await page . pause ( 200 ) ;
442+
443+ await page . keys ( [ ' ' , 'a' , 'n' , 'd' , ' ' ] ) ;
444+
445+ await page . keys ( [ '@' ] ) ;
446+ await page . pause ( 200 ) ;
447+ // Select second option
448+ await page . keys ( [ 'ArrowDown' , 'ArrowDown' , 'Enter' ] ) ;
449+ await page . pause ( 200 ) ;
450+
451+ const text = await page . getEditorText ( ) ;
452+ expect ( text ) . toContain ( 'Jane Smith' ) ;
453+ expect ( text ) . toContain ( 'and' ) ;
454+ expect ( text ) . toContain ( 'Bob' ) ;
361455 } )
362456 ) ;
363457} ) ;
0 commit comments