@@ -35,6 +35,36 @@ function createDiffFile(): DiffFile {
3535 } ;
3636}
3737
38+ function createEmptyLineDiffFile ( ) : DiffFile {
39+ const metadata = parseDiffFromFile (
40+ {
41+ name : "empty.ts" ,
42+ contents : "function foo() {\n return 1;\n}\n" ,
43+ cacheKey : "before-empty" ,
44+ } ,
45+ {
46+ name : "empty.ts" ,
47+ contents : "function foo() {\n\n return 2;\n}\n" ,
48+ cacheKey : "after-empty" ,
49+ } ,
50+ { context : 3 } ,
51+ true ,
52+ ) ;
53+
54+ return {
55+ id : "empty" ,
56+ path : "empty.ts" ,
57+ patch : "" ,
58+ language : "typescript" ,
59+ stats : {
60+ additions : 2 ,
61+ deletions : 1 ,
62+ } ,
63+ metadata,
64+ agent : null ,
65+ } ;
66+ }
67+
3868function createMarkdownDiffFile ( ) : DiffFile {
3969 const metadata = parseDiffFromFile (
4070 {
@@ -125,6 +155,23 @@ describe("Pierre diff rows", () => {
125155 expect ( additionRow . cell . newLineNumber ) . toBe ( 1 ) ;
126156 } ) ;
127157
158+ test ( "does not produce newline characters in spans for highlighted empty lines" , async ( ) => {
159+ const file = createEmptyLineDiffFile ( ) ;
160+ const theme = resolveTheme ( "midnight" , null ) ;
161+ const highlighted = await loadHighlightedDiff ( file ) ;
162+
163+ for ( const buildRows of [ buildSplitRows , buildStackRows ] ) {
164+ const rows = buildRows ( file , highlighted , theme ) ;
165+ const allSpans = rows . flatMap ( ( row ) => {
166+ if ( row . type === "split-line" ) return [ ...row . left . spans , ...row . right . spans ] ;
167+ if ( row . type === "stack-line" ) return row . cell . spans ;
168+ return [ ] ;
169+ } ) ;
170+
171+ expect ( allSpans . every ( ( span ) => ! span . text . includes ( "\n" ) ) ) . toBe ( true ) ;
172+ }
173+ } ) ;
174+
128175 test ( "remaps Pierre markdown reds and greens away from diff-semantic hues" , async ( ) => {
129176 const file = createMarkdownDiffFile ( ) ;
130177
0 commit comments