@@ -1919,8 +1919,8 @@ describe("UI components", () => {
19191919 "1 / 2 / 0 split / stack / auto" ,
19201920 "s / t sidebar / theme" ,
19211921 "a toggle AI notes" ,
1922+ "z toggle unchanged context" ,
19221923 "l / w / m lines / wrap / metadata" ,
1923- "e open file in $EDITOR" ,
19241924 "Review" ,
19251925 "/ focus file filter" ,
19261926 "c create review note" ,
@@ -2368,6 +2368,77 @@ describe("UI components", () => {
23682368 expect ( expandableFrame ) . toContain ( "▾" ) ;
23692369 } ) ;
23702370
2371+ test ( "PierreDiffView hides add-note affordances on collapsed and hunk-header rows" , async ( ) => {
2372+ const expandable = createExpandableContextDiffFile ( "meta-hover" , "meta-hover.ts" ) ;
2373+ const file = {
2374+ ...expandable . file ,
2375+ sourceFetcher : createTestSourceFetcher ( ( ) => expandable . after ) ,
2376+ } ;
2377+ const theme = resolveTheme ( "midnight" , null ) ;
2378+ const setup = await testRender (
2379+ < PierreDiffView
2380+ file = { file }
2381+ layout = "split"
2382+ theme = { theme }
2383+ width = { 120 }
2384+ selectedHunkIndex = { 0 }
2385+ scrollable = { false }
2386+ onStartUserNoteAtHunk = { ( ) => { } }
2387+ onToggleGap = { ( ) => { } }
2388+ /> ,
2389+ { width : 120 , height : 40 } ,
2390+ ) ;
2391+
2392+ try {
2393+ await act ( async ( ) => {
2394+ await setup . renderOnce ( ) ;
2395+ } ) ;
2396+
2397+ const frame = setup . captureCharFrame ( ) ;
2398+ const frameLines = frame . split ( "\n" ) ;
2399+ const collapsedY = frameLines . findIndex ( ( line ) => line . includes ( "unchanged lines" ) ) ;
2400+ const hunkHeaderY = frameLines . findIndex ( ( line ) => line . includes ( "@@" ) ) ;
2401+ const codeY = frameLines . findIndex ( ( line ) => line . includes ( "line 5 modified" ) ) ;
2402+ expect ( collapsedY ) . toBeGreaterThanOrEqual ( 0 ) ;
2403+ expect ( hunkHeaderY ) . toBeGreaterThanOrEqual ( 0 ) ;
2404+ expect ( codeY ) . toBeGreaterThanOrEqual ( 0 ) ;
2405+
2406+ await act ( async ( ) => {
2407+ await setup . mockMouse . moveTo ( 4 , collapsedY ) ;
2408+ await setup . renderOnce ( ) ;
2409+ } ) ;
2410+ expect ( setup . captureCharFrame ( ) ) . not . toContain ( "[+]" ) ;
2411+
2412+ await act ( async ( ) => {
2413+ await setup . mockMouse . moveTo ( 4 , hunkHeaderY ) ;
2414+ await setup . renderOnce ( ) ;
2415+ } ) ;
2416+ expect ( setup . captureCharFrame ( ) ) . not . toContain ( "[+]" ) ;
2417+
2418+ let codeHoverFrame = "" ;
2419+ for ( const y of [ codeY , codeY + 1 ] ) {
2420+ for ( const x of [ 4 , 16 , 48 , 76 ] ) {
2421+ await act ( async ( ) => {
2422+ await setup . mockMouse . moveTo ( x , y ) ;
2423+ await setup . renderOnce ( ) ;
2424+ } ) ;
2425+ codeHoverFrame = setup . captureCharFrame ( ) ;
2426+ if ( codeHoverFrame . includes ( "[+]" ) ) {
2427+ break ;
2428+ }
2429+ }
2430+ if ( codeHoverFrame . includes ( "[+]" ) ) {
2431+ break ;
2432+ }
2433+ }
2434+ expect ( codeHoverFrame ) . toContain ( "[+]" ) ;
2435+ } finally {
2436+ await act ( async ( ) => {
2437+ setup . renderer . destroy ( ) ;
2438+ } ) ;
2439+ }
2440+ } ) ;
2441+
23712442 test ( "PierreDiffView toggles a collapsed gap when clicked" , async ( ) => {
23722443 const expandable = createExpandableContextDiffFile ( "expand-click" , "expand-click.ts" ) ;
23732444 const file = {
0 commit comments