@@ -98,24 +98,115 @@ public function testGetFiles(): void
9898
9999 static ::assertSame ('a.txt ' , $ fileA ->name );
100100 static ::assertSame (File::STATUS_REMOVED , $ fileA ->status );
101+ static ::assertSame (0 , $ fileA ->additions );
102+ static ::assertSame (1 , $ fileA ->deletions );
103+ static ::assertSame (1 , $ fileA ->changes );
101104
102105 $ fileB = $ files ->get ('b.txt ' );
103106
104107 static ::assertNotNull ($ fileB );
105108
106109 static ::assertSame ('b2 ' , $ fileB ->getContent ());
107110 static ::assertSame (File::STATUS_ADDED , $ fileB ->status );
111+ static ::assertSame (1 , $ fileB ->additions );
112+ static ::assertSame (0 , $ fileB ->deletions );
113+ static ::assertSame (1 , $ fileB ->changes );
114+ static ::assertNotEmpty ($ fileB ->patch );
108115
109116 $ fileC = $ files ->get ('c.txt ' );
110117
111118 static ::assertNotNull ($ fileC );
112119
113120 static ::assertSame ('c ' , $ fileC ->getContent ());
114121 static ::assertSame (File::STATUS_ADDED , $ fileC ->status );
122+ static ::assertSame (1 , $ fileC ->additions );
123+ static ::assertSame (0 , $ fileC ->deletions );
124+ static ::assertSame (1 , $ fileC ->changes );
115125
116126 $ fileModified = $ files ->get ('modified.txt ' );
117127 static ::assertNotNull ($ fileModified );
118128 static ::assertSame (File::STATUS_MODIFIED , $ fileModified ->status );
129+ static ::assertSame (1 , $ fileModified ->additions );
130+ static ::assertSame (1 , $ fileModified ->deletions );
131+ static ::assertSame (2 , $ fileModified ->changes );
132+ static ::assertNotEmpty ($ fileModified ->patch );
133+ }
134+
135+ public function testDiffStatsForSingleAddedFile (): void
136+ {
137+ $ pr = new LocalPullRequest ($ this ->tmpDir , 'feature ' , 'main ' );
138+
139+ $ files = $ pr ->getFiles ();
140+
141+ static ::assertCount (1 , $ files );
142+
143+ $ fileB = $ files ->get ('b.txt ' );
144+ static ::assertNotNull ($ fileB );
145+
146+ static ::assertSame (File::STATUS_ADDED , $ fileB ->status );
147+ static ::assertSame (1 , $ fileB ->additions );
148+ static ::assertSame (0 , $ fileB ->deletions );
149+ static ::assertSame (1 , $ fileB ->changes );
150+ static ::assertNotEmpty ($ fileB ->patch );
151+ }
152+
153+ public function testDiffStatsForMultilineChanges (): void
154+ {
155+ (new Process (['git ' , 'checkout ' , '-b ' , 'multiline ' ], $ this ->tmpDir ))->mustRun ();
156+
157+ file_put_contents ($ this ->tmpDir . '/multi.txt ' , "line1 \nline2 \nline3 \nline4 \nline5 \n" );
158+ (new Process (['git ' , 'add ' , 'multi.txt ' ], $ this ->tmpDir ))->mustRun ();
159+ (new Process (['git ' , 'commit ' , '-m ' , 'add multiline file ' ], $ this ->tmpDir ))->mustRun ();
160+
161+ (new Process (['git ' , 'checkout ' , '-b ' , 'multiline-edit ' ], $ this ->tmpDir ))->mustRun ();
162+
163+ file_put_contents ($ this ->tmpDir . '/multi.txt ' , "line1 \nchanged2 \nline3 \nchanged4 \nline5 \nnewline6 \n" );
164+ (new Process (['git ' , 'add ' , 'multi.txt ' ], $ this ->tmpDir ))->mustRun ();
165+ (new Process (['git ' , 'commit ' , '-m ' , 'edit multiline file ' ], $ this ->tmpDir ))->mustRun ();
166+
167+ $ pr = new LocalPullRequest ($ this ->tmpDir , 'multiline-edit ' , 'multiline ' );
168+
169+ $ files = $ pr ->getFiles ();
170+
171+ static ::assertCount (1 , $ files );
172+
173+ $ file = $ files ->get ('multi.txt ' );
174+ static ::assertNotNull ($ file );
175+
176+ static ::assertSame (File::STATUS_MODIFIED , $ file ->status );
177+ static ::assertSame (3 , $ file ->additions );
178+ static ::assertSame (2 , $ file ->deletions );
179+ static ::assertSame (5 , $ file ->changes );
180+
181+ static ::assertStringContainsString ('+changed2 ' , $ file ->patch );
182+ static ::assertStringContainsString ('-line2 ' , $ file ->patch );
183+ static ::assertStringContainsString ('+newline6 ' , $ file ->patch );
184+ }
185+
186+ public function testPatchContentForDeletedFile (): void
187+ {
188+ $ pr = new LocalPullRequest ($ this ->tmpDir , 'feature2 ' , 'main ' );
189+
190+ $ files = $ pr ->getFiles ();
191+
192+ $ fileA = $ files ->get ('a.txt ' );
193+ static ::assertNotNull ($ fileA );
194+ static ::assertSame (File::STATUS_REMOVED , $ fileA ->status );
195+ static ::assertStringContainsString ('-a ' , $ fileA ->patch );
196+ }
197+
198+ public function testPatchContentForModifiedFile (): void
199+ {
200+ $ pr = new LocalPullRequest ($ this ->tmpDir , 'feature2 ' , 'main ' );
201+
202+ $ files = $ pr ->getFiles ();
203+
204+ $ fileModified = $ files ->get ('modified.txt ' );
205+ static ::assertNotNull ($ fileModified );
206+
207+ static ::assertStringContainsString ('-a ' , $ fileModified ->patch );
208+ static ::assertStringContainsString ('+b ' , $ fileModified ->patch );
209+ static ::assertStringContainsString ('@@ ' , $ fileModified ->patch );
119210 }
120211
121212 public function testGetSingleFile (): void
0 commit comments