diff --git a/core/src/main/kotlin/org/evomaster/core/problem/httpws/HttpWsCallResult.kt b/core/src/main/kotlin/org/evomaster/core/problem/httpws/HttpWsCallResult.kt index 4f2ffe7a2e..eb79d8b41f 100644 --- a/core/src/main/kotlin/org/evomaster/core/problem/httpws/HttpWsCallResult.kt +++ b/core/src/main/kotlin/org/evomaster/core/problem/httpws/HttpWsCallResult.kt @@ -487,6 +487,12 @@ abstract class HttpWsCallResult : EnterpriseActionResult { return observed.deepCopy() } + // Preserve a size difference recorded by an earlier observation. + // Its elements can no longer be merged using the original indices. + if (merged.size() != original.size()) { + return merged + } + for (i in 0 until observed.size()) { merged.set(i, mergeJsonDiffFromOriginal(original[i], observed[i], merged[i])) } diff --git a/core/src/test/kotlin/org/evomaster/core/problem/rest/RestCallResultTest.kt b/core/src/test/kotlin/org/evomaster/core/problem/rest/RestCallResultTest.kt index 8876f415b8..3f1bed4061 100644 --- a/core/src/test/kotlin/org/evomaster/core/problem/rest/RestCallResultTest.kt +++ b/core/src/test/kotlin/org/evomaster/core/problem/rest/RestCallResultTest.kt @@ -269,4 +269,24 @@ internal class RestCallResultTest { assertEquals("first", original.getMergedFlakyBody()) } + + @Test + fun testMergedFlakyBodyPreservesArraySizeChangesAcrossObservations(){ + for (changedArray in listOf("[]", "[1]", "[1,2,3]")) { + val original = createCallResult("""{"items":[1,2]}""") + original.recordFlakyObservation(createCallResult("""{"items":$changedArray}"""), 1) + original.recordFlakyObservation(createCallResult("""{"items":[1,3]}"""), 2) + + assertEquals("""{"items":$changedArray}""", original.getMergedFlakyBody()) + } + } + + @Test + fun testMergedFlakyBodyPreservesNestedArraySizeChangeAndOtherDeltas(){ + val original = createCallResult("""{"items":[{"values":[1,2]}],"first":"a","second":"b"}""") + original.recordFlakyObservation(createCallResult("""{"items":[{"values":[]}],"first":"x","second":"b"}"""), 1) + original.recordFlakyObservation(createCallResult("""{"items":[{"values":[1,3]}],"first":"a","second":"y"}"""), 2) + + assertEquals("""{"items":[{"values":[]}],"first":"x","second":"y"}""", original.getMergedFlakyBody()) + } }