@@ -209,6 +209,87 @@ void testIsDeserializationError() {
209209 assertFalse (Comparator .isDeserializationError (42 ));
210210 }
211211
212+ // ============================================================
213+ // VOID METHOD STATE COMPARISON — proves we actually compare
214+ // post-call state for void methods, not just skip them
215+ // ============================================================
216+
217+ @ Test
218+ @ DisplayName ("void state: both sides sorted identically → equivalent" )
219+ void testVoidState_identicalMutation_equivalent () throws Exception {
220+ createTestDb (originalDb );
221+ createTestDb (candidateDb );
222+
223+ // Simulate: bubbleSortInPlace(arr) — both original and candidate sort correctly
224+ // Post-call state: Object[]{sorted_array}
225+ int [] sortedArr = {1 , 2 , 3 , 4 , 5 };
226+ byte [] origState = Serializer .serialize (new Object []{sortedArr });
227+ byte [] candState = Serializer .serialize (new Object []{new int []{1 , 2 , 3 , 4 , 5 }});
228+
229+ insertRow (originalDb , "L1_1" , 1 , origState );
230+ insertRow (candidateDb , "L1_1" , 1 , candState );
231+
232+ String json = Comparator .compareDatabases (originalDb .toString (), candidateDb .toString ());
233+ Map <String , Object > result = parseJson (json );
234+
235+ assertTrue ((Boolean ) result .get ("equivalent" ),
236+ "Both sides produce same sorted array — should be equivalent" );
237+ assertEquals (1 , ((Number ) result .get ("actualComparisons" )).intValue ());
238+ }
239+
240+ @ Test
241+ @ DisplayName ("void state: candidate mutates array differently → NOT equivalent" )
242+ void testVoidState_differentMutation_rejected () throws Exception {
243+ createTestDb (originalDb );
244+ createTestDb (candidateDb );
245+
246+ // Simulate: original sorts [3,1,2] → [1,2,3]
247+ // Bad optimization doesn't sort correctly → [3,1,2] unchanged
248+ byte [] origState = Serializer .serialize (new Object []{new int []{1 , 2 , 3 }});
249+ byte [] candState = Serializer .serialize (new Object []{new int []{3 , 1 , 2 }});
250+
251+ insertRow (originalDb , "L1_1" , 1 , origState );
252+ insertRow (candidateDb , "L1_1" , 1 , candState );
253+
254+ String json = Comparator .compareDatabases (originalDb .toString (), candidateDb .toString ());
255+ Map <String , Object > result = parseJson (json );
256+
257+ assertFalse ((Boolean ) result .get ("equivalent" ),
258+ "Candidate produced wrong array — must be rejected" );
259+ assertEquals (1 , ((Number ) result .get ("actualComparisons" )).intValue ());
260+ }
261+
262+ @ Test
263+ @ DisplayName ("void state: receiver + args both compared — wrong receiver state rejected" )
264+ void testVoidState_receiverAndArgs_wrongReceiverRejected () throws Exception {
265+ createTestDb (originalDb );
266+ createTestDb (candidateDb );
267+
268+ // Simulate: instance method sorter.sort(data)
269+ // Post-call state is Object[]{receiver_fields_map, mutated_data}
270+ // Original: receiver has size=3, data is [1,2,3]
271+ // Candidate: receiver has size=0 (wrong), data is [1,2,3]
272+ Map <String , Object > origReceiver = new HashMap <>();
273+ origReceiver .put ("size" , 3 );
274+ origReceiver .put ("sorted" , true );
275+ Map <String , Object > candReceiver = new HashMap <>();
276+ candReceiver .put ("size" , 0 );
277+ candReceiver .put ("sorted" , true );
278+
279+ byte [] origState = Serializer .serialize (new Object []{origReceiver , new int []{1 , 2 , 3 }});
280+ byte [] candState = Serializer .serialize (new Object []{candReceiver , new int []{1 , 2 , 3 }});
281+
282+ insertRow (originalDb , "L1_1" , 1 , origState );
283+ insertRow (candidateDb , "L1_1" , 1 , candState );
284+
285+ String json = Comparator .compareDatabases (originalDb .toString (), candidateDb .toString ());
286+ Map <String , Object > result = parseJson (json );
287+
288+ assertFalse ((Boolean ) result .get ("equivalent" ),
289+ "Receiver state differs (size 3 vs 0) — must be rejected even though args match" );
290+ assertEquals (1 , ((Number ) result .get ("actualComparisons" )).intValue ());
291+ }
292+
212293 // --- Helpers ---
213294
214295 private void createTestDb (Path dbPath ) throws Exception {
0 commit comments