@@ -186,6 +186,59 @@ class SarifReportTest {
186186 assert (codeFlowPhysicalLocations[0 ].region.startColumn == 5 )
187187 }
188188
189+ @Test
190+ fun testMinimizationRemovesDuplicates () {
191+ mockUtMethodNames()
192+
193+ val mockUtExecution = Mockito .mock(UtExecution ::class .java, Mockito .RETURNS_DEEP_STUBS )
194+ Mockito .`when `(mockUtExecution.result).thenReturn(UtImplicitlyThrownException (NullPointerException (), false ))
195+
196+ val testCases = listOf (
197+ UtTestCase (mockUtMethod, listOf (mockUtExecution)),
198+ UtTestCase (mockUtMethod, listOf (mockUtExecution)) // duplicate
199+ )
200+
201+ val report = SarifReport (
202+ testCases = testCases,
203+ generatedTestsCode = " " ,
204+ sourceFindingEmpty
205+ ).createReport().toSarif()
206+
207+ assert (report.runs.first().results.size == 1 ) // no duplicates
208+ }
209+
210+ @Test
211+ fun testMinimizationChoosesShortestCodeFlow () {
212+ mockUtMethodNames()
213+
214+ val mockNPE1 = Mockito .mock(NullPointerException ::class .java)
215+ val mockNPE2 = Mockito .mock(NullPointerException ::class .java)
216+
217+ val mockUtExecution1 = Mockito .mock(UtExecution ::class .java, Mockito .RETURNS_DEEP_STUBS )
218+ val mockUtExecution2 = Mockito .mock(UtExecution ::class .java, Mockito .RETURNS_DEEP_STUBS )
219+ Mockito .`when `(mockUtExecution1.result).thenReturn(UtImplicitlyThrownException (mockNPE1, false ))
220+ Mockito .`when `(mockUtExecution2.result).thenReturn(UtImplicitlyThrownException (mockNPE2, false ))
221+
222+ val stackTraceElement1 = StackTraceElement (" Main" , " main" , " Main.java" , 3 )
223+ val stackTraceElement2 = StackTraceElement (" Main" , " main" , " Main.java" , 7 )
224+ Mockito .`when `(mockNPE1.stackTrace).thenReturn(arrayOf(stackTraceElement1))
225+ Mockito .`when `(mockNPE2.stackTrace).thenReturn(arrayOf(stackTraceElement1, stackTraceElement2))
226+
227+ val testCases = listOf (
228+ UtTestCase (mockUtMethod, listOf (mockUtExecution1)),
229+ UtTestCase (mockUtMethod, listOf (mockUtExecution2)) // duplicate with longer stack trace
230+ )
231+
232+ val report = SarifReport (
233+ testCases = testCases,
234+ generatedTestsCode = " " ,
235+ sourceFindingEmpty
236+ ).createReport().toSarif()
237+
238+ assert (report.runs.first().results.size == 1 ) // no duplicates
239+ assert (report.runs.first().results.first().totalCodeFlowLocations() == 1 ) // with shorter stack trace
240+ }
241+
189242 // internal
190243
191244 private val mockUtMethod = Mockito .mock(UtMethod ::class .java, Mockito .RETURNS_DEEP_STUBS )
0 commit comments