From 90387e4f03d2e2cbe772f487206413cfa0403979 Mon Sep 17 00:00:00 2001 From: Federico Jeanne Date: Mon, 23 Mar 2026 10:44:02 +0100 Subject: [PATCH] Improve assertChanges method in MarkersChangeListener #2569 Use assertAll and more details about the missing/extra markers. Contributes to https://github.com/eclipse-platform/eclipse.platform/issues/2569 --- .../resources/MarkersChangeListener.java | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkersChangeListener.java b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkersChangeListener.java index 01fc8dcbbed..b45eadece52 100644 --- a/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkersChangeListener.java +++ b/resources/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkersChangeListener.java @@ -17,6 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -29,6 +30,7 @@ import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.runtime.IPath; +import org.junit.jupiter.api.Assertions; /** * A support class for the marker tests. @@ -41,31 +43,44 @@ public MarkersChangeListener() { } /** - * Asserts whether the changes for the given resource (or null for the workspace) - * are exactly the added, removed and changed markers given. The arrays may be null. + * Asserts whether the changes for the given resource (or null for the + * workspace) are exactly the added, removed and changed markers given. The + * arrays may be null. */ public void assertChanges(IResource resource, IMarker[] added, IMarker[] removed, IMarker[] changed) { IPath path = resource == null ? IPath.ROOT : resource.getFullPath(); Supplier> changesRetriever = () -> changes.getOrDefault(path, Collections.emptyList()); - int numChanges = (added == null ? 0 : added.length) + (removed == null ? 0 : removed.length) + (changed == null ? 0 : changed.length); - TestUtil.waitForCondition(() -> changesRetriever.get().size() == numChanges, 5000); - assertThat(numChanges).as("number of markers for resource %s", path).isEqualTo(changesRetriever.get().size()); - - for (IMarkerDelta delta : changesRetriever.get()) { - switch (delta.getKind()) { - case IResourceDelta.ADDED: - assertThat(added).as("check added markers contain resource %s", path).contains(delta.getMarker()); - break; - case IResourceDelta.REMOVED: - assertThat(removed).as("check removed markers contain resource %s", path).contains(delta.getMarker()); - break; - case IResourceDelta.CHANGED: - assertThat(changed).as("check changed markers contain resource %s", path).contains(delta.getMarker()); - break; - default: - throw new IllegalArgumentException("delta with unsupported kind: " + delta); - } - } + + int expectedTotal = (added == null ? 0 : added.length) + (removed == null ? 0 : removed.length) + + (changed == null ? 0 : changed.length); + + TestUtil.waitForCondition(() -> changesRetriever.get().size() == expectedTotal, 5000); + + List deltas = new ArrayList<>(changesRetriever.get()); + + List actualAdded = deltas.stream().filter(d -> d.getKind() == IResourceDelta.ADDED) + .map(IMarkerDelta::getMarker).toList(); + List actualRemoved = deltas.stream().filter(d -> d.getKind() == IResourceDelta.REMOVED) + .map(IMarkerDelta::getMarker).toList(); + List actualChanged = deltas.stream().filter(d -> d.getKind() == IResourceDelta.CHANGED) + .map(IMarkerDelta::getMarker).toList(); + + List expectedAdded = added == null ? Collections.emptyList() : Arrays.asList(added); + List expectedRemoved = removed == null ? Collections.emptyList() : Arrays.asList(removed); + List expectedChanged = changed == null ? Collections.emptyList() : Arrays.asList(changed); + + List unsupported = deltas.stream().filter(d -> d.getKind() != IResourceDelta.ADDED + && d.getKind() != IResourceDelta.REMOVED && d.getKind() != IResourceDelta.CHANGED).toList(); + + Assertions.assertAll(String.format("marker delta assertions for resource %s", path), + () -> assertThat(deltas).as("number of marker deltas for resource %s", path).hasSize(expectedTotal), + () -> assertThat(actualAdded).as("added markers for resource %s", path) + .containsExactlyInAnyOrderElementsOf(expectedAdded), + () -> assertThat(actualRemoved).as("removed markers for resource %s", path) + .containsExactlyInAnyOrderElementsOf(expectedRemoved), + () -> assertThat(actualChanged).as("changed markers for resource %s", path) + .containsExactlyInAnyOrderElementsOf(expectedChanged), + () -> assertThat(unsupported).as("unsupported delta kinds for resource %s", path).isEmpty()); } /**