@@ -7,6 +7,7 @@ import org.evomaster.client.java.instrumentation.shared.ObjectiveNaming
77import org.evomaster.core.search.service.IdMapper
88import org.evomaster.core.sql.DatabaseExecution
99import org.evomaster.core.sql.SqlExecutionInfo
10+ import org.evomaster.core.sql.schema.TableId
1011import org.junit.jupiter.api.Assertions.*
1112import org.junit.jupiter.api.Test
1213
@@ -126,36 +127,77 @@ class FitnessValueTest {
126127 }
127128
128129 @Test
129- fun testAggregatedFailedWhereQueriesExcludesBlankEntries () {
130+ fun testAggregatedFailedWhereQueriesOnlyFromExecutionsWithFailedWhere () {
130131 val fv = FitnessValue (1.0 )
131132
132- val execution = DatabaseExecution (
133+ val tableId = TableId (" foo" )
134+
135+ // Execution that has a failing WHERE clause — its queries should be collected
136+ val executionWithFailedWhere = DatabaseExecution (
137+ queriedData = emptyMap(),
138+ updatedData = emptyMap(),
139+ insertedData = emptyMap(),
140+ failedWhere = mapOf (tableId to setOf (" id" )),
141+ deletedData = emptyList(),
142+ numberOfSqlCommands = 1 ,
143+ sqlParseFailureCount = 0 ,
144+ executionInfo = listOf (
145+ SqlExecutionInfo (" SELECT * FROM foo WHERE id = 1" , false , 10L )
146+ )
147+ )
148+
149+ // Execution with no failing WHERE clause — its queries must NOT be collected,
150+ // even though it has executionInfo entries
151+ val executionWithoutFailedWhere = DatabaseExecution (
133152 queriedData = emptyMap(),
134153 updatedData = emptyMap(),
135154 insertedData = emptyMap(),
136155 failedWhere = emptyMap(),
137156 deletedData = emptyList(),
157+ numberOfSqlCommands = 1 ,
158+ sqlParseFailureCount = 0 ,
159+ executionInfo = listOf (
160+ SqlExecutionInfo (" INSERT INTO bar VALUES (1)" , false , 5L )
161+ )
162+ )
163+
164+ fv.setDatabaseExecution(0 , executionWithFailedWhere)
165+ fv.setDatabaseExecution(1 , executionWithoutFailedWhere)
166+ fv.aggregateDatabaseData()
167+
168+ val queries = fv.getViewOfAggregatedFailedWhereQueries()
169+ assertEquals(1 , queries.size)
170+ assertTrue(queries.contains(" SELECT * FROM foo WHERE id = 1" ))
171+ }
172+
173+ @Test
174+ fun testAggregatedFailedWhereQueriesExcludesBlankSqlCommands () {
175+ val fv = FitnessValue (1.0 )
176+
177+ val tableId = TableId (" foo" )
178+
179+ // JSQLParser >= 4.9 can produce empty-string SQL commands; they must be filtered out
180+ // at the source in aggregateDatabaseData() rather than at every call site
181+ val execution = DatabaseExecution (
182+ queriedData = emptyMap(),
183+ updatedData = emptyMap(),
184+ insertedData = emptyMap(),
185+ failedWhere = mapOf (tableId to setOf (" id" )),
186+ deletedData = emptyList(),
138187 numberOfSqlCommands = 3 ,
139188 sqlParseFailureCount = 0 ,
140189 executionInfo = listOf (
141190 SqlExecutionInfo (" SELECT * FROM foo WHERE id = 1" , false , 10L ),
142191 SqlExecutionInfo (" " , false , 5L ),
143- SqlExecutionInfo (" " , false , 5L ),
144- SqlExecutionInfo (" SELECT * FROM bar WHERE name = 'x'" , false , 8L )
192+ SqlExecutionInfo (" " , false , 5L )
145193 )
146194 )
147195 fv.setDatabaseExecution(0 , execution)
148196 fv.aggregateDatabaseData()
149197
150- val allQueries = fv.getViewOfAggregatedFailedWhereQueries()
151- assertEquals(4 , allQueries.size)
152-
153- // Simulate the filter applied in ApiWsStructureMutator before sending queries to the solver
154- val nonBlankQueries = allQueries.filter { it.isNotBlank() }
155- assertEquals(2 , nonBlankQueries.size)
156- assertTrue(nonBlankQueries.none { it.isBlank() })
157- assertTrue(nonBlankQueries.contains(" SELECT * FROM foo WHERE id = 1" ))
158- assertTrue(nonBlankQueries.contains(" SELECT * FROM bar WHERE name = 'x'" ))
198+ val queries = fv.getViewOfAggregatedFailedWhereQueries()
199+ assertEquals(1 , queries.size)
200+ assertTrue(queries.contains(" SELECT * FROM foo WHERE id = 1" ))
159201 }
160202
161203}
0 commit comments